SSブログ

データ登録フォーム 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します。
 最後に、画面のクリア処理を呼び出して、入力用テキストボックスを空欄にもどします。

以上、とりあえずは、こんな感じで。


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

nice! 0

コメント 0

コメントを書く

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

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

トラックバック 0

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

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