連番自動生成クラス
受注伝票や売上伝票などに使える伝票番号を連番で生成するクラスを作成します。
MDB版:部門ごとに連番を生成するサンプル
コンストラクタを2つと、次のメソッドを実装します。
- 連番生成テーブルから連番を取得するメソッド
- 部門コードのレコードが連番生成テーブルに存在するか否かを調べるメソッド
- 連番生成テーブルに1レコードを登録するメソッド
プロジェクトフォルダ下のbinフォルダにsample.mdbを置きます。
Option Strict On Imports System.Data.OleDb Public Class clsSequenceNum ' 部門コード Private bumonCode As String ' 連番 Private renban As Integer = 1 '=========================================================== ' 機能:コンストラクタ ' 引数:部門コード '=========================================================== Sub New(ByVal bumonCode As String) MyBase.New() Me.bumonCode = bumonCode ' 部門コードのレコードがなければ1レコード追加 If Me.ExistBumon = False Then Me.CreateSequenceNum() End If End Sub '=========================================================== ' 機能:コンストラクタ ' 引数:部門コード ' 引数:初期設定の連番5桁 '=========================================================== Sub New(ByVal bumonCode As String, ByVal renban As Integer) MyBase.New() Me.bumonCode = bumonCode Me.renban = renban If renban >= 0 And renban < 100000 Then ' 部門コードのレコードがなければ、1レコード追加 If Me.ExistBumon = False Then Me.CreateSequenceNum() Else ' 部門コードのレコードがあれば、例外をスロー Throw New Exception("部門コード" & bumonCode & _ "の連番は設定されています") End If Else ' 初期値が範囲外ならば、例外をスロー Throw New Exception("部門コード" & bumonCode &_ "連番初期値は0-99999を設定してください") End If End Sub '************************************************************ ' 機能:連番生成テーブルから連番を取得するメソッド ' 引数:なし ' 戻値:8桁文字列ならば、取得成功 ' ""(長さ0の文字列)ならば、取得失敗 '************************************************************ Public Function GetSequenceNum() As String Dim con As New OleDbConnection() Dim cmd As New OleDbCommand() Dim dr As OleDbDataReader Dim renban As Integer ' DB接続文字列の設定 con.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Application.StartupPath & "\sample.mdb" ' コネクションの設定 cmd.Connection = con ' DB接続を開く con.Open() ' SQL文の設定 cmd.CommandText = "SELECT 連番 FROM 連番生成テーブル " cmd.CommandText &= "WHERE 部門コード = @bumon" ' SQL文パラメータの設定 cmd.Parameters.Add("@bumon", OleDbType.Char, 3) cmd.Parameters("@bumon").Value = Me.bumonCode ' 取得するレコードが1件の時は、 ' パラメータにCommandBehavior.SingleRowをセット dr = cmd.ExecuteReader(CommandBehavior.SingleRow) If dr.Read() Then ' << レコードが取得できた時の処理 >> ' 連番セット renban = CInt(dr("連番")) ' データリーダを閉じる If Not dr Is Nothing Then dr.Close() End If ' 8桁連番生成処理 If renban < 100000 Then ' SQL文の設定 cmd.CommandText = "UPDATE 連番生成テーブル " cmd.CommandText &= "SET 連番=@nextNum " cmd.CommandText &= "WHERE 部門コード = @bumon " cmd.CommandText &= "AND 連番=@nowNum" ' SQL文パラメータの設定 cmd.Parameters.Clear() cmd.Parameters.Add("@nextNum", OleDbType.Integer) cmd.Parameters("@nextNum").Value = renban + 1 cmd.Parameters.Add("@bumon", OleDbType.Char, 3) cmd.Parameters("@bumon").Value = Me.bumonCode cmd.Parameters.Add("@nowNum", OleDbType.Integer) cmd.Parameters("@nowNum").Value = renban ' 連番生成テーブル更新SQL文実行 ' 連番を+1してレコードを更新 Dim count As Integer count = cmd.ExecuteNonQuery() If count = 1 Then ' 連番が6桁になったら例外をスロー If renban < 100000 Then ' 部門コード3桁と5桁連番を連結する Dim strNum As String = _ String.Format("{0,3:000}", mBumonCode) + _ String.Format("{0,5:00000}", renban) ' 戻り値にセットしてリターン Return strNum Else Throw New Exception _ ("連番が100000に達しました") End If Else ' 更新処理エラー時 '戻り値に""をセットしてリターン Return "" End If Else ' 連番が6桁になったら、例外をスロー Throw New Exception("連番が100000に達しました") End If Else ' << レコードが取得できなかった時の処理 >> ' 戻り値に""をセットしてリターン Return "" End If ' DB接続を閉じる If Not con Is Nothing Then con.Close() End If End Function '************************************************************ ' 機能:部門コードのレコードが連番生成テーブルに ' 存在するか否かを調べるメソッド ' 引数:なし ' 戻値:True --> 存在する. False --> 存在しない '************************************************************ Private Function ExistBumon() As Boolean Dim con As New OleDbConnection() Dim cmd As New OleDbCommand() ' DB接続文字列の設定 con.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Application.StartupPath & "\sample.mdb" ' コネクションの設定 cmd.Connection = con ' DB接続を開く con.Open() ' SQL文の設定 cmd.CommandText = "SELECT COUNT(*) FROM 連番生成テーブル " cmd.CommandText &= "WHERE 部門コード = @bumon" ' SQL文パラメータの設定 cmd.Parameters.Add("@bumonCode", OleDbType.Char, 3) cmd.Parameters("@bumonCode").Value = Me.mBumonCode ' 連番生成テーブルから該当部門コードのレコード数読込 Dim recCount As Integer recCount = CInt(cmd.ExecuteScalar()) If recCount = 1 Then ' レコードが存在する時の処理 Return True Else ' レコードが存在しない時の処理 Return False End If ' DB接続を閉じる If Not con IsNothingThen con.Close() End If End Function '************************************************************ ' 機能:連番生成テーブルに1レコードを登録するメソッド ' 引数:なし ' 戻値:True --> 登録成功. False --> 登録失敗 '************************************************************ Private Function createSequenceNum() As Boolean Dim con As New OleDbConnection() Dim cmd As New OleDbCommand() ' DB接続文字列の設定 con.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Application.StartupPath & "\sample.mdb" ' コネクションの設定 cmd.Connection = con ' DB接続を開く con.Open() ' SQL文の設定 cmd.CommandText = "INSERT INTO " cmd.CommandText &= "連番生成テーブル " cmd.CommandText &= "(部門コード, 連番, 更新日時) " cmd.CommandText &= "VALUES(@bumonCode, " cmd.CommandText &= "@renban, @kosinNitizi)" ' パラメータの設定 cmd.Parameters.Add("@bumon", OleDbType.Char, 3) cmd.Parameters("@bumon").Value = Me.bumonCode cmd.Parameters.Add("@renban", OleDbType.Integer) cmd.Parameters("@renban").Value = Me.renban cmd.Parameters.Add("@kosinNitizi", OleDbType.Date) cmd.Parameters("@kosinNitizi").Value = Now() ' 自動連番生成テーブルレコード追加処理実行 Dim count As Integer = cmd.ExecuteNonQuery() If count = 1 Then ' 追加成功:戻り値にTrueを設定してリターン Return True Else ' 追加失敗:戻り値にFalseを設定してリターン Return False End If ' DB続を閉じる If Not con Is Nothing Then con.Close() End If End Function End Class