如何上传条码数据和比例数据

rob*_*s35 1 upload ms-access barcode barcode-scanner sql-server-2008

所以,我正在构建一个简单的库存系统。该信息将存储在远程 SQL Server 2005 数据库中。在我正在处理的项目的当前部分,我需要扫描条形码(其中包含两个数据,员工 ID 和产品 ID)。我们将使用 MC9090-G 扫描仪。在它被扫描的同时,它会坐在秤上。我需要把这三块数据放在一起,上传到数据库中。

首先,我需要弄清楚如何收集数据。其次,我需要找出编写客户端应用程序的最佳平台。这些将相当简单,例如插入上述数据。我不确定是否应该使用 ACCESS 2010 前端,或者用其他东西编写前端。

如果这个问题看起来很模糊,我很抱歉,请向我询问更多详细信息。谢谢你们的帮助,我真的迷路了。

Ren*_*uis 5

这是您上一个问题的副本。您不必重新创建一个新问题即可使其再次可见:只需使用更多数据编辑您的原始问题,它就会再次回到顶部。

没有人能够回答,因为这太模糊了。对于这些类型的系统,员工的身体工作方式是解决方案的驱动因素:您需要简化他们的动作,使其自然流畅,并且不需要比绝对必要的更多的移动、确认和处理。

所以,让我们尝试一些东西。

假设

因为我对你的环境、设备、工艺还不够了解,所以对问题做一些假设:

  • 计算机安装在秤附近用于数据输入。

  • 条码扫描器和秤都连接到电脑

  • 条形码阅读器的行为类似于 HID 设备(就像输入是在键盘上输入的一样)

  • 条码阅读器配置为在每次扫描后添加 CR(回车)后缀(所有阅读器都有这种类型的配置)。

  • 员工条码印在产品 ID 上(上方或下方),是贴在鱼上的标签。
    员工 ID 条形码的格式如下:@123456其中 123456 是员工 ID。
    所述@前缀允许系统检测到扫描的条形码是雇员ID。
    使用Code128或类似方法打印字母数字字符串。

  • 假定鱼条码标签位于鱼上或印在卡片上。
    鱼条码标签可以是任何东西,但不能以@.

  • 我们假设秤有一个接口。由于您没有提及您使用的是哪一个或如何从 PC 检索数据,我们将不得不假设体重秤提供了一个 SDK,或者允许您读取当前重量的东西。
    让我们调用该函数ReadScale()并假设它返回一个浮点数,其中包含对您的任务有意义的任何测量值。

工作进程

在这里,我们再次做出一些假设。根据您的确切设置和物理执行的操作流程,事情可能会大不相同,在这种情况下,您的软件也可能需要以不同的方式运行。

我假设通过加权和数据输入是最终操作:到那时标签已经贴在鱼/产品上。

可能的过程:

  • 工人在电脑和秤前

  • 工人把鱼放在秤上

  • 工人等待读数稳定

  • 工作人员扫描贴在鱼上的标签上的 2 个条形码。

或者:

  • 工作人员扫描贴在鱼上的标签上的 2 个条形码。

  • 工人把鱼放在秤上

  • 工人等待读数稳定

  • 工人在键盘上输入 ENTER 键或扫描一个特殊的 OK 条形码,告诉软件该过程已完成。

第一种选择需要较少的操作,但它要求标签在产品在秤上时扫描可见。这可能是也可能不是。

软件解决方案

有上千种不同的方法可以实现您的愿望,但是既然您提到了 Access,我们就假设您对它感到满意。
此外,它提供了一种很好的方法来构建解决方案的原型,因为它很容易更新 Access 应用程序。

我假设 SQL Server 数据库与将托管 Access 应用程序的数据输入计算机位于同一 LAN 中。
如果情况并非如此,或者您必须使用 Wifi,则连接到数据库和保存数据的方式会有所不同(并且可能会更复杂一些)。

数据流

当员工扫描条形码时,应用程序将收到一串键,就好像员工实际在键盘上输入一样:

例如,假设用户扫描了员工 ID,然后扫描了产品 ID。计算机将接收以下数据流,就好像它来自键盘一样:

@443678¶
876657098¶
Run Code Online (Sandbox Code Playgroud)

符号仅代表条码扫描器添加的 CR 代码后缀(与 ENTER 键代码相同)。

SQL Server 数据库

我假设您在 SQL Server 上ProductLogFishery数据库中有一个表。该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).
Run Code Online (Sandbox Code Playgroud)

现在ProductLog表链接到您的 Access 应用程序前端
然后我们就可以像使用本地 Access 表一样使用它。

数据输入表

让我们不要做最基本的事情:创建一个空白表单并向其添加 3 个大标签,您将称之为:labelEmployeeIDlabelProductIDlabelWeight

编辑表单的属性,使其成为模态并保持在应用程序的前面,其中包括:

Default View    : Single Form
Record Selector : No
Pop up          : yes
Modal           : yes
key Preview     : Yes  (on the Events page)
Run Code Online (Sandbox Code Playgroud)

表格设计

打开 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
Run Code Online (Sandbox Code Playgroud)

当然,所有这些都是基于简单假设的特别简单的实现,这些假设可能与您的特定情况相匹配,也可能不匹配。
没有错误处理,它甚至不是很好的代码,但它可以帮助您将一些东西放在一起并开始。

要尝试模拟数据输入过程,只需打开表单并使用键盘即可。
例如,输入以下内容(先输入 ProductID,然后输入EmployeeID 也可以):

@TIMOTHY¶
987654¶
Run Code Online (Sandbox Code Playgroud)

将显示此屏幕,并自动记录数据:

在此处输入图片说明

示例数据库

我公开了一个示例数据库,显示了正在运行的代码。
它会将数据保存到自己的演示中。
下载吧

结论

同样,构建这些仓库数据输入应用程序时的主要问题是将数据输入建模为实际简化的物理过程。
如果您不考虑用户的实际环境和实践,您的解决方案可能会适得其反,需要工人付出更多努力,并使他的工作变得尴尬而不是高效。