1

だから、私は簡単な在庫システムを構築しています。情報は、リモートのSQLServer2005データベースに保存されます。私が取り組んでいるプロジェクトの現在の部分では、バーコード(従業員IDと製品IDの2つのデータを保持している)をスキャンする必要があります。MC9090-Gスキャナーを使用します。スキャンされると同時に、はかりの上に置かれます。これらの3つのデータをまとめて、データベースにアップロードする必要があります。

まず、データの収集方法を理解する必要があります。次に、クライアント側のアプリケーションを作成するのに最適なプラットフォームを見つける必要があります。これらは、上記のデータを挿入するなど、かなり簡単です。ACCESS 2010フロントエンドを使用するべきか、それとも他の何かでフロントエンドを作成するべきかわかりません。

この質問があいまいに見える場合は申し訳ありませんが、詳細についてはお問い合わせください。助けてくれてありがとう、私はここで本当に迷子になっています。

4

1 に答える 1

5

これは前の質問の複製です。新しい質問を再作成して再度表示する必要はありません。元の質問をより多くのデータで編集するだけで、再び一番上に表示されます。

これが曖昧すぎるという理由だけで、誰も答えることができませんでした。これらのタイプのシステムでは、作業者が物理的にどのように作業するかがソリューションを推進します。アクションを合理化して、自然に流れ、厳密に必要な以上の移動や確認、処理を必要としないようにする必要があります。

それでは、何かを試してみましょう。

仮定

私はあなたの環境、機器、プロセスについて十分に知らないので、問題についていくつかの仮定をします:

  • データ入力用のはかりの近くにコンピューターが設置されています。

  • バーコードスキャナーとスケールの両方がコンピューターに接続されています

  • バーコードリーダーはHIDデバイスのように動作します(入力がキーボードで入力された場合のように)

  • バーコードリーダーは、各スキャンの後にCR(キャリッジリターン)サフィックスを追加するように構成されています(すべてのリーダーにはこのタイプの構成があります)。

  • 従業員のバーコードは、魚に貼られているラベルの製品IDに沿って(上または下に)印刷されています。
    従業員IDバーコードは次の形式になります@123456。123456は従業員IDです。プレフィックスにより、システムはスキャンされたバーコードが従業員IDであることを検出できます
    。英数字の文字列を印刷するには、 Code128など を使用します。@

  • 魚のバーコードラベルは、魚に貼られているか、カードに印刷されていると見なされます。
    フィッシュバーコードのラベルは何でもかまいませんが、で始めることはできません@

  • スケールにはインターフェースがあると想定しています。どちらを使用するか、またはPCからデータを取得する方法については言及していないため、スケールに付属のSDK、または現在の重量を読み取ることができるものがあると想定する必要があります。
    その関数を呼び出してReadScale()、タスクに適した測定値で重み付きのフロートを返すと仮定しましょう。

労働者のプロセス

ここでも、いくつかの仮定を行います。正確な設定と物理的に実行されるアクションのフローによっては、状況が大きく異なる場合があります。その場合、ソフトウェアの動作も異なる必要があります。

重み付けとデータ入力によって最終的な操作になると思います。その時点で、ラベルはすでに魚/製品に適用されています。

可能なプロセス:

  • 労働者はコンピューターの正面にいて、体重計を持っています

  • 労働者は魚をはかりに乗せます

  • 作業者は読み取り値が安定するのを待ちます

  • 作業員は、魚に貼られたラベルの2つのバーコードをスキャンします。

または:

  • 作業員は、魚に貼られたラベルの2つのバーコードをスキャンします。

  • 労働者は魚をはかりに乗せます

  • 作業者は読み取り値が安定するのを待ちます

  • ワーカーはキーボードのENTERキーを入力するか、プロセスが完了したことをソフトウェアに通知する特別なOKバーコードをスキャンします。

最初の選択肢は、必要な操作が少なくて済みますが、製品がスケール上にある間、スキャンのためにラベルが表示される必要があります。それは真実かもしれないし、そうでないかもしれない。

ソフトウェアソリューション

あなたが望むものを達成するための千の異なる方法がありますが、あなたがアクセスについて言及したので、私たちはそれがあなたが快適であると仮定します。
また、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¶

この画面が表示され、データが自動的に記録されます。

ここに画像の説明を入力してください

サンプルデータベース

動作中のコードを示すサンプルデータベースを公開しました。
デモ用にデータをそれ自体に保存します。
ダウンロードしてください。

結論

繰り返しますが、これらのウェアハウスデータ入力アプリケーションを構築する際の主な問題は、データ入力を実際の合理化された物理プロセスにモデル化することです。
ユーザーの実際の環境や慣行について考えないと、ソリューションが逆効果になり、作業者の労力が増え、効率的ではなく厄介な作業になる可能性があります。

于 2012-05-18T04:14:05.037 に答える