设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 6173|回复: 11
打印 上一主题 下一主题

[报表] 报表栏目宽度与子窗体项目宽度相适应的解决方案

[复制链接]
跳转到指定楼层
1#
发表于 2004-12-3 07:08:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    当你设计好报表后,报表的栏目是固定的,不能由用户随意修改,也不能由用户选择哪些项目打印,哪些项目不打印,这确实不够方便。

    下面我给出一个解决方案,供大家参考:

    编程思路:

    一、用子窗体显示查询结果:

    一般情况下,都会给用户显示一个查询窗体,由用户指定条件,根据条件显示查询结果,用于显示结果的往往是一个子窗体,表现形式为

数据表,因为数据表的项目宽度可由用户随意调整,当他将宽度调为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

   

    '
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2004-12-16 22:36:00 | 只看该作者
我最怕长长的代码了,头痛。但为什么不直接打印窗体呢?即,在窗体中的菜单中选打印窗体?
3#
 楼主| 发表于 2004-12-27 07:08:00 | 只看该作者
打印窗体没有报表美观,格式也不够灵活。
4#
发表于 2005-1-31 23:47:00 | 只看该作者
   
5#
发表于 2005-12-1 17:43:00 | 只看该作者
收藏了!
6#
发表于 2006-2-16 02:42:00 | 只看该作者
好贴.实用.
7#
发表于 2006-2-17 03:01:00 | 只看该作者
erfewrf
8#
发表于 2006-2-17 03:03:00 | 只看该作者
eftre
9#
发表于 2006-2-17 03:04:00 | 只看该作者
好贴
10#
发表于 2006-2-18 04:18:00 | 只看该作者
好贴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-22 20:42 , Processed in 0.092166 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表