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

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

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

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

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

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

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

--------------------------------------------------------------------
              ■ 明細行追加ボタンと明細行確認ボタン ■

今回は、明細行追加ボタンクリック処理と明細行確認ボタンクリック処理を
実装します。

商品コードと受注数量を入力します。

    ┌―――――┐ ┌―――――――――――――┐
 商品 │00001│ │             │
    └―――――┘ └―――――――――――――┘

    ┌――┬―┐   ┌―――┐   ┌――――┐
 数量 │2 │▲│ 単価│   │ 金額│    │
    │  │▼│   └―――┘   └――――┘
    └――┴―┘

そして、明細行追加ボタンを押すと、商品名称、単価、金額をラベルに表示
します。

    ┌―――――┐ ┌―――――――――――――┐
 商品 │00001│ │商品00001      │
    └―――――┘ └―――――――――――――┘

    ┌――┬―┐   ┌―――┐   ┌――――┐
 数量 │2 │▲│ 単価│200│ 金額│ 400│
    │  │▼│   └―――┘   └――――┘
    └――┴―┘

【明細行確認ボタンクリック処理】
商品コードを引数に指定して、商品クラスのインスタンスを生成します。そ
して、商品名称プロパティと、単価プロパティから、商品名称と単価を取得
します。受注金額は、単価×数量を計算し、表示形式を指定します。

  ' 商品クラスのインスタンス生成
  Dim shohin As New ClsShohin(TxtShohinCode.Text)
  ' 商品名称と単価を取得し、ラベルにセット
  LblShohinMeisho.Text = shohin.ShohinMeisho
  LblJuchuTanka.Text = CStr(shohin.Tanka)
  ' 受注金額を計算後、表示形式を指定し、ラベルにセット
  LblJuchuKingaku.Text = _
     (NudSuryo.Value * shohin.Tanka).ToString("#,##0")


次に、明細行追加ボタンを押すと、データグリッドビューに追加されます。
 ┌────────────────────────────┐
 │ 商品コード  商品名     数量   単価   金額│
 ├────────────────────────────┤
 │ 00001 商品00001   2  100  200│

【明細行追加ボタンクリック処理】
ClsInsertDetailRowクラスの共有メソッドCreateDataRowを呼び出して、受
注ディテール表の1行分を生成し、商品コードと受注数量をセットします。
そして、この行データを引数に指定して、ClsInsertDetailRowクラスのイン
スタンスを生成します。最後に、バインディングソースに追加すれば、受注
明細リストに追加されます。

  ' 受注ディテール表空行生成
  Dim dr As DataRow
  dr = ClsInsertDetailRow.CreateDataRow
  ' 入力データセット
  dr("商品コード") = TxtShohinCode.Text
  dr("受注数量") = NudSuryo.Value
  ' インスタンス生成
  Dim meisaiGyo As New ClsInsertDetailRow(dr)
  ' 受注明細リストに追加
  bindingSrc.Add(meisaiGyo)


明細行追加ボタンクリック処理と明細行確認ボタンクリック処理を、
FormJuchuEntryクラスに追加します。

--【プログラムソースリスト:FormJuchuEntry.vb】---------------------
    '*******************************************************
    ' 明細行確認ボタンクリック処理
    '*******************************************************
    Private Sub BtnGyoKakunin_Click _
      (ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles BtnGyoKakunin.Click

      Try
          ' 商品クラスのインスタンス生成
          Dim shohin As New ClsShohin(TxtShohinCode.Text)
          ' 商品名称と単価を取得し、ラベルにセット
          LblShohinMeisho.Text = shohin.ShohinMeisho
          LblJuchuTanka.Text = CStr(shohin.Tanka)
          ' 金額を計算後、表示形式を指定し、ラベルにセット
          LblJuchuKingaku.Text = _
              (NudSuryo.Value * shohin.Tanka).ToString("#,##0")

          ' 明細行追加ボタンにフォーカス
          BtnGyoTsuika.Focus()

      Catch ex As ShohinCodeException
          ' 商品コードエラー処理
          MessageBox.Show(ex.Message, "商品コードエラー")
          TxtShohinCode.Focus()

      Catch ex As DBIOException
          MessageBox.Show(ex.Message, "DBIO例外発生")

      Catch ex As Exception
          MessageBox.Show(ex.ToString, "その他例外発生")

      End Try

    End Sub

    '*******************************************************
    ' 明細行追加ボタンクリック処理
    '*******************************************************
    Private Sub BtnGyoTsuika_Click _
      (ByVal sender As System.Object, _
       ByVal e As System.EventArgs) Handles BtnGyoTsuika.Click

      Try
          ' 受注明細1行生成
          Dim dr As DataRow
          dr = ClsInsertDetailRow.CreateDataRow
          ' 入力データセット
          dr("商品コード") = TxtShohinCode.Text
          dr("受注数量") = NudSuryo.Value
          ' 受注明細1行を受注明細リストに追加
          Dim meisaiGyo As New ClsInsertDetailRow(dr)
          bindingSrc.Add(meisaiGyo)

          ' 受注合計金額を計算
          Dim sum As Integer = 0
          For i As Integer = 0 To meisaiList.Count - 1
              sum += meisaiList(i).JuchuKingaku
          Next
          LblGokeiKingaku.Text = sum.ToString("#,##0")

          ' 明細行クリア
          TxtShohinCode.Text = Nothing
          LblShohinMeisho.Text = Nothing
          NudSuryo.Value = 1
          LblJuchuTanka.Text = Nothing
          LblJuchuKingaku.Text = Nothing

          ' 商品コードにフォーカス
          TxtShohinCode.Focus()

          ' 明細行削除ボタン押下可能
          BtnGyoSakujo.Enabled = True
          ' 明細行変更ボタン押下可能
          BtnGyoHenko.Enabled = True

      Catch ex As ShohinCodeException
          ' 商品コードエラー処理
          MessageBox.Show(ex.Message, "商品コードエラー")
          TxtShohinCode.Focus()

      Catch ex As DBIOException
          MessageBox.Show(ex.Message, "DBIO例外発生")

      Catch ex As Exception
          MessageBox.Show(ex.ToString, "その他例外発生")

      End Try

    End Sub

--------------------------------------------------------------------
それから、ClsDetailRowBaseに、ClsInsertDetailRowクラスの共有メソッド
CreateDataRowを追加します。Sharedメソッドなので、抽象クラスからも呼
び出せます。中身は、ClsHanbaiKanriDBIOクラスのCreateDataRowを呼び出す
だけです。

ClsHanbaiKanriDBIOクラスにも、CreateDataRowを追加します。表の列情報を
取込むだけなので、適当にレコードを取得しています。

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

    '-------------------[ 定数メンバー ]--------------------
    Protected Const TABLE_NAME As String = "受注ディテール表"
    Protected Const KEY_FIELD As String = "受注番号"

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

        Dim retRow As DataRow
        Dim dbIO As New ClsHanbaiKanriDBIO(TABLE_NAME, KEY_FIELD)

        retRow = dbIO.CreateDataRow()

        Return retRow

    End Function


--【プログラムソースリスト:ClsHanbaiKanriDBIO.vb】-----------------
    '*******************************************************
    ' 機能:表対応の1行空データを生成するメソッド
    ' 引数:表名
    ' 引数:主キーフィールド(列名)
    ' 戻値:生成した1行分空データ
    '*******************************************************
    Public Function CreateDataRow() As DataRow

        Dim retDr As DataRow

        ' 表の列情報を取込むためにレコードを取得するが、
        ' 取得できなくても問題ないので、
        ' 第3引数のキー値にはアンダースコアを設定
        Dim dt As DataTable
        dt = GetKeyData(tableNameValue, keyFieldValue, "_")
        retDr = dt.NewRow

        Return retDr

    End Function

--------------------------------------------------------------------
次号:得意先クラスの実装です。

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