メールマガジン【アクセスで作るシリーズ】
バックナンバー 【会計ソフト編】 Vol.56
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【会計ソフト編】
発 行 : Yoshihisa Fukuda 2001. 6.23 Vol.56
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は勘定科目設定の科目IDの欠番対策です。。
== ◇ 第5章 拡張機能 ====================
--------------------------------------
第11回 勘定科目設定の科目IDの欠番対策
--------------------------------------
--------------------------------------
今回は勘定科目設定で自動で割り振ったIDの欠番対策です。
皆さんは Vol.10 勘定科目設定のフォーム作成の続きの1.の【解説】内の※をご覧
下さい。
ここで欠番の話をしていますが、要は勘定科目の登録をして、途中の科目を削除した
場合、科目IDに欠番が生じます。
その欠番を次に登録する勘定科目で使用すると言うのが今回の主旨です。
欠番を見つける方法としては色々考えられます。
1つは、科目テーブルを先頭から順番に総なめして、欠番を見つける方法ですが、
これでは、勘定科目の様に少ないデータなら良いのですが、例えば仕訳データなど、
将来何百件、何千件にもなるテーブルでは時間が掛かりすぎ、あまり良くありません。
そこで、今回はバイナリサーチという方法で欠番の検索を行ないます。
まず、取り合えずプログラミングを行いましょう。
1.ではまず、勘定科目設定(KamokuSetForm)をデザインで開きます。
2.次にフォームを選択した状態で[挿入前処理]プロパティへカーソルを移動し、
[...]ボタンでモジュールウィンドウを開きます。
3.モジュールウィンドウを開くと、前回書いたコードが表示されますので、これら
を全て削除(コメントでも良い)し、今回のコードに置き換えます。
【前回のコード】
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim KamokuIDMax As Variant
KamokuIDMax = DMax("KamokuID", "KamokuTable")
If IsNull(KamokuIDMax) Then
Me![KamokuID] = 1
Else
Me![KamokuID] = KamokuIDMax + 1
End If
End Sub
【今回のコード】
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim S_Pos As Integer
Dim E_Pos As Integer
Dim Now_Pos As Integer
Dim SELSQL As String
Dim ACC_DB As Database
Dim Kamo_T As Recordset
Dim TopBookmark As Variant
Set ACC_DB = CurrentDb
S_Pos = 1
SELSQL = "select KamokuID from KamokuTable ORDER BY KamokuID"
Set Kamo_T = ACC_DB.OpenRecordset(SELSQL)
Kamo_T.MoveLast
E_Pos = Kamo_T.RecordCount
If E_Pos = 0 Then
Me![KamokuID] = 1
GoTo Exit_Form_BeforeInsert
End If
If Kamo_T.RecordCount = Kamo_T.Fields(0).Value Then
Me![KamokuID] = Kamo_T.RecordCount + 1
GoTo Exit_Form_BeforeInsert
End If
Kamo_T.MoveFirst
TopBookmark = Kamo_T.Bookmark
Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
While S_Pos + 1 <> E_Pos
If Now_Pos = Kamo_T.Fields(0).Value Then
S_Pos = Now_Pos
Else
E_Pos = Now_Pos
End If
Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
Wend
Me![KamokuID] = E_Pos
Exit_Form_BeforeInsert:
Kamo_T.Close
ACC_DB.Close
Set Kamo_T = Nothing
Set ACC_DB = Nothing
End Sub
これでデータを新規登録する際に、科目IDの欠番を検索して、そのIDを使用する事が
できます。
次回は、欠番検索の考え方、バイナリサーチとプログラムの解説を行います。
______________________________________
◆◇ Q&Aコーナー ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
今回はありません。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ ACCESSで作るシリーズ 【会計ソフト編】
◇ 発 行 元 :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
ご質問等 :fukuda@shun-net.com
◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
しています。(まぐまぐID:0000030446)
◇ バックナンバー:http://www.shun-net.com/fukuda/
◇ 登録・解除 :http://www.shun-net.com/fukuda/
Copyright(C) 2000-2001 Yoshihisa Fukuda All rights reserved.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【会計ソフト編】
発 行 : Yoshihisa Fukuda 2001. 6.23 Vol.56
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は勘定科目設定の科目IDの欠番対策です。。
== ◇ 第5章 拡張機能 ====================
--------------------------------------
第11回 勘定科目設定の科目IDの欠番対策
--------------------------------------
--------------------------------------
今回は勘定科目設定で自動で割り振ったIDの欠番対策です。
皆さんは Vol.10 勘定科目設定のフォーム作成の続きの1.の【解説】内の※をご覧
下さい。
ここで欠番の話をしていますが、要は勘定科目の登録をして、途中の科目を削除した
場合、科目IDに欠番が生じます。
その欠番を次に登録する勘定科目で使用すると言うのが今回の主旨です。
欠番を見つける方法としては色々考えられます。
1つは、科目テーブルを先頭から順番に総なめして、欠番を見つける方法ですが、
これでは、勘定科目の様に少ないデータなら良いのですが、例えば仕訳データなど、
将来何百件、何千件にもなるテーブルでは時間が掛かりすぎ、あまり良くありません。
そこで、今回はバイナリサーチという方法で欠番の検索を行ないます。
まず、取り合えずプログラミングを行いましょう。
1.ではまず、勘定科目設定(KamokuSetForm)をデザインで開きます。
2.次にフォームを選択した状態で[挿入前処理]プロパティへカーソルを移動し、
[...]ボタンでモジュールウィンドウを開きます。
3.モジュールウィンドウを開くと、前回書いたコードが表示されますので、これら
を全て削除(コメントでも良い)し、今回のコードに置き換えます。
【前回のコード】
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim KamokuIDMax As Variant
KamokuIDMax = DMax("KamokuID", "KamokuTable")
If IsNull(KamokuIDMax) Then
Me![KamokuID] = 1
Else
Me![KamokuID] = KamokuIDMax + 1
End If
End Sub
【今回のコード】
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim S_Pos As Integer
Dim E_Pos As Integer
Dim Now_Pos As Integer
Dim SELSQL As String
Dim ACC_DB As Database
Dim Kamo_T As Recordset
Dim TopBookmark As Variant
Set ACC_DB = CurrentDb
S_Pos = 1
SELSQL = "select KamokuID from KamokuTable ORDER BY KamokuID"
Set Kamo_T = ACC_DB.OpenRecordset(SELSQL)
Kamo_T.MoveLast
E_Pos = Kamo_T.RecordCount
If E_Pos = 0 Then
Me![KamokuID] = 1
GoTo Exit_Form_BeforeInsert
End If
If Kamo_T.RecordCount = Kamo_T.Fields(0).Value Then
Me![KamokuID] = Kamo_T.RecordCount + 1
GoTo Exit_Form_BeforeInsert
End If
Kamo_T.MoveFirst
TopBookmark = Kamo_T.Bookmark
Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
While S_Pos + 1 <> E_Pos
If Now_Pos = Kamo_T.Fields(0).Value Then
S_Pos = Now_Pos
Else
E_Pos = Now_Pos
End If
Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
Wend
Me![KamokuID] = E_Pos
Exit_Form_BeforeInsert:
Kamo_T.Close
ACC_DB.Close
Set Kamo_T = Nothing
Set ACC_DB = Nothing
End Sub
これでデータを新規登録する際に、科目IDの欠番を検索して、そのIDを使用する事が
できます。
次回は、欠番検索の考え方、バイナリサーチとプログラムの解説を行います。
______________________________________
◆◇ Q&Aコーナー ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇
今回はありません。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
◇ ACCESSで作るシリーズ 【会計ソフト編】
◇ 発 行 元 :Yoshihisa Fukuda(福田 義久)
◇ ご意見・ご要望
ご質問等 :fukuda@shun-net.com
◇ このメールマガジンは、インターネットの本屋さん『まぐまぐ』を利用して発行
しています。(まぐまぐID:0000030446)
◇ バックナンバー:http://www.shun-net.com/fukuda/
◇ 登録・解除 :http://www.shun-net.com/fukuda/
Copyright(C) 2000-2001 Yoshihisa Fukuda All rights reserved.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□