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

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

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

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

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

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

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

--------------------------------------------------------------------
                    ■ 受注ディテール行クラス ■

今回は、明細1行分クラスのClsInsertDetailRowを実装します。このクラス
は、明細行追加ボタンを押したときに、入力データをClsInsertDetailRowか
ら明細行リストに追加し、データグリッドビューに表示できるようにするた
めのクラスです。

列スタイルDataPropertyName(前号参照)に、このプロパティ名を設定する
と、データグリッドビューに商品名称や受注単価等の内容を表示できるよう
になります。

ClsInsertDetailRowは、基本クラス(基底クラス)ClsDetailRowBaseを継承
したクラスです。受注番号プロパティを継承クラス、その他のプロパティを
基本クラスに実装します。

ClsDetailRowBaseクラスは、
  Public MustInherit Class ClsDetailRowBase
と宣言して、抽象クラスとするので、インスタンスを生成できません。

ClsInsertDetailRowクラスは、
  Public Class ClsInsertDetailRow
      Inherits ClsDetailRowBase
と宣言して、基本クラスを継承します。インスタンスは、このクラスから生
成します。

商品名称・受注単価・受注金額は、データグリッドビューに表示するだけな
ので、ReadOnlyプロパティにします。

入力データのエラーチェックは、Setプロパティに実装します。

ClsShohinと ClsJuchuDetailIOが未実装なので、このままビルドすると、エ
ラーになります。◆◆行をコメントアウトします。エラー部分は、次号から
実装していきます。


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

Option Strict On

Imports System.Text.RegularExpressions

'%%%%%%%%%%%%% 抽象クラス:受注ディテール行クラス %%%%%%%%%%%
Public MustInherit Class ClsDetailRowBase

    '--------------------< メンバ:変数 >-------------------
    Private shohinCodeValue As String         ' 商品コード
    Private shohinMeishoValue As String       ' 商品名称
    Private juchuSuryoValue As Integer        ' 受注数量
    Private juchuTankaValue As Integer        ' 受注単価

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

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

    End Sub

    '------------------------------------------------------
    ' プロパティ:商品コード
    '------------------------------------------------------
    Public Property ShohinCode() As String

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

        ' Setプロパティ
        Set(ByVal value As String)
            ' 【エラーチェック】エラー時は例外をスロー
            If Not Regex.IsMatch(value, "^[0-9]+$") Then
                ' 数字以外は例外をスルー
                Throw New ShohinCodeException _
                ("商品コードに数字以外の文字があります")
            Else
                ' 商品インスタンスの生成
                '◆◆Dim shohin As New ClsShohin(value)

                ' 商品コードをプライベート変数にセット
                '◆◆shohinCodeValue = value
                ' 商品名称をプライベート変数にセット
                '◆◆shohinMeishoValue = shohin.ShohinMeisho
                ' 商品単価をプライベート変数にセット
                '◆◆juchuTankaValue = shohin.Tanka

            End If

        End Set

    End Property

    '------------------------------------------------------
    ' プロパティ:商品名称(読取専用)
    '------------------------------------------------------
    Public ReadOnly Property ShohinMeisho() As String

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

    End Property

    '------------------------------------------------------
    ' プロパティ:受注数量
    '------------------------------------------------------
    Public Property JuchuSuryo() As Integer

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

        ' Setプロパティ
        Set(ByVal value As Integer)
            '【エラーチェック】1から100なら正常
            If value >= 0 And value <= 100 Then
                juchuSuryoValue = value
            Else
                Throw New JuchuSuryoException _
                ("受注数量は1から100を入力してください")
            End If
        End Set

    End Property

    '------------------------------------------------------
    ' プロパティ:受注単価(読取専用)
    '------------------------------------------------------
    Public ReadOnly Property JuchuTanka() As Integer

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

    End Property

    '------------------------------------------------------
    ' プロパティ:受注金額(読取専用)
    '------------------------------------------------------
    Public ReadOnly Property JuchuKingaku() As Integer

        ' Getプロパティ
        Get
            Return juchuTankaValue * juchuSuryoValue
        End Get

    End Property

End Class


'%%%%%%%%%%%%%%%%% 受注ディテール追加クラス %%%%%%%%%%%%%%%%%
Public Class ClsInsertDetailRow
    Inherits ClsDetailRowBase

    '--------------------< メンバ:変数 >-------------------
    Private juchuBangoValue As String        ' 受注番号

    '======================================================
    ' 機能:コンストラクタ
    ' 引数:ディテール表に追加する行データ
    ' 戻値:なし
    '======================================================
    Public Sub New(ByVal row As DataRow)

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

        ' エラーチェックとデータセット
        ShohinCode = CStr(row("商品コード"))
        JuchuSuryo = CInt(row("受注数量"))

    End Sub

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

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

        ' Setプロパティ
        Set(ByVal value As String)
            ' 【エラーチェック】
            If value.Length = 0 Then
                ' 未入力はエラー
                Throw New JuchuBangoException _
                    ("受注番号を入力してください")
            End If

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

            ' 受注ディテール表にアクセス
            '◆◆Dim dbIO As New ClsJuchuDetailIO
            ' 受注番号が受注ディテール表にあればエラー
            '◆◆If dbIO.ExistKeyData(value) = True Then
            '◆◆    Throw New JuchuBangoException _
            '◆◆        ("受注番号は登録済みです")
            '◆◆End If

            juchuBangoValue = value

        End Set

    End Property

End Class


--------------------------------------------------------------------
次号:商品クラスClsShohinの実装

====================================================================
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」
などホームページに掲載されている会社名・製品名等は、各社の登録商標ま
たは商標です。
====================================================================