ヘッダー明細テーブルクラス

Visual Basic ADO.NET [Community Express]

受注ヘッダーテーブル・明細テーブルアクセスクラス

受注ヘッダーデータを受注ヘッダーテーブルに、明細データをとディテールテーブルに追加するクラスです。

ヘッダーテーブル・明細テーブルアクセスクラスの実装

受注エントリー画面

販売管理データベースアクセスクラスを継承したクラスです。

受注ヘッダー表と受注ディテール表にレコードを追加するInsertRecordメソッドを実装します。

TransactionScopeクラスを使用するので、受注ヘッダー表、または受注ディテール表にレコードが追加できなかった時は、自動的にロールバックされます。

レコードが正常に追加できた時は、追加した明細行数をリターン値にセットします。

【注意】SQL文は、必ずメソッド内部で生成してください。

ソースリストの枠内をクリックすると全選択できます。

Option Strict On
Imports System.Data.SqlClient
Imports System.Transactions

'%%%%%%%%%%%%%%%%% 受注伝票アクセスクラス %%%%%%%%%%%%%%%%%%%
Public Class ClsJuchuDenpyoIO
    Inherits ClsHanbaiKanriDBIO

    '--------------------< 定数メンバー >--------------------
    Protected Const TABLE_NAME As String = "受注ヘッダー表"
    Protected Const KEY_FIELD As String = "受注番号"

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:なし
    ' 戻値:なし
    '=======================================================
    Public Sub New()

       ' 最初に基本クラスのコンストラクタを呼び出す
       MyBase.New(TABLE_NAME, KEY_FIELD)

    End Sub

    '*******************************************************
    ' 機能:ヘッダー表とディテール表へのレコード追加メソッド
    ' 引数:追加する受注ヘッダー表データ
    ' 引数:追加する受注ディテール表データ
    ' 戻値:受注ディテール表に追加したレコード数
    '*******************************************************
    Public Function InsertRecord _
        (ByVal header As ClsInsertHeader, _
         ByVal meisai As List(Of ClsInsertDetailRow)) As Integer

        Dim retInsertCount As Integer          ' リターン値
        Dim addCount As Integer
        ' トランザクション開始
        Using tran As New TransactionScope
          Using con As New SqlConnection
            Using cmd As New SqlCommand
                ' DBを開く
                ClsHanbaiKanriDBIO.OpenDB(con, cmd)
                ' 【受注ヘッダー表に追加】
                ' SQL文の生成
                cmd.CommandText = _
                    "INSERT INTO 受注ヘッダー表(受注番号, " & _
                    "受注日, "得意先コード) " & _
                    "VALUES(@bango, @juchuBi, @tokuCode)"
                ' SQL文の引数設定
                cmd.Parameters.Clear()
                cmd.Parameters.Add("@bango", SqlDbType.NChar)
                cmd.Parameters.Add("@juchuBi", SqlDbType.Date)
                cmd.Parameters.Add("@tokuCode", SqlDbType.NChar, 4)
                ' 引数に値を設定
                cmd.Parameters("@bango").Value = header.JuchuBango
                cmd.Parameters("@juchuBi").Value = header.JuchuBi
                cmd.Parameters("@tokuCode").Value = header.TokuisakiCode
                ' 受注ヘッダー表へ追加
                addCount = cmd.ExecuteNonQuery()
                ' 戻り値が1以外なら例外をスローし、
                ' 自動的にロールバック
                If Not addCount = 1 Then
                    Throw New DBIOException("受注ヘッダー表への追加失敗")
                End If

                ' 【受注ディテール表に追加】
                ' SQL文の生成
                cmd.CommandText = _
                    "INSERT INTO 受注ディテール表(受注番号, " & _
                    "受注行番号, 商品コード, 受注数量) " & _
                    "VALUES(@bango, @gyo, @hinCode, @suryo)"

                ' SQL文の引数設定
                cmd.Parameters.Clear()
                cmd.Parameters.Add("@bango", SqlDbType.NChar)
                cmd.Parameters.Add("@gyo", SqlDbType.SmallInt)
                cmd.Parameters.Add("@hinCode", SqlDbType.NChar, 5)
                cmd.Parameters.Add("@suryo", SqlDbType.Int)

                ' 明細行を1行ずつ受注ディテール表に追加
                For i As Integer = 0 To meisai.Count - 1
                    ' 引数に値を設定
                    cmd.Parameters("@bango").Value = header.JuchuBango
                    cmd.Parameters("@gyo").Value = i + 1
                    cmd.Parameters("@hinCode").Value = meisai(i).ShohinCode
                    cmd.Parameters("@suryo").Value = meisai(i).JuchuSuryo
                    ' 受注ディテール表へ追加
                    addCount = cmd.ExecuteNonQuery()
                    If addCount = 1 Then
                        ' 正常に受注ディテール表に追加
                        retInsertCount += 1
                    Else
                        ' 戻り値が1以外なら例外をスローし、
                        ' 自動的にロールバック
                        Throw New DBIOException _
                        ("受注ディテール表への追加失敗")
                    End If
                Next i
            End Using
          End Using
          ' 正常にレコード追加完了
          ' トランザクション完了(コミット)
          tran.Complete()
        End Using

        ' ◆戻値を設定してリターン
        Return retInsertCount

    End Function

End Class