SSブログ

データ登録フォーム 伝票形式 その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へつづく。


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

ナンボ ユキオ

伝票入力で色々と手こずります。行番号を振ったり、行の挿入、入力項目の各項目の妥当性チェック、不要行チェック等。
参考にさせて頂きます。。。。。有り難うございます。

※主な Access テンプレートはVBAがなく参考になりませんでした。

by ナンボ ユキオ (2020-01-16 11:44) 

NZ

ナンボ ユキオ様
コメントありがとうございます。
参考になれば幸いです。
また何かありましたら、なんでも書き込んでください。

管理人
by NZ (2020-01-16 13:34) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。