設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

12下一頁
返回列表 發(fā)新帖
查看: 6145|回復(fù): 11
打印 上一主題 下一主題

[報(bào)表] 報(bào)表欄目寬度與子窗體項(xiàng)目寬度相適應(yīng)的解決方案

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2004-12-3 07:08:00 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
    當(dāng)你設(shè)計(jì)好報(bào)表后,報(bào)表的欄目是固定的,不能由用戶隨意修改,也不能由用戶選擇哪些項(xiàng)目打印,哪些項(xiàng)目不打印,這確實(shí)不夠方便。

    下面我給出一個解決方案,供大家參考:

    編程思路:

    一、用子窗體顯示查詢結(jié)果:

    一般情況下,都會給用戶顯示一個查詢窗體,由用戶指定條件,根據(jù)條件顯示查詢結(jié)果,用于顯示結(jié)果的往往是一個子窗體,表現(xiàn)形式為

數(shù)據(jù)表,因?yàn)閿?shù)據(jù)表的項(xiàng)目寬度可由用戶隨意調(diào)整,當(dāng)他將寬度調(diào)為0時,該項(xiàng)目就會隱藏,用戶還可以拖動項(xiàng)目標(biāo)頭改變排列位置。

    二、建立報(bào)表:

  

    使用向?qū)梢粋與子窗體數(shù)據(jù)源相同的報(bào)表。

    三、建立子窗體項(xiàng)目與報(bào)表欄目之間的聯(lián)系:

    子窗體各個項(xiàng)目標(biāo)簽和報(bào)表各個欄目標(biāo)簽采用相同的命名方法,且同一項(xiàng)目使用同一個名字,如:子窗體上有CustomerName項(xiàng)目,其項(xiàng)目

標(biāo)簽命名為:CustomerName_Label,報(bào)表欄目CustomerName的標(biāo)簽應(yīng)使用CustomerName_Label,這樣報(bào)表欄目與子數(shù)據(jù)窗體項(xiàng)目之間就建立了聯(lián)

系。

    四、在報(bào)表的Open事件中寫代碼,使欄目寬度與子窗體項(xiàng)目寬度一致:

    這一步需要循環(huán)判斷子窗體的每一個控件,判斷其ColumnWidth、ColumnOrder屬性,當(dāng)ColumnWidth屬性為0時,隱藏報(bào)表上對應(yīng)的欄目,

否則將欄目寬度改變?yōu)樽哟绑w上項(xiàng)目的寬度,這樣就將欄目寬度與項(xiàng)目寬度對應(yīng)起來了,接下來需要改變報(bào)表上欄目的排列順序,改變?yōu)樽哟?br />
體上對應(yīng)項(xiàng)目的ColumnOrder。

    還有一步就是,報(bào)表欄目的標(biāo)簽Caption,也需要從子窗體上取得。

    下面是報(bào)表Open事件調(diào)用的代碼,僅供參考:

Sub ReSetReport(sRep As String, sFrm As String, sSubFrm As String)

    '調(diào)用方式:

    'ReSetReport "RepReceiveDetail", "frmGetReceiveDetail", "dfrmGetReceiveDetail"     掛帳明細(xì)表

    'ReSetReport "RepBills", "frmBills", "dfrmGetBillsByDate"                          帳單列表

     

    Dim oControl As Control         '控件

    Dim i, j, k As Integer            '計(jì)數(shù)

    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           '狀態(tài)

    Dim iColumnCount As Integer     '列數(shù)

   

    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)             '數(shù)組從0開始計(jì)數(shù)

    ReDim aColumnOrder(iColumnCount - 1)

    ReDim aColumnWidth(iColumnCount - 1)

   

    ReDim aColumnName1(iColumnCount - 1)

    ReDim aColumnWidth1(iColumnCount - 1)

   

    On Error GoTo 0         'Resume Next

    '將窗體上的控件名,列寬度,列順序保存到數(shù)組

    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

            '給標(biāo)簽賦值,用窗體上對應(yīng)的標(biāo)簽值

            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            '合計(jì)欄

                k = k + 1

            End If

            i = i + 1

        End If

    Next

            

    '設(shè)置報(bào)表寬度

    Reports(sRep).Report.Width = nWidth + 1000

   

    '按窗體上列順序重新生成數(shù)組

    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#
發(fā)表于 2004-12-16 22:36:00 | 只看該作者
我最怕長長的代碼了,頭痛。但為什么不直接打印窗體呢?即,在窗體中的菜單中選打印窗體?
3#
 樓主| 發(fā)表于 2004-12-27 07:08:00 | 只看該作者
打印窗體沒有報(bào)表美觀,格式也不夠靈活。
4#
發(fā)表于 2005-1-31 23:47:00 | 只看該作者
   
5#
發(fā)表于 2005-12-1 17:43:00 | 只看該作者
收藏了!
6#
發(fā)表于 2006-2-16 02:42:00 | 只看該作者
好貼.實(shí)用.
7#
發(fā)表于 2006-2-17 03:01:00 | 只看該作者
erfewrf
8#
發(fā)表于 2006-2-17 03:03:00 | 只看該作者
eftre
9#
發(fā)表于 2006-2-17 03:04:00 | 只看該作者
好貼
10#
發(fā)表于 2006-2-18 04:18:00 | 只看該作者
好貼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:26 , Processed in 0.115536 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表