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

时间:2018-04-04 14:29:48

标签: access-vba access

如果主表单已被弄脏,有没有办法要求3个子表单字段?我用google搜索没有结果,所以我想知道这是否甚至可以在Access中。

我有一个包含5个子表单的MainForm。其中一个子表单是NoteSubForm,用户输入Note(短文本),Initials(组合框)和NoteDate(Date / Time)。无论何时对MainForm进行更改/更新,我都要求用户输入描述更改的注释,Initials和NoteDate。

我认为可以使用If / Then语句和Dirty属性。

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

下面添加了更多详细信息

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

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

'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

如果您需要更多详细信息,请告诉我,我希望这可以帮助您根据您的情况制定类似的东西。