メールマガジン【アクセスで作るシリーズ】


バックナンバー 【会計ソフト編】 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.

◇転載について
 このメールマガジンの無断転載などは、一切禁止です。
 転載をご希望の方は、事前にメールで連絡をください。
◇免責
 このメールマガジン及びホームページの内容による、いかなる損害、障害などに
 関して発行者は一切の責任を負いません。
 掲載広告についても同様です。
______________________________________
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□