以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  请教:分组报表问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=68027)

--  作者:feiyu988
--  发布时间:2015/5/8 11:03:00
--  请教:分组报表问题
做了个物资计划的分组报表,按照工程名称和计划编号生成报表,现在出现的问题是:计划明细中材料没有按照分组分开,而是在每个报表中都打印了一遍,另外两个计划没有分成两页,想实现一个计划打完后自动补空行,在下一页打印另一个计划。请老师给修改一下代码,谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目8.foxdb


--  作者:大红袍
--  发布时间:2015/5/8 12:52:00
--  

\'\'\'
Dim g As New CrossTableBuilder("物资统计表", DataTables("物资需求计划明细"))
g.HGroups.AddDef("项目名称","工程项目名称")
g.HGroups.AddDef("计划编号")
g.HGroups.AddDef("材料名称","物资名称")
g.HGroups.AddDef("规格型号","技术要求条件")
g.HGroups.AddDef("单位")
g.HGroups.AddDef("备注")
g.VGroups.AddDef("单位工程名称")
g.Totals.AddDef("数量", "数量")
g.filter = Tables("物资需求计划明细").filter
g.HorizontalTotal = True
g.Build()

Tables("物资统计表").Cols("合计").Move(5)
Tables("物资统计表").Cols("备注").Move(Tables("物资统计表").cols.Count-1)

Dim doc As New PrintDoc
Doc.PageSetting.LeftMargin = 20 \'设置左边距
Doc.PageSetting.RightMargin = 15 \'设置右边距
Doc.PageSetting.TopMargin = 15 \'设置上边距
Doc.PageSetting.BottomMargin = 15 \'设置下边距
Dim rt As Prt.RenderTable
Dim rm As New prt.RenderImage() \'定义一个图片对象
rm.Image = GetImage(ProjectPath & "images\\中国中铁.png") \'请改为实际的图标名称和路径
rm.Style.ImageAlign.AlignHorz = prt.ImageAlignHorzEnum.Center \'图片水平居中
rm.Style.ImageAlign.AlignVert = prt.ImageAlignVertEnum.Center \'图片垂直居中

Dim tbl As Table = Tables("物资统计表")
Dim Rows As List(Of DataRow)
Dim Datas As List(Of String()) = tbl.DataTable.GetValues("工程项目名称|计划编号",tbl.Filter)
doc.Pagesetting.LandScape = True


\'设置页眉
rt = New prt.RenderTable
rt.Cells(0,0).Text = "主要物资需用限(定)额数量总计划表"
rt.Cells(1,0).RenderObject = rm \'将单元格内容设置为图片对象rm
rt.Cells(1,1).Text = "  主要物资需用限(定)额数量总计划表"
rt.Cells(1,2).Text = "表格编号:"
rt.Cells(2,2).Text = "0902"
rt.Cols(2).Width = 60
rt.Cols(0).Width = 16
rt.Cells(1,1).Style.TextAlignvert = prt.AlignVertEnum.Center
rt.Cols(2).Style.TextAlignHorz = prt.AlignHorzEnum.Center
rt.Cols(2).Style.TextAlignvert = prt.AlignvertEnum.Center
rt.rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.Center
\'设置合并单元格
rt.Cells(0,0).Spancols = 3 \'第1行第5个单元格向下合并6行(用于显示照片)
rt.Cells(1,1).Spanrows =2  \'第5行第2个单元格向右合并3列(用于显示地址)
rt.Cells(1,0).Spanrows =2  \'第5行第2个单元格向右合并3列(用于显示地址)
rt.Rows(1).Height = 8
rt.Rows(2).Height = 8
rt.Style.Gridlines.All = New prt.Linedef(Color.black) \'黑色网格线
rt.CellStyle.Spacing.Bottom = 0.5 \'底端内容缩进0.5毫米
rt.Style.FontSize = 12 \'字体大小为8磅
rt.Cells(0,0).Style.FontSize = 18 \'字体大小为8磅
rt.Cells(0,0).Style.FontBold = True \'字体加粗
rt.Rows(0).Style.Borders.All = New prt.LineDef("0mm", Color.white) \'去掉第二行的网格线
rt.Rows(0).Style.Borders.Bottom = New prt.Linedef  \'恢复第二行底端的网格线
rt.cols(0).Style.GridLines.right = New prt.Linedef("0mm", Color.white)  \'去掉第一行底端的网格线
Doc.PageHeader = rt \'作为页眉使用

\'设置页脚
rt = New prt.RenderTable
rt.Cells(0,0).Text = "技术负责人:"
rt.Cells(0,2).Text = "审核人:"
rt.Cells(0,4).Text = "编制人:"
rt.Cells(0,6).Text = "物资部接收人:"
rt.Cells(0,8).Text = "日期:       年     月     日"
rt.Cols(6).Width = 30
rt.Cols(8).Width = 40
rt.Cols(0).Style.TextAlignHorz = prt.AlignHorzEnum.Left
rt.Cols(8).Style.TextAlignHorz = prt.AlignHorzEnum.right

rt.Style.FontSize = 10 \'字体大小为8磅
Doc.PageFooter = rt \'作为页脚使用


For j As Integer = 0 To datas.count - 1
    Dim data() As String = datas(j)
    Dim n As Integer = Tables("物资统计表").cols.Count
    rt = New prt.RenderTable
    rt.Style.FontSize = 10
    rt.Style.Spacing.Top = 0
    rt.Style.Spacing.Bottom = 0
    rt.Cells(0, 0).Text = "  工程项目名称: " & Data(0) & "                                                  计划编号: " & Data(1)
    rt.Cells(0,0).Spancols =n-1
    rt.Cells(1, 0).text = "物资编号"
    For i As Integer = 2 To n-1
        rt.Cells(1, i-1).text = Tables("物资统计表").cols(i).Caption
    Next
   
    Dim drs As List(Of DataRow) = DataTables("物资统计表").Select("计划编号 = \'" & data(1) & "\'")
    For r As Integer = 0 To drs.Count-1
        Dim dr As DataRow = drs(r)
        rt.Cells(r+2, 0).text = r + 1
        For i As Integer = 2 To n-1
            rt.Cells(r+2, i-1).text = dr(Tables("物资统计表").cols(i).name)
        Next
    Next
   
    \'补空行
    For i As Integer = drs.Count To 20
        rt.Cells(i+2, 0).text = " "
    Next
    \'换页
    If j < Datas.Count - 1 Then
        rt.BreakAfter = prt.BreakEnum.page
    End If
    rt.CellStyle.Spacing.All = 0.5 \'单元格内距设为0.5毫米
    rt.Rows(0).Height = 8
    rt.Cols(0).Width = 10
    rt.Cols(3).Width = 15
    rt.Cols(4).Width = 15
    rt.Style.TextAlignHorz = prt.AlignHorzEnum.center \'所有文本内容靠右对齐
    rt.Style.TextAlignVert = prt.AlignVertEnum.center \'所有文本内容垂直居中
    rt.Rows(0).Style.TextAlignHorz = prt.AlignHorzEnum.left \'第一行内容水平居中
    rt.RowGroups(0, 2).Header = prt.TableHeaderEnum.All \'利用行组功能设置表头
    rt.Style.Gridlines.All = New prt.Linedef(Color.black) \'黑色网格线
    rt.Rows(0).Style.GridLines.Vert = New prt.LineDef("0mm", Color.white) \'去掉第一行的网格线
    rt.Rows(0).Style.GridLines.Top = New prt.Linedef("0mm", Color.white)  \'去掉第一行底端的网格线
   
    doc.Body.Children.Add(rt)
Next

doc.preview()


--  作者:feiyu988
--  发布时间:2015/5/8 14:28:00
--  
补空行的代码能够自动判断行数生成吗,毕竟每个计划的零件数量是不固定的,或遇到字数多的会自动加大行高,采取固定的行数不太合适
--  作者:大红袍
--  发布时间:2015/5/8 15:03:00
--  
 不行,行高是无法确定的,要么你就尽量不要填充空白行或少填充一些行。直接用强制换页就好了。
--  作者:feiyu988
--  发布时间:2015/5/8 15:12:00
--  
好吧