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