データ登録フォーム 1画面版 その4 データをテーブルに書き込む [Form登録一画面版]
その1、その2、その3の続きです。
入力された内容を、テーブルに書き込む処理を、「登録」ボタンで実行します。
テーブルに書き込む前に、入力された内容のチェックを行い、よければ実際にテーブルに書き込みます。
テーブルへの書き込みは、ADOのレコードセットを使って行います。
まずは、ざっとソースを。
Private Sub cmdENT_Click()
'登録ボタン クリック
Dim recA As New ADODB.Recordset
'1.入力チェック
If IsNumeric(Me.txtCOMCD) = False Then
MsgBox "商品CDが正しく入力されていません。", vbExclamation
Exit Sub
End If
'以下、各項目をそれなりにチェック
' …
' …
'2.レコードセットオープン
recA.Open "SELECT * FROM TMSYOHIN WHERE COMCD = " & Me.txtCOMCD, _
CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
'3.項目編集
If Me.txtMODE = "新規" Then
'新規登録
If recA.EOF = False Then
MsgBox "すでにこの商品CDで登録されています。", vbExclamation
recA.Close
Exit Sub
End If
recA.AddNew
recA!COMCD = Me.txtCOMCD
recA!INSYMD = Now()
Else
'変更登録
If recA.EOF = True Then
MsgBox "変更データが見つかりません。", vbExclamation
recA.Close
Exit Sub
End If
End If
recA!COMMEI = Me.txtCOMMEI
recA!BUNCD = Me.txtBUNCD
recA!GENTANKA = Me.txtGENTANKA
recA!BAITANKA = Me.txtBAITANKA
recA!UPDYMD = Now()
recA.Update
recA.Close
'4.後処理
Me.subLIST.Requery
Call subCLR
End Sub
順番に説明をいきます。
1.入力チェック
入力された内容が、テーブルに登録できる内容かどうかチェックを行います。
ここでは、商品CDをIsNumericでチェックしかしていませんが、本当はもっときちんとやります。
たとえば下記のような内容を、全入力項目に対してチェックします。
・タイプチェック…数値か、文字か、日付か
・必須入力チェック…必ず入力されていること
・上限値・下限値チェック…数値なら最小値・最大値・小数点以下の桁数、文字なら文字数(またはバイト数)
詳しくはまた今度。(なんかこればっかり。)
2.レコードセットオープン
テーブルにデータを書き込む準備です。
recA.Open "SELECT * FROM TMSYOHIN WHERE COMCD = " & Me.txtCOMCD, _
CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
ADOでデータベースへアクセスする場合は、
1)まずはConnectionオープン
2)レコードセットを使うときはRecordsetオープン
の手順を踏みます。
今回はACCESSのデータベースにアクセスするので、ACCESS自身が接続しているConnectionを拝借して使っています。
Recordsetを使って、新たなレコードを作成する場合は、単純にデータを作成するテーブルをSELECTします。SELECTの後に指定するテーブル項目は、KEY項目と、値を入れる必要があるものだけで良いです。が、面倒臭いので、「*」を使います。あ、「*」は、多用しないほうがいいです。通常SQLのINSERTやUPDATEで使ってはいけません。この処理に限っては、後々の影響がないので使ってます。
レコードを新規作成するので、レコードが選択される必要はありません。逆に、選択されるとそれだけ負荷がかかるので、レコードが引っかからないWHERE句をわざと書きます。
次に、すでに登録されているレコードを変更する場合は、そのレコードのみがSELECTされるSQL文を指定します。SELECT項目は新規と一緒。
で、この画面では、新規と変更のどちらの場合でも、KeyをWhere句に指定すれば、新規ならレコードはSELECTされないはずだし、変更ならそのレコードがSELECTされるはずです。もし違った場合は、何かの間違いなので、処理を中止します。
3.項目編集
Recordsetを開いたら、データを書き込む前に、本当に処理が正常に行えるかチェックします。
現在の処理が「新規」登録なのか、「変更」登録なのかは、txtMODEの内容で判断します。
'3.項目編集
If Me.txtMODE = "新規" Then
'新規登録
If recA.EOF = False Then
MsgBox "すでにこの商品CDで登録されています。", vbExclamation
recA.Close
Exit Sub
End If
recA.AddNew
recA!COMCD = Me.txtCOMCD
recA!INSYMD = Now()
Else
新規にレコードを作成する場合は、作成しようとするKEYのレコードがすでに存在していないかチェックします。KEYが重複するデータは登録できないので。
もし、登録しようとした商品CDがすでにテーブルに存在していた場合、OpenのSELECT文でレコードが抽出されているため、EOFがFalseになります。
次に
recA.AddNew
AddNewでレコードを新規作成するという宣言をします。
これで、各項目に値をセットできるようになります。
IF文で新規モードに分岐しているので、先に新規の時のみセットする項目へ値をセットしておきます。
recA!COMCD = Me.txtCOMCD
recA!INSYMD = Now()
商品CDはKEY項目なので、これを書き込むのは新規登録を行う時のみです。変更モードでも書き換えません。
新規登録日時は、当然新規に登録した日付日時なので、新規の時以外かきこみません。
続いて、変更の方の分岐ですが、
'変更登録
If recA.EOF = True Then
MsgBox "変更データが見つかりません。", vbExclamation
recA.Close
Exit Sub
End If
End If
こちらは、変更対象データがきちんと抽出されているかチェックします。EOFがTrueだと、抽出されていません。
変更の時は、レコードが抽出されていれば、そのまま値をセットしていきます。
以下、新規変更共通の処理で、各項目に画面で入力された内容をセットしていきます。
recA!COMMEI = Me.txtCOMMEI
recA!BUNCD = Me.txtBUNCD
recA!GENTANKA = Me.txtGENTANKA
recA!BAITANKA = Me.txtBAITANKA
recA!UPDYMD = Now()
Recordsetへの値のセットが終わったら、
recA.Update
で、内容を反映させます。
Recordsetの処理が終わったら、
recA.Close
で、テーブルのレコードへの接続を閉じます。
4.後処理
Me.subLIST.Requery
Call subCLR
テーブルのデータが書き換えられたので、その内容を画面に反映させるため、サブフォームをRequeryします。
最後に、画面のクリア処理を呼び出して、入力用テキストボックスを空欄にもどします。
以上、とりあえずは、こんな感じで。
コメント 0