Foxtable(狐表)用户栏目专家坐堂 → [求助]专业报表插入转次页、承前页行


  共有8057人关注过本帖树形打印复制链接

主题:[求助]专业报表插入转次页、承前页行

帅哥哟,离线,有人找我吗?
洮沙
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:819 积分:7048 威望:0 精华:0 注册:2017/8/31 12:07:00
  发帖心情 Post By:2022/8/29 7:20:00 [只看该作者]

蓝老师,你好!参照10楼代码,折腾两天了,做测试不添加分组统计用其他表会做分页了,但这个需要按年、按月分组汇总,而且顺序还不能乱,实在是没有办法进行分页添加行。无奈再次请教,麻烦你给改写一下,谢谢!
测试过程出现如下图各种情况错误:

图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20220829073447.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20220829073452.png
图片点击可在新窗口打开查看

代码如下:

'环境判断
If Forms("日记账").Opened Then
Else
    MessageBox.Show("【日记账】窗口未打开!", "提示")
    Return ""
End If

If Tables("日记账_Table1").Rows.Count > 0 Then
Else
    MessageBox.Show("【日记账】无有效数据!", "提示")
    Return ""
End If
'页面设置
Dim doc As New PrintDoc
doc.PageSetting.PaperKind = 9 '纸张类型改为A4
doc.PageSetting.Landscape = True '横向打印
doc.PageSetting.LeftMargin = 30 '设置左边距
doc.PageSetting.RightMargin = 30 '设置右边距
doc.PageSetting.TopMargin = 20 '设置上边距
doc.PageSetting.BottomMargin = 20 '设置下边距

'定义变量
Dim tbl As Table = Tables("日记账_Table1")
Dim s1 As String = tbl.Rows(0)("会计科目_全名")
Dim text As String = s1.Remove(s1.IndexOf("_"))
Dim text2 As String = "科目:" & tbl.Rows(0)("会计科目_代码") & "/" & s1.SubString(s1.IndexOf("_") + 1)
Dim ys As List(Of String) = tbl.DataTable.GetValues("日期_年", tbl.Filter, "排序")
Dim pds As List(Of String)
Dim drs As List(Of DataRow)
Dim cnt As Integer
Dim dwmc As String
Dim pzdr As DataRow = DataTables("系统配置").Find("编号 = 'XTPZ-001'") 
if pzdr isnot nothing then
    dwmc = pzdr("单位名称")
End If 

'定义表格
Dim rt As New prt.RenderTable '定义一个新表格
rt.Style.Gridlines.All = New prt.Linedef(Color.Gray) '灰色网格线
rt.Style.Gridlines.Left = New prt.LineDef("0mm", Color.white) '去掉左边框的网格线
rt.Style.Gridlines.Right = New prt.LineDef("0mm", Color.white) '去掉左边框的网格线
rt.CellStyle.Spacing.All = 1 '内容距离网格线1毫米

'增加表头
rt.Cells(0, 0).Text = text & "日记账" '第一行设置文本对象的内容
rt.Cells(1, 0).Text = text2 '第二行设置文本对象的内容
rt.Cells(1, 6).Text = "单位:元" '第二行设置文本对象的内容
rt.Cells(2, 0).Text = "日期"
rt.Cells(2, 1).Text = "凭证字"
rt.Cells(2, 2).Text = "凭证编号"
rt.Cells(2, 3).Text = "摘要"
rt.Cells(2, 4).Text = "本期发生额"
rt.Cells(3, 4).Text = "借方"
rt.Cells(3, 5).Text = "贷方"
rt.Cells(2, 6).Text = "余额"
rt.Cells(2, 7).Text = "核对勾选"

'合并表头
rt.Cells(0, 0).SpanCols = 8 '第1行第1个单元格向右合并8列 (标题)
rt.Cells(1, 0).SpanCols = 6 '第2行第1个单元格向右合并6列 (标题)
rt.Cells(1, 6).SpanCols = 2 '第2行第1个单元格向右合并2列 (单位)
rt.Cells(2, 0).SpanRows = 2 '第3行第1个单元格向下合并2行 (日期)
rt.Cells(2, 1).SpanRows = 2 '第3行第2个单元格向下合并2行 (凭证字)
rt.Cells(2, 2).SpanRows = 2 '第3行第3个单元格向下合并2行 (凭证编号)
rt.Cells(2, 3).SpanRows = 2 '第3行第4个单元格向下合并2行 (摘要)
rt.Cells(2, 4).SpanCols = 2 '第3行第5个单元格向右合并2列 (本期发生额)
rt.Cells(2, 6).SpanRows = 2 '第3行第7个单元格向下合并2行 (余额)
rt.Cells(2, 7).SpanRows = 2 '第3行第8个单元格向下合并2行 (核对勾选)

'设置列宽
rt.Cols(0).Width = 55
rt.Cols(1).Width = 30
rt.Cols(2).Width = 80
rt.Cols(3).Width = 205
rt.Cols(4).Width = 70
rt.Cols(5).Width = 70
rt.Cols(6).Width = 70
rt.Cols(7).Width = 25

'设置样式
rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center '内容水平居中
rt.Style.TextAlignVert = prt.AlignVertEnum.Center '内容垂直居中
rt.RowGroups(0, 5).Header = prt.TableHeaderEnum.All '将前四行作为表头.
rt.ColGroups(0, 1).Header = prt.TableHeaderEnum.All '将第一列作为分组列.
rt.Rows(0).Height = 10 '标题行高
rt.Rows(0).Style.Font = New Font("宋体", 16, FontStyle.Bold) '设置文本对象的字体
rt.Rows(1)(0).Style.Font = New Font("宋体", 11, FontStyle.Bold) '设置文本对象的字体
rt.Rows(1)(6).Style.Font = New Font("宋体", 9, FontStyle.Bold) '设置文本对象的字体
rt.Rows(0).Style.Borders.All = New prt.LineDef("0mm", Color.white) '去掉第一行的网格线
rt.Rows(1).Style.Borders.All = New prt.LineDef("0mm", Color.white) '去掉第二行的网格线
rt.Rows(1)(6).Style.Borders.Left = New prt.LineDef("0mm", Color.white) '去掉第二行最后单元格的网格线
rt.Rows(1).Style.Borders.Bottom = New prt.Linedef(Color.Gray) '恢复第二行底端的网格线
rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center '第一行内容水平居中
rt.Rows(1)(0).Style.TextAlignHorz = prt.AlignHorzEnum.Left '第二行第一列内容靠左 
rt.Rows(1)(6).Style.TextAlignHorz = prt.AlignHorzEnum.Center '第二行第最后列内容居中 
rt.Rows(2).Style.Font = New Font("宋体", 10, FontStyle.Bold) '设置文本对象的字体
rt.Rows(3).Style.Font = New Font("宋体", 10, FontStyle.Bold) '设置文本对象的字体

'表格细节赋值
For Each y As String In ys '分年打印  
    pds = tbl.DataTable.GetValues("日期_月", "日期_年 = '" & y & "'", "排序")
    For Each pd As String In pds '分月打印
        If tbl.Filter > "" Then
            drs = tbl.DataTable.Select("日期_年 = '" & y & "' And 日期_月 = '" & pd & "' And " & tbl.Filter, "排序")
        Else
            drs = tbl.DataTable.Select("日期_年 = '" & y & "' And 日期_月 = '" & pd & "'", "排序")
        End If
        For Each dr As DataRow In drs '逐行打印此月凭证 
            cnt = rt.Rows.Count
            For c As Integer = 0 To tbl.Cols.Count - 1
                If tbl.Cols(c).Name = "本期发生额_借方" OrElse tbl.Cols(c).Name = "本期发生额_贷方" OrElse tbl.Cols(c).Name = "余额" Then
                    If dr(tbl.Cols(c).Name) = 0 Then
                        rt.Cells(cnt, c).Text = ""
                    Else
                        rt.Cells(cnt, c).Text = Format(dr(tbl.Cols(c).Name), "#,##0.00") '格式化数字后赋值
                    End If
                Else
                    rt.Cells(cnt, c).Text = dr(tbl.Cols(c).Name) '其余逐行赋值   
                End If 
                
                '格式化数据
                If rt.Cells(cnt, 7).Text = "True" Then
                    rt.Cells(cnt, 7).Text = "√"
                Else
                    rt.Cells(cnt, 7).Text = "×" 
                End If
                
                '调整对齐
                rt.Cells(cnt, 0).Style.TextAlignHorz = prt.AlignHorzEnum.Left '数据水平靠右                
                rt.Cells(cnt, 4).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
                rt.Cells(cnt, 5).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
                rt.Cells(cnt, 6).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
            Next
        Next
        cnt = rt.Rows.Count
        rt.Cells(cnt, 0).Text = pd & "月小计 " '打印月小计
        rt.Cells(cnt, 0).SpanCols = 4 '月小计行第1个单元格向右合并4行 (月小计行)
        rt.Rows(cnt).Style.BackColor = Color.WhiteSmoke '小计行背景颜色设为白烟色.
        rt.Cells(cnt, 4).Text = Format(tbl.compute("Sum(本期发生额_借方)", "日期_年 = '" & y & "' And 日期_月 = '" & pd & "'"), "#,##0.00")
        rt.Cells(cnt, 5).Text = Format(tbl.compute("Sum(本期发生额_贷方)", "日期_年 = '" & y & "' And 日期_月 = '" & pd & "'"), "#,##0.00")
        rt.Cells(cnt, 4).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
        rt.Cells(cnt, 5).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
    Next
    cnt = rt.Rows.Count
    rt.Cells(cnt, 0).Text = y & "年累计 " '打印月小计
    rt.Cells(cnt, 0).SpanCols = 4 '月小计行第1个单元格向右合并4行 (月小计行)
    rt.Rows(cnt).Style.BackColor = Color.WhiteSmoke '小计行背景颜色设为白烟色.
    rt.Cells(cnt, 4).Text = Format(tbl.compute("Sum(本期发生额_借方)", "日期_年 = '" & y & "'"), "#,##0.00")
    rt.Cells(cnt, 5).Text = Format(tbl.compute("Sum(本期发生额_贷方)", "日期_年 = '" & y & "'"), "#,##0.00")
    rt.Cells(cnt, 4).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
    rt.Cells(cnt, 5).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
    rt.Rows(cnt).Style.Font = New Font("宋体", 10, FontStyle.Bold) '设置文本对象的字体加粗
Next

'最后一页最后行增加总计行
rt.Rows.Count = rt.Rows.Count + 1 
rt.Rows(rt.Rows.count - 1)(0).text = "总计"
rt.Rows(rt.Rows.count - 1)(0).SpanCols = 4 '总计行第1个单元格向右合并4行 (总计行)
rt.Rows(rt.Rows.count - 1).Style.BackColor = Color.LightGray '总计行背景颜色设为灰色.
rt.Rows(rt.Rows.count - 1)(4).text = Format(tbl.compute("Sum(本期发生额_借方)"), "#,##0.00")
rt.Rows(rt.Rows.count - 1)(5).text = Format(tbl.compute("Sum(本期发生额_贷方)"), "#,##0.00")
rt.Rows(rt.Rows.count - 1)(4).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右
rt.Rows(rt.Rows.count - 1)(5).Style.TextAlignHorz = prt.AlignHorzEnum.Right '数据水平靠右

'添加页脚
Dim rx As New prt.RenderTable
rx.Cells(0, 0).Text = "账套:" & dwmc
rx.Cells(0, 1).Text = RJ
rx.Cells(0, 2).Text = "操作:" & _UserName
rx.Cells(0, 3).Text = "打印:" & Format(Date.Now, "yyyy-MM-dd HH:mm:ss") 
rx.Cells(0, 4).Text = "第[PageNo]页,共[PageCount]页" 
rx.Cols(0).Style.TextAlignHorz = prt.AlignHorzEnum.Left '各列对齐
rx.Cols(1).Style.TextAlignHorz = prt.AlignHorzEnum.Center
rx.Cols(2).Style.TextAlignHorz = prt.AlignHorzEnum.Center
rx.Cols(3).Style.TextAlignHorz = prt.AlignHorzEnum.Center
rx.Cols(4).Style.TextAlignHorz = prt.AlignHorzEnum.right
rx.Style.Borders.Top = New prt.LineDef '设置上边框
rx.CellStyle.Spacing.Bottom = 0.2 '底端内容缩进0.2毫米
rx.Style.FontSize = 9 '字体大小为9磅
Doc.PageFooter = rx '作为页脚使用

doc.Body.Children.Add(rt) '将表格加入到报表
doc.Preview() '打印
[此贴子已经被作者于2022/8/29 7:37:09编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109713 积分:558275 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/29 8:34:00 [只看该作者]

请上传实例测试

 回到顶部
帅哥哟,离线,有人找我吗?
洮沙
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:819 积分:7048 威望:0 精华:0 注册:2017/8/31 12:07:00
  发帖心情 Post By:2022/8/29 9:33:00 [只看该作者]

有劳蓝老师了!感谢!

蓝老师,用下边的这个例子。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:日记账.foxdb


[此贴子已经被作者于2022/8/29 10:03:12编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109713 积分:558275 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/29 10:11:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:日记账.zip


 回到顶部
帅哥哟,离线,有人找我吗?
洮沙
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:819 积分:7048 威望:0 精华:0 注册:2017/8/31 12:07:00
  发帖心情 Post By:2022/8/29 10:32:00 [只看该作者]

蓝老师,我将 If fycnt >=22 Then

 改成
Dim prs As Integer = 5 '每页显示行数
 If fycnt >= prs Then  
 后不会自动分页啊,麻烦你再辛苦改一下。谢谢!

图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20220829103001.png
图片点击可在新窗口打开查看

需要自动分页,而且转次页的余额数取的是上一行的余额数,如下图:

图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20220829104244.png
图片点击可在新窗口打开查看


[此贴子已经被作者于2022/8/29 10:43:35编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109713 积分:558275 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/29 10:47:00 [只看该作者]

重新上传有问题的实例测试

 回到顶部
帅哥哟,离线,有人找我吗?
洮沙
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:819 积分:7048 威望:0 精华:0 注册:2017/8/31 12:07:00
  发帖心情 Post By:2022/8/29 10:51:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:日记账.foxdb


 回到顶部
帅哥,在线噢!
有点蓝
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109713 积分:558275 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/29 11:08:00 [只看该作者]

不对的【If fycnt >=22 Then】这里的22指的是打印预览一页纸表格打印的行数。

这是一个固定的值,和纸张的大小有关,和数据表的行数以及其它值没有任何的关系


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2022/8/29 11:08:29编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
洮沙
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:819 积分:7048 威望:0 精华:0 注册:2017/8/31 12:07:00
  发帖心情 Post By:2022/8/29 11:26:00 [只看该作者]

明白了,豁然开朗了。另外问一下,22怎么求出来的,可以根据纸张大小或者行高进行定义变量吗?

 回到顶部
帅哥,在线噢!
有点蓝
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:109713 积分:558275 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/8/29 11:42:00 [只看该作者]

我是手指数的,自己预览一下,手指数一数一页有多少行。

如果要计算,稍微有点麻烦。指定纸张高度,然后就是:行数 = (纸张高度 - 上下页边距 - 页首高度 - 页尾高度) / 行高

 回到顶部
总数 27 上一页 1 2 3 下一页