SSブログ

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


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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

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