Accessで採番テーブルを使用して年度ごとの自動採番する方法について紹介したいと思います。
こちらは主に請求書や見積書等にそれぞれ一意のID(コード)を採番したい時に使用します。
共有DBに採番テーブルを作成して、それを使用して採番処理をVBAで行えば
一意のコードを自動生成することが可能となります。
採番テーブルを作成する
まずは採番テーブルを作成します。
用途により必要な項目を定義していきます。
今回は、年度により切替される採番テーブルを作成しました。
採番ルールを考えます
1:請求ID →”SQ” & 年(2桁) & “-” & 0001~自動採番
2:入金ID →”NK” & 年(2桁) & “-” & 0001~自動採番
2:入金ID →”NK” & 年(2桁) & “-” & 0001~自動採番
テーブル名:t_saiban
(項目)
saiban_id:オートナンバー
saiban_div:数値型
nendo:短いテキスト
フィールドサイズ:4
備考:西暦yyyy
new_id:数値型
no:短いテキスト
フィールドサイズ:10
note
データイメージ
画面を作成する
テキスト1
名前:txt請求ID
テキスト2
名前:txt入金ID
ボタン1
名前:cmd採番請求ID
ボタン2
名前:cmd採番入金ID
VBA
標準モジュールに下記のコードを記載します
Option Compare Database Option Explicit Public Const C_SAIBAN_請求ID = 1 Public Const C_SAIBAN_入金ID = 2
CONSTは定数といって変更することのない固定の値です。
採番テーブルより新IDを取得する
Rem ---------------------------------------------------------------------------------- Rem 関数名 : getNewId Rem 処理内容 : 採番テーブルより新IDを取得 Rem 引 数 : なし Rem 戻り値 : 新台帳ID Rem ---------------------------------------------------------------------------------- Public Function getNewId(pSaiban_div As Integer, pNendo As String) As String Dim objRs As Recordset Dim strSql As String Dim strNo As String Dim newId As Long On Error GoTo Error ' SQL実行 strSql = "SELECT * FROM t_saiban" strSql = strSql & " WHERE saiban_div = " & pSaiban_div & " " strSql = strSql & " AND nendo = '" & pNendo & "'" Set objRs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset) If objRs.RecordCount = 1 Then ' データがある時はIDをカウントアップ newId = Nz(objRs.Fields("new_id"), 0) + 1 '------------------------------------------------------- ' 1:請求ID →"SQ" & 年(2桁) & "-" & 0001~自動採番 ' 2:入金ID →"NK" & 年(2桁) & "-" & 0001~自動採番 '------------------------------------------------------- Select Case pSaiban_div Case C_SAIBAN_請求ID strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4) Case C_SAIBAN_入金ID strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4) Case Else End Select objRs.Edit objRs!new_id = newId objRs!No = strNo objRs.Update Else ' データがない時は新規に採番(年度変わった時) newId = 1 objRs.AddNew objRs!saiban_div = pSaiban_div objRs!nendo = pNendo objRs!new_id = newId '------------------------------------------------------- ' 1:請求ID →"SQ" & 年(2桁) & "-" & 0001~自動採番 ' 2:入金ID →"NK" & 年(2桁) & "-" & 0001~自動採番 '------------------------------------------------------- Select Case pSaiban_div Case C_SAIBAN_請求ID strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4) Case C_SAIBAN_入金ID strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(newId), 4) Case Else End Select objRs!No = strNo objRs.Update End If ' 後処理 objRs.Close: Set objRs = Nothing getNewId = strNo Exit Function Error: MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "ID取得" End Function
採番テーブルより現在のIDを取得
Rem ---------------------------------------------------------------------------------- Rem 関数名 : getSaibanId Rem 処理内容 : 採番テーブルより現在のIDを取得する Rem 引 数 : なし Rem 戻り値 : ID Rem ---------------------------------------------------------------------------------- Public Function getSaibanId(pSaiban_div As Integer, pNendo As String) As String Dim objRs As Recordset Dim strSql As String Dim strNo As String Dim saibanId As Long On Error GoTo Error ' SQL実行 strSql = "SELECT * FROM t_saiban" strSql = strSql & " WHERE saiban_div = " & pSaiban_div & " " strSql = strSql & " AND nendo = '" & pNendo & "'" Set objRs = CurrentDb.OpenRecordset(strSql, dbOpenDynaset) If objRs.RecordCount = 1 Then saibanId = Nz(objRs.Fields("new_id"), 0) Select Case pSaiban_div Case C_SAIBAN_請求ID strNo = "SQ" & Right(pNendo, 2) & "-" & funSetEditCode(STR(saibanId), 4) Case C_SAIBAN_入金ID strNo = "NK" & Right(pNendo, 2) & "-" & funSetEditCode(STR(saibanId), 4) Case Else End Select End If ' 後処理 objRs.Close: Set objRs = Nothing getSaibanId = strNo Exit Function Error: MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "ID取得" End Function
コードを0埋め編集して返却
Rem ---------------------------------------------------------------------------------- Rem 関数名 : funSetEditCode Rem 処理内容 : コードを0埋め編集して返却します Rem 引 数 : code = 編集前のコード Rem lenCnt = 桁数 Rem 戻り値 : 編集結果 Rem ---------------------------------------------------------------------------------- Public Function funSetEditCode(code As String, lenCnt As Integer) As String On Error GoTo Error If Nz(code) = "" Then funSetEditCode = "" Exit Function End If funSetEditCode = Format(code, String(lenCnt, "0")) Exit Function Error: MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "0埋め編集" End Function
画面表示
フォームの開くイベントを表示します。
Private Sub Form_Open(Cancel As Integer) ' 請求IDを取得 Me.txt請求ID.Value = getSaibanId(C_SAIBAN_請求ID, "2024") ' 入金IDを取得 Me.txt入金ID.Value = getSaibanId(C_SAIBAN_入金ID, "2024") End Sub
請求ID採番
請求ID採番ボタンのクリックイベントに記載します。
Private Sub cmd採番請求ID_Click() ' 請求IDを採番して再セットする Me.txt請求ID.Value = getNewId(C_SAIBAN_請求ID, "2024") End Sub
動きを確認
画面表示時
請求IDのボタンを押下
getNewId関数がコールされて採番テーブルより該当のIDを取得し
請求IDの場合は、その所定のルールにあうように採番処理をしてIDが返却されるので
それを画面のテキストに再表示しています。
コメント