Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]提问:限定行数并补空行的例子

风水师  发表于:2010-04-02 05:44:25  
复制

'       函数名:RepDetail_Format()
'       调用报表必须使用控件:(文本框)
'               txtRecord_NO   在主体节    可见                用于显示记录号,可选
'               txtTotGrp      在主体节    不可见  =Count(*)   用于取得报表的总记录数,必须
'               txtCurrentPage 在主体节    不可见  =[Page]     用于取得当前页数,必须
'
'       参数说明:  RepName         报表名称    (当前报表可用 (Me), 其它报表可用:(Reports.报表名)引用)
'                   txtCurrentPage  报表主体节上的[txtCurrentPage]文本框控件
'                   txtRecordNum    报表定义的私人变量              用于记录数的递增,必须  使用直接用:txtRecordNum 输入不可变更
'                                   (注:Private txtRecordNum As Integer)
'                   txtTotGrp       报表主体节上的[txtTotGrp]文本框控件
'                   IntPrintLen     报表打印的行数。   数据类型:Integer    (注:不可超过每页允许的最大记录数)
'

'       使用方法:
'                   1,先定义一私人变量:Private txtRecordNum As Integer,必须
'                   2,报表主体节的格式化事件中调用(Detail_Format 事件)
       
'       调用方法:NextRecord=RepDetail_Format(RepName , txtCurrentPage.text , txtRecordNum , txtTotGrp.text , IntPrintLen)
'       使用示例:NextRecord = RepDetail_Format(Me, [txtCurrentPage], txtRecordNum, [txtTotGrp], 20)
'==============================================================


Option Compare Database

Option Explicit '不允许使用未经声明的变量,可以防止引用错误的变量


Function RepDetail_Format(RepName As Report, txtCurrentPage As Integer, txtRecordNum As Integer, txtTotGrp As String, IntPrintLen As Integer) As Boolean
Dim ctrl As Control '定义ctrl为控件数据类型
Dim intCurrentPage1stI As Integer 'intCurrentPage1stI记录每页起始的I,用于强制分页
Dim intMaxI As Integer 'intMaxI是用计算得出的所有页的总行数(包括空行)
Dim intCountPerPage As Integer  'intCountPerPage是指定的每页打印记录行数


On Error GoTo ER

 intCountPerPage = IntPrintLen       'intCountPerPage是指定的每页打印记录行数
'----------------------------------------
      
        txtRecordNum = txtRecordNum + 1     '----递增全局 txtRecordNum 变量

'--------------计算最大记录数--------------------

    If intMaxI = 0 Then
        If txtTotGrp Mod intCountPerPage = 0 Then
            intMaxI = txtTotGrp
        Else
            intMaxI = (Fix(txtTotGrp / intCountPerPage) + 1) * intCountPerPage
        End If
    End If
'-----------------------------------------------
    '设置每页第一条记录的记录数(顺号值)
   
 '   If txtRecordNum = IntPrintLen Then intCurrentPage1stI = (txtCurrentPage - 1) * intCountPerPage
 
    intCurrentPage1stI = (txtCurrentPage - 1) * intCountPerPage
 '    Debug.Print "intCurrentPage1stI=" & intCurrentPage1stI & "   intCountPerPage + intCurrentPage1stI=" & intCountPerPage + intCurrentPage1stI & "   intMaxI=" & intMaxI


    '当到达本页设定的记录数时,强制分页
    If txtRecordNum = intCountPerPage + intCurrentPage1stI Then
        RepName.Section(acDetail).ForceNewPage = 1
    Else
        RepName.Section(acDetail).ForceNewPage = 0
    End If

    If txtRecordNum <= txtTotGrp Then
    
  '      If txtRecordNum = 0 Then txtRecordNum = 1
           
        For Each ctrl In RepName.Section(0).Controls
                                                                         '  Debug.Print "ctrl.ItemData" & ctrl.ItemData
            With ctrl
                .ForeColor = 0
            End With
        Next ctrl

 

 

Top
风水师 发表于:2010-04-02 05:45:27


Else
    '---------------------------------设置文本框字体颜色为白色----------------------
        If txtRecordNum = intMaxI + 1 Then txtRecordNum = 1          '--------当 txtRecordNum 增长至 报表最大记录数时(包括空白)归 1
                                                                             'Debug.Print "2=" & txtRecordNum
            '超过报表最后一条记录,由于NextRecord = False报表上实际还是最后
            '一条记录的内容,设定文本框字体颜色是白色,看起来就是空行了。
        For Each ctrl In RepName.Section(0).Controls
            With ctrl
                .ForeColor = 16777215
            End With
        Next ctrl
       '----------将第一条记录设为黑色(显示出来)-------------
        If txtRecordNum = 1 Then
            For Each ctrl In RepName.Section(0).Controls
                With ctrl
                    .ForeColor = 0
                End With
            Next ctrl
        End If
        '---------------------------------------------------
    End If
'=================================================================================================
           
'=======================第二步,处理是否进入下一条记录===========================
    If txtTotGrp < intMaxI Then
  
    '当总记录数<总行数时,分三段来考虑是否进入下一条记录
        '
        If txtRecordNum < txtTotGrp Then
            RepDetail_Format = True
        ElseIf (txtRecordNum >= txtTotGrp And txtRecordNum < intMaxI) Then
            RepDetail_Format = False
        Else
            RepDetail_Format = True
        End If
    Else
             '当总记录数=总行数时,分两段来考虑是否进入下一条记录,但两段实际都是同一句代码
        RepDetail_Format = True
    End If
                                        '    Debug.Print "txtRecordNum=" & txtRecordNum & "   txtTotGrp=" & txtTotGrp
   

    RepName.txtRecord_NO = txtRecordNum      '对文本框:txtRecord_NO 置值
Exit Function

ER:
    If Err() = 2465 Then    '-------此项为没有  文本框:txtRecord_NO 时 取消置值
        Resume Next
    Else
        MsgBox (Err() & Err.Description)
    End If
   
End Function



风水师 发表于:2010-04-02 05:51:14

Dim intCurrentPage1stI As Integer 'intCurrentPage1stI记录每页起始的I,用于强制分页

想问一下:记录每页起始的I,用于强制分页的意思,举例来说,每页报表我指定打印6行,一个销售订单有20条记录.那就得4页.intCurrentPage1stI记录每页起始的I,也就是说intCurrentPage1stI记录第二页起始的行数为7,第三页起始行数13行.,第三页起始行数为19行,是这种理解吧.



风水师 发表于:2010-04-02 06:29:28
txtRecordNum变量的含义是什么呢?

风水师 发表于:2010-04-02 06:45:45

'当到达本页设定的记录数时,强制分页
    If txtRecordNum = intCountPerPage + intCurrentPage1stI Then
        RepName.Section(acDetail).ForceNewPage = 1 '当前节在新页的顶部打印
    Else
        RepName.Section(acDetail).ForceNewPage = 0  '当前节(正在设置属性的节)在当前页中打印。
    End If

 

就是想问一下:如果记录数只有5条,而每页可以打印6条记录,程序自动判断它在当前页中打印,而如果记录数有7条,每页可以打印6条,程序自动判断它在下一页打印.我就是不理解txtRecordNum在什么情况下,系统会判断RepName.Section(acDetail).ForceNewPage = 1 '当前节在新页的顶部打印



simon 发表于:2010-04-02 13:15:17
期待高手解答,顶

善裕 发表于:2010-04-12 21:21:50

到我的空间看一下,我原来也请高手帮过这个问题



兰草 发表于:2010-04-23 16:41:35

我的理解txtRecordNum是记录格式化打印的行数,每格式打印一次就增加1,ntCurrentPage1stI 从0开始,你再看下程序就知道了。见笑了,

想问下你 If txtRecordNum = intMaxI + 1 Then txtRecordNum = 1 起什么作用,似乎为了让打印第一行时部位空行,可不理解为什么?



总记录:7篇  页次:1/1 9 1 :