前回までに、入庫及び出庫のデータ登録フォームを作成してきました。このままでも運用は可能ですが、ヒトが行う作業はエラーがつきものと考える必要があります。例えば、次のような事例が考えられます。
・連続して入出庫処理した際に、前のデータをそのまま登録してしまった。
・入庫数や出庫数にマイナスの数字を入力してしまった。(現状は登録可能です。)
・出庫した際に、在庫数量がマイナスになってしまった。
人間系によるエラーは100%なくすことはできません。しかしながら、一度エラーが起きてしまうと、リカバリーすることも大変です。せっかく業務効率を改善するために作成したシステムも使ってもらえなくては意味がありません。そのため、次の要件をVBAソースコードに追加していきます。
これまでに紹介したソースコードを改めて追記・修正しますので、予め内容の確認をお願いいたします。
データ登録後のクリア処理
まずは、連続入出庫処理をする際の登録方法を考えてみましょう。品目情報と入庫数・出庫数は都度変わると思いますが、一方で担当者情報は同一人物が登録することを考えれば、連続して同じデータを登録することになると考えられます。(データインプットのオペレーターがいると話は変わってきますが…。)
このように、業務プロセスを考慮してデータ登録の処理フローから適切な処理を施し、フールプルーフの機能を設けます。
※フールプルーフ: ユーザーが操作方法等を間違ってもエラーが生じないように予め策を講じておくこと、またその構造や仕組み。
いずれのデータ登録処理についても、ADOによるデータベースアクセスを閉じた後に、ガーベージコレクションを設定しています。そして、メッセージボックスにより処理が終了したことを知らせる仕組みとしていますが、このソースコード間にテキストボックス等に入力された値をクリアするようにします。
この方法は至って単純で、NULL(「””」と記載することでブランクとなります。)を設定します。
【入庫処理のソースコード】
'cn変数に対するガーベージコレクション Set cn = Nothing '以下2行を追加 Me.t_品目情報 = "" Me.t_入庫数 = "" MsgBox "処理を完了しました。"
【出庫処理のソースコード】
'cn変数に対するガーベージコレクション Set cn = Nothing '以下2行を追加 Me.t_出庫品目 = "" Me.t_出庫数 = "" MsgBox "処理を完了しました。"
以上で、連続データ処理時のエラーを未然防止できるようになりました。
入出庫数のマイナス登録禁止処理
数量登録をする際に、マイナスの値を登録することはありません。そこで、テキストボックスにマイナスの値が入っていることを検知した場合に、アラートを出して処理を中止する仕組みをソースコードに追記します。 なお、在庫登録の場合はゼロもおかしいので、今回の処理はゼロ以下をエラーとします。
If文を用いて、入庫または出庫登録時にそれぞれ数字が入力されているかをチェックしてますが、この際に、マイナスの値が入力されていたら処理を中止するように、If文を追加します。
【入庫処理のソースコード】
'品目情報が入力されていないと処理中止 If Me.t_品目情報 = "" Or IsNull(Me.t_品目情報) Then 'Nullか未入力かどちらかで処理中止 MsgBox "品目情報が選択されていません。" Exit Sub '入庫数が入力されていないと処理中止 ElseIf IsNumeric(Me.t_入庫数) = False Then MsgBox "入庫数が正しく入力されていません。(半角数字で入力)" Exit Sub '★ここにElseIf文を追加する。 ElseIf Me.t_入庫数 <= 0 Then MsgBox "入庫数にゼロ以下の値が入力されています。" Exit Sub '担当者情報が入力されていないと処理中止 ElseIf Me.t_担当者情報 = "" Or IsNull(Me.t_担当者情報) Then MsgBox "担当者情報が選択されていません。" Exit Sub End If
【出庫処理のソースコード】
'品目情報が入力されていないと処理中止 If Me.t_出庫品目 = "" Or IsNull(Me.t_出庫品目) Then 'Nullか未入力かどちらかで処理中止 MsgBox "品目情報が選択されていません。" Exit Sub '出庫数が入力されていないと処理中止 ElseIf IsNumeric(Me.t_出庫数) = False Then MsgBox "出庫数が正しく入力されていません。(半角数字で入力)" Exit Sub '★ここにElseIf文を追加する。 ElseIf Me.t_出庫数 <=0 Then MsgBox "出庫数にゼロ以下の値が入力されています。" Exit Sub '担当者情報が入力されていないと処理中止 ElseIf Me.t_出庫担当者 = "" Or IsNull(Me.t_出庫担当者) Then MsgBox "担当者情報が選択されていません。" Exit Sub End If
出庫処理時の在庫確認機能
出庫時に、在庫以上の数を払い出しすることはできません。したがって、出庫数として登録したデータが在庫数以下であることを確認し、もし条件を満足していなければ、データ登録処理を中止する機能を設けます。在庫の確認方法は「T_在庫テーブル」を用いて、当該品目の在庫を集計する方法が考えられますので、今回はこの方法をADOを用いて実現します。
さて、対象となるデータを集計するにあたっては、当該品目のレコードを抽出し、合計値を求めれば良く、SQL文を書くことで算出できます。この際に、GROUP BY句を用いるため、WHERE条件ではなく、HAVING句を用いますので注意してください。
まず、SQL文は次のように記載します。
SELECT Sum(T_在庫テーブル.在庫数) AS 在庫数の合計, T_在庫テーブル.品名 FROM T_在庫テーブル GROUP BY T_在庫テーブル.品名 HAVING (((T_在庫テーブル.品名)=[Forms]![F_メイン].[t_出庫品目]));
ここで、HAVING句の抽出条件に「F_メイン」フォームの「t_出庫品目」の値を参照するようにしていますが、参照先の記入に際しては、「[Forms]![フォーム名].[オブジェクト名]」となりますので、是非覚えておいてください。
また、Sum等の集計関数を用いる場合は、GROUP BYによる指定をしないとエラーとなりますので注意してください。今回の場合は、「品名」フィールドの値でグループ化し、その際に「在庫数」フィールドの合計を返すようにしています。
さて、SQL文で「在庫数の合計」を集計できるようにしましたので、これをVBAソースコードに記載します。この際の注意点として、先ほど紹介したフォーム上オブジェクトの参照先は「変数」として処理する必要があるということです。ダブルクオーテーション内に記述すると、そのまま文字列として認識されますので注意してください。詳しくは、実際のソースコードを確認してください。
Private Sub cmd_出庫処理_Click() '品目情報が入力されていないと処理中止 If Me.t_出庫品目 = "" Or IsNull(Me.t_出庫品目) Then 'Nullか未入力かどちらかで処理中止 MsgBox "品目情報が選択されていません。" Exit Sub '出庫数が入力されていないと処理中止 ElseIf IsNumeric(Me.t_出庫数) = False Then MsgBox "出庫数が正しく入力されていません。(半角数字で入力)" Exit Sub '出庫数がマイナスになっていないか確認。 ElseIf Me.t_出庫数 <= 0 Then MsgBox "出庫数にゼロ以下の値が入力されています。" Exit Sub '担当者情報が入力されていないと処理中止 ElseIf Me.t_出庫担当者 = "" Or IsNull(Me.t_出庫担当者) Then MsgBox "担当者情報が選択されていません。" Exit Sub End If Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'カレントデータベースへの接続 Set cn = CurrentProject.Connection '★ここからが追加された内容 'mySQL変数にSELECT文を格納。半角スペースの記入漏れに注意!! Dim mySQL As String mySQL = "SELECT Sum(T_在庫テーブル.在庫数) AS 在庫数の合計, T_在庫テーブル.品名" mySQL = mySQL + " FROM T_在庫テーブル" mySQL = mySQL + " GROUP BY T_在庫テーブル.品名 HAVING (((T_在庫テーブル.品名)= " & [Forms]![F_メイン].[t_出庫品目] & "));" 'mySQLで設定したSELECT文を開く rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic '在庫数のチェック: 在庫数から出庫数を引いた値がマイナスとなれば処理を中止する。 If rs!在庫数の合計 - Me.t_出庫数 < 0 ThenMsgBox "在庫数がマイナスとなるため、処理を中止します。"
'DBを閉じることを忘れないように!!
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Exit Sub
Else 'SELECT文で開いた内容は閉じる。 rs.Close End If '★ここまでが追加された内容 'T_出庫テーブルを開く(rs変数は使いまわしている。) rs.Open "T_出庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!出庫数 = Me.t_出庫数 rs!出庫年月日 = Now() rs!品名 = Me.t_出庫品目 rs!担当者 = Me.t_出庫担当者 'Updateで情報登録が完了する。 rs.Update 'テーブルを閉じる。 rs.Close 'T_在庫テーブルを開く rs.Open "T_在庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!在庫数 = -Me.t_出庫数 '出庫は在庫に対してマイナスの処理。 rs!在庫年月日 = Now() rs!品名 = Me.t_出庫品目 'Updateで情報登録が完了する。 rs.Update 'テーブルを閉じる。 rs.Close 'データベース接続を閉じる。 cn.Close 'ガーベージコレクション Set rs = Nothing Set cn = Nothing 'テキストボックスの値をリセット Me.t_出庫品目 = "" Me.t_出庫数 = "" MsgBox "処理を完了しました。" End Sub
以上のソースコードにより、今回挙げたエラーを防ぐことができるようになりました。
まとめ
今回はデータ登録作業に対するヒューマンエラーを未然に防止する策として、値のリセット、値の妥当性確認、エラーチェック機能の追加方法を紹介しました。
このようにして、効率的なデータ登録に加えて、登録するデータの妥当性チェックをすることで間違いを防ぐこともできますので、是非ご参考にしてみてください。次回は、登録したデータを確認するための画面を追加する方法を紹介します。
スポンサーリンク
コメント
SQLの部分で[1つ以上必要なパラメータの値が有りません]て言うエラーが出ます。何か解決策は有りますでしょうか?
どの部分のSQLでエラーが出ているか分からないのですが、良くあるパターンとして
フィールドの記載方法が間違っている、カンマ区切りできていない、スペースが抜けている、
等が挙げられます。
一度、これらの記載内容をご確認ください。
在庫テーブルと出庫テーブルのフィールドに[在庫数の合計]をつくるべきでしょうか?
各テーブルに「合計用」のフィールドを作るということでしょうか?
集計についてはクエリを用いれば良く、テーブル中に新たにフィールドを追加する必要はありません。