You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用DataGrid实现重复扫码条码时仅递增数量而非重复添加数据?

解决条码重复扫描时递增数量的问题

我完全懂你想要实现的效果:扫描条码时,如果这条码已经在DataGrid里存在,就只把对应条目的数量加1,而不是新增一行重复数据。咱们来看看你的现有代码,调整优化一下就能达到目标:

先说说原代码里的几个关键问题

  1. 修改数量后没有调用Update提交修改,只靠Refresh很可能导致修改丢失;
  2. 折扣和总价的计算逻辑看起来有点奇怪(比如tdiscount = CTquantity.Text),大概率是笔误;
  3. 每次Find前没重置记录集指针,可能会因为之前的指针位置导致漏查。

修改后的完整代码

Private Sub CTbarcode_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        ' 先把主数据源的指针移到开头,确保全量查找条码
        Main.MSAadodc1.Recordset.MoveFirst
        Main.MSAadodc1.Recordset.Find "BARCODE='" & CTbarcode.Text & "'", , adSearchForward, 1
        
        If Not Main.MSAadodc1.Recordset.EOF Then
            ' 同样重置当前DataGrid数据源的指针,避免漏查已存在的条码
            CAadodc1.Recordset.MoveFirst
            CAadodc1.Recordset.Find "tbarcode='" & CTbarcode.Text & "'", , adSearchForward, 1
            
            If CAadodc1.Recordset.EOF Then
                ' 条码不存在,新增一条记录
                CTproduct.Text = Main.MSAadodc1.Recordset!PRODUCT
                CTprice.Text = Main.MSAadodc1.Recordset!PRICE
                CTquantity.Text = "1"
                
                CAadodc1.Recordset.AddNew
                CAadodc1.Recordset!tbarcode = CTbarcode.Text
                CAadodc1.Recordset!tproduct = CTproduct.Text
                CAadodc1.Recordset!tquantity = CTquantity.Text
                CAadodc1.Recordset!tprice = CTprice.Text
                ' 这里假设折扣初始为0,你可以根据实际规则修改
                CAadodc1.Recordset!tdiscount = 0
                ' 计算总价:单价*数量 - 折扣
                CAadodc1.Recordset!ttotalprice = Val(CTprice.Text) * Val(CTquantity.Text) - CAadodc1.Recordset!tdiscount
                CAadodc1.Recordset.Update ' 必须提交新增的记录
            Else
                ' 条码已存在,递增数量并更新总价
                Dim newQuantity As Integer
                newQuantity = Val(CAadodc1.Recordset!tquantity) + 1
                CAadodc1.Recordset!tquantity = newQuantity
                ' 用最新的数量重新计算总价
                CAadodc1.Recordset!ttotalprice = Val(CAadodc1.Recordset!tprice) * newQuantity - CAadodc1.Recordset!tdiscount
                CAadodc1.Recordset.Update ' 提交数量修改
                CAadodc1.Refresh ' 刷新DataGrid显示最新数据
            End If
            
            ' 清空输入框,方便下一次扫描
            CTbarcode.Text = ""
            CTbarcode.SetFocus
        Else
            MsgBox "Data Not Found!", vbOKOnly + vbCritical, "Unknown!"
            CTbarcode.Text = ""
            CTbarcode.SetFocus
        End If
    End If
End Sub

关键优化点说明

  • 重置记录集指针:每次Find前调用MoveFirst,确保从第一条记录开始查找,避免因为之前的操作导致指针停在中间,漏查已存在的条码;
  • 提交修改:不管是新增还是更新记录,都必须调用Update把修改同步到数据源,这是原代码最容易忽略的点;
  • 优化计算逻辑:调整了总价的计算方式,确保用最新的数量和价格计算,同时把折扣逻辑做了合理假设,你可以根据实际业务需求修改;
  • 提升扫描体验:处理完成后自动清空条码输入框,不用手动删除,方便连续扫描。

额外注意事项

  • 确保数据源的字段名和代码里的完全一致(比如主数据源的BARCODE、PRODUCT,CAadodc1的tbarcode等);
  • 如果条码里包含单引号,当前的字符串拼接会报错,可以把单引号转义成两个单引号:Replace(CTbarcode.Text, "'", "''");
  • 可以给条码输入框加个Trim()处理,避免扫描时带的空格导致查找失败:CTbarcode.Text = Trim(CTbarcode.Text)。

内容的提问来源于stack exchange,提问作者Nevyllo Kalangi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:29:05