检查用户是不是更改了连续子表单记录集的最简单方法?

Posted

技术标签:

【中文标题】检查用户是不是更改了连续子表单记录集的最简单方法?【英文标题】:Easiest way to check if continuous subform recordset was changed by the user?检查用户是否更改了连续子表单记录集的最简单方法? 【发布时间】:2016-07-06 20:59:20 【问题描述】:

我正在创建一个 Microsoft Access 2010 应用程序,用于记录在单独的工作流系统中发生的错误。用户输入工作流程编号,单击搜索,下面会出现一个连续的子表单,其中包含与其他系统中触及该工作流程的人一样多的行。连续子表单也填充了先前记录的错误行。

然后,用户在这些行中的每一行上勾选一个框,以表明那些特定的人犯了错误。然后用户输入错误描述等。

如果用户与之前记录的错误行进行交互,我想知道它,以便我可以返回并更新/删除之前的错误。

我可以使用 VBA 来检索连续子表单的 RecordSet。但是,我没有在该子表单记录集上看到允许我检查用户是否真的触摸了连续子表单的该行上的一个字段的属性/方法。

除了逐个字段比较子表单记录集中的行与数据库中的行以查看是否发生更改之外,VBA 中是否有一种方法可以检查子表单记录集中的行在呈现后是否发生更改给用户?

【问题讨论】:

查看子表单上的AfterUpdate 事件。它会在用户对记录进行更改后触发。然后,您可以使用该记录引用来做任何事情。 【参考方案1】:

您可以使用 Form.Dirty 来检查是否有更改......

我有类似的情况,我是这样解决的……

1 - 当我打开带有子表单的表单时...

2 - 创建子表单原始记录的克隆记录集

3- 然后使用 [dirty] 检查用户是否更改了表单或子表单中的某些内容。

4 - 如果表单或子表单中的某些内容发生了更改并且脏了,您可以禁用主表单中的按钮(下一步、新建...),并且只允许保存和撤消更改操作

5 - 如果用户保存,我们只需更新主表中的记录并使用新值重新创建克隆记录集

6 - 如果用户点击 UNDO 按钮,然后我们进行比较并将克隆记录集/表中的记录复制到原始表中

我认为您可以在这里找到使用 DAO 的工作示例:https://support.microsoft.com/en-us/kb/131535

这里有一个简单的函数代码,您可以使用该代码将所有记录从子表单复制到另一个临时表/记录集(例如:TDetPedTemp),然后在必要时将流程副本恢复为原始;

// copy actual subforms records to a temporary new table/recordset
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim rs2 As ADODB.Recordset

Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
Set rs2 = New ADODB.Recordset

'open main recordset (TDetPed)
rs.Open "SELECT TDetPed.* FROM TDetPed WHERE CodPed = " & CodPed & "", cnn, adOpenKeyset, adLockOptimistic


'open clone table recordset (TDetPedTemp)
rs2.Open "TDetPedTemp", cnn, adOpenKeyset, adLockOptimistic

'move to first record of main table
rs.MoveFirst

'add record by record in clone table(rs2) from maintable(rs)
Do Until rs.EOF
rs2.AddNew
rs2("CodPed") = rs("CodPed")
rs2("CodDetPed") = rs("CodDetPed")
rs2("CodInterno") = rs("CodInterno")
rs2("DescrDetPed") = rs("DescrDetPed")
rs2("DescontoDetPed") = rs("DescontoDetPed")
rs2("CodProd") = rs("CodProd")
rs2("PreçoDetPed") = rs("PreçoDetPed")
rs2("QtdeDetPed") = rs("QtdeDetPed")

'update current added record in clone table
rs2.Update

'move to next record in main table
rs.MoveNext
'Move para o proximo registro do detalhe do pedido
Loop

'close everthing
rs.Close
rs2.Close
cnn.Close
'clean everthing
Set rs = Nothing
Set rs2 = Nothing
Set cnn = Nothing

要撤消更改,代码是相同的,只是源顺序不同。我们只需要先从表中删除原始记录(例如:TDetPed),然后将临时的新记录(例如:TDetPedTemp)复制到原始记录集

'del original files
cnn.Execute "Delete * FROM TDetPed WHERE CodPed = " & CodPed & ""

【讨论】:

以上是关于检查用户是不是更改了连续子表单记录集的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是在 Access 子表单中单击了空记录?

Meteor 模板:检查用户是不是登录的最简单方法是啥?

主窗体记录更改时从子窗体移动焦点

控制子表单记录和选项卡控制页面?

通过弹出子表单 (2) 添加新子表单 (1) 记录后重新查询子表单 (1) - Access 2007

在关闭之前检查用户表单是不是已使用 save_click 保存