バックナンバー 第85号:VB2008 データベースプログラミング

VB 2008 Express Editiont と、SQL Server 2008 Express with Advanced Services を使って、フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に登録する、受注伝票エントリープログラムを作成していきます。
受注伝票エントリー 第13回(受注登録ボタン)
第85号(2010.6.22発行)
====================================================================
       ★★ -- VB.NETデータベースプログラミング奮闘記 -- ★★
           (VB 2008 Express & SQL Server 2008 Express)
--------------------------------------------------------------------
いつもご購読ありがとうございます。ADO.NETの基本的なサンプルプログラ
ムをお届けします。これからもよろしくお願いいたします。

やさしいVB2008 ADO.NET → https://adonetvb.com/index.html
====================================================================
                ■■ 受注伝票エントリー 第13回 ■■

フォームから入力した受注データを、受注ヘッダー表と受注ディテール表に
登録するプログラムを作成します。

フォーム    → https://adonetvb.com/OrderEntry/index.html

テーブル定義  → https://adonetvb.com/OrderEntry/DB.html

バックナンバー → https://adonetvb.com/MailMagazine/index.html

--------------------------------------------------------------------
                        ■ 受注登録ボタン ■

今回から受注登録ボタンクリック処理を実装します。

伝票の入力が完了したら、受注登録ボタンをクリックします。エラーがなけ
れば、受注ヘッダー表と受注ディテール表に入力データを追加します。

【受注登録ボタンクリック処理】
受注ヘッダー表の空データ1行分を生成し、受注日・受注番号・得意先コー
ドをセットします。この受注ヘッダーデータと受注明細行リストを引数に指
定して、受注伝票クラスのインスタンスを生成します。

そして受注伝票クラスのInsertRecordメソッドを呼び出し、受注ヘッダー表
と受注ディテール表に受注データを追加します。

この受注登録ボタンクリック処理を、FormJuchuEntryクラスに追加します。

--【プログラムソースリスト:FormJuchuEntry.vb】---------------------
    '*******************************************************
    ' 受注登録ボタンクリック処理
    '*******************************************************
    Private Sub BtnTouroku_Click _
        (ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles BtnTouroku.Click

        Try
            ' 受注ヘッダー表の空行を生成
            Dim dr As DataRow
            dr = ClsHeader.CreateDataRow()

            ' 入力した受注ヘッダーデータをセット
            dr("受注日") = LblJuchuBi.Text
            dr("受注番号") = TxtJuchuBango.Text
            dr("得意先コード") = TxtTokuisakiCode.Text

            ' 受注伝票インスタンス生成
            Dim denpyo As New ClsJuchuDenpyo(dr, meisaiList)

            ' 受注ヘッダー表・受注ディテール表にレコード追加
            denpyo.InsertRecord()

            '正常にレコード追加のメッセージ表示
            MessageBox.Show _
                ("受注伝票を登録しました", "受注エントリー")

            ' ヘッダー部初期化
            InitialHeader()
            ' ディテール部初期化
            InitialDetail()

        Catch ex As JuchuBangoException
            ' 受注番号例外が発生した時の処理
            MessageBox.Show(ex.Message, "受注番号エラー")
            ' 受注番号にフォーカス
            TxtJuchuBango.Focus()

        Catch ex As TokuisakiCodeException
            ' 得意先コードエラー処理
            MessageBox.Show(ex.Message, "得意先コードエラー")
            ' 得意先コードにフォーカス
            TxtTokuisakiCode.Focus()

        Catch ex As ShohinCodeException
            ' 商品コードエラー処理
            MessageBox.Show(ex.Message, "明細行エラー")
            ' 商品コードにフォーカス
            TxtShohinCode.Focus()

        Catch ex As DBIOException
            ' DBIO例外が発生した時の処理
            MessageBox.Show(ex.Message, "DBIO例外発生")

        Catch ex As Exception
            ' その他例外が発生した時の処理
            MessageBox.Show(ex.ToString, "例外発生")

        End Try

    End Sub
--------------------------------------------------------------------
次に、受注ヘッダー基本クラスClsHeaderBaseに、入力した受注ヘッダー
データをセットするCreateDataRow共有メソッドを追加します。他の
CreateDataRowと同様に、ClsHanbaiKanriDBIOクラスのCreateDataRowを呼び
出すだけです。

クラスファイルClsJuchuHeader.vbに実装します。

--【プログラムソースリスト:ClsJuchuHeader.vb】---------------------

Option Strict On
Imports System.Text.RegularExpressions

'%%%%%%%%%%% 抽象クラス:受注ヘッダー基本クラス %%%%%%%%%%%%
Public MustInherit Class ClsHeaderBase

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

    '-------------------[ 変数メンバー ]--------------------
    Protected juchuBiValue As Date           ' 受注日
    Protected juchuBangoValue As String      ' 受注番号
    Protected tokuisakiCodeValue As String   ' 得意先コード

    '*******************************************************
    ' 機能:受注ヘッダー表1行の空データ生成メソッド
    ' 引数:なし
    ' 戻値:受注ヘッダー表の1行分空データ
    ' 補足:インスタンスの生成不要
    '*******************************************************
    Public Shared Function CreateDataRow() As DataRow

        Dim retDr As DataRow                   ' リターン値

        ' 受注ヘッダー表の1行分空データ生成
        Dim dbIO As New ClsHanbaiKanriDBIO(TABLE_NAME, KEY_FIELD)
        retDr = dbIO.CreateDataRow()

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

    End Function

End Class

--------------------------------------------------------------------

さらに受注伝票クラスClsJuchuDenpyoを実装します。ClsJuchuDenpyoのコン
ストラクタは、二つの引数を指定します。ひとつは、受注ヘッダーデータ(
エラー未チェックの)、もうひとつは、受注明細行リスト(エラーチェック
済)です。これらを内部変数にセットします。このとき受注ヘッダーにエラー
があれば、例外をスローします。

受注ヘッダー表と受注ディテール表にレコードを追加するInsertRecordメ
ソッドは、受注ヘッダーデータと明細行リストを引数に指定して、
ClsJuchuDenpyoIOクラスの追加メソッドInsertRecordを呼び出します。

ClsJuchuDenpyoクラスをClsJuchuDenpyo.vbに実装します。

--【プログラムソースリスト:ClsJuchuDenpyo.vb】---------------------
Option Strict On
Imports System.Text.RegularExpressions

'%%%%%%%%%%%%%%%%%%%%% 受注伝票クラス %%%%%%%%%%%%%%%%%%%%%%

Public Class ClsJuchuDenpyo

    '-------------------[ メンバー変数 ]--------------------
    Private hValue As ClsInsertHeader  ' 受注ヘッダーデータ
    Private dValue _
        As List(Of ClsInsertDetailRow) ' 受注ディテールデータ

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:追加する受注ヘッダー表データ
    ' 引数:追加する受注ディテール表データ
    '=======================================================
    Public Sub New _
        (ByVal header As DataRow, _
         ByVal detail As List(Of ClsInsertDetailRow))

        ' 基本クラスのコンストラクタを呼び出す
        MyBase.New()

        ' 注:ヘッダーデータにエラーがあれば例外スロー
        hValue = New ClsInsertHeader(header)

        ' ディテール行有無チェック
        If detail.Count > 0 Then
            ' 行データがあれば、変数メンバーに値をセット
            dValue = New List(Of ClsInsertDetailRow)(detail)
        Else
            ' 行データがなければ例外スロー
            Throw New ShohinCodeException _
            ("明細を入力してください")
        End If

    End Sub

    '*******************************************************
    ' 機能:ヘッダー表とディテール表にレコードを追加する
    ' 引数:なし
    ' 戻値:受注ディテール表に追加したレコード数
    '*******************************************************
    Public Function InsertRecord() As Integer

        Dim retInsertCount As Integer      ' リターン値

        ' 受注ヘッダー表・受注ディテール表にレコード追加
        Dim dbio As New ClsJuchuDenpyoIO
        retInsertCount = dbio.InsertRecord(hValue, dValue)

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

    End Function

End Class

--------------------------------------------------------------------

その他未実装のクラスClsInsertHeader、ClsHeader、ClsJuchuDenpyoIOは、
次号で実装します。今号ではエラーにならないように仮実装しました。

--【プログラムソースリスト:ClsJuchuHeader.vb】---------------------

'////////// 派生クラス:受注ヘッダー表追加データ ///////////
Public Class ClsInsertHeader
    Inherits ClsHeaderBase

    '=======================================================
    ' 機能:コンストラクタ
    '=======================================================
    Public Sub New(ByVal row As DataRow)

        MyBase.New()

        ' 受注ヘッダーデータをセット
        juchuBiValue = CDate(row("受注日"))
        juchuBangoValue = CStr(row("受注番号"))
        tokuisakiCodeValue = CStr(row("得意先コード"))

     End Sub

End Class

'////// 派生クラス:受注ヘッダー表選択更新削除データ ///////
Public Class ClsHeader
    Inherits ClsHeaderBase

    '=======================================================
    ' 機能:コンストラクタ
    '=======================================================
    Public Sub New(ByVal juchuBango As String)

        MyBase.New()

    End Sub

End Class
--------------------------------------------------------------------

--【プログラムソースリスト:ClsJuchuDenpyoIO.vb】-------------------

Option Strict On
Imports System.Data.SqlClient
Imports System.Transactions  ' 参照の追加 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

        Return retInsertCount

    End Function

End Class

--------------------------------------------------------------------
次号は、クラスClsInsertHeader、ClsHeader、ClsJuchuDenpyoIOを実装しま
す。

====================================================================
VB.NET データベースプログラミング奮闘記
  発行者:
          http://park5.wakwak.com/‾weblab/
--------------------------------------------------------------------
このメールマガジン(マガジンID: 0000128094)は、
インターネットの本屋さん『まぐまぐ』から配信されています。
  http://www.mag2.com/

【購読中止の方法】購読の中止は次のホームページからお願い致します。
  http://park5.wakwak.com/‾weblab/
  http://www.mag2.com/m/0000128094.htm
--------------------------------------------------------------------
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などのホームページで公開しているソースプログラム・データの利用により
生じた損害等については、発行者は一切責任を負いません。ソースプログラ
ムの再利用は自由です。著作権は発行者が所有します。
このメールマガジン及び「すぐ使えるADO.NET」「やさしいBV2008 ADO.NET」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================