#09 次の商品のバーコードの読み取り待ち状態の設定

一般的なレジ操作を思い浮かべれば分かるとおり、購入された商品は次々に単にバーコードが読み取られていくだけです。購入数量がみな1ケだけであれば、商品ごとに数量を入力したり商品ごとにEnterキーを押したりといった操作はありません。

一方、Accessのフォームの場合、次の商品の商品コードを入力するには、次のレコード、つまり新規レコードへとカレントレコードを進めなければなりません。本データベースの元の仕様であれば、すべてのデータをキーボードから入力したりマウスで選択したりするマニュアル操作が基本ですので、順番に所定のデータを入力していけばおのずと次レコードにフォーカスが移動します。さらに、#8のカスタマイズによって「数量」欄でEnterキーを押すだけで次レコードにフォーカスが移動するようになっています。しかし今回はそのような簡単なキー操作さえもできる限り除外しなければなりません。

そのようなことから、JANコードを次々と読み取るだけで連続した商品データを入力できるようにするためには、『もし数量入力待ちの状態で次の商品のバーコードが読み取られたら、カレントレコードを新規レコードに移動し、そのJANコードを自動入力する』という仕様にカスタマイズする必要性が出てきます。


このような処理を行う場合、まず考えられるのが「数量」テキストボックスの更新前処理イベントを使った次のような方法です。
  1. 入力されたデータを更新前処理イベントプロシージャによってチェックする。
  2. もしその値が13桁であればそれは数量ではなくJANコードが入力されたものと判断する。
  3. 数量が入力されたと判断されたときは、そのまま入力を確定する。
  4. JANコードが入力されたと判断されたときは、数量の入力をキャンセルした上で新規レコードに移動、そのJANコードを「商品コード」のテキストボックスに自動入力する。
しかしこの方法は本データベースの場合は使えません。なぜなら、「数量」フィールドは"長整数型"となっているため、13桁の大きさの数値を受け付けてくれないからです。更新前処理イベントは発生せず、その前の時点でエラーとなってしまいます。そこで、その対処方法として「数量」フィールドを"浮動小数点型"に変えるという方法もあるのですが、ここではフォームだけの変更に止められるよう、次のような考え方で処理するようにします。なお、通常の数量が入力されたときはエラーが発生しないので、特にチェック等のコードを入れる必要はありません。
  1. フォームの「エラー時」イベントを使って、上記のエラーを捉える。
  2. もし「数量」テキストボックスで発生したエラーであり、かつエラー内容が入力データの不正であるときはJANコードが入力されたものと判断する。
  3. JANコードが入力されたと判断されたときは、そこで入力されたJANコードを変数に保存した上で数量の入力をキャンセル、新規レコードに移動してそのJANコードを「商品コード」のテキストボックスに自動入力する。

この処理を行うプログラムは次のようになります。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'フォームのエラー時

  Dim strInputCode As String
  
  If Me.ActiveControl.Name = "数量" Then
    'アクティブコントロールが数量のとき
    If DataErr = 2113 Then
      '入力データ型が不正なとき
      '入力された値を変数に保存
      strInputCode = Me!数量.Text
      '入力をキャンセル
      Me!数量.Undo
      '新規レコードに移動
      Me.Recordset.AddNew
      '保存した値を入力
      Me!商品コード = strInputCode
      '商品コードの更新後処理イベントを実行
      商品コード_AfterUpdate
      'エラーを無視して継続
      Response = acDataErrContinue
    End If
  End If

End Sub

これを実行すると、次のような画面になります。見た目はこれまでと同じですが、とにかくバーコードを次々と読み取るだけの作業を行った結果の画面です。
バーコードを次々と読み取ったあとのフォームビュー

ただし、このプログラムはまだ基本的な部分だけで、厳密には次のようなことも考慮する必要があります。
  • アルファベットが入力されたときも同様のエラーが発生するので、それに対するチェックまたはエラー処理が必要です。

  • バーコードリーダーだけを使った入力作業をしている場合、あるいは数量をキーボードで変更したあとにEnterキーを押した場合、「数量」テキストボックスに入力された値は反転(範囲選択)された状態になっています。ところが、数量をマニュアル変更した場合、そのままでは値は反転された状態になっていません。縦長形状のカーソル状態になっています。そのような状態でJANコードが読み取られると、上記プログラムの「数量.Text」の値は、「元の値」+「JANコード」というようになってしまいます。そのため、それもチェックしてから新規レコードに代入するか、Form_Errorイベントプロシージャ内でエラー処理を行う必要があります。

なお、全体の操作手順をどのようにするかという考え方に依存するのですが、次のような仕様も考えられます。
『とにかくバーコードを読み取り完了した時点で次々と新規レコードに移動していくようにする』
この場合には、「商品コード」テキストボックス以外のすべてのコントロールの「タブストップ」プロパティを"いいえ"にすることでその操作を実現できます。#8のカスタマイズを踏まえれば、「数量」テキストボックスだけその設定変更を行うことで実現できます。ただし「1」以外の数量を入力したい場合もあるでしょうから、それについてはマウスを使うか、本シリーズで後述する矢印キーやファンクションキーによる例外的操作をモジュールに加えることになります。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved