MS Access - 更改表单中的值后立即写入表
Posted
技术标签:
【中文标题】MS Access - 更改表单中的值后立即写入表【英文标题】:MS Access - Write to Table Immediately After Changing Value in Form 【发布时间】:2012-03-01 18:04:29 【问题描述】:有没有办法让 Access 在更改表单中的值时立即将值写入表?现在,我必须在表单中更改一个值,然后在将值写入相应的表之前单击子表单上的字段。
听起来没什么大不了的,但某些控件需要当前数据才能提供有效选项。如果用户没有足够的知识来点击子表单,那么他们查看的数据可能已经过时了。
【问题讨论】:
我想不出任何合适的事件,您当然不想在更改事件中更新表,而after update
要求您从控件中移出。包含某种刷新按钮来更新表格怎么样?
有一个组合下拉菜单,可以拉出工单号、工单状态和该工单上的最新活动(由子表单编写)。用户可以更改工单的状态,但组合下拉菜单不会反映更改(在我的测试中,表源也不会反映),直到他们完全退出记录。完全取消记录包括更改记录或单击子表单。组合下拉菜单将始终更新,但我希望立即更新。我不想以 Access 不完美为借口。我只是想让它工作。 :)
@Ben 不幸的是,Access 并不完美,用户必须习惯这种实现。 :)
我想这不是最好的选择,但你可以结合 Me.Dirty = False 使用(表单)定时器事件,但我不知道当前字段对字段的影响是什么重点。
【参考方案1】:
默认情况下,您要求的行为是访问功能的方式。在大多数典型情况下,您的主表单将成为父表,因此在您可以将子记录添加到此类关系设置之前,必须将父记录写入并保存到磁盘。
反过来,虽然不是必需的,但也是访问的默认操作。
换句话说,不清楚为什么当焦点从父表单移动到子表单时,父表单的记录没有写入表中。
因此,您的设置中的某些内容在这里不正确,或者您必须扩展您所看到的行为。
默认情况下,将焦点从主窗体更改为子窗体会导致主窗体记录写入表格,而从子窗体工具主窗体更改焦点通常也会导致子窗体要写入表的记录。
【讨论】:
【参考方案2】:如果您要匹配组合框,则可以将其用作链接主字段,即控件本身的名称。选择带有组合的票证后,您的子表单应立即更新。
Link Master Fields: Combo1
Link Child Fields: Field1
【讨论】:
【参考方案3】:当用户离开 Lost_Focus 事件中的字段时,您可以强制保存记录。
Private Sub MyField_LostFocus()
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
End Sub
【讨论】:
DoMenuItem 在 Access 2000 中已被替换,并且仅包含在内以实现向后兼容性:msdn.microsoft.com/en-us/library/aa203634(v=office.10).aspx 有趣的是,Access 向导仍然将它用于此目的,这就是我生成上述命令的方式 是的,这就是为什么 MVP 告诉您要非常小心使用 Access 向导,例如,tech-archive.net/Archive/Access/… 中的 Bob Larson@【参考方案4】:我也面临同样的问题,但在另一种情况下。我没有子表单,而是分屏上同一张表的数据表视图,在保存按钮后没有立即更新。按 DUPLICATE 按钮时,我没有获取最新记录的重复数据,而是将指针转移到第一条记录,然后第一条记录中的数据被重复。
通过插入
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
在数据复制代码之前,我现在通过将记录指针粘在当前记录上来立即更新数据,并根据需要复制相同的最后一条记录。
分享经验。
感谢克里斯帕德汉姆
【讨论】:
【参考方案5】:只需在您的表单模型中使用它:
Private Sub your textbox name her_AfterUpdate()
Me.Refresh
End Sub
【讨论】:
【参考方案6】:本质上:在每个所需控件的AfterUpdate
事件中执行acCmdSaveRecord
命令。
所以:
在表单的设计视图中单击您的控件。 菜单 > 设计 > 属性表(为您的控件调出属性表) 属性表 > 事件 [选项卡] > 更新后。选择“[事件过程]”。点击省略号“...”进入 Code-Behind-Form VBA 开发环境。 提供您的代码如下...Private Sub [Control Name]_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
End Sub
例如
Private Sub cboFinancialYear_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
End Sub
对表单上的每个相关控件重复上述操作。
acCmdSaveRecord
避免了对当前表单进行不必要的视觉刷新,就像使用 Me.Refresh
时一样(@medjahed mohamed 建议这样做)。
【讨论】:
以上是关于MS Access - 更改表单中的值后立即写入表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ms access 中更改表字段的数据类型,而无需创建新表单来更新表?
如何在 Ms Access 的组合框中单击按钮并打开与值相关的表单?