子表单最初不显示过滤结果

Posted

技术标签:

【中文标题】子表单最初不显示过滤结果【英文标题】:Subform not displaying filtered results initially 【发布时间】:2019-02-12 10:22:45 【问题描述】:

我有一个包含 2 个子表单的表单:

主窗体:PaymentDetails 子表单 1:UnreleasePayments 子表单 2:ReleasedPayments

这个想法是,用户可以通过更新支付状态列在子表单 1 和子表单 2 之间移动支付记录:

这可以使用我创建的命令按钮批量完成,例如,将所有持有的付款设置为“释放”会导致它们全部移动到底部子表单:

...或者可以通过更改“支付状态”组合框来按记录完成:

问题:将支付状态组合框更新从子表单 2 更新到子表单 1(即从“发布”到“保留”)时出现问题。其他所有情况似乎都可以。

第一次通过组合框将付款从“释放”设置为“保留”时,记录正确地从子表单 2 中消失...

...但由于某种原因,该记录未显示在子表单 1 中,即使为子表单 1 计算的总值表明应该存在一条记录:

如果我将下一条记录从“发布”移动到“保留”,这条记录会显示,但仍然没有我移动的第一条记录的迹象(为子表单计算的总价值仍然比显示的多 500 英镑) :

当我将最终记录从“发布”移动到“保留”时,所有 3 条记录现在实际上都显示在子表单 1 中:

主窗体绑定到一个名为 PaymentRun 的表。子表单 1 和 2 使用查询来显示其数据,但都使用名为 Payments 的表,该表与 PaymentRun 建立了关系,其中 PaymentRunID 是 PaymentRun 的 PK 和 Payments 的 FK。

当记录的 PayStatus 设置为“Release”时,某些 VBA 会将主窗体中的 PaymentRunID 分配给付款记录的 PaymentRunID(并在 PayStatus 为“Hold”或空白时将其删除)。

子表单 2 (ReleasedPayments) 设置为主表单的子表单,因此每次付款记录获取主表单的 PaymentRunID 时,都会在子表单 2 中显示该记录。

子表单 1 (UnreleasedPayments) 未链接到主表单,并根据传递给其 .Filter 属性的字符串显示记录。

以下是子表单 2 (ReleasedPayments) 中 PayStatus 组合框的 change 事件运行顺序的代码:

cboPayStatus 更改事件:

If _
    Me.cboPayStatus.Value = "Hold" _
Then
    Me.PaymentRunID.Value = Null
ElseIf _
    Me.cboPayStatus.Value = "Release" _
Then
    Me.PaymentRunID.Value = Me.Parent!PaymentRunID.Value
End If

Call PaymentsFilter
Call PaymentsRequery

PaymentsFilter sub(用于过滤子表单 1):

Dim strUnreleased As String

strUnreleased = ""

strUnreleased = "[PaymentPeriod] IN " _
              & "(SELECT PayPer.PaymentPeriod " _
              & "FROM PaymentPeriod PayPer " _
              & "WHERE PayPer.PaymentPeriodSort <=" & Forms!PaymentDetails!cboPaymentPeriod.Column(1) & ") " _
              & "AND [EDRSRef] = '" & Forms!PaymentDetails!cboEmployer & "' " _
              & "AND ([PaymentStatus]='Hold' Or [PaymentStatus] IS NULL)"

Forms!PaymentDetails!PaymentDetails_sub.Form.Filter = strUnreleased
Forms!PaymentDetails!PaymentDetails_sub.Form.FilterOn = True

PaymentsRequery sub(用于重新查询subform 2并将释放的支付值推送到支付运行金额)

Forms!PaymentDetails!PaymentDetailsRelease_sub.Form.Requery
Forms!PaymentDetails!txtRelVal.Requery
Forms!PaymentDetails!PaymentRunAmount.Value = Forms!PaymentDetails!txtRelVal.Value

【问题讨论】:

【参考方案1】:

我不完全确定问题是什么,但是切换这两个的顺序解决了我的问题:

Call PaymentsFilter
Call PaymentsRequery

也许PaymentsRequery 在 PaymentsFilter 完成对子表单 1 的影响之前导致子表单 2 窃取焦点?

如果有人可以提供解释,我仍然会感兴趣。

【讨论】:

以上是关于子表单最初不显示过滤结果的主要内容,如果未能解决你的问题,请参考以下文章

在MS访问中的子表单上显示查询结果

在新窗口中打开 Access 中的子表单

自定义 HTML5 表单验证最初不显示自定义错误

用于过滤子表单数据表的未绑定文本框

按日期字段过滤子表单

子表单不显示在表单视图中