杰表 .2008  改版设计 杭州杰创软件拥有版权 .www.jatools.com
杰表4.0的不足 表头不平衡报表支持不够 同比支持不够 xml数据源不支持
杰表2008解决之道 xml数据访问模型 用 xml 表达数据结构 xpath,xquery 引用数据 细粒度的布局模型
报表制作流程 定义数据节点  ->  组件布局  ->  数据节点绑定到组件 各类数据  ->  数据节点 , 数据类型有 jdbc,csv, 等
简单列表 数据库表 students 作成报表 正始中学学生表 制表日期 :2007.9.1                         总分 姓名 学号                         总分 姓名 学号
定义数据节点 1. 定义访问 students 表的 jdbc 参数 ,sql 查询 2. 将 jdbc 数据集作为节点 , 加入到数据树中 , 并取名学生表 设计器数据树如图所示 报表引擎将根据定义 , 将数据树翻译为 document 内容如下 :   <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?>  - < 学生表 >     <Row />      <Row />      ...     <Row />      </ 国家表 >  
组件布局  1. 定义一个表格 (Table) 组件 2. 在表格组件的第二行 , 定义一个 RowPanel 组件 如图所示 : 此处 ,RowPanel 占据整个第二行 , 被单元格覆盖 , 所以以右侧的” }” 表示其层次关系 , 逻辑上 , 应看作下图 : Table RowPanel = 总分 = 姓名 = 学号 总分 姓名 学号 总分 姓名 学号 = 总分 = 姓名 = 学号
数据节点绑定到组件 Table RowPanel = 总分 = 姓名 = 学号 总分 姓名 学号 总分 姓名 学号 = 总分 = 姓名 = 学号
报表生成   <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?>  - < 学生表 >    <Row />    <Row />     <Row />     <Row />     </ 学生表 >     正始中学学生表 制表日期 :2007.9.1                         总分 姓名 学号
NodeSource
布局示例 标签(Label) 文本(Text) 页(Page) 页眉(PageHeader) 页主体(PageBody) 行板(RowPanel)
布局组件类型 容器组件 可以包含其他组件的组件 顶层组件 不能包含其他组件的组件
容器组件 容器包含其他容器时两个限制 不能下层包含上层组件 , 比如 ,PowerTable 可以包含 Table, 但相反则不行 不能跨层包含 , 比如 ,Page 不能包含 Table
顶层组件
简单列表 报表预览 报表设计界面 RowPanel Table   总计                           总分 姓名 学号 = 总分 .sum() 总计   = 总分 = 姓名 = 学号 总分 姓名 学号
主从报表 RowPanel Panel Table   总计                                       总分 姓名 学号 赵紫洋 班长 : 35 人数 : 杨明德 班主任 : 高三 (2) 班级 :         总计                           总分 姓名 学号 李小红 班长 : 41 人数 : 王芳 班主任 : 高三 (1) 班级 : 李小红 班长 : 41 人数 : 王芳 班主任 : 高三 (1) 班级 :   = 总分 .sum() 总计   = 总分    = 姓名   = 学号 总分 姓名 学号
分组报表 报表预览 报表设计界面 RowPanel RowPanel Table   总计         合计                   高二     合计             高一 总分 姓名 学号 班级   总计         合计       = 班级 总分 姓名 学号 班级
双表连接 报表预览 报表设计界面 Table Table RowPanel RowPanel                                               * 金额 单价 备件数量 备件名称 备件号 序号 索赔备件                                   *       工时名称 工时代码 序号 索赔维修项           * 金额 单价 备件数量 备件名称 备件号 序号 索赔备件           *       工时名称 工时代码 序号 索赔维修项
固定格式表 0.00  0.00    0.00  0.00  五、净利润 028       减:其他 027       加:其他 026       减:所得税 025   0.00  0.00  四、利润总额 024       加:以前年度损益调整 023       其他 022       减:营业外支出 021       其他 020       营业外收入 019       补贴收入 018       加:投资收益 017   0.00  0.00  三、营业利润 016       其他 015       财务费用 014       减:管理费用 013       加:其他业务利润 012   0.00  0.00  二、销售利润 011       减:其他 010       加:其他 009       销售税金及附加 008       销售费用 007       减:销售成本 006   0.00  0.00  销售收入净额 005   1 = 上月数  = 本月数  减:销售折扣与折让 004       一、销售收入 003 索引列 上月数 本月数 002   001 上月数 本月数 科目 行次 ... ... ... ...     其他业务利润 8     其他 7     其他 6     销售税金及附加 5     销售费用 4     销售成本 3     销售收入净额 2   880   900 销售折扣与折让 1 上月数 本月数 名称 id
交叉报表 地区表 销售表                 合计                 小计                 天津                 北京 华北                 小计                 合肥                 杭州                 南京                 上海 华东 本年小计 四季度 二季度 一季度 本年小计 二季度 一季度     合计 2006 年 2005 年   金额 季度 年份 城市 地区 城市 地区
复合交叉报表 地区表 销售表 产品类别表 应收款表                 欧洲                  北美                  东南亚                  小计                 台湾                 澳门                 香港                 大陆 大中华区 小计 电脑配件 笔记本 台式机 小计 2006 2005   按类别 应收款 年份   应收款 小区 大区 名称 类别 金额 年份 类别 小区 大区 名称 小区 大区
复合交叉报表 1 6 5 4 3 2                 欧洲                  北美                  东南亚                  小计                 台湾                 澳门                 香港                 大陆 大中华区 小计 电脑配件 笔记本 台式机 小计 2006 2005   按类别 应收款 年份  
布局诀 见到横表,从表模板扩展 见到主表,连接从数据集成合集, 打印主表,从表 表布局 一个List总是与一个节点或节点集合关联 如果这个节点是数据集节点,则总是与若干行数据相关 数据集节点,数据集主节点,组节点,行节点
从表数据集扩展 年份列横转 , 且列数不定 , 产品列保持 右下角 , 黄色部分为交叉数据区 , 每单元可能包含不止一个数据 , 如既可以统计合计 , 又同时计算平均值 3 冰箱 1994 4 冰箱 1994 3 冰箱 1993 2 洗衣机 1992 1 洗衣机 1991 1 冰箱 1991 1 电视机 1991 销售额 产品 年     2 1 洗衣机 7 3   1 冰箱       1 电视机 1994 1993 1992 1991 产品
从表数据集扩展 ( 多级 ) 年 , 季列横转 红色列 , 列名是一个特殊 , 二维键 新列 = 年 / 季 +sum( 销售额 ) ... ... ... ... 1 洗衣机   1991 1 冰箱 1 1991 1 电视机 1 1991 销售额 产品 季度 年   2 1     2 1 洗衣机 7   1 7 3   1 冰箱     1       1 电视机 1992/* 1992/2 1992/1 1991/* 1991/3 1991/2 1991/1 产品
直连 A 为主数据集 ,B,C 为从数据集 ,D 为合集 合表记录数及顺序与主数据集一致 对主数据集有 , 从数据集没有的行 , 合集中空行补足 , 如 D 数据集中黄色部分 从数据集有 , 主数据集没有的行 , 合集中删除该行 , 如 ,C 中的红色行 A B C D 100 电脑 20 洗衣机 60 冰箱 100 电视机 库存数 产品     2 1 洗衣机 7 3   1 冰箱       1 电视机 1994 1993 1992 1991 产品 40 空调 20 洗衣机 60 冰箱 100 电视机 应收款 产品         2 1 洗衣机 40 空调 20 洗衣机           20 洗衣机 60 冰箱 7 3   1 冰箱 60 冰箱 100 电视机       1 电视机 100 电视机 库存数 产品 1994 1993 1992 1991 产品 应收款 产品
合集中的列 静态列 =name  // 静态列的引用 动态列 =sales{year,quauter}  动态列组 =sales{year}.sum() =sales{1991}.sum()  //
简单布局 数据合集 D 由三部分组成 .a,b,c 设计时 , 设计三个表 , 分别绑定合集中的 a,b,c 三个数据集 1. 数据合集 (D) a b c 2. 设计时布局 3. 预览效果 = 库存数 = 销售额 = 应收款 = 产品 库存数 = 年份 -> 应收款 产品       2 1 40 空调 20         20 洗衣机 60 7 3   1 60 冰箱 100       1 100 电视机 库存数 1994 1993 1992 1991 应收款 产品         2 1 洗衣机 40 空调 20 洗衣机           20 洗衣机 60 冰箱 7 3   1 冰箱 60 冰箱 100 电视机       1 电视机 100 电视机 库存数 产品 1994 1993 1992 1991 产品 应收款 产品
主表布局 主表每打印完一行 , 打印从表行 从表行当前数据 , 取决于主键位置 空调 40 空调 洗衣机 20 洗衣机 冰箱 60 冰箱 电视机 100 电视机 null 应收款 产品 主键   20 60 100 库存数 = 库存数 = 应收款 = 产品 库存数 应收款 产品
堆叠交叉 销售额(地区,客户,年,季) 销售额(地区,客户,年,*) 销售额(地区,*,年,季) 销售额(地区,*,年,*) 销售额(产品,年,季) 销售额(产品,年,*) = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度
合集数据引用 主表每打印完一行 , 打印从表行 从表行当前数据 , 取决于主键位置       合计       = 客户 = 地区 合计 = 季 应收款 = 年                   * *       * 华北                 * 华东                 天津 华北                 北京 华北                 南京 华东                 杭州 华东                   上海 华东 应收款 * * * 2 1 3 2 1 客户 地区   * 1992 1991 1992 1992 1991 1991 1991    
合集数据引用 ( 一 ) 规则一:是先定位列 , 后定位行 =销售{年,季}{地区,客户} =应收款 {地区,客户} 列定位  行定位 列定位  行定位 静态列时定位  动态列时定位 = 应收款 { 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() 合计 = 应收款 { 地区 , 客户 } = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 } = 客户 = 地区 合计 = 季 应收款 = 年  
合集数据引用 ( 二 ) 规则二:行或列满键时,可以省去 =销售  // 等价,列键,行键均满 =应收款.sum()  // 等价 = 应收款 { 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() 合计 = 应收款 { 地区 , 客户 } = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 } = 客户 = 地区 合计 = 季 应收款 = 年  
合集数据引用 ( 三 ) 规则二:引用上级,可特指行列键 =销售 / 销售{年}{地区,客户}  // 等价,意即本季与本年合计所占比重 = 应收款 .sum() = 销售 .sum() = 销售 .sum() 合计 = 应收款 = 销售 .sum() = 销售  /  销售 { 年 } = 客户 = 地区 合计 = 季 应收款 = 年  
合集数据引用 ( 四 ) this =销售{年,*}  <=>  =销售{年} =销售{NEXT.年,*}  <=>  =销售{NEXT.年} =销售{*,*}  <=>  =销售{*} =销售{PREV.年,*}  <=>  =销售{PREV.年} =销售{年,PREV.季}  =销售{年,NEXT.季}  =销售{PREV.年,季}  // 去年同期 =销售{NEXT.年,季}  // 下年同季 * * * 1994 * 1993 * 1992 2 1994 1 1994 4 1993 3 1993 2 1993 1 1993 3 1992 2 1992 1 1992
合集上下文 合集数据列, 数据列,动态树 销售,应收款,应付款 行组树
合集上下文 = 年 \ 季 \ 应收款余额  <=>  = 应收款余额 = 年 \ 应收款余额  <=>  = 年 \ 应收款余额 =*\ 应收款余额  = 年 \ 地区 \ 城市 \ 销售  = 年 \ 地区 \ 销售  =*\ 销售  = 销售
合集上下文 灌入变量 : 年度 [.=1991]\\@ 季度 .sum()  季度 应收款余额 地区 城市 销售
合集上下文 有游标的情况下 , 年度 =1991, 季度 =1 @ 销售额 季度 \@ 销售额 年度 \ 季度 \@ 销售额  上述等价  年度 [.=1991]\ 季度 [1]\@ 销售额 年度 [postion()-1]\\@ 销售额 .sum()  上一年度销售额总计 年度 [postion()-1]\ 季度 [.=ANY]\@ 销售额 .sum() 等价 年度[postion()-1]\季度[.=@季度]\@销售额.sum() 去年同季销售额 年度 [postion()-1]\ 季度 []\[.=] 季度 \@ 销售额  1991  年 1 季度销售额 年度 \\@ 销售额 .sum()  1991 的销售额总计
合集上下文 销售表 . 应收款余额 { 华北 \ 城市 }{ 年 \ 季 }
合集数据引用公式 =销售{年,月}{地区,客户}  // 等价 =应收款{地区,客户}  // 等价 =销售{年,月}{地区,客户}.sum()  // 等价 以下二个公式等价 =销售{年}{地区,客户}.sum() =销售{年}.sum() = 应收款 .sum() = 销售 .sum() = 销售 .sum() 合计 = 应收款 = 销售 .sum() = 销售 = 客户 = 地区 合计 = 季 应收款 = 年  
从表模板扩展 A 表A打印后,模板被横向扩展 规则: 同列,同宽的表被扩展 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 产品 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 客户 = 地区 合计 四季度 三季度 二季度 一季度 合计 四季度 二季度 一季度 2000 2000 = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度
纵向扩展 ( 打印扩展 ) A 表B随表A向下打印 规则: 同行,同高的表被打印 打印扩展不扩展模板 B = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度 6 1 2   3 8 2   6 合计 1       1 3     3 杭州华信科技 1 1       2     2 南京巨人系统公司 4   2   2 3 2   1 上海光明软件公司 华东 合计 四季度 三季度 二季度 一季度 合计 四季度 二季度 一季度 2000 2000
超级 cell 打印流程 2. 行打印流程 1. 表格打印流程
 
Dataset ds = null; ds.group( 地区 , 城市 ); Dataset sales = getSales(); ds.join(sales,new String[]{“ 地区” ,” 城市” }); Node dsn = new DatasetNode(ds,” 销售额” ); 地区 [.=“ 华东” ]\ 销售额 .sum())
同期比 ( 普通列表中 ) 报表数据/年度销售表 Row 38 160 1994 2 122 1993 20 120 1992 - 100 1991 与去年增加 销售额 年 160 1994 122 1993 120 1992 100 1991 销售额 年 =PRE. 销售额 - 销售额 = 销售额 = 年度 与去年增加 销售额 年
字段类型 节点字段 value:  如果是行节点 , 取行 row, 取得值 , 否则 , 取第一行 , values: =sales  按节点所在第一列取值 =sales.sum()  按节点起始行 , 取合计值 =PRE.sales  取前兄弟节点 , 第一行取值 =PRE.sales.sum()  取前兄弟节点 , 取合计  =${.}.sales.sum()  索引字段 必须是索引数据集 =sales  按  sales{rowkeys}  第一行取值 =sales .sum()  按 sales{rowkeys}, 即合计值 =sales{rowkeys}  按 sales{rowkeys}  取合计值 交叉字段 必须是交叉数据集 =sales  按  sales{colkeys}{rowkeys}  第一行取值 =sales{colkeys}{rowkeys}  取第一行值 =sales.sum() =sales{colkeys}.sum()
同期比 ( 交叉报表中 )       合计   = 销售 .sum()- 销售 {PRE. 年 }.sum()   = 地区表 . 客户 = 地区表 . 地区 合计 比上年增长 = 季 = 年  
字段类型 节点字段 当前节点引用 =${.}.sales =sales 引用 value:  如果是行节点 , 取行 row, 取得值 , 否则 , 取第一行 , values: =sales  按节点所在第一列取值 =sales.sum()  按节点起始行 , 取合计值 =PRE.sales  取前兄弟节点 , 第一行取值 =PRE.sales.sum()  取前兄弟节点 , 取合计  =${.}.sales.sum()  = 国家表 .area.sum() =area
两类特殊变量 (ValueAlways,ValueIfClosed) 节点变量(NodeVariable) 在任何时候,不管是否收尾都返回value() 要取得节点变量本身,须调用NameSpace.getLocalVariable(String) 节点字段(NodeField)  只有在收尾时,返回为value(),在其他时候,返回本身 节点变量,实现 ValueAnyway 表示在任何时候,都返回value() 节点字段,实现 ValueIfClosed 表示在收尾时,才返回取值
索引字段的引用路线
占比 ( 普通列表中 ) = 销售额 / 销售额 .sum() = 销售额 = 年度 与去年增加 销售额 年
占比 ( 交叉报表中 )       合计   = 销售 .sum()/ 销售 { 年 }.sum()   = 地区表 . 客户 = 地区表 . 地区 合计 占全年比 = 季 = 年  
Table 对象 1. table布局只在 paint()时发生 2. table children 布局 由 gridLayout 进行布局 3. table list中的list,由顶层对象布局,借助cell信息 Component[] cellstore Component[] liststore Vector getChildren() √ √ √ √ 深层列表 √ √ 插入列 √ √ 插入列 √ √ 删除行 √ √ 插入行 √ 撤销合并单元格 √ 合并单元格 顶层列表 单元格对象 操作
PowerTable 对象 1. table布局只在 paint()时发生 2. table children 布局 由 gridLayout 进行布局 3. table list中的list,由顶层对象布局,借助cell信息 Component[] cellstore Component[] liststore Vector getChildren() √ √ √ √ 深层列表 √ √ 插入列 √ √ 插入列 √ √ 删除行 √ √ 插入行 √ 撤销合并单元格 √ 合并单元格 顶层列表 单元格对象 操作
Field解析流程
换页示例 1.  子件结束打印两种可能 : 溢 , 完 2.  父件打印前 , 应查询所有子件 , 哪些为必要件 , 并为必要件保留空间 3. 一个子件的打印次数 , 取决于 node 行数和父件打印次数 print.count = count1+count2+count3+count4...counti i 为父件的打印次数 4. 父件退出时 , 需要打印未打印之必要件 5. 父件打印分两种 , 新打 ( 子件已打印结束 , 由父件再一次打印引起 ), 续打 ( 子件满时再次打印 ) 普通件 :  父件中打印一次
换页规则 1.  打印完所有子件 , 叫做一个打印周期 , 打印周期可以有一个新打步骤 2.  打印周期 = 新打 3.  打印周期 = 新打 + 续打 + 续打 4.  必要件 , 是每一个打印步骤都要打印的子件 5.  普通件 , 是每一个打印周期 , 只打印一次的子件 6.  预留件 , 是每一个打印步骤结束前 , 都需要打印的件 7.  续打由未打印完子件 , 发起 8.  新打由 node 新行发起 9.  预留件必须高度不变
ReportPrinter.print流程

杰表.2008改版设计

  • 1.
    杰表 .2008 改版设计 杭州杰创软件拥有版权 .www.jatools.com
  • 2.
  • 3.
    杰表2008解决之道 xml数据访问模型 用xml 表达数据结构 xpath,xquery 引用数据 细粒度的布局模型
  • 4.
    报表制作流程 定义数据节点 -> 组件布局 -> 数据节点绑定到组件 各类数据 -> 数据节点 , 数据类型有 jdbc,csv, 等
  • 5.
    简单列表 数据库表 students作成报表 正始中学学生表 制表日期 :2007.9.1                         总分 姓名 学号                         总分 姓名 学号
  • 6.
    定义数据节点 1. 定义访问students 表的 jdbc 参数 ,sql 查询 2. 将 jdbc 数据集作为节点 , 加入到数据树中 , 并取名学生表 设计器数据树如图所示 报表引擎将根据定义 , 将数据树翻译为 document 内容如下 :   <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?> - < 学生表 >   <Row />   <Row />   ...   <Row />   </ 国家表 >  
  • 7.
    组件布局 1.定义一个表格 (Table) 组件 2. 在表格组件的第二行 , 定义一个 RowPanel 组件 如图所示 : 此处 ,RowPanel 占据整个第二行 , 被单元格覆盖 , 所以以右侧的” }” 表示其层次关系 , 逻辑上 , 应看作下图 : Table RowPanel = 总分 = 姓名 = 学号 总分 姓名 学号 总分 姓名 学号 = 总分 = 姓名 = 学号
  • 8.
    数据节点绑定到组件 Table RowPanel= 总分 = 姓名 = 学号 总分 姓名 学号 总分 姓名 学号 = 总分 = 姓名 = 学号
  • 9.
    报表生成   <?xmlversion=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?> - < 学生表 >   <Row />   <Row />   <Row />   <Row />   </ 学生表 >   正始中学学生表 制表日期 :2007.9.1                         总分 姓名 学号
  • 10.
  • 11.
    布局示例 标签(Label) 文本(Text)页(Page) 页眉(PageHeader) 页主体(PageBody) 行板(RowPanel)
  • 12.
    布局组件类型 容器组件 可以包含其他组件的组件顶层组件 不能包含其他组件的组件
  • 13.
    容器组件 容器包含其他容器时两个限制 不能下层包含上层组件, 比如 ,PowerTable 可以包含 Table, 但相反则不行 不能跨层包含 , 比如 ,Page 不能包含 Table
  • 14.
  • 15.
    简单列表 报表预览 报表设计界面RowPanel Table   总计                           总分 姓名 学号 = 总分 .sum() 总计   = 总分 = 姓名 = 学号 总分 姓名 学号
  • 16.
    主从报表 RowPanel PanelTable   总计                                       总分 姓名 学号 赵紫洋 班长 : 35 人数 : 杨明德 班主任 : 高三 (2) 班级 :         总计                           总分 姓名 学号 李小红 班长 : 41 人数 : 王芳 班主任 : 高三 (1) 班级 : 李小红 班长 : 41 人数 : 王芳 班主任 : 高三 (1) 班级 :   = 总分 .sum() 总计   = 总分    = 姓名   = 学号 总分 姓名 学号
  • 17.
    分组报表 报表预览 报表设计界面RowPanel RowPanel Table   总计         合计                   高二     合计             高一 总分 姓名 学号 班级   总计         合计       = 班级 总分 姓名 学号 班级
  • 18.
    双表连接 报表预览 报表设计界面Table Table RowPanel RowPanel                                               * 金额 单价 备件数量 备件名称 备件号 序号 索赔备件                                   *       工时名称 工时代码 序号 索赔维修项           * 金额 单价 备件数量 备件名称 备件号 序号 索赔备件           *       工时名称 工时代码 序号 索赔维修项
  • 19.
    固定格式表 0.00 0.00   0.00 0.00 五、净利润 028       减:其他 027       加:其他 026       减:所得税 025   0.00 0.00 四、利润总额 024       加:以前年度损益调整 023       其他 022       减:营业外支出 021       其他 020       营业外收入 019       补贴收入 018       加:投资收益 017   0.00 0.00 三、营业利润 016       其他 015       财务费用 014       减:管理费用 013       加:其他业务利润 012   0.00 0.00 二、销售利润 011       减:其他 010       加:其他 009       销售税金及附加 008       销售费用 007       减:销售成本 006   0.00 0.00 销售收入净额 005   1 = 上月数  = 本月数  减:销售折扣与折让 004       一、销售收入 003 索引列 上月数 本月数 002   001 上月数 本月数 科目 行次 ... ... ... ...     其他业务利润 8     其他 7     其他 6     销售税金及附加 5     销售费用 4     销售成本 3     销售收入净额 2   880   900 销售折扣与折让 1 上月数 本月数 名称 id
  • 20.
    交叉报表 地区表 销售表                合计                 小计                 天津                 北京 华北                 小计                 合肥                 杭州                 南京                 上海 华东 本年小计 四季度 二季度 一季度 本年小计 二季度 一季度     合计 2006 年 2005 年   金额 季度 年份 城市 地区 城市 地区
  • 21.
    复合交叉报表 地区表 销售表产品类别表 应收款表                 欧洲                  北美                  东南亚                  小计                 台湾                 澳门                 香港                 大陆 大中华区 小计 电脑配件 笔记本 台式机 小计 2006 2005   按类别 应收款 年份   应收款 小区 大区 名称 类别 金额 年份 类别 小区 大区 名称 小区 大区
  • 22.
    复合交叉报表 1 65 4 3 2                 欧洲                  北美                  东南亚                  小计                 台湾                 澳门                 香港                 大陆 大中华区 小计 电脑配件 笔记本 台式机 小计 2006 2005   按类别 应收款 年份  
  • 23.
    布局诀 见到横表,从表模板扩展 见到主表,连接从数据集成合集,打印主表,从表 表布局 一个List总是与一个节点或节点集合关联 如果这个节点是数据集节点,则总是与若干行数据相关 数据集节点,数据集主节点,组节点,行节点
  • 24.
    从表数据集扩展 年份列横转 ,且列数不定 , 产品列保持 右下角 , 黄色部分为交叉数据区 , 每单元可能包含不止一个数据 , 如既可以统计合计 , 又同时计算平均值 3 冰箱 1994 4 冰箱 1994 3 冰箱 1993 2 洗衣机 1992 1 洗衣机 1991 1 冰箱 1991 1 电视机 1991 销售额 产品 年     2 1 洗衣机 7 3   1 冰箱       1 电视机 1994 1993 1992 1991 产品
  • 25.
    从表数据集扩展 ( 多级) 年 , 季列横转 红色列 , 列名是一个特殊 , 二维键 新列 = 年 / 季 +sum( 销售额 ) ... ... ... ... 1 洗衣机   1991 1 冰箱 1 1991 1 电视机 1 1991 销售额 产品 季度 年   2 1     2 1 洗衣机 7   1 7 3   1 冰箱     1       1 电视机 1992/* 1992/2 1992/1 1991/* 1991/3 1991/2 1991/1 产品
  • 26.
    直连 A 为主数据集,B,C 为从数据集 ,D 为合集 合表记录数及顺序与主数据集一致 对主数据集有 , 从数据集没有的行 , 合集中空行补足 , 如 D 数据集中黄色部分 从数据集有 , 主数据集没有的行 , 合集中删除该行 , 如 ,C 中的红色行 A B C D 100 电脑 20 洗衣机 60 冰箱 100 电视机 库存数 产品     2 1 洗衣机 7 3   1 冰箱       1 电视机 1994 1993 1992 1991 产品 40 空调 20 洗衣机 60 冰箱 100 电视机 应收款 产品         2 1 洗衣机 40 空调 20 洗衣机           20 洗衣机 60 冰箱 7 3   1 冰箱 60 冰箱 100 电视机       1 电视机 100 电视机 库存数 产品 1994 1993 1992 1991 产品 应收款 产品
  • 27.
    合集中的列 静态列 =name // 静态列的引用 动态列 =sales{year,quauter} 动态列组 =sales{year}.sum() =sales{1991}.sum() //
  • 28.
    简单布局 数据合集 D由三部分组成 .a,b,c 设计时 , 设计三个表 , 分别绑定合集中的 a,b,c 三个数据集 1. 数据合集 (D) a b c 2. 设计时布局 3. 预览效果 = 库存数 = 销售额 = 应收款 = 产品 库存数 = 年份 -> 应收款 产品       2 1 40 空调 20         20 洗衣机 60 7 3   1 60 冰箱 100       1 100 电视机 库存数 1994 1993 1992 1991 应收款 产品         2 1 洗衣机 40 空调 20 洗衣机           20 洗衣机 60 冰箱 7 3   1 冰箱 60 冰箱 100 电视机       1 电视机 100 电视机 库存数 产品 1994 1993 1992 1991 产品 应收款 产品
  • 29.
    主表布局 主表每打印完一行 ,打印从表行 从表行当前数据 , 取决于主键位置 空调 40 空调 洗衣机 20 洗衣机 冰箱 60 冰箱 电视机 100 电视机 null 应收款 产品 主键   20 60 100 库存数 = 库存数 = 应收款 = 产品 库存数 应收款 产品
  • 30.
    堆叠交叉 销售额(地区,客户,年,季) 销售额(地区,客户,年,*)销售额(地区,*,年,季) 销售额(地区,*,年,*) 销售额(产品,年,季) 销售额(产品,年,*) = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度
  • 31.
    合集数据引用 主表每打印完一行 ,打印从表行 从表行当前数据 , 取决于主键位置       合计       = 客户 = 地区 合计 = 季 应收款 = 年                   * *       * 华北                 * 华东                 天津 华北                 北京 华北                 南京 华东                 杭州 华东                   上海 华东 应收款 * * * 2 1 3 2 1 客户 地区   * 1992 1991 1992 1992 1991 1991 1991    
  • 32.
    合集数据引用 ( 一) 规则一:是先定位列 , 后定位行 =销售{年,季}{地区,客户} =应收款 {地区,客户} 列定位 行定位 列定位 行定位 静态列时定位 动态列时定位 = 应收款 { 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() 合计 = 应收款 { 地区 , 客户 } = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 } = 客户 = 地区 合计 = 季 应收款 = 年  
  • 33.
    合集数据引用 ( 二) 规则二:行或列满键时,可以省去 =销售 // 等价,列键,行键均满 =应收款.sum() // 等价 = 应收款 { 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() 合计 = 应收款 { 地区 , 客户 } = 销售 { 年 , 季 }{ 地区 , 客户 }.sum() = 销售 { 年 , 季 }{ 地区 , 客户 } = 客户 = 地区 合计 = 季 应收款 = 年  
  • 34.
    合集数据引用 ( 三) 规则二:引用上级,可特指行列键 =销售 / 销售{年}{地区,客户} // 等价,意即本季与本年合计所占比重 = 应收款 .sum() = 销售 .sum() = 销售 .sum() 合计 = 应收款 = 销售 .sum() = 销售 / 销售 { 年 } = 客户 = 地区 合计 = 季 应收款 = 年  
  • 35.
    合集数据引用 ( 四) this =销售{年,*} <=> =销售{年} =销售{NEXT.年,*} <=> =销售{NEXT.年} =销售{*,*} <=> =销售{*} =销售{PREV.年,*} <=> =销售{PREV.年} =销售{年,PREV.季} =销售{年,NEXT.季} =销售{PREV.年,季} // 去年同期 =销售{NEXT.年,季} // 下年同季 * * * 1994 * 1993 * 1992 2 1994 1 1994 4 1993 3 1993 2 1993 1 1993 3 1992 2 1992 1 1992
  • 36.
    合集上下文 合集数据列, 数据列,动态树销售,应收款,应付款 行组树
  • 37.
    合集上下文 = 年\ 季 \ 应收款余额 <=> = 应收款余额 = 年 \ 应收款余额 <=> = 年 \ 应收款余额 =*\ 应收款余额 = 年 \ 地区 \ 城市 \ 销售 = 年 \ 地区 \ 销售 =*\ 销售 = 销售
  • 38.
    合集上下文 灌入变量 :年度 [.=1991]\\@ 季度 .sum() 季度 应收款余额 地区 城市 销售
  • 39.
    合集上下文 有游标的情况下 ,年度 =1991, 季度 =1 @ 销售额 季度 \@ 销售额 年度 \ 季度 \@ 销售额 上述等价 年度 [.=1991]\ 季度 [1]\@ 销售额 年度 [postion()-1]\\@ 销售额 .sum() 上一年度销售额总计 年度 [postion()-1]\ 季度 [.=ANY]\@ 销售额 .sum() 等价 年度[postion()-1]\季度[.=@季度]\@销售额.sum() 去年同季销售额 年度 [postion()-1]\ 季度 []\[.=] 季度 \@ 销售额 1991 年 1 季度销售额 年度 \\@ 销售额 .sum() 1991 的销售额总计
  • 40.
    合集上下文 销售表 .应收款余额 { 华北 \ 城市 }{ 年 \ 季 }
  • 41.
    合集数据引用公式 =销售{年,月}{地区,客户} // 等价 =应收款{地区,客户} // 等价 =销售{年,月}{地区,客户}.sum() // 等价 以下二个公式等价 =销售{年}{地区,客户}.sum() =销售{年}.sum() = 应收款 .sum() = 销售 .sum() = 销售 .sum() 合计 = 应收款 = 销售 .sum() = 销售 = 客户 = 地区 合计 = 季 应收款 = 年  
  • 42.
    从表模板扩展 A 表A打印后,模板被横向扩展规则: 同列,同宽的表被扩展 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 产品 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 销售额 = 客户 = 地区 合计 四季度 三季度 二季度 一季度 合计 四季度 二季度 一季度 2000 2000 = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度
  • 43.
    纵向扩展 ( 打印扩展) A 表B随表A向下打印 规则: 同行,同高的表被打印 打印扩展不扩展模板 B = 销售额 = 销售额 产品 = 销售额 = 销售额 合计 = 销售额 = 销售额 = 客户 = 地区 合计 = 季度 = 年度 6 1 2   3 8 2   6 合计 1       1 3     3 杭州华信科技 1 1       2     2 南京巨人系统公司 4   2   2 3 2   1 上海光明软件公司 华东 合计 四季度 三季度 二季度 一季度 合计 四季度 二季度 一季度 2000 2000
  • 44.
    超级 cell 打印流程2. 行打印流程 1. 表格打印流程
  • 45.
  • 46.
    Dataset ds =null; ds.group( 地区 , 城市 ); Dataset sales = getSales(); ds.join(sales,new String[]{“ 地区” ,” 城市” }); Node dsn = new DatasetNode(ds,” 销售额” ); 地区 [.=“ 华东” ]\ 销售额 .sum())
  • 47.
    同期比 ( 普通列表中) 报表数据/年度销售表 Row 38 160 1994 2 122 1993 20 120 1992 - 100 1991 与去年增加 销售额 年 160 1994 122 1993 120 1992 100 1991 销售额 年 =PRE. 销售额 - 销售额 = 销售额 = 年度 与去年增加 销售额 年
  • 48.
    字段类型 节点字段 value: 如果是行节点 , 取行 row, 取得值 , 否则 , 取第一行 , values: =sales 按节点所在第一列取值 =sales.sum() 按节点起始行 , 取合计值 =PRE.sales 取前兄弟节点 , 第一行取值 =PRE.sales.sum() 取前兄弟节点 , 取合计 =${.}.sales.sum() 索引字段 必须是索引数据集 =sales 按 sales{rowkeys} 第一行取值 =sales .sum() 按 sales{rowkeys}, 即合计值 =sales{rowkeys} 按 sales{rowkeys} 取合计值 交叉字段 必须是交叉数据集 =sales 按 sales{colkeys}{rowkeys} 第一行取值 =sales{colkeys}{rowkeys} 取第一行值 =sales.sum() =sales{colkeys}.sum()
  • 49.
    同期比 ( 交叉报表中)       合计   = 销售 .sum()- 销售 {PRE. 年 }.sum()   = 地区表 . 客户 = 地区表 . 地区 合计 比上年增长 = 季 = 年  
  • 50.
    字段类型 节点字段 当前节点引用=${.}.sales =sales 引用 value: 如果是行节点 , 取行 row, 取得值 , 否则 , 取第一行 , values: =sales 按节点所在第一列取值 =sales.sum() 按节点起始行 , 取合计值 =PRE.sales 取前兄弟节点 , 第一行取值 =PRE.sales.sum() 取前兄弟节点 , 取合计 =${.}.sales.sum() = 国家表 .area.sum() =area
  • 51.
    两类特殊变量 (ValueAlways,ValueIfClosed) 节点变量(NodeVariable)在任何时候,不管是否收尾都返回value() 要取得节点变量本身,须调用NameSpace.getLocalVariable(String) 节点字段(NodeField) 只有在收尾时,返回为value(),在其他时候,返回本身 节点变量,实现 ValueAnyway 表示在任何时候,都返回value() 节点字段,实现 ValueIfClosed 表示在收尾时,才返回取值
  • 52.
  • 53.
    占比 ( 普通列表中) = 销售额 / 销售额 .sum() = 销售额 = 年度 与去年增加 销售额 年
  • 54.
    占比 ( 交叉报表中)       合计   = 销售 .sum()/ 销售 { 年 }.sum()   = 地区表 . 客户 = 地区表 . 地区 合计 占全年比 = 季 = 年  
  • 55.
    Table 对象 1.table布局只在 paint()时发生 2. table children 布局 由 gridLayout 进行布局 3. table list中的list,由顶层对象布局,借助cell信息 Component[] cellstore Component[] liststore Vector getChildren() √ √ √ √ 深层列表 √ √ 插入列 √ √ 插入列 √ √ 删除行 √ √ 插入行 √ 撤销合并单元格 √ 合并单元格 顶层列表 单元格对象 操作
  • 56.
    PowerTable 对象 1.table布局只在 paint()时发生 2. table children 布局 由 gridLayout 进行布局 3. table list中的list,由顶层对象布局,借助cell信息 Component[] cellstore Component[] liststore Vector getChildren() √ √ √ √ 深层列表 √ √ 插入列 √ √ 插入列 √ √ 删除行 √ √ 插入行 √ 撤销合并单元格 √ 合并单元格 顶层列表 单元格对象 操作
  • 57.
  • 58.
    换页示例 1. 子件结束打印两种可能 : 溢 , 完 2. 父件打印前 , 应查询所有子件 , 哪些为必要件 , 并为必要件保留空间 3. 一个子件的打印次数 , 取决于 node 行数和父件打印次数 print.count = count1+count2+count3+count4...counti i 为父件的打印次数 4. 父件退出时 , 需要打印未打印之必要件 5. 父件打印分两种 , 新打 ( 子件已打印结束 , 由父件再一次打印引起 ), 续打 ( 子件满时再次打印 ) 普通件 : 父件中打印一次
  • 59.
    换页规则 1. 打印完所有子件 , 叫做一个打印周期 , 打印周期可以有一个新打步骤 2. 打印周期 = 新打 3. 打印周期 = 新打 + 续打 + 续打 4. 必要件 , 是每一个打印步骤都要打印的子件 5. 普通件 , 是每一个打印周期 , 只打印一次的子件 6. 预留件 , 是每一个打印步骤结束前 , 都需要打印的件 7. 续打由未打印完子件 , 发起 8. 新打由 node 新行发起 9. 预留件必须高度不变
  • 60.