如何使用DataGrid实现重复扫码条码时仅递增数量而非重复添加数据?
解决条码重复扫描时递增数量的问题
我完全懂你想要实现的效果:扫描条码时,如果这条码已经在DataGrid里存在,就只把对应条目的数量加1,而不是新增一行重复数据。咱们来看看你的现有代码,调整优化一下就能达到目标:
先说说原代码里的几个关键问题
- 修改数量后没有调用
Update提交修改,只靠Refresh很可能导致修改丢失; - 折扣和总价的计算逻辑看起来有点奇怪(比如
tdiscount = CTquantity.Text),大概率是笔误; - 每次
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
相关产品推荐
相关产品推荐

