带绑定与非绑定列的拆分表单无法录入多条记录的技术求助
问题:拆分表单无法保存多条记录,录入第二条时覆盖第一条
我的拆分表单包含若干组合框,属性表设置如下:
- [Split Form Datasheet]设为"Allow Edits"
- [Split form Printing]设为"Form Only"
按这个设置应该允许向源表输入数据,但现在只能添加一条记录——开始录入第二条时,第一条的所有列会被第二条的内容覆盖。需要实现:在数据表视图的顶部或底部录入多条记录,且所有录入的记录都能保存下来。
当前使用的组合框事件代码
cboProd 的 On Change 事件
Private Sub cboProd_Change() Me.ProdDesc = Me.cboProd.Column(1) Me.Quantity = Me.cboProd.Column(2) Me.Orders = Me.cboProd.Column(3) Me.AmountRem = Me.cboProd.Column(4) End Sub
cboCust 的 On Change 事件
Private Sub cboCust_Change() Me.CustID = Me.cboCust.Column(1) Me.CustName = Me.cboCust.Column(2) Me.CustGender = Me.cboCust.Column(3) End Sub
除了上面两段代码,表单里只有关闭、保存和搜索按钮的代码,而且我已经试过多种属性表设置选项了。
解决方案
1. 把 On Change 事件换成 After Update 事件
On Change 会在组合框内容每一次变化时触发(比如输入字符的过程中),不是等用户选完选项才触发,切换记录时很容易把旧记录的字段覆盖成新的组合框值。换成 After Update 事件,确保只有用户确认选择后才填充字段:
修改后的代码示例:
Private Sub cboProd_AfterUpdate() If Not IsNull(Me.cboProd.Value) Then Me.ProdDesc = Me.cboProd.Column(1) Me.Quantity = Me.cboProd.Column(2) Me.Orders = Me.cboProd.Column(3) Me.AmountRem = Me.cboProd.Column(4) End If End Sub
Private Sub cboCust_AfterUpdate() If Not IsNull(Me.cboCust.Value) Then Me.CustID = Me.cboCust.Column(1) Me.CustName = Me.cboCust.Column(2) Me.CustGender = Me.cboCust.Column(3) End If End Sub
加个 IsNull 判断是为了避免清空组合框时,字段被设为空值。
2. 确认绑定的源表有主键
如果表单绑定的表或查询没有主键,Access没法区分不同记录,就会出现覆盖问题。检查源表有没有唯一标识的主键字段(比如自动编号类型的ID),没有的话赶紧加一个。
3. 检查表单的记录集类型
在表单属性表里,把记录集类型设为"动态集"或"动态集(不一致的更新)",别用"快照"——快照类型的记录集不支持编辑和添加多条记录。
4. 保存后自动跳转新记录
修改保存按钮的代码,确保保存当前记录后自动跳到新记录,避免在同一条记录上重复编辑:
Private Sub btnSave_Click() Me.Dirty = False ' 保存当前记录 DoCmd.RunCommand acCmdRecordsGoToNew ' 跳转到新记录 End Sub
5. 关掉组合框的"自动展开"(可选)
如果组合框开了"自动展开",切换记录时可能会意外触发值变化。在组合框属性表里把自动展开设为"否",减少不必要的事件触发。
内容的提问来源于stack exchange,提问作者Datamint
相关产品推荐
相关产品推荐

