技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 5960
|
當(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
' |
|