データ登録フォーム 伝票形式 その4 登録処理 [Form登録伝票版]
伝票形式での、登録処理の詳細です。
まず、画面中央右側にある「登録」ボタン。
この登録ボタンは、明細登録を行うための物です。
処理的には、「データ登録フォーム 1画面版 その4 データをテーブルに書き込む」と同じ要領なので、ここでの説明は省略します。
次に、画面下部分にある「伝票登録」ボタン。(前回からちょっと画面修正しました。)
このボタンで、伝票全体を登録します。
伝票登録を行うまでは、明細の内容はワークテーブルに登録されており、本来のデータテーブルにはまだ登録されていません。
伝票登録処理で、ワークから本来のデータテーブルへの反映と、伝票部分(ラベルが緑色の項目)の登録処理を行います。
以下、伝票登録ボタンの処理を説明します。
Private Sub cmdDENENT_Click() '売上伝票データ 登録処理 Dim Cn As New ADODB.Connection Dim recW As New ADODB.Recordset Dim recD As New ADODB.Recordset Dim lngDNO As Long Dim lngCM As Long Dim datNow As Date datNow = Now '1)入力項目チェック '顧客CDチェック If IsNumeric(Me.txt顧客CD) = False Then MsgBox "顧客CDを入力して下さい。", vbInformation Me.txt顧客CD.SetFocus Exit Sub End If '注文日チェック If IsDate(Me.txt注文日) = False Then MsgBox "注文日を入力して下さい。", vbInformation Me.txt注文日.SetFocus Exit Sub End If '納品日チェック If IsDate(Me.txt納品日) = False Then MsgBox "納品日を入力して下さい。", vbInformation Me.txt納品日.SetFocus Exit Sub End If '担当者CDチェック If IsNumeric(Me.txt担当者CD) = False Then MsgBox "担当者CDを入力して下さい。", vbInformation Me.txt担当者CD.SetFocus Exit Sub End If '明細行が入力されているかチェック If DCount("*", "TW売上明細") = 0 Then MsgBox "明細行が入力されていません", vbExclamation Exit Sub End If '2)コネクション準備・トランザクション開始 Set Cn = CurrentProject.Connection Cn.BeginTrans If Me.txtDENmode = "新規" Then '3)伝票 新規登録 '伝票番号作成 recD.Open " SELECT MAX(伝票番号) AS DENNO FROM TD売上伝票 ", Cn, adOpenForwardOnly, adLockReadOnly If recD.EOF = True Then lngDNO = 1 Else lngDNO = Nz(recD!DENNO, 0) + 1 End If recD.Close 'レコードセットオープン recD.Open "SELECT * FROM TD売上伝票 WHERE 伝票番号 = " & lngDNO, Cn, adOpenForwardOnly, adLockOptimistic If recD.EOF = False Then MsgBox "新規伝票番号の採番に失敗しました。", vbCritical recD.Close Cn.RollbackTrans Exit Sub End If '新規レコード作成、項目セット recD.AddNew recD!伝票番号 = lngDNO recD!登録日 = Now Else '4)伝票 更新登録 'レコードセットオープン lngDNO = Me.txt伝票番号 recD.Open "SELECT * FROM TD売上伝票 WHERE 伝票番号 = " & lngDNO, Cn, adOpenForwardOnly, adLockOptimistic If recD.EOF Then MsgBox "変更する売上伝票データが見つかりません。", vbCritical recD.Close Cn.RollbackTrans Exit Sub End If End If '5)項目セット recD!顧客CD = Me.txt顧客CD recD!注文日 = Me.txt注文日 recD!納品日 = Me.txt納品日 recD!担当者CD = Me.txt担当者CD recD!メモ = Me.txtメモ recD!備考欄 = Me.txt備考欄 recD!税抜合計 = Me.txt税抜合計 recD!消費税額 = Me.txt消費税額 recD!総額合計 = Me.txt総額合計 recD!変更日 = Now recD.Update recD.Close '6)明細処理 '明細を削除 Cn.Execute "DELETE FROM TD売上明細 WHERE 伝票番号 = " & lngDNO 'ワークテーブルOPEN recW.Open " SELECT * FROM TW売上明細 ORDER BY 明細番号 ", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly 'TD売上明細 Open recD.Open " SELECT * FROM TD売上明細 WHERE 伝票番号 = " & lngDNO, Cn, adOpenForwardOnly, adLockOptimistic lngCM = 0 '7)ワークからTD売上明細へ While recW.EOF = False lngCM = lngCM + 1 recD.AddNew recD!伝票番号 = lngDNO recD!明細番号 = lngCM recD!商品CD = recW!商品CD recD!数量 = recW!数量 recD!単価 = recW!単価 recD!金額 = recW!金額 recD!消費税額 = recW!消費税額 recD!総額 = recW!総額 recD!備考欄 = recW!備考欄 recD!変更日 = datNow recD.Update recW.MoveNext Wend recD.Close recW.Close 'コミット Cn.CommitTrans '8)後処理 '変更の時は終了する If Me.txtDENmode <> "新規" Then DoCmd.Close acForm, Me.NAME Forms.F売上伝票一覧.subList.Requery Exit Sub End If '新規の時は初期化する 'ワークテーブル削除 Cn.Execute "DELETE FROM TW売上明細 " Call subMeiInit Call subDenInit Me.subMEI.Requery End Sub
以下、ブロックごとに説明です。
1)入力項目チェック
実際にデータを登録する前に、入力項目への入力が正しく行われているかチェックします。
このプログラムのチェックは、とりあえずのざっくりチェックですのでご了承下さい。
また、明細が1件も登録されていない場合、伝票の登録はできないようにしています。
2)コネクション準備・トランザクション開始
ADOで処理を行うための準備で、ここでは単純に、CurrentProjectのConnectionを利用しています。
ここから先、データの更新を行うので、トランザクションを開始しています。
今回の処理では、TD売上伝票テーブル・TD売上明細テーブルと、複数のテーブルに対して更新を行うのに加えて、TD売上明細テーブルへは、複数件のレコードを処理します。
途中、何らかの原因で処理が中断してしまった場合や、処理中の判断で処理を中止した場合などに、テーブルの更新内容が中途半端な状態になってしまう可能性があります。
トランザクションを行っておけば、更新内容を取り消したい場合は、ロールバックを行えば、トランザクションを開始した状態に簡単に戻すことができます。
プログラムが途中で停止した場合も、コミットがされていない限り、元の状態に戻ります。
バッチ処理など、複数の処理が一連で行われる場合も、トランザクションを利用すると便利です。
3)伝票 新規登録
伝票データの処理で、新規登録の場合です。
まず、キーとなる伝票番号を採番します。
ここでは単純にテーブル中の最大の番号から、1を加えた値を伝票番号とするようにしています。
採番した伝票番号を条件にして、TD売上伝票をオープンしています。
この時、新規作成なので、この伝票番号でレコードは抽出されないはずです。
念のため、レコードが抽出されてしまったときの処理を書いていますが、ここに来ることはまず無いと思われます。
AddNewで新規レコードを作成して、新規登録の時のみ設定する項目、伝票番号を設定します。
他の項目は、変更登録と共通の処理で設定します。
4)伝票 更新登録
伝票データの変更登録の場合です。
画面上に表示されている伝票番号を条件に、TD売上伝票をオープンしています。
普通であればレコードが抽出されるはずですが、念のためチェックを行っています。
5)項目セット
レコードの各盲目に、入力内容を設定しています。
Updateして、Closeして、伝票の処理はここで終了です。
6)明細処理
ここから明細の処理です。
ワークからTD売上明細にレコードを作成するので、あらかじめTD売上明細側のレコードを削除しておきます。
新規の場合は不要なんですが、念のため。
ワークテーブルのレコードセットと、TD売上明細のレコードセットをオープンします。
7)ワークからTD売上明細へ
ループでワークからTD売上明細へ、レコードを作成していきます。
この処理では、明細番号をきれいに振り直すようにしています。
明細レコードを作成し終えたら、更新処理は完了ですので、コミットを行っています。
8)後処理
更新処理の後、画面をどうするかの処理です。
新規の場合は、画面を初期化して、次の入力が行えるようにします。
変更の場合は、入力画面を終了して、一覧画面に戻ります。
戻る前に、一覧画面の一覧をRequeryして、最新の内容が表示された状態にしています。
伝票形式タイプは、複数のレコードを処理するので、少々手間がかかります。
処理が複数段階になっていますが、個々の処理は複雑ではないので、ADOによる基本的な処理ができれば、さほど難しくないと思います。
次回は、削除処理で完了です。
その5へつづく。
伝票入力で色々と手こずります。行番号を振ったり、行の挿入、入力項目の各項目の妥当性チェック、不要行チェック等。
参考にさせて頂きます。。。。。有り難うございます。
※主な Access テンプレートはVBAがなく参考になりませんでした。
by ナンボ ユキオ (2020-01-16 11:44)
ナンボ ユキオ様
コメントありがとうございます。
参考になれば幸いです。
また何かありましたら、なんでも書き込んでください。
管理人
by NZ (2020-01-16 13:34)