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

时间:2012-05-15 22:13:19

标签: sql-server-2008 ms-access upload barcode barcode-scanner

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

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

如果这个问题看起来含糊不清,我很抱歉,请向我询问更多细节。谢谢你的帮助,我真的迷失了。

1 个答案:

答案 0 :(得分:4)

这是您previous question的副本。您不必重新创建新问题,以便再次显示:只需使用更多数据编辑原始问题,它就会再次显示在顶部。

没有人能够回答,因为这太模糊了。对于这些类型的系统,工人的身体工作方式是推动解决方案的动力:您需要简化他们的行动,使他们自然流动,不需要更多的动作,确认和处理,而不是严格必要的。

所以,让我们尝试一下。

假设

因为我对您的环境,设备和流程了解不多,所以我会对这个问题做出一些假设:

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

  • 条形码扫描仪和刻度都连接到计算机

  • 条形码阅读器的行为类似于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¶

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

SQL Server数据库

我假设您在SQL Server上的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).

现在link the ProductLog table to your Access application front-end
然后,我们就可以像使用本地Access表一样使用它。

数据输入表格

最基本的事情是:创建一个空白表单并为其添加3个大标签,您将调用:labelEmployeeIDlabelProductIDlabelWeight

编辑表单的属性,使其成为模态并保留在应用程序的前面,以及其他内容:

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

Design of the form

打开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¶

将导致此屏幕,并自动记录数据:

enter image description here

示例数据库

我公开了一个示例数据库,显示了行动中的代码 它将为演示保存数据。
Download it

结论

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