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