データ登録フォーム 伝票形式 その3 一覧画面から入力画面へ [Form登録伝票版]
まず最初に一覧画面が表示されます。
この画面は現在登録されているデータを確認する目的と、データを選んで編集画面へ展開する機能と、新規入力作業へ進む機能があります。
一覧画面の作り方は、「データ一覧フォーム その1」あたりを参考にしてください。
ここでは省略します。
まずは新規入力ボタン。
これがクリックされた時は、入力画面を新規入力として開きます。
フォームを開くのには、DoCmd.OpenFormを使います。
DoCmd.OpenFormは、最後のパラメタ(第7パラメタ)を使って、値を渡すことが出来ます。
ここに値がセットされていない場合は、開かれるフォーム側で新規で開かれたと判断するようにします。
新規入力ボタンの「クリック時」イベントに、以下のコードを記述します。
Private Sub cmdNEW_Click() '新規入力ボタン クリック DoCmd.OpenForm "F売上伝票入力", acNormal End Sub
次に「編集」ボタン。
既に登録されているデータを再度編集する場合は、一覧から該当データの編集ボタンをクリックします。
入力画面が選択されたデータの編集として開かれます。
入力画面を開くとき、先程のDoCmd.OpenFormの第7パラメタを使って、変更するデータのキーを渡すようにします。
入力画面側では、これによってどのデータの編集であるか判断します。
編集ボタンの「クリック時」イベントに、以下のコードを記述します。
Private Sub cmdEdit_Click() '編集ボタン クリック時 DoCmd.OpenForm "F売上伝票入力", acNormal, , , , , Me.txt伝票番号 End Sub
今回のテーブルでは、伝票番号がキーになっているので、この項目の値があればどのデータなのか識別できます。
キー項目が複数ある場合は、それなりに工夫が必要です。(カンマで区切るとか、ゼロ埋め固定長にして並べるとか)
後は入力画面のプログラムに引き継がれます。
新規入力で開いた場合の入力画面。
何も入力されていない状態で画面が開きます。
「注文日」に日付が表示されているのは、当日が初期値ということで。
編集ボタンから開いた場合の入力画面。
登録されている内容がコントロールにセットされた状態で開きます。
画面が開かれたときの処理は、フォームのイベント「開く時」(Form_Open)で行っています。
Private Sub Form_Open(Cancel As Integer) 'フォームオープン 初期設定処理 Dim Cn As New ADODB.Connection Dim recD As New ADODB.Recordset Dim recW As New ADODB.Recordset Dim strSQL As String '1)ワークテーブル削除 Set Cn = CurrentProject.Connection Cn.Execute "DELETE FROM TW売上明細 " Me.subMEI.Requery '2)入力コントロール初期化 Call subMeiInit Call subDenInit '3)変更モードならデータ呼び出し If Me.OpenArgs = "" Or IsNull(Me.OpenArgs) Then Exit Sub End If '4)伝票データ読込 recD.Open "SELECT * FROM TD売上伝票 WHERE 伝票番号 = " & Me.OpenArgs, Cn, adOpenForwardOnly, adLockReadOnly If recD.EOF Then MsgBox "変更伝票データが見つかりません。", vbExclamation DoCmd.Close acForm, Me.Name Exit Sub End If Me.txt伝票番号 = recD!伝票番号 Me.txt顧客CD = recD!顧客CD Me.txt注文日 = recD!注文日 Me.txt納品日 = recD!納品日 Me.txt担当者CD = recD!担当者CD Me.txt税抜合計 = recD!税抜合計 Me.txt消費税額 = recD!消費税額 Me.txt総額合計 = recD!総額合計 Me.txt備考欄 = recD!備考欄 Me.txtメモ = recD!メモ recD.Close '5)明細データをワークテーブルへ recW.Open "SELECT * FROM TW売上明細 ", Cn, adOpenForwardOnly, adLockOptimistic strSQL = " SELECT MEI.* , SYO.商品名 " & _ " FROM TD売上明細 AS MEI" & _ " LEFT JOIN TM商品 AS SYO ON MEI.商品CD = SYO.商品CD " & _ " WHERE MEI.伝票番号 = " & Me.OpenArgs & " ORDER BY MEI.明細番号 " recD.Open strSQL, Cn, adOpenForwardOnly, adLockReadOnly Do While recD.EOF = False recW.AddNew recW!伝票番号 = recD!伝票番号 recW!明細番号 = recD!明細番号 recW!商品CD = recD!商品CD recW!商品名 = recD!商品名 recW!数量 = recD!数量 recW!単価 = recD!単価 recW!金額 = recD!金額 recW!消費税額 = recD!消費税額 recW!総額 = recD!総額 recW!備考欄 = recD!備考欄 recW.Update recD.MoveNext Loop recW.Close recD.Close Me.subMEI.Requery '6)モード表示 Me.txtDENmode = "変更" End Sub
今回の説明に関係のない処理は省いてます。
コメントの番号順に説明していきます。
1)ワークテーブル削除
最初に、ワークテーブルを全件削除しておきます。
このワークテーブルの内容が、画面の明細部分に表示されます。
データが残っていた場合を考えて、まず削除を行っておきます。
2)入力コントロール初期化
画面のコントロールの内容をクリアします。
画面を開いたとき、通常であればコントロールの内容は空なわけですが、念のため空にする処理を通します。
クリアの関数を準備しておき、それを呼び出します。
初期値のある項目は、コントロールを空にする代わりに、クリア関数で初期値を設定するようにしておくと、コードで確認できてわかりやすいので、私はこのパターンを使ってます。
Private Sub subDenInit() '伝票項目クリア Me.txt伝票番号 = Null Me.txt顧客CD = Null Me.txt注文日 = Date Me.txt納品日 = Null Me.txt担当者CD = Null Me.txt税抜合計 = Null Me.txt消費税額 = Null Me.txt総額合計 = Null Me.txtメモ = Null Me.txt備考欄 = Null Me.txtDENmode = "新規" Me.txt顧客CD.SetFocus End Sub Private Sub subMeiInit() '明細項目クリア Me.txt明細番号 = Null Me.txt商品CD = Null Me.txt数量 = Null Me.txt単価 = Null Me.txt金額 = Null Me.txt明細消費税額 = Null Me.txt総額 = Null Me.txt明細備考欄 = Null Me.txtMEImode = "新規" Me.txt商品CD.SetFocus End Sub
こんなふうに、各項目を空にする処理を行います。
「注文日」のみ、今日の日付が初期値として表示されるようにしています。
フォーカスの位置もここで設定しています。
3)変更モードならデータ呼び出し
DoCmd.OpenFormの第7パラメタで設定した値は、Me.OpenArgsを参照することで確認できます。
Me.OpenArgsに値が設定されていなければ、新規で呼び出された事になります。
新規入力画面の準備はここまでで完了しているので、新規の場合はここで終了です。
Me.OpenArgsに値が設定されている場合は、その値をキーにして、データを読み込む処理を行います。
4)伝票データ読込
Me.OpenArgsに伝票番号がセットされているので、それを条件にして、伝票情報(TD売上伝票)を読み込んでいます。
5)明細データをワークテーブルへ
伝票データと同様に、Me.OpenArgsの伝票番号を条件にして、明細情報(TD売上明細)を読み込んで、それをワークテーブル(TW売上明細)に移し替えています。
この時、TD売上明細に商品名項目を持たせていないので、クエリで取得してワークテーブルにセットしています。
フォームのデータソースのクエリで商品マスタと結合して持ってきても良いのですが、今回は上記のようにしました。
INSERT文で追加しても良いと思いますが、ここでは追加用と読込用の2つのレコードセットを使って行っています。
ワークテーブルにデータができたら、サブフォームをRequeryして明細部分の表示を更新します。
6)モード表示
伝票の方のモード表示を「変更」にしています。
以上で画面表示の処理は完了です。
データの読込を、伝票と明細の2つについて行わなければならない点と、明細が複数件あってワークに一旦移す点がちょっと面倒です。
次回はデータ登録処理についてです。
その4へつづく。
コメント 0