1

在 Access 2003 数据库中,我有一个通过 VBA 生成的员工状态/反馈报告。我在 VBA 中创建报告是因为所需的报告格式是这样的,我发现这样做对我来说更容易(组合多个记录集,显示与其他记录集对齐的记录集中的多个记录,自定义一些基于格式的格式化元素部门等)。可能有更好的方法来创建这些报告,但这运行得很好,所以我宁愿尽可能避免重新创建。

我的问题是:由于这是一份员工反馈表,因此主管希望能够看到一些细节,但不向员工展示。生成报告时,主管有机会审查数据/对报告本身进行更改(通过用户表单、报告上的事件处理)。审查的一部分是查看一组字段(作为标签添加到报告中),但在最终打印报告时应该隐藏这些字段。

在我的脑海中,我以为我以前见过一种以这种方式隐藏特定控件的方法,并进行了一些谷歌搜索DisplayWhen. 但是,它似乎DisplayWhen只能在表单上使用。有没有办法使用报告设置此值(或类似/相关选项)?在 SO 上进行搜索时,我在DisplayWhen的查询中只发现了一个问题,这对我没有帮助。

在创建报告时使用.Visible = False该报告将不起作用,因为主管需要查看这些字段。我似乎无法在打印时设置此属性,因为我没有看到任何事件处理选项。我可以创建一个自定义事件处理程序来捕获打印命令吗?

这是控件创建代码:

Private Sub AddOneOnOneField(Rpt As Report, Left As Integer, Top As Integer, Width As Integer, Height As Integer, _
    Optional Cap As String = vbNullString, Optional Align As Integer = cnFontCenter, Optional Size As Integer = 10, _
    Optional Bold As Integer = cnBoldFont, Optional DisplayWhen As Byte = 0)

    With CreateReportControl(Rpt.Name, acLabel, acDetail, vbNullString, vbNullString, _
        Left, Top, Width, Height)

        .Properties("FontSize") = Size
        .Properties("FontWeight") = Bold
        .Properties("BorderStyle") = 1
        .Properties("TextAlign") = Align
        .Properties("Caption") = Cap
        .Properties("DisplayWhen") = DisplayWhen ' This does not work!
    End With

End Sub

重申我的问题:

  • 如何将某些报表字段设置为仅在打印预览中显示,而不在打印时显示?
  • 我可以创建一个自定义事件处理程序来从报告中捕获打印命令吗?
  • 有没有办法DisplayWhen在报告字段上设置属性(或类似/相关选项)?
4

2 回答 2

1

如果隐藏数据真的很重要,那么您选择了错误的数据库,如果有点随意,您可以要求管理员输入代码,然后根据代码隐藏或显示字段。或者,您可以为管理员提供稍微不同的前端。

于 2012-07-16T18:39:41.910 回答
0

这并不理想,但它有效。通过 VBA 创建报表时,我已经有了在报表模块中创建代码的代码。我添加到该功能以捕获字段的打印/强制隐藏,打印,然后取消隐藏。

Private Sub AddReportCode(mdlNew As Module)
Dim sNewCode As String

    sNewCode = "Option Compare Database" & vbCr & "Option Explicit"
    sNewCode = sNewCode & vbCr
    sNewCode = sNewCode & vbCr & "Public Sub CapturePrint()"
    sNewCode = sNewCode & vbCr & "Dim v As Variant"
    sNewCode = sNewCode & vbCr & "If Application.CurrentObjectName = ""OneOnOneReport"" And Application.CurrentObjectType = acReport Then"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = False"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 3) = ""Occ"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = False"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acNormal"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewDesign"
    sNewCode = sNewCode & vbCr & "For Each v In Reports(""OneOnOneReport"").Controls"
    sNewCode = sNewCode & vbCr & "If Left(v.Properties(""Name""), 4) = ""HIDE"" Then"
    sNewCode = sNewCode & vbCr & "v.Visible = True"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "Next v"
    sNewCode = sNewCode & vbCr & "Reports(""OneOnOneReport"").Visible = True"
    sNewCode = sNewCode & vbCr & "DoCmd.OpenReport ""OneOnOneReport"", acViewPreview"
    sNewCode = sNewCode & vbCr & "End If"
    sNewCode = sNewCode & vbCr & "End Sub"

    mdlNew.DeleteLines 1, mdlNew.CountOfLines

    mdlNew.InsertText sNewCode

End Sub

为了便于阅读,这是运行后模块中的实际代码:

Option Compare Database
Option Explicit

Public Sub CapturePrint()
Dim v As Variant
If Application.CurrentObjectName = "OneOnOneReport" And Application.CurrentObjectType = acReport Then
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    Reports("OneOnOneReport").Visible = False
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 3) = "Occ" Then
            v.Visible = False
        End If
    Next v
    DoCmd.OpenReport "OneOnOneReport", acNormal
    DoCmd.OpenReport "OneOnOneReport", acViewDesign
    For Each v In Reports("OneOnOneReport").Controls
        If Left(v.Properties("Name"), 4) = "HIDE" Then
            v.Visible = True
        End If
    Next v
    Reports("OneOnOneReport").Visible = True
    DoCmd.OpenReport "OneOnOneReport", acViewPreview
End If
End Sub

在向报告中添加新控件时(请参阅有问题的原始代码正文),我添加了可以选择为控件分配名称的功能:

.Properties("Name") = NewName

控件创建代码使用NewName参数调用,"HIDE" & ControlTop & ControlLeft以允许命名所有需要的控件而无需重复名称。隐藏之前,报表以设计模式打开,以防止屏幕闪烁/减速。然后,打印代码循环遍历报表上的所有控件,查找以“HIDE”开头的名称并隐藏它们。一旦所有控件都被隐藏,报表将正常重新打开以打印,然后重复该过程以取消隐藏这些控件并向用户显示原始报表。

我仍然无法print正确捕获事件(这是解决方案不是我最喜欢的选项的地方),所以我在最初创建报告时提示用户打印,调用新创建的CapturePrintSub(同时隐藏这些字段)。如果他们选择不这样做,那么他们可以在不隐藏字段的情况下正常打印,或者重新生成报告以隐藏它们/再次提示。

于 2012-07-17T14:44:49.363 回答