データ登録フォーム 2画面版 その3 入力画面 [Form登録二画面版]
続いて入力画面の処理です。
新規の場合は、レコードの新規登録。変更の場合は、レコードの変更登録、または削除の処理を行います。
ではまず、「登録」ボタンをクリックしたときの処理から行きます。
Private Sub cmdENT_Click()
'登録ボタン クリック
Dim Cn As ADODB.Connection
Dim recA As New ADODB.Recordset
Dim datNOW As Date
'1)入力チェック
'項目のチェック処理
'(省略)
' …
'2)処理日時取得
datNOW = Now()
'3)Recordsetオープン
Set Cn = CurrentProject.Connection
recA.Open "SELECT * FROM TMCUS WHERE CUSCD = " & Me.txtCUSCD, _
Cn, adOpenForwardOnly, adLockOptimistic
'4)登録処理
If Me.txtMODE = "新規" Then
'新規登録
If recA.EOF = False Then
MsgBox "すでにこの得意先CDで登録されています。", vbExclamation
recA.Close
Exit Sub
End If
recA.AddNew
recA!CUSCD = Me.txtCUSCD
recA!INSYMD = datNOW
Else
'変更登録
If recA.EOF = True Then
MsgBox "変更データが見つかりません。", vbExclamation
recA.Close
Exit Sub
End If
End If
recA!KANJIMEI = Me.txtKANJIMEI
recA!KANAMEI = Me.txtKANAMEI
recA!ZIPCD = Me.txtZIPCD
recA!ADD1 = Me.txtADD1
recA!ADD2 = Me.txtADD2
recA!ADD3 = Me.txtADD3
recA!TEL = Me.txtTEL
recA!FAX = Me.txtFAX
recA!MAIL = Me.txtMAIL
recA!UPDYMD = datNOW
recA.Update
recA.Close
'5)後処理
MsgBox "登録が完了しました。", vbInformation
If Me.txtMODE = "新規" Then
'新規登録
Call subCLR
Else
'変更登録
Forms!FMCUS010.subLIST.Requery
DoCmd.Close acForm, Me.NAME
End If
End Sub
基本的にやってることは、「データ登録フォーム 1画面版 その4 データをテーブルに書き込む」と同じなので、細かい説明は割愛します。
最後の5)の部分が、1画面版とは違っています。
新規登録の場合は、1件登録し終わったら、続けて別のレコードを登録するかも知れないので、再び画面を空の状態に戻して、この画面のまま続けて登録作業が出来るようにしています。
変更登録の場合は、画面を閉じて、一覧画面へ戻ります。その際、レコードの内容が変更されているので、一覧をRequeryします。
次に、「削除」ボタンの処理。
Private Sub cmdDEL_Click()
'削除ボタン クリック
Dim Cn As ADODB.Connection
Dim recA As New ADODB.Recordset
'1)対象データをSelect
Set Cn = CurrentProject.Connection
recA.Open "SELECT * FROM TMCUS WHERE CUSCD = " & Me.txtCUSCD, _
CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
If recA.EOF = True Then
MsgBox "削除データが見つかりません。", vbExclamation
recA.Close
Exit Sub
End If
'2)削除確認、実行
If MsgBox("得意先CD:" & recA!CUSCD & "・得意先名:" & recA!KANJIMEI & _
vbCrLf & "このデータを削除します。よろしいですか?", 324) = vbNo Then
recA.Close
Exit Sub
End If
recA.Delete
'3)後処理
recA.Close
Forms!FMCUS010.subLIST.Requery
DoCmd.Close acForm, Me.NAME
End Sub
こちらもやってることは概ね同じです。こちらも最後に、Requeryして、画面を閉じて一覧へ戻るようにしています。
ちょっと余談ですが、Recordset を使用してレコードを処理するのと、SQL文でUPDATEやINSERT文を実行するのと、どちらが効率がよいか?という内容をよく見かけます。そりゃ、SQL文を実行する方が、早いです。クライアント側は、テキスト文を送信するだけですので。
でも、こういう画面の処理で、1件やそこらの少ない件数のデータであれば、気にするような物ではないと思います。
それよりなにより、VBでSQL文を組み立てるコーディングをするのが、私は面倒くさくて嫌いです。いっぱい「&」で繋げるのが、面倒くさいし、ソースが見難くなるし。
そんなわけで、私はRecordset派です。
最後に、「終了」ボタンの処理です。
Private Sub cmdEXIT_Click()
'終了ボタン クリック
Forms!FMCUS010.subLIST.Requery
DoCmd.Close acForm, Me.NAME
End Sub
画面を閉じて一覧へ戻るのですが、テーブルのデータが変更されている可能性があるので、Requeryをかけています。
以上、2画面版の登録画面でした。
データ登録フォーム 2画面版 その2 一覧画面から入力画面へ [Form登録二画面版]
まずは一覧画面から行きます。
このタイプの画面についての説明は、「データ一覧フォーム」等をご参照ください。ここでは、メンテ画面機能に絞って説明します。
まず、「新規登録」ボタン。
新規にマスタを登録するときの画面を呼び出します。
何も入っていない入力画面を表示するだけです。
次に、「編集」ボタン。
クリックされた行のレコードを編集する場合は、こっちをクリックします。
クリックされたレコードの内容がセットされた入力画面が表示されます。(その後、必要な箇所を入力して、変更登録します。)
どちらも DoCmd.OpenForm で入力画面を開く処理を行います。その後、「編集」の場合は、該当レコードの内容を取得して、画面にセットする処理を行います。
その処理までこのボタンのイベントに書いても良いのですが、DoCmd.OpenForm は、フォームに対して引数を渡すことができるので、これを利用して後の処理はオープンされるフォームにまかせる形で、処理を作ります。
DoCmd.OpenForm の構文
DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode][, windowmode][, openargs]
formname が、オープンするフォームの名前で、あとはだいたい省略で、一番最後の openargs がフォームに渡す引数になります。
では、コーディング。
「新規登録」ボタンクリック時のイベント
Private Sub cmdENT_Click()
'新規登録ボタン クリック
DoCmd.OpenForm "FMCUS030"
End Sub
「FMCUS030」が、入力画面のフォーム名です。新規登録の場合は、引数なしで呼び出します。
次に、「編集」ボタンクリック時のイベント。
Private Sub cmdUPD_Click()
'編集ボタン クリック
DoCmd.OpenForm "FMCUS030", , , , , , Me.txtCUSCD
End Sub
引数として、選択されたレコードの、得意先コードを指定しています。この例の得意先マスタは、得意先コードがKEYになっています。引数項目はひとつしかないので、KEYが複数項目で構成されている場合は、工夫が必要になります。項目を連結した固定長と言うことにして、受け取り側で切り分けるとか。
ここから先は、入力画面フォームの処理です。
こっちの画面の Form_Open イベントで、続きの処理を行います。
Private Sub Form_Open(Cancel As Integer)
'フォームオープン 初期化処理
Dim Cn As ADODB.Connection
Dim recA As New ADODB.Recordset
'1)画面最大化と項目クリア
DoCmd.Maximize
Call subCLR
'2)引数確認
If IsNull(Me.OpenArgs) = True Then
Exit Sub
End If
'3)変更レコード取得
Set Cn = CurrentProject.Connection
recA.Open " SELECT * FROM TMCUS " & _
" WHERE CUSCD = " & Me.OpenArgs, Cn, adOpenForwardOnly,
adLockReadOnly
If recA.EOF = True Then
MsgBox "変更レコードが見つかりません。", vbCritical
recA.Close
Exit Sub
End If
'4)項目セット
Me.txtCUSCD = recA!CUSCD
Me.txtKANJIMEI = recA!KANJIMEI
Me.txtKANAMEI = recA!KANAMEI
Me.txtZIPCD = recA!ZIPCD
Me.txtADD1 = recA!ADD1
Me.txtADD2 = recA!ADD2
Me.txtADD3 = recA!ADD3
Me.txtTEL = recA!TEL
Me.txtFAX = recA!FAX
Me.txtMAIL = recA!MAIL
recA.Close
’5)変更モード
Me.txtMODE = "変更"
Me.txtKANJIMEI.SetFocus
Me.txtCUSCD.Enabled = False
Me.cmdDEL.Visible = True
End Sub
Private Sub subCLR()
'クリア
Me.txtCUSCD = Null
Me.txtKANJIMEI = Null
Me.txtKANAMEI = Null
Me.txtZIPCD = Null
Me.txtADD1 = Null
Me.txtADD2 = Null
Me.txtADD3 = Null
Me.txtTEL = Null
Me.txtFAX = Null
Me.txtMAIL = Null
Me.txtMODE = "新規"
Me.txtCUSCD.Enabled = True
Me.txtCUSCD.SetFocus
Me.cmdDEL.Visible = True
End Sub
1)画面最大化と項目クリア
フォームを開いたときは、速やかに最大化します。他の物を隠します。はい。
Call subCLR は、項目入力用のテキストボックスをすべて空にするサブプロシジャです。テキストボックスのクリアといっしょに、「新規」の表示と、「得意先CD」項目のロックの解除、「削除」ボタンの非表示設定をしています。(新規登録のときは、削除処理はないので)
厳密に処理を考えていくと、不要な部分もあるのですが、冗長な書き方をすることで、へんなバグを引き起こさない為のおまじないみたいな物です。もっと複雑な仕掛けを作る時に、この習慣が効果を発揮します。
2)引数確認
DoCmd.OpenForm で、引数が渡されたかどうかをチェックします。引数は、フォームの OpenArgs プロパティにセットされています。引数が無い場合は、OpenArgs は Null です。引数が無い場合は新規登録モードで、画面は 1)の処理で新規登録の状態になっているので、ここで処理終了です。
変更モードの場合は、レコードの内容をセットする処理へ続きます。
3)変更レコード取得
OpenArgs をKEYにして、テーブルからレコードを探します。見つからないことはまず無いのですが、レコードセットを Open したときは必ず EOF を確認するようにします。
4)項目セット
レコードセットの項目をひたすら画面のコントロールへセットしていきます。テーブルの項目名と、コントロールの名前を合わせておくと、コーディングが楽です。
5)変更モード
画面の表示を、「変更」にして、KEY項目の「得意先CD」を変更できないようにします。変更モードでは、レコードの削除も行うので、「削除」ボタンを表示します。
以上で、入力画面の表示処理は完了です。
データ登録フォーム 2画面版 その1 [Form登録二画面版]
1画面版のデータ登録画面に引き続き、次は2画面版の登録画面です。
データの一覧画面と、入力用の画面を別々に設けます。入力項目が多い場合用で、画面全体を使って項目を配置します。
得意先(顧客)マスタとか、商品マスタとか、そこそこの項目数になるマスタは、この形式で作ります。
一覧画面はこんな感じ。既出の物と同じような感じです。新規のデータを登録する場合は、上部の「新規登録」ボタンをクリックします。既存データを編集する場合は、一覧の「編集」ボタンをクリックします。