在Access 2003数据库中,我有一个通过VBA生成的员工状态/反馈报告。我在VBA中创建报表,因为所需的报表格式是这样的,我发现它更容易这样做(组合多个记录集,显示与其他记录集对齐的记录集中的多个记录,自定义一些基于格式的元素在部门等)。可能有更好的方法来创建这些报告,但这种功能很好,所以我宁愿避免重新创建。
我的问题是:由于这是一份员工反馈表,因此主管希望能够看到详细信息,但不会向员工展示。生成报告时,主管有机会从报告本身查看数据/进行更改(通过用户表单,报告上的事件处理)。部分检查是查看一组字段(作为标签添加到报告中),但在最终打印报告时应隐藏这些字段。
在我脑海中,我以为我之前已经看过以这种方式隐藏特定控件的方法,并在DisplayWhen
上搜索了this MSDN resource。但是,似乎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
属性(或类似/相关选项)? 答案 0 :(得分:1)
如果隐藏数据非常重要,那么您选择了错误的数据库,如果它有点随意,您可以要求管理员输入代码并根据代码隐藏或显示字段。或者,您可以为管理员提供稍微不同的前端。
答案 1 :(得分: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
事件(这是解决方案不是我最喜欢的选项),所以我提示用户在初始创建报告时打印,调用新创建的CapturePrint
Sub(隐藏这些字段时)。如果他们选择不这样做,那么他们可以正常打印而不隐藏字段,或者重新生成报告以隐藏它们/再次提示。