受注伝票アクセスクラス[VB 2013]

Visual Basic 2010/2008 やさしいADO.NET DBプログラム

   やさしい VB2010/2008 ADO.NET

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

受注ヘッダー表・ディテール表アクセスクラスの実装

受注エントリー画面

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

受注ヘッダー表と受注ディテール表にレコードを追加する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

Copyright© やさしいVB2012/2010 ADO.NET. All rights reserved.