我正在创建一个Microsoft Access 2010应用程序,用于记录在单独的工作流系统中发生的错误。用户输入工作流程编号,单击搜索,并在下方显示连续子窗体,其行数与在其他系统中触摸该工作流程的人员一样多。连续子表单还填充了以前记录的错误行。
然后,用户勾选每个行上的一个框,以指示这些特定人员发生了错误。然后,用户输入错误的描述等。
如果用户与之前记录的错误行进行交互,我想知道它,以便我可以返回并更新/删除之前的错误。
我能够使用VBA来检索连续子表单的RecordSet。但是,我没有在该子表单记录集上看到属性/方法,这将允许我检查用户是否实际触摸了连续子表单的该行上的某个字段。
除了将子窗体记录集中的行与数据库字段中的行进行逐字段比较以查看是否有更改后,VBA中是否有办法检查子窗体记录集上的行是否在显示后发生了更改给用户?
答案 0 :(得分:0)
您可以使用Form.Dirty来检查某些内容是否已更改....
我有一个类似的情况,我这样解决了......
1 - 当我打开带有子表单的表单时...
2 - 创建子表单原始记录的克隆记录集
3-然后使用[dirty]检查用户是否更改了表单或子表单中的内容。
4 - 如果在表单或子表单中更改了某些内容并且脏了,您可以从主表单中禁用按钮(next,new ...),并且只允许保存和撤消更改操作
5 - 如果用户保存,我们只更新主表中的记录并使用新值重新创建克隆记录集
6 - 如果用户点击UNDO按钮,那么我们进行比较并将记录从克隆记录集/表复制到原始表
这是一个简单的函数代码,您可以使用它将所有记录从子表单复制到另一个临时表/ recorset(例如: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)复制到原始recorset
'del original files
cnn.Execute "Delete * FROM TDetPed WHERE CodPed = " & CodPed & ""