Foxtable(狐表)用户栏目专家坐堂 → 专业报表问题


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

主题:专业报表问题

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
专业报表问题  发帖心情 Post By:2016/4/11 18:32:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:双表数据并排.png
图片点击可在新窗口打开查看

如上图,生产单的明细表有两个一个是物料明细,一个是工序明细,打印时要求在一行中左边显示物料明细的内容,右边显示工序明细的内容

当只有一个明细表是觉得很简单:用下面的代码就可以
‘----------------------------------------
rt = New prt.RenderTable() '定义一个表格对象

rt.Rows(rt.Rows.Count).Height = 9  '新增一行
rt.Cells(rt.Rows.Count-1,0).SpanCols = 2
rt.Cells(rt.Rows.Count-1,0).Text = "产品代号"
rt.Cells(rt.Rows.Count-1,1).SpanCols = 3
rt.Cells(rt.Rows.Count-1,1).Text = CurRow("产品编码")
rt.Cells(rt.Rows.Count-1,2).Text = "产品规格"
rt.Cells(rt.Rows.Count-1,3).Text = CurRow("规格")
rt.Cells(rt.Rows.Count-1,4).SpanCols = 2
rt.Cells(rt.Rows.Count-1,4).Text = "下单日期"
rt.Cells(rt.Rows.Count-1,5).SpanCols = 2
rt.Cells(rt.Rows.Count-1,5).Text = CurRow("下单日期")

rt.Rows(rt.Rows.Count).Height = 9  '新增一行
rt.Cells(rt.Rows.Count-1,0).SpanCols = 2
rt.Cells(rt.Rows.Count-1,0).Text = "产品名称"
rt.Cells(rt.Rows.Count-1,1).SpanCols = 3
rt.Cells(rt.Rows.Count-1,1).Text = CurRow("品名")
rt.Cells(rt.Rows.Count-1,2).Text = "生产数量"
rt.Cells(rt.Rows.Count-1,3).Text = CurRow("生产数量")
rt.Cells(rt.Rows.Count-1,4).SpanCols = 2
rt.Cells(rt.Rows.Count-1,4).Text = "完成日期"
rt.Cells(rt.Rows.Count-1,5).SpanCols = 2
rt.Cells(rt.Rows.Count-1,5).Text = CurRow("计划结束")

rt.Rows(rt.Rows.Count).Height = 9  '新增一行
rt.Cells(rt.Rows.Count-1,0).SpanCols = 6
rt.Cells(rt.Rows.Count-1,0).Text = "物料明细"
rt.Cells(rt.Rows.Count-1,1).SpanCols = 6
rt.Cells(rt.Rows.Count-1,1).Text = "工序明细"

rt.Rows(rt.Rows.Count).Height = "auto"  '新增一行
rt.Rows(rt.Rows.Count-1).Style.Font = New Font("宋体",9) '设置字体
rt.Rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
Dim nms As String() = {"使用工序","材料代号","规格","单位","需求数量","工序号","工序名称","模号","机台吨位","加工方式","生产车间"} '明细表标题列
For c As Integer = 0 To nms.Length -1
    rt.Cells(rt.Rows.Count-1,c).Text = nms(c)
Next
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.Page  '指定表头行

Dim ColNames As String() = {"使用工序","物料编码","规格","计量单位","需求数量","工序号","工序名称","模号","机台吨位","加工方式","生产车间"} '明细表数据列
Dim drs As List(Of DataRow)
drs = DataTables("生产单_物料明细").Select("生产单号 = '" & CurRow("生产单号") & "'")
If drs.Count > 0 Then  '如果有值
    For i As Integer = 0 To drs.Count-1
        rt.Rows(rt.Rows.Count).Height = rh '新增一行
        For c As Integer = 0 To ColNames.Length -1
            If c < 5 Then  '左边五列来自生产物料明细
                rt.cells(rt.Rows.Count-1,c).text = dr(i)(ColNames(c))
            Else
                rt.cells(rt.Rows.Count-1,c).text = dr(i)(ColNames(c))
            End If
        Next
    Next
End If
'----------------------------------------------------------3

上面红色部份不知道怎么写了,因为两个明细表的行数可能不一样,比如,只有2个工序,但可能用到4种物料;是否必须按多行的那个行数来计算?
前五列是从物料明细取数,后五列又是从工序明细取数,要怎么写代码?

谢谢!



 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/11 19:29:00 [只看该作者]

 不是可以在单元格里面插入对象的吗?

 

 分别生成两个新的表格,然后插入到两个单元格即可,如 rt.Cells(1, 2).RenderObject = 表格对象rt2


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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/4/11 20:05:00 [只看该作者]

那如果表的行数超出了一页以上怎么办呢?比如有20行,但每页只能打印6行。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/11 20:07:00 [只看该作者]

 为什么要理会行数,直接把表弄出来,它不是自动排好的了吗?

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/4/11 22:43:00 [只看该作者]

代码如下:中间红色那段写法好象不对,生成的报表不正确

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


'''
  省略上面部份生成表头的代码
 
    '1--------------------------------定义主副标题----------------------------------1
    Dim ra As New prt.RenderArea '定义一个容器
    '---定义主标题
 
    
    '2-------------------------------定义表格抬头--------------------------------------
    Dim rt As New prt.RenderTable() '定义一个表格对象
    '指定总列数及各列宽,未指定的最后一列平分剩余宽度(12列)
    CW = dr8("Bodycw")  '""
    Cls = CW.split("|")
    rt.Cols.Count = Cls.Length + 1 '设置总列数
    For i As Integer = 0 To Cls.Length-1
        rt.Cols(i).Width = Cls(i)
    Next
    '---设置表格总体样式---------
    rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
    rt.Style.TextAlignVert = prt.AlignVertEnum.Center '文本垂直居中
    rt.CellStyle.Spacing.All = 1 '单元格内容缩进1毫米
    rt.Style.GridLines.All = New prt.Linedef(0.2,Color.Black) '设置网格线
    rt.Style.Font = New Font("宋体", prt_tbfontsize) '设置总体字体
    'rt.SplitVertBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '禁止被垂直分割
    'rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '表格宽度超出页宽时,可以水平换页
    '---设置明细表标题列---------
    '   rt.Style.Spacing.Bottom = prt_Upspacing '和下一个对象的距离(毫米)
    ' ra.Children.Add(rt) '将文本对象加入到容器ra中
    
    '------------------设置以上部份作为页眉------------------------
    ' doc.PageHeader = ra '(页眉本身就是报表的一部份,不能再用语句加入到报表中会出错)
    
    '2----------------------------------------定义明细表表体----------------------------------2
    'ra = New prt.RenderArea '定义一个容器
    rt = New prt.RenderTable() '定义一个表格对象
    
   
    rt.Rows(rt.Rows.Count).Height = 9  '新增一行
    rt.Cells(rt.Rows.Count-1,0).SpanCols = 6
    rt.Cells(rt.Rows.Count-1,0).Text = "物料明细"
    rt.Cells(rt.Rows.Count-1,1).SpanCols = 6
    rt.Cells(rt.Rows.Count-1,1).Text = "工序明细"
    
    rt.Rows(rt.Rows.Count).Height = "auto"  '新增一行
    rt.Rows(rt.Rows.Count-1).Style.Font = New Font("宋体",9) '设置字体
    rt.Rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
    Dim nms As String() = {"使用工序","材料代号","规格","单位","需求数量","工序号","工序名称","模号","机台吨位","加工方式","生产车间"} '明细表标题列
    For c As Integer = 0 To nms.Length -1
        rt.Cells(rt.Rows.Count-1,c).Text = nms(c)
    Next
    
    rt.RowGroups(0,1).Header = prt.TableHeaderEnum.Page  '指定表头行(因为是逐列增加的,所以行组只能用一行)
    
    ra.Children.Add(rt) '将文本对象加入到容器ra中
    
    '--------------------------生成物料明细表--------------------------------
    Dim rt2 As New prt.RenderTable() '定义一个表格对象
    rt2.Style.Spacing.Top = 1  '和上一个对象的距离(毫米)
    '指定总列数及各列宽,未指定的平分剩余宽度
    CW = "8|16|16|8|16"
    Cls = CW.split("|")
    rt2.Cols.Count = Cls.Length '设置总列数
    For i As Integer = 0 To Cls.Length-1
        rt2.Cols(i).Width = Cls(i)
    Next
    '设置表格总体样式-------------------------------------------0
    rt2.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
    rt2.Style.TextAlignVert = prt.AlignVertEnum.Center '文本垂直居中
    rt2.CellStyle.Spacing.All = 1 '单元格内容缩进1毫米
    rt2.Style.GridLines.All = New prt.Linedef(0.2,Color.Black) '设置网格线
    rt2.Style.Font = New Font("宋体", 12) '设置总体字体
    rt2.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本位置
    'rt2.SplitVertBehavior = prt.SplitBehaviorEnum.Never '禁止被垂直分割
    rt2.SplitVertBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '禁止被垂直分割
    'rt2.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '表格宽度超出页宽时,可以水平换页
    '-----------------------------------------------------------1
    
    Dim ColNames As String() = {"使用工序","物料编码","规格","计量单位","需求数量"} '明细表数据列
    Dim drs As List(Of DataRow)
    drs = DataTables("生产单_物料明细").Select("生产单号 = '" & CurRow("生产单号") & "'")
    If drs.Count > 0 Then  '如果有值
        For i As Integer = 0 To drs.Count-1
            For c As Integer = 0 To ColNames.Length -1
                rt2.cells(i,c).text = drs(i)(ColNames(c))
            Next
        Next
    End If
    
    '--------------------------生成工序明细表--------------------------------
    Dim rt1 As New prt.RenderTable() '定义一个表格对象
    '指定总列数及各列宽,未指定的平分剩余宽度
    CW = "8|16|16|16|16|20"
    Cls = CW.split("|")
    rt1.Cols.Count = Cls.Length '设置总列数
    For i As Integer = 0 To Cls.Length-1
        rt1.Cols(i).Width = Cls(i)
    Next
    '设置表格总体样式-------------------------------------------0
    rt1.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
    rt1.Style.TextAlignVert = prt.AlignVertEnum.Center '文本垂直居中
    rt1.CellStyle.Spacing.All = 1 '单元格内容缩进1毫米
    rt1.Style.GridLines.All = New prt.Linedef(0.2,Color.Black) '设置网格线
    rt1.Style.Font = New Font("宋体", 12) '设置总体字体
    rt1.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本位置
    'rt1.SplitVertBehavior = prt.SplitBehaviorEnum.Never '禁止被垂直分割
    rt1.SplitVertBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '禁止被垂直分割
    'rt1.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '表格宽度超出页宽时,可以水平换页
    '-----------------------------------------------------------1
    Dim ColNames2 As String() = {"工序号","工序名称","设备名称","模具编号","加工方式","生产车间"} '明细表数据列
    drs = DataTables("生产单_明细").Select("生产单号 = '" & CurRow("生产单号") & "'")
    If drs.Count > 0 Then  '如果有值
        For i As Integer = 0 To drs.Count-1
            For c As Integer = 0 To ColNames2.Length -1
                rt1.cells((i),c).text = drs(i)(ColNames2(c))
            Next
        Next
    End If
    
    rt = New prt.RenderTable() '定义一个表格对象
    '设置表格总体样式-------------------------------------------0
    rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本水平居中
    rt.Style.TextAlignVert = prt.AlignVertEnum.Center '文本垂直居中
    rt.CellStyle.Spacing.All = 1 '单元格内容缩进1毫米
    rt.Style.GridLines.All = New prt.Linedef(0.2,Color.Black) '设置网格线
    rt.Style.Font = New Font("宋体", 12) '设置总体字体
    rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center '文本位置
    'rt.SplitVertBehavior = prt.SplitBehaviorEnum.Never '禁止被垂直分割
    rt.SplitVertBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '禁止被垂直分割
    'rt.SplitHorzBehavior = prt.SplitBehaviorEnum.SplitIfNeeded '表格宽度超出页宽时,可以水平换页
    
    rt.Rows(rt.Rows.Count).Height = 9  '新增一行
    rt.Cells(rt.Rows.Count-1,0).SpanCols = 6
    rt.Cells(rt.Rows.Count-1,1).SpanCols = 6
    
    rt.Cells(rt.Rows.Count-1,0).RenderObject = rt2
    rt.Cells(rt.Rows.Count-1,1).RenderObject = rt1
    
    doc.Body.Children.Add(rt) '将表格对象加入到报表中

    
    '-------定义表格下方签名栏
    rx = New prt.RenderText '定义一个文本对象
    rx.Style.Spacing.Top = 2  '和上一个对象的距离(毫米)
    rx.Text = "批准:                            审核:                            制表:"
    'rx.Style.LineSpacing = prt_Bottomlinespacing '设置双倍行距
    ' rx.Style.TextAlignHorz = prt.AlignHorzEnum.Center '水平居中
    rx.Style.Font = New Font("宋体", prt_Bottomfontsize) '设置字体
    'rx.Style.Spacing.Bottom = 8 '和下一个对象的距离(毫米)
    ra.Children.Add(rx) '将文本对象加入到容器ra中
    doc.Body.Children.Add(ra) '将表格对象加入到报表中

   Doc.Preview() '预览报表

End If

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/11 22:45:00 [只看该作者]

 你还是上传实例,直接说要做的效果吧。

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


加好友 发短信
等级:八尾狐 帖子:1930 积分:17564 威望:0 精华:0 注册:2014/7/29 19:09:00
  发帖心情 Post By:2016/4/12 0:15:00 [只看该作者]



重新调整了下,结果是有了,但就是两个表中的行数不一致时,表格行高就不一样了,最主要一点是行数多超出一页时要如何换页,而且每页都要有上面红框中的内容和下面的签名

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/4/12 8:39:00 [只看该作者]

麻烦上传有数据测试的例子

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/12 9:23:00 [只看该作者]

1、行高的问题,你列的内容不同,而宽度固定以后,高度肯定不同的啊,这个没办法;

 

2、指定标题行 http://www.foxtable.com/help/topics/2735.htm

 

 


 回到顶部