【问题标题】:Access: Display Textbox Control In Sub-report when it has No Data访问:没有数据时在子报表中显示文本框控件
【发布时间】:2020-11-18 10:43:33
【问题描述】:

在一个子报告中,我创建了一个关于 detail_format 事件的子事件,当没有返回数据时会显示一个文本。

‘Code in sub-report
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

If Me.Report.HasData Then
    Me.Label43.Visible = True
    Me.txtNotEntered.Visible = False
Else
    Me.Label43.Visible = True
    Me.txtNotEntered.Visible = True
End If

End Sub

单独运行时,它在子报表上运行良好。当我运行主报告时,它不会触发。

我在主报告中添加了相同的代码,看看它是否可以工作。它运行了几行代码,但仍然看不到 txtNotEntered 文本框控件。

‘Code in main report
Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)

If Me!rptResults_Comments.Report.HasData Then
    Me!rptResults_Comments.Report.Label43.Visible = True
    Me!rptResults_Comments.Report.txtNotEntered.Visible = False
Else
    Me!rptResults_Comments.Visible = True
    Me!rptResults_Comments.Report.Label43.Visible = True
    Me!rptResults_Comments.Report.txtNotEntered.Visible = True
End If

End sub

我正在使用 MS Access 2003。

【问题讨论】:

  • 子报表是否绑定到主报表?也就是说,子报表控件的Link Master/Link Child Fields你填了吗?
  • 是的。当子报表中有记录时,该链接可以正常工作。

标签: ms-access vba ms-access-2007


【解决方案1】:

由于子报表绑定到主报表,如果没有数据连接到主报表,子报表本身将不会显示。通过将子报表的详细信息部分的背景颜色设置为红色或任何其他非白色,您可以更好地看到这一点。

一种解决方法是将您的txtNotEntered 控件移至主报表,并将其置于子报表控件“下方”(使用“发送到后面”)。然后将子报表控件的 Can Shrink 属性设置为 True。

然后,当子报表中有数据时,您将看到子报表,它将覆盖txtNotEntered 控件。当没有数据时,子报表将缩小,您将能够看到txtNotEntered控件。

这种方法的一个优点是它不需要代码。只需将 txtNotEntered Visible 属性设置为 True。子报表的缩小会在适当的时候将其显示出来。

【讨论】:

  • 我在主窗体上有几个子窗体可以缩小。定位将关闭。
  • 只要文本框和子报表不与其他可以收缩的子报表垂直重叠,应该没问题。当控件(包括子报表控件)在 Access 报表中收缩时,顶部低于收缩控件底部的所有控件都会在报表中“向上移动”一个等于收缩控件高度的量。长话短说,标签和子报表应该一起移动。
  • 要建立在@mwolfe02 的优秀技巧的基础上,我建议添加一个“注释”标签,开发人员始终可以在设计视图中查看该标签,但永久设置为Visible = no(在属性表中)类似“隐藏的 txtNotEntered 在子控件下”的文本。为这样的注释标签着色以在设计视图中脱颖而出(例如,我通常使用蓝色)。否则,作为开发人员,有可能会忽视正在发生的事情(如果其他开发人员必须分析您的工作,情况会更糟)。
【解决方案2】:

除了 mwolfe02 的回答,我建议不要使用标签和 VB 代码,而是使用具有以下表达式的文本框:

=IIf([HasData],"","No data found")

我在我的所有报告中都使用它。像

这样的表达式
=IIf([rptResults_Comments].[Report].[HasData],","No data found")

应该也可以。后面的表达式我没有测试,所以不确定是否需要[Report]。

【讨论】:

  • 为了从主报表引用子报表上的控件,在子报表中可能没有数据返回的这些上下文中,我发现了以下工作=IIf([sbctTemp].[Report].[HasData],[sbctTemp].[Report]![txtGrandTotal],0)。补充一点:由于子报表不返回任何数据,在引用的控件甚至不存在的情况下,Null 到零 Nz() 将不起作用。
【解决方案3】:

除了@rick 的问题,如何在子报表没有数据时显示“无数据”文本,想要处理主报表控件引用子报表控件(以及子报表)的情况也很常见有(有)没有数据)。当您计算引用许多子报表的小计的总计时,可能会发生这种情况。

所以我们可以将@mwolfe02 和@TheOtherTimDuncan 的解决方案(从@TheOtherTimDuncan 重新利用他对HasData 属性的用途),以及我自己的一些附带添加,作为清单。

我们有一个主报告rptMain 和一个子报告srpSub。在rptMain,详细信息部分,我们有一个子控件sbctSub,它引用srpSub。

  1. 在rptMain 上创建一个标签(一般不需要它是一个文本框)lblNoData 使用您喜欢的任何文本(例如“未返回数据”)。将lblNoData 放在sbctSub 下(使用发送到后面)。使用相同的Top 值。这样可以确保它们不会垂直重叠,因此在发生收缩/增长时不会出现问题。

  2. 添加一个“注释”标签,开发人员始终可以在设计视图中查看该标签,但永久设置为 Visible = No(这使得它在非设计视图中不可见),其中包含诸如“隐藏 lblNoData under subcontrol”之类的文本。如果这需要缩小 (Can Shrink = Yes) 则使其成为未绑定的文本框。为此类注释标签(或文本框)着色以在设计视图中突出显示(例如,我通常使用蓝色)。否则,作为开发人员,有可能会忽视正在发生的事情(如果其他开发人员必须分析您的工作,情况会更糟)。

  3. 确保以下设置为Can Shrink = Yes:

    • rptMain,详情。
    • sbctSub。

    当srpSub 没有数据时,lblNoData 将显示给用户,因为sbctSub 将缩小为零。

  4. 在生产中,“无数据”标签可能会出现问题(在某些情况下,白色背景似乎是透明的)。如果是这样,在rptMain:

     Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
       Me.lblNoData.Visible = (Not Me.sbctSub.Report.HasData)
     End Sub
    

    (我的“设计峰值”测试按照@mwolfe02 提到的那样工作。也就是说,不需要额外的代码,我可以根据需要依靠子控件来隐藏和显示 No Data 标签。但是我的生产报告具有这些奇怪的透明度问题。)

  5. 如果您在rptMain 上有任何引用srpSub 上的控件的控件(例如txtGrandTotal),则按如下方式设置控件源

     =IIf([sbctTemp].[Report].[HasData],[sbctTemp].[Report]![txtSubTotal],0)
    

    由于子报表不返回任何数据,在引用的控件甚至不存在的情况下,从零到零 Nz() 将不起作用。

编辑 01:添加了附加代码以在出现透明度问题时隐藏和显示无数据标签。重新排列,从最后一步列出,以更合理的顺序列出。

编辑02:提到注释标签如果需要缩小应该是一个文本框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多