如果主表单已更改/弄脏,是不是可以要求子表单?

Posted

技术标签:

【中文标题】如果主表单已更改/弄脏,是不是可以要求子表单?【英文标题】:Is it possible to required a subform if main form has been changed/dirtied?如果主表单已更改/弄脏,是否可以要求子表单? 【发布时间】:2018-04-04 14:29:48 【问题描述】:

如果主表单已被弄脏,有什么方法可以要求 3 个子表单字段?我用谷歌搜索了这个没有结果,所以我想知道这在 Access 中是否可行。

我有一个包含 5 个子表单的 MainForm。其中一个子表单是 NoteSubForm,用户在其中输入备注(短文本)、姓名缩写(组合框)和 NoteDate(日期/时间)。每当 MainForm 发生更改/更新时,我想要求用户放置一个说明更改、缩写和 NoteDate 的注释。

我认为有一种方法可以使用 If/Then 语句和 Dirty 属性。

有什么建议吗?谢谢!

【问题讨论】:

您可以使用主窗体中每个控件的 onChange 事件来记录更改,然后在窗体关闭之前检查该日志并确保用户已填写更改详细信息 Form.Dirty 如果对当前记录进行了任何更改,则为 True,所以是的,您可以使用它来控制所做的更改。在文本框的所有更新后事件中设置它,然后设置类似If Form.Dirty=True Then... 和代码以强制用户放置描述更改、首字母和 NoteDate 的注释。关于Form.Dirty的更多信息 我必须为每个控件编写一个事件吗?当表单中的任何内容发生更改时,是否有任何事件,在关闭之前,将焦点设置到注释子表单并要求输入注释? 恐怕是的,您必须为所有可供用户编辑的控件编写代码。至少,MSDN 在提供的链接的网站上是这么说的。 【参考方案1】:

我有类似的情况,我在父窗体上使用了隐藏文本控件,当任何子窗体更新时,它们会更改隐藏文本控件中的文本。然后,当用户尝试保存或退出父窗体时,我检查隐藏控件,如果它显示进行了更新,它会打开我的弹出窗体以记录所做的更改;即您的备注、姓名首字母和备注日期。 如果仅在父窗体控件上而不是在子窗体中进行更改,则父窗体上的正常窗体 BeforeUpdate 过程会捕获更改并允许您提示用户输入所需的注释。 HTH。

下面添加了更多详细信息

我的表单是订单表单,我正在跟踪已向客户确认的订单的更改。 在主窗体上,我有一个名为 txtRevToDo 的未绑定文本控件。它不可见并且没有默认值。子表单是连续表单,因此在子表单上的项目之间移动会触发更新后代码。

在更新后的子表单中,在每个单独的子表单上,我都有以下代码。我只捕获对更改的订单行有成本的订单的更新。如果没有成本,我不需要跟踪变化 -

'set the parent form to dirty so that the changes to contract items can be tracked as a revision to the contract
If Not IsNull(Me.Cost) Then
Me.Parent.txtRevToDo = "Yes"
End If

在主窗体上,用户单击“关闭”按钮退出窗体。在该按钮控件的 OnClick 事件的 vba 代码中,我使用此代码检查 txtRevToDo,如果对子窗体进行了任何可跟踪的更改,它会检查状态并将主窗体设置为脏,然后强制保存触发主窗体 BeforeUpdate 代码 -

If Me.txtRevToDo = "Yes" Then
Me.txtPaymentTerms.SetFocus
Me.Dirty = True
If Me.Dirty Then Me.Dirty = False
Else
DoCmd.Close acForm, "Edit Contract Details After Issued"
End If

触发的主窗体BeforeUpdate中的代码是这样的,该代码允许用户完成保存或返回并进行进一步的更改 -

'Provide the user with the option to save/undo
'changes made to the record in the form


If MsgBox("Changes have been made to this record." _
        & vbCrLf & vbCrLf & "Are you ready to save these changes and create the Contract revision? If you have further changes to make, please select 'No'." _
        , vbYesNo, "Changes Made...") = vbYes Then
       'increase the revision number by 1
        Me.Revision = (Me.Revision + 1)
        Me.txtContractStatus = "Revised"
            'update the Contract Actions table with a record of the action
                 strSQLApprove = ....my sql to update my table 

            'update this flag to reflect that the contract revision has been captured
            Me.txtRevToDo = ""

            'record the revision reason (this opens my pop up form that captures the changes made)
            DoCmd.OpenForm "Edit Contract Revisions"
            Forms![Edit Contract Revisions]!ContractNo = Me.ContractNo
            Forms![Edit Contract Revisions]!txtRevision = Me.Revision
            Forms![Edit Contract Revisions]!RevisedBy = TempVars!EmpID

Else
'update this flag so the revision can be captured even if no further changes are actually made
Me.txtRevToDo = "Yes"

End If

如果您需要更多详细信息,请告诉我,我希望这可以帮助您针对您的情况解决类似问题。

【讨论】:

你能展示一个示例代码吗?谢谢! 是的,当然。我已经用更多细节更新了我的答案。

以上是关于如果主表单已更改/弄脏,是不是可以要求子表单?的主要内容,如果未能解决你的问题,请参考以下文章

查看 html 表单是不是已更改

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

Excel:是不是可以根据值更改表单颜色填充?

我如何知道表单输入已更改?

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

提示用户保存表单