|
当你设计好报表后,报表的栏目是固定的,不能由用户随意修改,也不能由用户选择哪些项目打印,哪些项目不打印,这确实不够方便。
下面我给出一个解决方案,供大家参考:
编程思路:
一、用子窗体显示查询结果:
一般情况下,都会给用户显示一个查询窗体,由用户指定条件,根据条件显示查询结果,用于显示结果的往往是一个子窗体,表现形式为
数据表,因为数据表的项目宽度可由用户随意调整,当他将宽度调为0时,该项目就会隐藏,用户还可以拖动项目标头改变排列位置。
二、建立报表:
使用向导生成一个与子窗体数据源相同的报表。
三、建立子窗体项目与报表栏目之间的联系:
子窗体各个项目标签和报表各个栏目标签采用相同的命名方法,且同一项目使用同一个名字,如:子窗体上有CustomerName项目,其项目
标签命名为:CustomerName_Label,报表栏目CustomerName的标签应使用CustomerName_Label,这样报表栏目与子数据窗体项目之间就建立了联
系。
四、在报表的Open事件中写代码,使栏目宽度与子窗体项目宽度一致:
这一步需要循环判断子窗体的每一个控件,判断其ColumnWidth、ColumnOrder属性,当ColumnWidth属性为0时,隐藏报表上对应的栏目,
否则将栏目宽度改变为子窗体上项目的宽度,这样就将栏目宽度与项目宽度对应起来了,接下来需要改变报表上栏目的排列顺序,改变为子窗
体上对应项目的ColumnOrder。
还有一步就是,报表栏目的标签Caption,也需要从子窗体上取得。
下面是报表Open事件调用的代码,仅供参考:
Sub ReSetReport(sRep As String, sFrm As String, sSubFrm As String)
'调用方式:
'ReSetReport "RepReceiveDetail", "frmGetReceiveDetail", "dfrmGetReceiveDetail" 挂帐明细表
'ReSetReport "RepBills", "frmBills", "dfrmGetBillsByDate" 帐单列表
Dim oControl As Control '控件
Dim i, j, k As Integer '计数
Dim nWidth As Double '总列宽
Dim aColumnName() '列名
Dim aColumnOrder() '列顺序
Dim aColumnWidth() '列宽
Dim aColumnName1() '列名(按用户顺序)
Dim aColumnWidth1() '列宽(按用户顺序)
Dim sSql As String '查询语句
Dim sMemID As String '会员証号
Dim sStatus As String '状态
Dim iColumnCount As Integer '列数
i = 0
nWidth = 0
If Not IsLoaded(sFrm) Then
DoCmd.OpenForm sFrm, acNormal
End If
If Not IsLoadedRep(sRep) Then
DoCmd.OpenReport sRep, acViewDesign
End If
iColumnCount = Forms(sFrm).Controls(sSubFrm).Form.Controls.Count / 2
ReDim aColumnName(iColumnCount - 1) '数组从0开始计数
ReDim aColumnOrder(iColumnCount - 1)
ReDim aColumnWidth(iColumnCount - 1)
ReDim aColumnName1(iColumnCount - 1)
ReDim aColumnWidth1(iColumnCount - 1)
On Error GoTo 0 'Resume Next
'将窗体上的控件名,列宽度,列顺序保存到数组
k = 0
For Each oControl In Forms(sFrm).Controls(sSubFrm).Form.Controls
If Right(oControl.Name, 5) <> "Label" Then
aColumnName(i) = oControl.Name
aColumnOrder(i) = oControl.ColumnOrder
aColumnWidth(i) = Forms(sFrm).Controls(sSubFrm).Form.Controls(oControl.Name).ColumnWidth
'给标签赋值,用窗体上对应的标签值
Reports(sRep).Controls(oControl.Name & "_Label").Caption = Forms(sFrm).Controls(sSubFrm).Form.Controls(oControl.Name & "_Label").Caption
If Left(oControl.ControlSource, 1) <> "=" Then
nWidth = nWidth + aColumnWidth(i)
Else '合计栏
k = k + 1
End If
i = i + 1
End If
Next
'设置报表宽度
Reports(sRep).Report.Width = nWidth + 1000
'按窗体上列顺序重新生成数组
For i = 0 To iColumnCount - 1
For j = 0 To iColumnCount - 1
If aColumnOrder(j) = i + 1 Then
aColumnName1(i) = aColumnName(j)
aColumnWidth1(i) = aColumnWidth(j)
Exit For
End If
Next j
Next i
' |
|