技術(shù) 點(diǎn)
- 技術(shù)
- 點(diǎn)
- V幣
- 點(diǎn)
- 積分
- 12861
|
本帖最后由 t小寶 于 2009-5-30 15:39 編輯
最近又看到在關(guān)報(bào)表分組頁(yè)碼的帖子,也來(lái)湊下熱鬧。
一年前曾要使用在報(bào)表顯示分組頁(yè)碼和頁(yè)數(shù)的功能,網(wǎng)上苦苦尋覓而不得,于是硬著頭皮研究,終于得出
兩種方法。
后來(lái)才發(fā)現(xiàn)2004年在access中國(guó)已經(jīng)有人提出這樣的問(wèn)題,并有解決方法,是這個(gè)帖子:
http://ctxi.cn/forum.php?mod=viewthread&tid=19213&highlight=%D7%E9%2B%D2%B3
不過(guò)在預(yù)覽報(bào)表時(shí)改變頁(yè)面設(shè)置(邊距、大小、方向等)后,頁(yè)碼顯示出現(xiàn)錯(cuò)亂;
再后來(lái)又在微軟網(wǎng)站看到一篇專(zhuān)門(mén)解決此問(wèn)題的kb文章:
http://support.microsoft.com/kb/841779/zh-cn?spid=1265&sid=98,
其需要另建一個(gè)表,并使用記錄集,顯示效果比較好,但在某些情況下改變頁(yè)面設(shè)置還是會(huì)出現(xiàn)頁(yè)碼顯示
錯(cuò)亂。
而本人的方法經(jīng)本人測(cè)試,改變頁(yè)面設(shè)置無(wú)頁(yè)碼顯示錯(cuò)亂現(xiàn)象,因此斗膽稱(chēng)為終極解決方案,請(qǐng)大家測(cè)試
和批評(píng),也許還有更好的方法。
做成了類(lèi)模塊,有一點(diǎn)注釋但很難講明白,如果誰(shuí)要研究實(shí)現(xiàn)原理可以和我交流。其實(shí)上面說(shuō)的兩個(gè)方法的實(shí)現(xiàn)原
理我也不清楚,很多事情知道用就行了。
'分組報(bào)表顯示分組頁(yè)碼和頁(yè)數(shù)(方法一)
'
'功 能:在有分組的報(bào)表的每一頁(yè)上顯示組頁(yè)碼和組頁(yè)數(shù),在預(yù)
' 覽時(shí)改變頁(yè)面設(shè)置后仍能正確顯示。
'作 者:t小雨([email=tcl013@126.com)(t]tcl013@126.com)(t[/email]小寶)
'版 本:1.1
'創(chuàng)建日期:2008-05-??
'整理日期:2009-05-30
'補(bǔ)充說(shuō)明:這個(gè)代碼是一年前做的,由于實(shí)現(xiàn)原理和過(guò)程有點(diǎn)復(fù)雜,
' 當(dāng)時(shí)沒(méi)有添加注釋?zhuān)淹貌畈欢,加上表達(dá)能力有限,
' 現(xiàn)在勉強(qiáng)添加了不完全的注釋?zhuān)芤勒照f(shuō)明會(huì)用就行。
' 直接把代碼放到報(bào)表中也是可以。
' 做成類(lèi)模塊只是為了好保存,以后調(diào)用方便,但由于在
' 類(lèi)模塊中不能使用報(bào)表的節(jié)的事件,調(diào)用起來(lái)還是有些
' 麻煩,不過(guò)總要比直接把代碼放在報(bào)表簡(jiǎn)單一點(diǎn)。
'
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'實(shí)現(xiàn)原理:
'通過(guò)報(bào)表上的輔助文本框獲得組的總行數(shù)(記錄數(shù),后同)、1頁(yè)的最大行數(shù)、當(dāng)前頁(yè)在當(dāng)前組的截止行數(shù),
'在頁(yè)面頁(yè)腳_Format事件中通過(guò)計(jì)算得到分組頁(yè)碼和頁(yè)數(shù)。
'報(bào)表設(shè)計(jì)要求:
' 1、報(bào)表應(yīng)包含組頁(yè)眉、頁(yè)面頁(yè)眉、頁(yè)面頁(yè)腳
' 2、在組頁(yè)眉上有一文本框,有如下屬性
' ControlSource(控件來(lái)源)="=Count(*)"
' RunningSum(運(yùn)行總和)=0(不)
' 3、在主體有一文本框,有如下屬性
' ControlSource(控件來(lái)源)="=1"
' RunningSum(運(yùn)行總和)=1(工作組之上)
'調(diào)用方法,有2種:
' 第1種:
' 1、在報(bào)表用New關(guān)鍵字聲明一個(gè) CreateGroupPage1 類(lèi)的新實(shí)例
' 2、在報(bào)表的打開(kāi)事件執(zhí)行實(shí)例的 Init 方法,傳入全部參數(shù)
' 3、在頁(yè)面頁(yè)腳的 Format (格式化)事件執(zhí)行實(shí)例的 FormatPageFooter 方法
' 4、在頁(yè)面頁(yè)腳的 Print (打印)事件執(zhí)行實(shí)例的 PrintPageFooter 方法
' 這種方法在顯示分組頁(yè)碼的標(biāo)簽上顯示效果如 分組字段值: 1 / 2
' 在報(bào)表中的代碼類(lèi)似下面:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Dim newGroupPage As New CreateGroupPage1
'
' Private Sub Report_Open(Cancel As Integer)
' newGroupPage.Init Me, Me.TxtGrpRows, Me.txtRunSum, Me.LplGrpPages
' End Sub
'
' Private Sub 頁(yè)面頁(yè)腳_Format(Cancel As Integer, FormatCount As Integer)
' newGroupPage.FormatPageFooter
' End Sub
'
' Private Sub 頁(yè)面頁(yè)腳_Print(Cancel As Integer, PrintCount As Integer)
' newGroupPage.PrintPageFooter
' End Sub
'
' Private Sub 組頁(yè)眉0_Format(Cancel As Integer, FormatCount As Integer)
' newGroupPage.FormatGroupLevel1Header
' End Sub
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 第2種:
' 1、在報(bào)表用 WithEvents 關(guān)鍵字聲明一個(gè) CreateGroupPage1 類(lèi)的變量
' 2、在報(bào)表的打開(kāi)事件用 Set New 語(yǔ)句創(chuàng)建新實(shí)例
' 3、在報(bào)表的打開(kāi)事件執(zhí)行實(shí)例的 Init 方法,不須傳入最后一個(gè)參數(shù)(用于顯示分組頁(yè)碼的標(biāo)簽)
' 4、在頁(yè)面頁(yè)腳的 Format(格式化) 事件執(zhí)行實(shí)例的 FormatPageFooter 方法
' 5、在頁(yè)面頁(yè)腳的 Print(打印) 事件執(zhí)行實(shí)例的 PrintPageFooter 方法
' 6、在組頁(yè)眉的 Format(格式化) 事件執(zhí)行實(shí)例的 FormatGroupLevel1Header 方法
' 7、在類(lèi)的 Current 事件過(guò)程將事件參數(shù)返回的分組頁(yè)碼和頁(yè)數(shù)賦給用于顯示的標(biāo)簽
' 在報(bào)表中的代碼類(lèi)似下面:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Dim WithEvents newGroupPage As CreateGroupPage1
'
' Private Sub Report_Open(Cancel As Integer)
' Set newGroupPage = New CreateGroupPage1
' newGroupPage.Init Me, Me.TxtGrpRows, Me.txtRunSum
' End Sub
'
' Private Sub 頁(yè)面頁(yè)腳_Format(Cancel As Integer, FormatCount As Integer)
' newGroupPage.FormatPageFooter
' End Sub
'
' Private Sub 頁(yè)面頁(yè)腳_Print(Cancel As Integer, PrintCount As Integer)
' newGroupPage.PrintPageFooter
' End Sub
'
' Private Sub 組頁(yè)眉0_Format(Cancel As Integer, FormatCount As Integer)
' newGroupPage.FormatGroupLevel1Header
' End Sub
'
' Private Sub newGroupPage_Current(GrpPage As Integer, GrpPages As Integer)
' Me.LplGrpPages.Caption = Me.類(lèi)別名稱(chēng) & " 共 " & GrpPages & " 頁(yè),第 " & GrpPage & " 頁(yè)"
' End Sub
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
類(lèi)模塊:- Option Compare Database
- Option Explicit
- Public Event Current(GrpPage As Integer, GrpPages As Integer)
- '在此自定義事件中可以獲取分組頁(yè)碼信息,以便自定義顯示頁(yè)碼格式
- Dim MyRpt As Report
- Dim txtRunSum As TextBox ' 取得每個(gè)組的記錄數(shù)的文本框
- Dim TxtGrpRows As TextBox ' 取得每個(gè)組的記錄在組中的序號(hào)的文本框
- Dim lblShowPage As Label ' 用于顯示分組頁(yè)碼信息的標(biāo)簽
- Dim inMaxRows As Integer ' 1頁(yè)的最大行數(shù)(記錄數(shù))
- Dim inRptPage As Integer ' 報(bào)表本身頁(yè)碼
- Dim blPrint As Boolean ' 是否已經(jīng)發(fā)生頁(yè)面頁(yè)腳的Print事件,為避免頁(yè)面頁(yè)腳的Format事件中的代碼重復(fù)運(yùn)行
- Dim blFistPage As Boolean ' 當(dāng)前頁(yè)是否是所在組的第一頁(yè)
- Public Sub Init(rpt As Report, GrpRows As TextBox, RunSum As TextBox, Optional ShowPage As Label)
- ' 過(guò)程中的檢查參數(shù)代碼不是必須的,僅為了防止以后忘記如何設(shè)計(jì)報(bào)表
- Dim st1 As String
- Set MyRpt = rpt
-
- Set TxtGrpRows = GrpRows
- With TxtGrpRows
- If .Section <> acGroupLevel1Header Then
- st1 = "作為第二個(gè)參數(shù)的文本框必須在分組頁(yè)眉節(jié)上!"
- ElseIf .ControlSource <> "=Count(*)" Then
- st1 = "作為第二個(gè)參數(shù)的文本框的ControlSource屬性必須是""=Count(*)""!"
- ElseIf .RunningSum <> 0 Then
- st1 = "作為第二個(gè)參數(shù)的文本框的RunningSum屬性必須是0!"
- End If
- End With
- If Len(st1) > 0 Then
- MsgBox st1, vbExclamation, "參數(shù)錯(cuò)誤"
- Exit Sub
- End If
-
- Set txtRunSum = RunSum
- With txtRunSum
- If .Section <> acDetail Then
- st1 = "作為第三個(gè)參數(shù)的文本框必須在報(bào)表主體節(jié)上!"
- ElseIf .ControlSource <> "=1" Then
- st1 = "作為第三個(gè)參數(shù)的文本框的ControlSource屬性必須是""=1""!"
- ElseIf .RunningSum <> 1 Then
- st1 = "作為第三個(gè)參數(shù)的文本框的RunningSum屬性必須是1!"
- End If
- End With
- If Len(st1) > 0 Then
- MsgBox st1, vbExclamation, "參數(shù)錯(cuò)誤"
- Exit Sub
- End If
-
- If Not (ShowPage Is Nothing) Then Set lblShowPage = ShowPage
-
- End Sub
- Public Sub FormatGroupLevel1Header()
- If txtRunSum = 1 Then blFistPage = True ' 為頁(yè)面頁(yè)腳Format事件作標(biāo)記
- End Sub
- Public Sub FormatPageFooter()
- Dim inGrpPage As Integer ' 組頁(yè)碼
- Dim inGrpPages As Integer ' 組頁(yè)數(shù)
- Dim inLastRows As Integer ' 截止當(dāng)前頁(yè),所在組的所有行數(shù)
- inLastRows = txtRunSum ' 從文本框獲得截止行數(shù)
- If inLastRows = 0 Then inLastRows = TxtGrpRows
-
- If MyRpt.Page = 1 Then
- '在第1頁(yè)初始變量
- If MyRpt.Pages > 0 And MyRpt.Pages = inRptPage Then
- ' 這里已經(jīng)是第2輪格式化第1頁(yè),報(bào)表加載時(shí)進(jìn)行兩輪格式化,第一輪Pages=0
- Else
- inMaxRows = 0
- End If
- inRptPage = 0
- blPrint = False
- End If
-
- If Not blPrint Then
- '僅在第1輪格式化中,獲取每組第一頁(yè)的行數(shù)
- If blFistPage Then
- '每組第一頁(yè)的行數(shù)即是本組任一頁(yè)的最大行數(shù)
- If inMaxRows < inLastRows Then inMaxRows = inLastRows
- blFistPage = False
- End If
- inRptPage = inRptPage + 1
- End If
-
- If MyRpt.Pages > 0 Then
- inGrpPages = Int(TxtGrpRows / inMaxRows + 0.9999) ' 組的總行數(shù)除以1頁(yè)的行數(shù),得到組的頁(yè)數(shù)
- inGrpPage = Int(inLastRows / inMaxRows + 0.9999) ' 截止當(dāng)前頁(yè)的累計(jì)行數(shù)除以1頁(yè)的行數(shù),得到當(dāng)前頁(yè)的頁(yè)碼
- If Not (lblShowPage Is Nothing) Then
- lblShowPage.Caption = inGrpPage & " / " & inGrpPages
- End If
- RaiseEvent Current(inGrpPage, inGrpPages)
- End If
- End Sub
- Public Sub PrintPageFooter()
- blPrint = True
- End Sub
復(fù)制代碼 |
|