メールマガジン【アクセスで作るシリーズ】
バックナンバー 【会計ソフト編】 Vol.58
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ACCESSで作るシリーズ 【会計ソフト編】
発 行 : Yoshihisa Fukuda 2001. 7. 7 Vol.58
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は勘定科目設定の科目ID欠番対策のプログラムを解説します。
== ◇ 第5章 拡張機能 ====================
--------------------------------------
第13回 勘定科目設定の科目IDの欠番対策(解説続き)
--------------------------------------
前回は勘定科目設定の欠番対策の考え方、理論の解説を行いました。
今回は、その理論を元にプログラムを解説していきます。
1.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
これはもう、いまさら解説する事も無いと思いますが、使用する変数の宣言です。
2.Set ACC_DB = CurrentDb
これも前に詳しくやりました、データベースオブジェクトの設定です。(Vol.50参照)
さて、ここから先の解説を行う前に、使用する変数の役割を簡単に解説しておきます。
3.
(1)S_Pos ・・・バイナリサーチで検索する範囲の開始位置
(2)E_Pos ・・・バイナリサーチで検索する範囲の終了位置
(3)NOW_Pos ・・・バイナリサーチで検索する範囲を2分割した分割位置
(4)SELSQL ・・・SQL文
(5)ACC_DB ・・・データベースオブジェクト
(6)Kamo_T ・・・勘定科目テーブルのレコードセット
(7)TopBookmark・・勘定科目テーブルの先頭を押えるブックマーク
では、解説です。
4.S_Pos = 1
まず最初に、バイナリサーチで検索する範囲の開始位置を1に設定しています。
5.SELSQL = "select KamokuID from KamokuTable ORDER BY KamokuID"
勘定科目テーブルに対するSELECT文です。(Vol.53・54参照)
勘定科目テーブルの科目IDフィールドを科目IDで昇順にソートして抽出します。
ORDER BY KamokuID が、科目IDを昇順でソートでしたが、勘定科目テーブルの
科目IDは主キーに指定されていますので、このORDER BY句が無くてもソートされて
いますが、一応明示的に記述してあります。
6.Set Kamo_T = ACC_DB.OpenRecordset(SELSQL)
勘定科目テーブルのレコードセットに SELSQL の SQL文で抽出したレコードセットが
設定されます。
7.Kamo_T.MoveLast
E_Pos = Kamo_T.RecordCount
抽出した勘定科目のカレントレコードを最終レコードに移動して、バイナリサーチで
検索する範囲の終了位置に勘定科目のレコード数を設定しています。
8.If E_Pos = 0 Then
Me![KamokuID] = 1
GoTo Exit_Form_BeforeInsert
End If
勘定科目テーブルのレコード数が0の場合(1件も登録されていない場合)、最初の
科目IDを1に設定します。
そして、Exit_Form_BeforeInsertラベルのところへ処理を移動します。
9.If Kamo_T.RecordCount = Kamo_T.Fields(0).Value Then
Me![KamokuID] = Kamo_T.RecordCount + 1
GoTo Exit_Form_BeforeInsert
End If
勘定科目テーブルのレコード数と、最終レコードの科目IDが同一の場合、欠番は
無い(理由はVol.57の欠番を探す原理参照)ので、科目IDに現在のレコード数+1
を設定します。
そして、Exit_Form_BeforeInsertラベルのところへ処理を移動します。
10.Kamo_T.MoveFirst
TopBookmark = Kamo_T.Bookmark
勘定科目テーブルのカレントレコードを先頭に移動し、ブックマークを先頭で設定
します。
ここで、突然ブックマークと言うのが出てきましたが、このブックマークは、皆さん
が普段お使いのインターネットブラウザにあるのと同じ(IEの場合、お気に入りと
言う)で、その場所を記憶しておけるものです。
11.Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
バイナリサーチで検索する範囲を2分割し、その分割位置を設定します。
12.Kamo_T.Move Now_Pos - 1, TopBookmark
勘定科目テーブルのカレントレコードを、2分割した位置に移動します。
Moveメソッドは第一引数が移動するレコード数で、第2引数にブックマークを指定
すると、ブックマーク位置から第1引数のレコード数分移動する事になります。
第一引数のレコード数に負の数を指定する事で、前に移動する事ができます。
13.While S_Pos + 1 <> E_Pos
バイナリサーチで検索する範囲の開始位置と終了位置が1レコード違い、すなわち
2分割出来ない状態になるまでループします。
14.If Now_Pos = Kamo_T.Fields(0).Value Then
S_Pos = Now_Pos
Else
E_Pos = Now_Pos
End If
2分割したレコード番号と、そのレコードの科目IDを比較します。
同一の場合、欠番は2分割したレコードの後側にあるので、バイナリサーチで検索
する範囲の開始位置を2分割した分割位置に設定します。
同一でない場合、欠番は2分割したレコードの前側にあるので、バイナリサーチで
検索する範囲の終了位置を2分割した分割位置に設定します。
15.Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
再び、バイナリサーチで検索する範囲を2分割し、その分割位置を設定します。
そして、勘定科目テーブルのカレントレコードを、2分割した位置に移動します。
16.Wend
ここまでを、先程の13.While文の条件でループします。
17.Me![KamokuID] = E_Pos
バイナリサーチで検索する範囲の開始位置と終了位置が1レコード違いになった所で、
バイナリサーチで検索する範囲の終了位置が欠番の値となるので、その値を科目ID
に設定します。
18.Exit_Form_BeforeInsert:
Kamo_T.Close
ACC_DB.Close
Set Kamo_T = Nothing
Set ACC_DB = Nothing
これらは、後処理です。
勘定科目テーブルのレコードセット、データベースオブジェクトをクローズし、領域
を開放して終了です。
以上で、プログラムの解説は終わりです。
1つ1つの命令は、今までに出てきたので、もう大分解ってきた事と思います。
VBAによるテーブル操作やSQL文なども拡張編で取り上げたので大丈夫でしょう。
唯一、ブックマークだけが突然出てきましたが、このブックマークは今回の使い方
以外にも、色々と便利に使えます。
また、続編で機会があれば、使って解説をしていきたいと思います。
--------------------------------------
いよいよ、この【会計ソフト編】が、次回で最終回となります。
最終回は、全体のまとめと、続編に付いて少しお話します。
______________________________________
◆◇ 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. 7. 7 Vol.58
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
--------------------------------------
今回は勘定科目設定の科目ID欠番対策のプログラムを解説します。
== ◇ 第5章 拡張機能 ====================
--------------------------------------
第13回 勘定科目設定の科目IDの欠番対策(解説続き)
--------------------------------------
前回は勘定科目設定の欠番対策の考え方、理論の解説を行いました。
今回は、その理論を元にプログラムを解説していきます。
1.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
これはもう、いまさら解説する事も無いと思いますが、使用する変数の宣言です。
2.Set ACC_DB = CurrentDb
これも前に詳しくやりました、データベースオブジェクトの設定です。(Vol.50参照)
さて、ここから先の解説を行う前に、使用する変数の役割を簡単に解説しておきます。
3.
(1)S_Pos ・・・バイナリサーチで検索する範囲の開始位置
(2)E_Pos ・・・バイナリサーチで検索する範囲の終了位置
(3)NOW_Pos ・・・バイナリサーチで検索する範囲を2分割した分割位置
(4)SELSQL ・・・SQL文
(5)ACC_DB ・・・データベースオブジェクト
(6)Kamo_T ・・・勘定科目テーブルのレコードセット
(7)TopBookmark・・勘定科目テーブルの先頭を押えるブックマーク
では、解説です。
4.S_Pos = 1
まず最初に、バイナリサーチで検索する範囲の開始位置を1に設定しています。
5.SELSQL = "select KamokuID from KamokuTable ORDER BY KamokuID"
勘定科目テーブルに対するSELECT文です。(Vol.53・54参照)
勘定科目テーブルの科目IDフィールドを科目IDで昇順にソートして抽出します。
ORDER BY KamokuID が、科目IDを昇順でソートでしたが、勘定科目テーブルの
科目IDは主キーに指定されていますので、このORDER BY句が無くてもソートされて
いますが、一応明示的に記述してあります。
6.Set Kamo_T = ACC_DB.OpenRecordset(SELSQL)
勘定科目テーブルのレコードセットに SELSQL の SQL文で抽出したレコードセットが
設定されます。
7.Kamo_T.MoveLast
E_Pos = Kamo_T.RecordCount
抽出した勘定科目のカレントレコードを最終レコードに移動して、バイナリサーチで
検索する範囲の終了位置に勘定科目のレコード数を設定しています。
8.If E_Pos = 0 Then
Me![KamokuID] = 1
GoTo Exit_Form_BeforeInsert
End If
勘定科目テーブルのレコード数が0の場合(1件も登録されていない場合)、最初の
科目IDを1に設定します。
そして、Exit_Form_BeforeInsertラベルのところへ処理を移動します。
9.If Kamo_T.RecordCount = Kamo_T.Fields(0).Value Then
Me![KamokuID] = Kamo_T.RecordCount + 1
GoTo Exit_Form_BeforeInsert
End If
勘定科目テーブルのレコード数と、最終レコードの科目IDが同一の場合、欠番は
無い(理由はVol.57の欠番を探す原理参照)ので、科目IDに現在のレコード数+1
を設定します。
そして、Exit_Form_BeforeInsertラベルのところへ処理を移動します。
10.Kamo_T.MoveFirst
TopBookmark = Kamo_T.Bookmark
勘定科目テーブルのカレントレコードを先頭に移動し、ブックマークを先頭で設定
します。
ここで、突然ブックマークと言うのが出てきましたが、このブックマークは、皆さん
が普段お使いのインターネットブラウザにあるのと同じ(IEの場合、お気に入りと
言う)で、その場所を記憶しておけるものです。
11.Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
バイナリサーチで検索する範囲を2分割し、その分割位置を設定します。
12.Kamo_T.Move Now_Pos - 1, TopBookmark
勘定科目テーブルのカレントレコードを、2分割した位置に移動します。
Moveメソッドは第一引数が移動するレコード数で、第2引数にブックマークを指定
すると、ブックマーク位置から第1引数のレコード数分移動する事になります。
第一引数のレコード数に負の数を指定する事で、前に移動する事ができます。
13.While S_Pos + 1 <> E_Pos
バイナリサーチで検索する範囲の開始位置と終了位置が1レコード違い、すなわち
2分割出来ない状態になるまでループします。
14.If Now_Pos = Kamo_T.Fields(0).Value Then
S_Pos = Now_Pos
Else
E_Pos = Now_Pos
End If
2分割したレコード番号と、そのレコードの科目IDを比較します。
同一の場合、欠番は2分割したレコードの後側にあるので、バイナリサーチで検索
する範囲の開始位置を2分割した分割位置に設定します。
同一でない場合、欠番は2分割したレコードの前側にあるので、バイナリサーチで
検索する範囲の終了位置を2分割した分割位置に設定します。
15.Now_Pos = S_Pos + Int((E_Pos - S_Pos) / 2)
Kamo_T.Move Now_Pos - 1, TopBookmark
再び、バイナリサーチで検索する範囲を2分割し、その分割位置を設定します。
そして、勘定科目テーブルのカレントレコードを、2分割した位置に移動します。
16.Wend
ここまでを、先程の13.While文の条件でループします。
17.Me![KamokuID] = E_Pos
バイナリサーチで検索する範囲の開始位置と終了位置が1レコード違いになった所で、
バイナリサーチで検索する範囲の終了位置が欠番の値となるので、その値を科目ID
に設定します。
18.Exit_Form_BeforeInsert:
Kamo_T.Close
ACC_DB.Close
Set Kamo_T = Nothing
Set ACC_DB = Nothing
これらは、後処理です。
勘定科目テーブルのレコードセット、データベースオブジェクトをクローズし、領域
を開放して終了です。
以上で、プログラムの解説は終わりです。
1つ1つの命令は、今までに出てきたので、もう大分解ってきた事と思います。
VBAによるテーブル操作やSQL文なども拡張編で取り上げたので大丈夫でしょう。
唯一、ブックマークだけが突然出てきましたが、このブックマークは今回の使い方
以外にも、色々と便利に使えます。
また、続編で機会があれば、使って解説をしていきたいと思います。
--------------------------------------
いよいよ、この【会計ソフト編】が、次回で最終回となります。
最終回は、全体のまとめと、続編に付いて少しお話します。
______________________________________
◆◇ 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.
◇転載について
このメールマガジンの無断転載などは、一切禁止です。
転載をご希望の方は、事前にメールで連絡をください。
◇免責
このメールマガジン及びホームページの内容による、いかなる損害、障害などに
関して発行者は一切の責任を負いません。
掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□