Accessによる採番システム その5 フォームの作成②自動採番

採番

前回までに、登録した文書管理番号の情報を閲覧できる機能を実装してきました。今回は、採番するための機能として自動採番の方法を紹介していきます。

VBAによるコーディングを行うため、一見難しそうに見えるかもしれませんが、一つずつ内容を確認していただければさほど難しいものではないとご理解いただけると思いますので、宜しくお願いいたします。

また、VBAのコーディングについては様々な事例を見ることが必要だと思いますので、以下の書籍を参考にしていただければと思います。

スポンサーリンク

スポンサーリンク

フォームにおける自動採番

文書番号の管理に際して、ユーザーが自由に入力できてしまうと、不整合の要因となります。したがって、文書管理コードと年度の内で、最新の番号を自動取得できるように機能を実装していきます。

また、連番に係るテキストボックスへの入力はできないように設定をします。

図1 フォームによる自動発番の準備

まずは、前回までに作成している「t_連番」テキストボックスのプロパティシートを開き、編集ロックプロパティを「はい」とします。これでユーザー側からフォーム上への値入力を禁止することができます。あくまでも採番は自動で行うことを主眼に置いています。

続いて、文書管理コードあるいは年度の値を更新した都度、当該文書コード体系に基づく最新の連番を取得するように、VBAによるコーディングを行います。

まずは、VBA画面を開き「採番」プロシージャを設定します。なお、プロシージャの設定方法については以下の記事を参考にしてください。

さて、ここからVBAによる最新連番の取得ルーチンを実装します。今回はADOを用いたコーディングとしますので、VBA画面の中で参照設定からMicrosoft ActiveX Data Object 6.1 Libraryにチェックを入れます。

図2 ADOの参照設定

ADOについては、以下の記事を参照していただければと思います。

続いて、自動採番するためのコーディングをします。「採番Subプロシージャ」を作成した後、以下のようにコードを記載します。

Public Sub 採番()

'文書管理コードあるいは年度が入力されていない場合は処理を中止する。
If Me.t_文書管理コード = "" Or IsNull(Me.t_文書管理コード) Or Me.t_年度 = "" Or IsNull(Me.t_年度) Then
  Me.t_連番 = 0
  Exit Sub
End If

'ADOによる処理に向けた変数宣言
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim MaxNumber As Integer: MaxNumber = 0

'データベースへ接続
Set cn = CurrentProject.Connection

'T_管理テーブルを開く
rs.Open "T_管理", cn, adOpenKeyset, adLockOptimistic

'フィルタリングで必要な情報を取得する。
rs.Filter = "文書管理コード = '" & Forms!F_Main.t_文書管理コード & "' AND 年度 = " & Forms!F_Main.t_年度

'当該レコードで最大の連番を取得する。
Do Until rs.EOF = True
 If rs!連番 > MaxNumber Then
   MaxNumber = rs!連番
 End If
 rs.MoveNext
Loop

'最大の連番に1を加えた値をテキストボックスに反映する。
Me.t_連番 = MaxNumber + 1

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub

ここまでで、自動採番するコーディングができましたので、これを動かすためのイベントを設定します。

今回は、文書管理コードあるいは年度を更新した際に、これら値をに紐づく文書番号の内で最新のものを取得するようにします。

したがって、「t_文書管理コード」コンボボックスの更新後処理プロパティにイベントプロシージャを設定し、さらに次のコードを実装します。(これは、前回作成したコードに追記する形をとります。)

Private Sub t_文書管理コード_AfterUpdate()

'文書管理コードが入力されているかの確認
If Me.t_文書管理コード = "" Or IsNull(Me.t_文書管理コード) Then
  MsgBox "文書管理コードを選択してください。" Exit Sub
End If

'Callにより採番プロシージャを呼び出す
Call 採番

'フォームの更新
Me.Requery

End Sub

同様に、「t_年度」テキストボックスに対しても更新後処理プロパティにイベントプロシージャを設定し、コーディングします。

Private Sub t_年度_AfterUpdate()

'年度が入力されているかの確認
If Me.t_年度 = "" Or IsNull(Me.t_年度) Then
  MsgBox "年度を西暦で入力してください。" Exit Sub
End If

'Callにより採番プロシージャを呼び出す
Call 採番

'フォームの更新
Me.Requery

End Sub

以上で、文書管理コードあるいは年度の値を更新した都度、自動採番をして連番が取得されるようになります。

まとめ

今回は、文書管理コードあるいは年度を取得することで、当該文書番号の最新値を取得するルーチンを実装しました。途中ADO等を用いたコーディングも行いましたが、慣れればさほど難しい内容ではありませんので、ここでしっかりと使い方を学んでいただければと思います。

また、著者がこれまでの学習で重宝した書籍を以下に示しますので、こちらもそばに置いてAccessファイルの作成をしていくことで、より効率的なシステムの構築ができると思いますので、ぜひご参考になさってください。

スポンサーリンク

コメント

タイトルとURLをコピーしました