自動採番クラス [VB.NET]

Visual Basic.NET ADO.NETデータベースプログラミング

連番自動生成クラス

受注伝票や売上伝票などに使える伝票番号を連番で生成するクラスを作成します。

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