#14 ファンクションキーによる売上伝票データの登録

購入された商品をバーコードリーダーによって次々と入力していき、お金を受け取って清算が完了したら、最後にそれらをデータベースに登録して次の顧客に備えます。

データベースの登録操作に関しては、すでに[登録]というコマンドボタンが用意されています。マウスならそれをクリックすれば済みますし、キーボードでもアクセスキーを使って「Alt+H」という操作で実行できます。しかし今回は"マウスは使わずかつできるだけ簡単なキー操作で"という条件になっていますので、この登録操作もファンクションキー1つで実現できるようにします。ここでは、「F4」キーに処理を割り当てることにしましょう。


さて、このファンクションキーの操作なのですが、前にやったように、「frm売上伝票入力_sub」フォームのキークリック時イベントで処理することができます。それによってサブフォーム内のどのコントロールにフォーカスがあってもその処理を実行させることができます。しかしそれだけでは不十分です。もしメインフォーム上のコントロールにフォーカスがあった場合には、そのイベントを検出することができません。そこで、ファンクションキーによる処理はメインフォームとサブフォーム両方に記述することにします。なお、メインフォーム「frm売上伝票入力」に関しても、事前に「キーイベント取得」プロパティを"はい"に設定しておくよう注意してください。


メイン/サブそれぞれのイベントプロシージャは次のようになります。

■メインフォーム側

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'フォームのキークリック時

  If KeyCode = vbKeyF4 Then
    '[F4]キーが押されたとき
    '登録ボタンの処理を実行
    cmdRegist_Click
  End If

End Sub


■サブフォーム側

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'フォームのキークリック時

  If KeyCode = vbKeyF4 Then
    '[F4]キーが押されたとき
    'メインフォームの登録ボタンの処理を実行
    With Parent
      !cmdRegist.SetFocus
      .cmdRegist_Click
    End With

  End If


メインフォーム側では、押されたキーのコードが「F4」かどうかをチェックし、そうであれば[登録]ボタンのクリック時イベントプロシージャである「cmdRegist_Click」を呼び出します。一方、サブフォームについては、メインフォームにすでに用意されている[登録]ボタンのクリック時イベントプロシージャを呼び出すのが一番簡単なのですが、モジュール上は別のクラスモジュールとなりますので、そのままでは呼び出すことができません。次の2点に注意する必要があります。
  • メインフォーム側の「cmdRegist_Click」プロシージャを"Public"に変更する

    Public Sub cmdRegist_Click()
    '[登録]ボタン

      '登録処理を実行
      cbfRegistData

    End Sub

    ※今回の場合には「cbfRegistData」プロシージャを"Public"にしてそれをサブフォームから呼び出す方法もあります。

  • サブフォームからメインフォームのプロシージャを呼び出すということで、「Parent.cmdRegist_Click」という記述を行う・・・・・"Parent"は"親"の意

また、「cbfRegistData」プロシージャでは、「frm売上伝票入力_sub」のレコードソースである「wtbl売上明細」テーブルを空にする処理を行っています。そのため、今回のデータベース固有の問題なのですが、フォーカスがサブフォーム内にありかつサブフォームのモジュールからその処理を呼び出した場合、レコード削除確認のイベントが発生してしまい、思わぬ確認メッセージが表示されてしまいます。それを回避するため、サブフォームからの「cmdRegist_Click」呼び出しに先立ち、いったんフォーカスをメインフォーム側の適当なコントロール(ここではcmdRegistコマンドボタン)に移動させるようにしています。


それでは、「frm売上伝票入力」フォームのフォームビューを開いて、その動作を確認してみましょう。

データ入力が完了した状態
データ入力が完了した状態

F4キーを押したあとの状態(次の売上伝票の入力待ち状態)
F4キーを押したあとの状態


以上で基本的には問題ないと思いますが、例外的な操作があった場合の対処を加味しておきましょう。それは『受取金額やおつりの清算前にF4キーを押してしまった場合』の対処です。現在のままでは、そのまま正常に登録処理が進んでしまいますので、F4キーが押された時点でまずそれをチェックするようにします。

これまでのプログラムを見ると、キークリック時イベントプロシージャでF4キーが押されたときにチェックすればよさそうに思えますが、実はこのフォームにはすでにそういった未入力チェックのコードが組み込まれています。それは、「frm売上伝票入力」フォームの「cbfRegistData」プロシージャにある次の1行です。

'入力必須データの未入力チェック
If IsEmptyData(Me!納品先コード, Me!請求先コード, Me!売上日付) Then Exit Function


今回はこれを利用することにします。「IsEmptyData」の引数リストにサブフォームの「受取金額」のテキストボックスを追加すれば上記チェック機能を追加できます。

'入力必須データの未入力チェック
If IsEmptyData(Me!納品先コード, Me!請求先コード, Me!frm売上伝票入力_sub!txt受取金額) Then Exit Function

ただし、「IsEmptyData」プロシージャではコントロール名をメッセージボックスに表示させるようになっています。
未入力メッセージ

これでは少々分かりづらいので、アレンジする必要があります。この場合、コントロール名を"受取金額"としてもよいのですが、サブフォームの「txt受取金額」テキストボックスの「タグ」プロパティを"受取金額"とすることで解決できます。その理由については「IsEmptyData」プロシージャのコードを参照してみてください。
未入力メッセージ


ユーザーの実際の画面操作においては、他にもどのような例外的なものが出てくるか想像できない部分もあります。もちろんそのようなものをできるだけ予見して、チェック機能やエラー処理を設けておくことが大切なのですが、ここではそれにあまり立ち入りません。実際にさまざまな"適当な"操作を行ってみて、逐一それらを追加してみてください。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved