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


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

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