前回は、フォーム上で文書管理コードと年度から連番情報を取得し、最新の値を取得する機能を実装しました。
また、VBAにより処理プロセスを一つの「更新」プロシージャとして作成し、文書管理コードあるいは年度の情報が更新される都度、フォーム上の情報も更新する仕組みを設けました。特に、作成したプロシージャは「Call」を用いて何回も呼び出すことができますので、決まったルーチンに対しては活用できると思います。VBAについて詳しく知りたい方は専用の書籍を手元に置いて色々と試していただけると良いかと思います。私自身、いまだにコードの記載方法に悩んだ際には辞典を確認しています。
スポンサーリンク
データ登録のプロセス
今回作成する採番システムでは、一度テキストボックスに必要な情報を入力し、その後にVBAにより「T_管理」テーブルへデータを入力する仕組みとします。
これにより、ユーザーが直接テーブルへのデータ書き込みをすることを防止でき、データベースの健全性を維持する一助になります。
まず、データ登録のイベントはコマンドボタンをクリックすることとし、そのためにフォーム上にデータ登録用コマンドボタン(「cmd_登録」という名前にします。)を配置します。
配置したコマンドボタンのプロパティとして標題は「データ登録」に、背景色は「#F59D56」とします。
続いて、詳細セクションにある各テキストボックスは「T_管理」テーブルと直接紐づいていますので、ユーザーによる変更を防ぐため、編集ロックプロパティを全て「はい」とします。
これで、フォーム上での基本設定は完了しましたので、次は「cmd_登録」をクリックした際の処理を実装していきます。実装はVBAを用いますので、「cmd_登録」コマンドボタンの「クリック時」プロパティにイベントプロシージャを設定し、その後以下のコーディングをします。
Private Sub cmd_登録Click() On Error GoTo Err登録 'テキストボックスの入力チェック If Me.t_文書管理コード = "" Or IsNull(Me.t_文書管理コード) ThenMsgBox "文書管理コードが入力されていません。" Exit Sub
End If If Me.t_年度 = "" Or IsNull(Me.t_年度) ThenMsgBox "年度が入力されていません。" Exit Sub
End If If Me.t_文書題目 = "" Or IsNull(Me.t_文書題目) ThenMsgBox "文書題目が入力されていません。" Exit Sub
End If If Me.t_作成者 = "" Or IsNull(Me.t_作成者) ThenMsgBox "作成者が入力されていません。" Exit Sub
End If If Me.t_作成日 = "" Or IsNull(Me.t_作成日) ThenMsgBox "作成日が入力されていません。" Exit Sub
End If 'ADO処理のための変数宣言 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'データベースの接続 Set cn = CurrentProject.Connection 'T_管理テーブルを開く rs.Open "T_管理", cn, adOpenKeyset, adLockOptimistic '登録する番号に重複がないかチェックする。 '複数ユーザーが一度にDBを使う際に重複リスクあり。 rs.Filter = "文書管理コード = '" & Forms!F_Main.t_文書管理コード & "' AND 年度 = " & Forms!F_Main.t_年度 & " AND 連番 = " & Forms!F_Main.t_連番 'フィルタリング結果でレコードを確認した場合、連番の値を1つ繰り上げる。 If rs.RecordCount <> 0 Then MsgBox "すでに同一番号が登録されているため、連番を1つ繰り上げます。" Me.t_連番 = Me.t_連番 + 1 End If 'フィルタリングを解除する。 rs.Filter = "" 'レコードの新規追加 rs.AddNew rs!文書管理コード = Me.t_文書管理コード rs!年度 = Me.t_年度 rs!連番 = Me.t_連番 rs!文書題目 = Me.t_文書題目 rs!作成者 = Me.t_作成者 rs!作成日 = Me.t_作成日 rs.Update 'T_管理テーブルを閉じる rs.Close: Set rs = Nothing 'データベースの接続を切る cn.Close: Set cn = Nothing 'フォームをいったんリクエリーする。 Me.Requery '続けて採番することを考えてテキストボックスの値をリセット 'テキストボックスの値を削除する Me.t_文書題目 = "" Me.t_作成者 = "" Me.t_作成日 = "" '採番プロシージャを呼び出して、連番の値を1つ繰り上げる Call 採番 '登録完了のメッセージを表示する。 MsgBox "採番システムに情報を登録しました。" Exit_登録: Exit Sub Err_登録: MsgBox Err.Description Resume Exit_登録 End Sub
今回作成するシステムでテーブルへ直接入力せず、テキストボックスを介してのデータ登録の理由として、ユーザーによる入力値をチェックすることが目的となります。
紹介する例ではテキストボックスへの入力有無を確認するルーチンしか記載していませんが、例えば年度の値を確認して異常値(例えば2900年等の未来日が入力されている場合)には適切な値を入力するようにアラートを出すことができます。これにより、データベース内のデータの妥当性をより強固なものにしてくれます。
続いて、ADOにより「T_管理」テーブルへのデータ登録を行う処理となりますが、複数ユーザーが使用する場合、実は連番が重複する場合があります。これは、ユーザーが同時にデータベースにアクセスし、同一文書管理コード及び年度による連番を取得する際、「T_管理」テーブルに登録されている連番から処理しますので、次のようなことが考えられるのです。
①AさんがDBより連番を取得して文書題目等を入力している(T_管理テーブルへは未登録)
②BさんがDBよりAさんと同様の文書管理体系の連番を取得する ← この時点でバッティング!
したがって、「T_管理」テーブルへデータを登録する際には、連番に重複がないかの確認が必要となりますので、これを確認するための処理を加えています。
その後、ADOにより「T_管理」テーブルへフォーム上テキストに入力した値を登録していきます。
ADOによる操作は過去にも紹介していますのでご参照ください。
データ登録後、フォームをいったん更新して登録データを表示するようにします。この際、続けて採番することを考えて、文書題目、作成者、作成日の各テキストボックスの値は削除し、また連番は最新の値を取得するルーチンとしています。
そして最後に、データを登録した旨のメッセージを表示するようにしています。メッセージがないといつ登録が完了したかが分かりにくいため、例に示すようなコード加えることをお勧めします。
以上のコーディングによりデータ登録の処理ルーチンが完成しました。
まとめ
今回紹介する記事では、データベースへのデータ登録について、直接テーブルへ書き込みはせず、フォーム上の値を都度確認して取り込むルーチンとしました。これにより、結果としてユーザーによる入力ミスを減らすことができ、業務効率の改善にも繋がるものと考えられるわけです。
VBAによるコーディングは慣れないうちは大変だと思いますが、様々なコードを記載していくうちに自ずと記載できるようになるかと思います。事例を知るには様々な方法がありますが、書籍に示されている内容を理解するのが手っ取り早いかと思います。是非初期投資として書籍などを用意していただければと思います。
スポンサーリンク
コメント