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

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

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

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

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

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

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

--------------------------------------------------------------------
                   ■ 受注ヘッダーデータクラス ■

前号で仮実装したClsInsertHeaderクラスとClsHeaderクラスを本実装します。
ClsJuchuDenpyoIOクラスは次号に掲載します。

【ClsInsertHeaderクラス】
受注ヘッダー表に登録するデータを管理するクラスで、受注ヘッダーデータ
基本クラスClsHeaderBaseを継承します。

ClsHeaderBaseクラスには、JuchuBiプロパティ、TokuisakiCodeプロパティ、
CheckJuchuBangoメソッドを実装します。

ClsInsertHeaderクラスとClsHeaderクラスには、JuchuBangoプロパティを
実装します。

--【プログラムソースリスト: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
    ' ここまで85号に掲載

    '-------------------------------------------------------
    ' プロパティ:受注日
    '-------------------------------------------------------
    Public Property JuchuBi() As Date

        ' Getプロパティ
        Get
            Return juchuBiValue
        End Get

        ' Setプロパティ
        Set(ByVal value As Date)
            juchuBiValue = value
        End Set

    End Property

    '-------------------------------------------------------
    ' プロパティ:得意先コード
    '-------------------------------------------------------
    Public Property TokuisakiCode() As String

        ' Getプロパティ
        Get
            Return tokuisakiCodeValue
        End Get

        ' Setプロパティ
        Set(ByVal tCode As String)
            ' 得意先エラーチェック
            Dim tokui As New ClsTokuisaki(tCode)
            tokuisakiCodeValue = tCode
        End Set

    End Property

    '*******************************************************
    ' 機能:受注番号のエラーチェックメソッド
    ' 引数:受注番号
    ' 補足:エラーがあれば例外をスロー
    '*******************************************************
    Protected Sub CheckJuchuBango(ByVal juchuBango As String)

        ' 未入力はエラー
        If juchuBango.Length = 0 Then
            Throw New JuchuBangoException _
                ("受注番号を入力してください")
        End If

        ' 数字以外はエラー
        If Not Regex.IsMatch(juchuBango, "^[0-9]+$") Then
            Throw New JuchuBangoException _
                ("受注番号に数字以外の文字があります")
        End If

        ' 6桁以外はエラー
        If Not juchuBango.Length = 6 Then
            Throw New JuchuBangoException _
                ("受注番号の桁数が違います")
        End If

    End Sub

End Class

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

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:受注ヘッダーデータ
    '=======================================================
    Public Sub New(ByVal row As DataRow)

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

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

    End Sub

    '-------------------------------------------------------
    ' プロパティ:受注番号
    '-------------------------------------------------------
    Public Property JuchuBango() As String

        ' Getプロパティ
        Get
            Return juchuBangoValue
        End Get

        ' Setプロパティ
        Set(ByVal jBango As String)

            ' 受注番号エラーチェック
            CheckJuchuBango(jBango)

            ' 受注ヘッダー表からレコード取得
            Dim dbIO As New ClsHanbaiKanriDBIO( _
                TABLE_NAME, KEY_FIELD, jBango)
            Dim dt As DataTable = dbIO.GetRowsData()

            ' 受注ヘッダー表にレコードがなければ正常
            If dt.Rows.Count = 0 Then
                juchuBangoValue = jBango
            Else
                ' 受注ヘッダー表にレコードがあれば例外スロー
                Throw New JuchuBangoException _
                    ("この受注番号は登録済みです")
            End If

        End Set

    End Property

End Class

'////////////// 派生クラス:受注選択更新削除 ///////////////
Public Class ClsHeader
    Inherits ClsHeaderBase

    '=======================================================
    ' 機能:コンストラクタ
    ' 引数:受注番号
    '=======================================================
    Protected Sub New(ByVal juchuBango As String)

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

        ' 受注番号エラーチェック
        CheckJuchuBango(juchuBango)

        ' 受注ヘッダー表からレコード取得
        Dim dbIO As New ClsHanbaiKanriDBIO( _
            TABLE_NAME, KEY_FIELD, juchuBango)
        Dim dt As DataTable
        dt = dbIO.GetRowsData()

        ' 受注ヘッダー表にレコードがあれば正常
        If dt.Rows.Count = 1 Then
            ' レコードがあった時
            MyBase.JuchuBi = CDate(dt.Rows(0)("受注日"))
            juchuBangoValue = CStr(dt.Rows(0)("受注番号"))
            MyBase.TokuisakiCode = CStr(dt.Rows(0)("得意先コード"))
        Else
            ' レコードが無かった時エラー
            Throw New JuchuBangoException _
                ("受注ヘッダー表にレコードがありません")
        End If

    End Sub

    '-------------------------------------------------------
    ' プロパティ:受注番号(読取専用)
    '-------------------------------------------------------
    Public ReadOnly Property JuchuBango() As String

        ' Getプロパティ
        Get
            Return juchuBangoValue
        End Get

    End Property

End Class

--------------------------------------------------------------------
次号:受注ヘッダー表と受注ディテール表にレコードを追加(挿入)する
ClsJuchuDenpyoIOクラスを実装します。

====================================================================
VB.NET データベースプログラミング奮闘記
  発行者:ウェブ実験室(adonet~live.jp ~はあっとマーク)
          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」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================