これは前の質問の複製です。新しい質問を再作成して再度表示する必要はありません。元の質問をより多くのデータで編集するだけで、再び一番上に表示されます。
これが曖昧すぎるという理由だけで、誰も答えることができませんでした。これらのタイプのシステムでは、作業者が物理的にどのように作業するかがソリューションを推進します。アクションを合理化して、自然に流れ、厳密に必要な以上の移動や確認、処理を必要としないようにする必要があります。
それでは、何かを試してみましょう。
仮定
私はあなたの環境、機器、プロセスについて十分に知らないので、問題についていくつかの仮定をします:
データ入力用のはかりの近くにコンピューターが設置されています。
バーコードスキャナーとスケールの両方がコンピューターに接続されています
バーコードリーダーはHIDデバイスのように動作します(入力がキーボードで入力された場合のように)
バーコードリーダーは、各スキャンの後にCR(キャリッジリターン)サフィックスを追加するように構成されています(すべてのリーダーにはこのタイプの構成があります)。
従業員のバーコードは、魚に貼られているラベルの製品IDに沿って(上または下に)印刷されています。
従業員IDバーコードは次の形式になります@123456
。123456は従業員IDです。プレフィックスにより、システムはスキャンされたバーコードが従業員IDであることを検出できます
。英数字の文字列を印刷するには、 Code128など
を使用します。@
魚のバーコードラベルは、魚に貼られているか、カードに印刷されていると見なされます。
フィッシュバーコードのラベルは何でもかまいませんが、で始めることはできません@
。
スケールにはインターフェースがあると想定しています。どちらを使用するか、またはPCからデータを取得する方法については言及していないため、スケールに付属のSDK、または現在の重量を読み取ることができるものがあると想定する必要があります。
その関数を呼び出してReadScale()
、タスクに適した測定値で重み付きのフロートを返すと仮定しましょう。
労働者のプロセス
ここでも、いくつかの仮定を行います。正確な設定と物理的に実行されるアクションのフローによっては、状況が大きく異なる場合があります。その場合、ソフトウェアの動作も異なる必要があります。
重み付けとデータ入力によって最終的な操作になると思います。その時点で、ラベルはすでに魚/製品に適用されています。
可能なプロセス:
または:
最初の選択肢は、必要な操作が少なくて済みますが、製品がスケール上にある間、スキャンのためにラベルが表示される必要があります。それは真実かもしれないし、そうでないかもしれない。
ソフトウェアソリューション
あなたが望むものを達成するための千の異なる方法がありますが、あなたがアクセスについて言及したので、私たちはそれがあなたが快適であると仮定します。
また、Accessアプリケーションの更新が簡単なため、ソリューションのプロトタイプを作成するための優れた方法を提供します。
SQL Serverデータベースは、Accessアプリケーションをホストするデータ入力コンピューターと同じLAN上にあると想定しています。
そうでない場合、またはWifiを使用する必要がある場合は、データベースに接続してデータを保存する方法が異なります(おそらくもう少し複雑になります)。
データフロー
従業員がバーコードをスキャンすると、アプリケーションは、従業員が実際にキーボードで入力したかのように、キーのストリームを受け取ります。
たとえば、ユーザーが従業員IDをスキャンしてから、製品IDをスキャンしたとします。コンピューターは、キーボードから送信されたかのように、次のデータストリームを受信します。
@443678¶
876657098¶
¶
記号は、バーコードスキャナーによって追加されたCRコードサフィックス(ENTERキーと同じコード)を表すだけです。
SQLServerデータベース
SQLServerのデータベースにProductLog
テーブルがあると仮定します。Fishery
このProductLog
表は、各魚/製品のデータセットを記録するだけです。
ID : Auto-increment ID (IDENTITY), to identify each record uniquely
EmployeeID : Stores the Employee ID (INT/CHAR)
ProductID : stores the Product ID (INT/CHAR)
Weight : Store the measured weight (FLOAT)
TimeStamp : records the operation's exact date and time (DATETIME).
次に、テーブルをAccessアプリケーションのフロントエンドにリンクしProductLog
ます。
これで、ローカルのAccessテーブルであるかのように使用できるようになります。
データ入力フォーム
最も基本的なことはやめましょう。空白のフォームを作成し、それに3つの大きなラベルを追加します。これを、、およびとlabelEmployeeID
呼びlabelProductID
ますlabelWeight
。
フォームのプロパティを編集して、モーダルになり、アプリケーションの前面にとどまるようにします。
Default View : Single Form
Record Selector : No
Pop up : yes
Modal : yes
key Preview : Yes (on the Events page)
VBA IDEを開いてフォームのコードを編集し、以下を追加します。
Option Compare Database
Option Explicit
' The SQL Server Connection String. Update to match your database '
Const SQLSERVERCONSTR As String = "ODBC;DRIVER=SQL Server;SERVER=MYSERVER;DATABASE=Fishery;Trusted_Connection=Yes;"
' Just clear the labels on the screen when we open the form '
Private Sub Form_Load()
labelEmployeeID.Caption = "-"
LabelProductID.Caption = "-"
labelWeight.Caption = "-"
End Sub
' Most of the processing is done here: the barcode scanner will act '
' as if the scanned code was typed on the keyboard. '
' We trap each keystroke and use a basic state machine to reconstruct '
' each barcode and process them once they have been received '
Private Sub Form_KeyPress(KeyAscii As Integer)
' Status = 0 : Waiting for any barcode input '
' Status = 1 : Currently reading EmployeeID barcode '
' Status = 2 : Currently reading ProductID barcode '
' Status = 3 : All barcode data read '
Static Status As Integer
' Keep track of our barcodes '
Static EmployeeID As String
Static ProductID As String
' All barcodes entered, but not processed yet, do not accept more entry '
If Status = 3 Then Exit Sub
' We received a CR, check if we have both barcodes and complete '
If KeyAscii = vbKeyReturn Then
Dim employeeCodeReceived As Boolean
Dim productCodeReceived As Boolean
employeeCodeReceived = (EmployeeID <> vbNullString)
productCodeReceived = (ProductID <> vbNullString)
' Update UI to reflect the completed code we scanned '
If employeeCodeReceived Then
labelEmployeeID.Caption = "Employee : " & EmployeeID
Else
labelEmployeeID.Caption = "-"
End If
If productCodeReceived Then
LabelProductID.Caption = "Product : " & ProductID
Else
LabelProductID.Caption = "-"
End If
labelWeight.Caption = "-"
' If both have been received, complete the transaction '
If employeeCodeReceived And productCodeReceived Then
Status = 3
' Get the weight from the scales '
Dim weight As Double
weight = ReadScale()
' Display the weight '
labelWeight.Caption = "Weight : " & Format(weight, "0.000") & " kg"
' Save to log '
Save EmployeeID, ProductID, weight
' Reset barcode data '
EmployeeID = vbNullString
ProductID = vbNullString
End If
Status = 0
Exit Sub
End If
Dim c As String
c = Chr(KeyAscii)
' We're starting a barcode '
If Status = 0 Then
If c = "@" Then
Status = 1
EmployeeID = vbNullString
Exit Sub ' Skip the @ prefix '
Else
Status = 2
ProductID = vbNullString
End If
End If
If Status = 1 Then
EmployeeID = EmployeeID & c
ElseIf Status = 2 Then
ProductID = ProductID & c
End If
End Sub
Private Sub Save(ByVal EmployeeID As String, ByVal ProductID As String, ByVal weight As Double)
' We use ADO and late binding to avoid requiring a library reference '
Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")
' Open using options adOpenDynamic(2) and adLockOptimistic(3) '
rs.Open "ProductLog", SQLSERVERCONSTR, 2, 3
' Add a new record and close '
With rs
.AddNew
!EmployeeID = EmployeeID
!ProductID = ProductID
!weight = weight
!timestamp = Now()
.Update
.Close
End With
Set rs = Nothing
End Sub
' Magic function to be replaced by whatever you need to do to read the scale '
Private Function ReadScale() As Double
Randomize
ReadScale = Rnd() * 2
End Function
もちろん、これはすべて、特定のケースに一致する場合と一致しない場合がある単純な仮定に基づく特に単純な実装です。
エラー処理はなく、非常に優れたコードでもありませんが、何かをまとめて開始するのに役立ちます。
使用する
データ入力プロセスをシミュレートするには、フォームを開いてキーボードを使用するだけです。
たとえば、次のように入力します(最初にProductIDを入力してから、 EmployeeIDも機能します)。
@TIMOTHY¶
987654¶
この画面が表示され、データが自動的に記録されます。
サンプルデータベース
動作中のコードを示すサンプルデータベースを公開しました。
デモ用にデータをそれ自体に保存します。
ダウンロードしてください。
結論
繰り返しますが、これらのウェアハウスデータ入力アプリケーションを構築する際の主な問題は、データ入力を実際の合理化された物理プロセスにモデル化することです。
ユーザーの実際の環境や慣行について考えないと、ソリューションが逆効果になり、作業者の労力が増え、効率的ではなく厄介な作業になる可能性があります。