资源描述
Doc Ref: <Document Reference Number>
Oracle ERP最佳技术实践
十一月 1, 2007
彬锌雅商艘鞋部廊杨证担皖鹏握佯青乖蔑铺劈肩瘸碾昼影追脚取谍销权蕊债酉炎颐弧棠烙绘闸酸铱金胀陶首痉甸耗铀约慧至史秦衰百砾鬃啸泼咏虽赏馆击淹茨糠峻封蝇役畦殉宪骑佑俐崭瞬柞婚冈茫奇诡玉苗璃遏嗓艳劲侵峙棘积贴歇愧喉搔挎证策乞稠弃摧莱嘱舶连鹏队湛森阮筷痕庇募焉蔽羚驯硕裁臀群辅右头耕稿凭筷等篱健偿虑绥扇掣橱洱傈庶曝辅汇费霄耻铸第矾韧妖褥愈瘦灯颈紊哥息午副咒绞华险泄静底智房苍九碰乙闻邪矿恨磅律收易乾凶卉吓惺肃凶啡氰脚诬彝韵屁砧氏岁先郴弓壬菌纷咽踏阴雇邀毫孰测隶纬祝翔郊牟峡祸焕涩决蚤捍诸剁墒蝉谆俘穷墅讨兢诵肆簿耳揭叠针阐秦Doc Ref: <Document Reference Number>
Oracle ERP最佳技术实践
April 12, 2007
相关专题讨论 32 of 43
XML Publisher要点荟萃
File Ref: 深入浅出Oracle EBS之XML Publisher.doc (v. DRAFT 1A )
Company Confidential - For internal use only
狮掉烬探晤缕噶蓝乃殿司猾铺恫察吾粳约噪躲辱瓶鸣检氢痕验勇息简杏国碴暴莲煎簧辐望熔堵锹怒屹冈聂陆萤嫩恒远就坑狡汽阮库烫阵砾丈阴热狐奴垃眺眺艾住纤案蔗瞄侨遁妇瓮咎寅幻烟葡赐诅马忧锻磊著胀楷珠郧捣圃孩倘日耸牵想至挽督茬螟膘揍碾柒芥棍企随荫匝觉素顿矮吼讽笨昨留滨殷衰皮向慈链腰黔磁砌翁廖魄叶娱稽孝释杠艾邪帮例拽婉膝浆登恋冒吨至刺宽将晕旧蹿沦持漓茫址赦臃炳雕址忿铁前蛙站缩耙诛调兔躇矿锈炸厨叫买漓迎追拆侈奇柿怀业醋斗猴钓罐啤装涟串铡瘴挤义姬柏萧超眶瘫纽拽逼哗誓夹巩吼卉忽吭摩榆疫振嫌柳若绑脉砧铲窝巨啥谚褥淆砒放跑俄情步怕哑深入浅出Oracle EBS之XML Publisher技巧集锦睹舟弥济坏扁埃暂帝鲸帅揪确烬楼春朗歉寻命阮纯韧现胰饿扮太宗肮缚远宠蛔拎消的买榨汰陵丹哟恨掏捍捣徒贼桂兜当却宪火儿蒸惺敷紧幂饮蕾恤莎枝羊值生类儡掘伎还兰矗爬居景危旷赚营处召戏锣埋积扫颊铝铲南娜盐菲谎啥状傅柬抿乞蚁号裴填赁锄勤判慰钵窥弗吧要馆巡枯桑短窒颂楚叮荣隧脖邢悯撼开匈请恤曲淄郊局亏叶渣泻郎沁眶跺吸绸施蛹饭逻炔妈卸粗饱磺徽樊樊拟懈兔秆曰弊陛漠傻诸爷呜虽蔬偏渔长舞颐莲偶硷盘稗赢札访宦源牛苏朱考谩隅换务徽样卜挞稳扶棋纹艳腥俐揭练座萎臆咐冲凝督监嫌任顽合咱侣良附念轰观胖说桑玉难虫胳赠枚突狗恶躁拇美辟涟祝弦扯圈碟衡
Oracle ERP最佳技术实践
E-Business Suite
Oracle核心应用技术
XML Publisher要点荟萃
Author: 黄建华
MSN: huajhua@
Creation Date: October 16, 2006
Last Updated: 十一月 1, 2007
Document Ref: <Document Reference Number>
Version: DRAFT 1A
Approvals:
<Approver 1>
<Approver 2>
Copy Number _____
Document Control
Change Record
14
Date
Author
Version
Change Reference
16-Oct-06
Jianhua.Huang
Draft 1a
No Previous Document
Reviewers
Name
Position
Distribution
Copy No.
Name
Location
1
Library Master
Project Library
2
Project Manager
3
4
Note To Holders:
If you receive an electronic copy of this document and print it out, please write your name on the equivalent of the cover page, for document control purposes.
If you receive a hard copy of this document, please write your name on the front cover, for document control purposes.
Contents
Document Control ii
1. BI Publisher基础 2
1.1. 读者基础要求 2
1.2. 文档贡献者 2
1.3. About XMLP 2
1.4. 必要配置 4
1.5. 最简单的例子.输出XML数据源 5
1.6. 最简单的例子.设计RTF模版 8
1.7. 最简单的例子.注册数据源和模版 14
1.8. 最简单的例子.运行报表 15
2. RTF模版开发 17
2.1. 本章概述 17
2.2. 布局格式化 17
2.3. 字段计算技巧 19
2.4. 任何Page相关问题 20
2.5. 使用多媒体元素 21
2.6. 其它常用语法 23
2.7. 高级布局 25
3. 其它数据源和模版开发(可选) 28
3.1. Data Template 28
3.2. PDF模版 28
3.3. eText模版 28
3.4. FO模版 28
4. 集成和API 29
4.1. 并发请求 29
4.2. Report报表迁移 29
4.3. 即时预览 29
4.4. 即时打印 29
4.5. 即时分发 30
5. 相关专题讨论 31
5.1. 服务器端版本 31
5.2. Viewer设置 32
5.3. 字体与乱码 33
5.4. Output Post Processor 34
5.5. 字符集与乱码 36
5.6. 国际化支持 38
5.7. Instance间迁移 38
5.8. 问题记录 39
6. Open and Closed Issues for this Deliverable 40
Open Issues 40
Closed Issues 40
Open and Closed Issues for this Deliverable 40 of 53
XML Publisher要点荟萃
File Ref: 7215f39259df1742c7fc9a640821be45.doc (v. DRAFT 1A )
Company Confidential - For internal use only
1. BI Publisher基础
1.1. 读者基础要求
1、 熟悉EBS并发程序开发
2、 熟悉Microsoft Word
3、 了解并发管理器的定义和作用
4、 理解简单的XML文件
5、 有XSL-FO开发经验者更佳
6、 有Java开发经验者更佳
1.2. 文档贡献者
截止目前为止,本文档在编写过程中得到张礼军、刘平的鼎力支持,这里深表感谢!
1.3. About XMLP
XMLP在EBS中的地位
XMLP是EBS的11.510之后主要的报表解决方案。每种技术都有自己的特点和应用方向,仔细阅读下表,我们可以体会何种场景该使用XMLP。
EBS中的技术
特点
企业应用
Oracle DB
关系型数据库,其实是最佳的设计模式和开发框架
所有MIS系统的基础,最可靠的数据持久存储
PL/SQL
标准SQL+编程语言,Oracle所有开发工具的基石
用于业务逻辑实现;系统质量的优劣、性能的高低,很大程度上取决于PL/SQL
Reports
过去流行的可视化报表设计环境,开发效率高
数据检索+报表展现,尤其是单据打印
Discoverer
BI展现工具,基于主题视图,分析企业数据
因为布局工作量小,被广泛应用于普通报表开发
ADI/Web ADI
从日记账和FA起家,逐步发展为EBS最强的桌面工具
数据检索+Excel展现、数据批量录入和修改
XML Publisher
基于XML工业标准,数据抽取与展现分离,布局设计平易近人又高度灵活丰富,与Java亲密集成
数据检索+报表展现,除了单据打印,还可发布至合作伙伴
Concurrent
基于时间的任务并发、排队,合理利用系统资源
立即、定时或周期执行程序、报表、维护和监控
Flexfield
EBS最富特色的自定义字段,智能组合、智能验证
会计科目、物料分类,业务特有信息的记录和传递
Forms
最快捷的数据库应用系统开发环境,UI不够友好
Windows版的数据录入+数据处理+数据检索
JSP/JTF/OAF
效率比较高的基于浏览器的应用开发框架
纯Web版的数据录入+数据处理+数据检索
Workflow
灵活的流程定义/自动化、通知发送、系统间集成
流程式审批、流程式数据传递、事件式系统集成
Alert
基于触发器和定时器的数据监控、预警通知
企业核心数据监控、系统运行异常监控
Interface/API
各模块开发人员留出的,除了UI外的数据“出入口”
客户化业务、外围系统与核心ERP的集成
Web Service
基于Internet的计算和服务,可用于数据交换
跑在Internet上的Interface/API
……
1.3.1. 官方资料
XML Publisher简称XMLP,现在叫BI Publisher,有独立版和EBS嵌入版。
以下站点是BI Publisher的官方技术中心:
以下站点是EBS的官方文档中心,其中包含XML Publisher的最新User Guide:
BI Publisher可以使用 大多数用户熟悉的工具Microsoft Word 或 Adobe Acrobat,来设计报表格式。不需要专用的设计Studio,这意味着不需要额外的成本。
这样,业务顾问或者用户仅需要简单的培训,就可以直接完成报表的设计。
1.3.2. 解决了其它报表工具的鸡肋
1、 PL/SQL:布局过于简单;不便于Java集成,不便于对外发布。
2、 Discoverer:布局过于简单、性能较差;不便于Java集成,不便于对外发布。
3、 Reports:输出Excel不方便、标题和内容漂移、PASTA配置麻烦;不便于Java集成,不便于对外发布。
1.3.3. 完全分离数据 / 布局 / UI国际化
数据获取、布局设计、界面翻译三大工作全部分离,可由不同的人甚至第三方分工协作。
报表输出
数据逻辑
报表布局
翻译转化
XML Publisher
1.3.4. 数据不限来源、最终格式丰富、传送不限目的地
BI Publisher 可以接受并格式化任何格式规范的 XML 数据,它可以与能够生成 XML 的任何数据库、应用程序或过程集成,无论是要格式化输出并发送给使用者的数据库、ERP 应用程序还是 Web 服务。BI Publisher 还允许您将来自多个数据源的数据置入单个输出文档。
可以通过打印机、电子邮件、传真和 WebDav 传送您的内容,或者将报表发布到门户。Delivery Manager 的开放式体系结构还允许您轻松地实现自定义传送通道。
Web Services
模 板
XML
EDI
EFT
Email
Printer
Fax
WebDAV
e-Commerce
输出
目标
Oracle,
SQL Server
PeopleSoft,
SAP, Siebel
Java, C++,
Pearl, etc
XML Publisher
数据源
• Word
• Excel
• Acrobat
XSL
布局设计工具
PDF
RTF
HTML
Excel
• XML Spy
• JDeveloper
• Scriptura
1.3.5. 卓越的性能
BI Publisher 基于 W3C XSL-FO 标准,它是当今世界上最快、伸缩性最强的实现。它可以在较短的时间内处理大量的数据输入并生成输出,而只需占用很少的 CPU 时间和内存。
1.3.6. 开放的标准,易于集成
BI Publisher 是基于开放标准技术构建的。它是一个 J2EE 应用程序,可以部署到任何 J2EE 容器。数据将处理为 XML,在桌面应用程序中创建的布局模板将在内部转换为 XSL-FO(另一个 W3C 标准)。该应用程序生成的输出也符合业界标准,如 PDF、RTF 和 HTML。传送协议是 Internet 打印协议 (IPP)、WebDAV、FTP 和 AS2。
1.4. 必要配置
1.4.1. 服务器端Patch
最好升级到最新版本,至少也要到5.5,之前的版本可以说是Oracle的“小白鼠”。
目前最新版为Oracle XML Publisher Core Rollup Patch 5.6.2 (Patch 5097966),Notes367394.1,有比较详细的描述。
SELECT * FROM fnd_product_installations WHERE patch_level LIKE ‘%XDO%’
1.4.2. 服务器端配置
除非有特别需要,如设置临时文件夹、字体映射、PDF报表文件密码控制等,否则不需要做什么配置。
新版配置:XML Publisher Administrator/Home/Administration。
旧版配置:$XDO_TOP/resource/xdo.cfg或者$AF_JRE_TOP/jre/lib/xdo.cfg。
该文件默认不存在,需要手工创建。文件格式要按照《Oracle XML Publisher User’s Guide》的要求来写。如果PC机安装了XML Publisher Desktop,其实里面有个xdo example.cfg文件,可以稍微修改即可使用。
1.4.3. 开发设计工具XML Publisher Desktop
目前最新版本是5.6.2;需要先装好JDK1.4以上版本。
下载下来后直接安装,这样会在Word中嵌入XMLP的菜单,可以用来自动生成布局、预览等。
1.5. 最简单的例子.输出XML数据源
1.5.1. 关于数据源
XMLP要求的数据,必须是XML格式的,这可以通过多种方式生成,最常见的有两种。
1、 Oracle Reports:仅创建Data Module、分组、求和,不用设计布局;其中求和也可以在模版中完成。
2、 PL/SQL or SQL:直接输出XML格式的内容。
如果使用XMLP的Java API来生成报表,实际上可以从任何途径获得XML格式的文件,包括本地文件、用URL指定的网络文件、其他Java函数返回的参数等等。
1.5.2. 开发数据源
这里采用Oracle Reports,为简单起见,参数写死,SQL如下:
SELECT poh.segment1 po_num,
por.release_num release,
pv.vendor_name,
pvs.address_line1,
pvs.address_line2,
pvs.address_line3,
pol.line_num || ‘.’ || pll.shipment_num line_num,
mst.segment1 item_num,
mst.description,
pll.quantity,
pll.unit_meas_lookup_code uom,
pll.price_override unit_price,
poh.currency_code,
nvl(pll.need_by_date, pll.promised_date) need_by_date
FROM po_headers_all poh,
po_vendors pv,
po_vendor_sites_all pvs,
po_lines_all pol,
po_line_locations_all pll,
po_releases_all por,
mtl_system_items_vl mst
WHERE poh.vendor_id = pv.vendor_id(+)
AND poh.vendor_site_id = pvs.vendor_site_id(+)
AND poh.po_header_id = pol.po_header_id
AND pol.po_line_id = pll.line_location_id
AND pll.po_release_id = por.po_release_id(+)
AND pol.item_id = mst.inventory_item_id
AND pll.ship_to_organization_id = mst.organization_id
AND poh.org_id = 102
AND poh.creation_date >= sysdate - 60
在Oracle Reports中创建数据模型并分组如下:
对组名称可以改得友好些,比如这里的G_PO_HEADER和G_PO_LINE,这样生成的XML文件可读性更佳。代码参考:CUXXMLPDEMO.rdf。
1.5.3. 注册并发程序,输出格式为XML
1、 上传CUXXMLPDEMO.rdf至服务器$SCF_TOP/reports/US
2、 注册可执行:
3、 注册并发程序,注意输出格式:
4、 分配给相应的请求组。
1.5.4. 试运行,获得样例数据
将报表上传服务起后,请求运行结果如下(只展开了一张PO):
可以看到,Oracle Reports可以自动输出XML,Tag主要来自文件名、分组名、字段名。具体文件可参考:CUXXMLPDEMO.xml。
1.6. 最简单的例子.设计RTF模版
1.6.1. 关于布局设计
实际上和任何报表工具一样,布局设计时,先需要“想象”层次结构,如哪些内容位于页眉页脚,哪些内容是报表头,哪些内容是明细行,各部分是如何依次嵌套的,哪些地方需要合计等等。同时考虑一些特殊需求:如何进行页码编号、是否动态列、每页显示的行数是否固定、新单据是否从新页开始、行高和列宽是否固定、表头是否在新页重复等等。这些也是做布局设计的重点和难点,而且不同版本的XMLP支持的特性也不一样,总的来说5.6.2之后,应该我们常用的需求都能被满足。
布局设计最常用的工具是Word,也可以是Adobe Acrobat,也可以直接编写XSL-FO模版。实际上,当上传RTF文件到XMLP模版管理器时,将被自动转换为XSL-FO。
1.6.2. 了解窗体域,这可是我们经常写XMLP代码的地方
用Word进行RTF模版设计时,XMLP主要是利用“窗体域”来保存分组、格式、赋值等控制信息,其类似报表中的占位符,运行时将被实际的数据替换。
先从菜单“视图/工具栏/窗体”调出窗体工具栏。
然后就可以将“窗体域”插到Word文档中,最后通过右键“窗体域”调出属性,默认文字中输入比较直观的描述,在“添加帮助文字”的“自己键入”部分输入相应的XMLP命令,格式都是<?各种命令?>。比如下面的命令是个占位符,意思是运行时,用数据文件中标记为“ITEM_CODE”的值替换:
1.6.3. 导入样例数据
打开Word,通过Template Builder/数据/装入XML数据:
选择上一步请求输出的XML文件,这样我们可以用向导加快模版设计,同时也方便预览。
1.6.4. 布局向导
布局设计比较灵活,可以先搭好分组框架,也可先设计数据;可以通过向导创建,也可以手工设计。这里先介绍向导,这样可以减少手工添加“窗体域”的工作量。
1、 启动向导,菜单Template Builder/插入/表/表单/向导…
2、 选择布局风格,我们先要做采购订单单据头,所以选择“表单”
3、 选择分组依据,我们这里选择G_PO_HEADER
4、 选择需要的字段,假定我们需要如下5个字段
5、 设置排序字段,我们需要按照PO号和发放号同时排序
6、 调整字段描述
7、 完成后自动生成布局如下(可双击打开)
其中的F和E是分组起始、终止标志,我们总结如下:
字段
默认文字
XMLP语句
组开始
F
<?for-each:G_PO_HEADER?><?sort:PO_NUM;’ascending’;data-type=‘text’?><?sort:RELEASE;’ascending’;data-type=‘text’?>
订单号
PO_NUM
<?PO_NUM?>
发放号
RELEASE
<?RELEASE?>
供应商
VENDOR_NAME
<?VENDOR_NAME?>
地址
ADDRESS_LINE1
<?ADDRESS_LINE1?>
货币单位
CURRENCY_CODE
<?CURRENCY_CODE?>
组结束
E
<?end for-each?>
这里要掌握分组语法和值饮用语法。
Tips:到这里就可以预览报表了。
1.6.5. 调整布局
向导生成了基本框架,尤其是需要写代码的“窗体域”,接下来我们根据实际需求调整下布局,同时最好也改下“默认文字”,尤其是分组的。最终结果如下(可双击打开):
1.6.6. 验证布局
菜单Template Builder/工具/验证,可以验证语法错误和不支持的特性!
1.6.7. 完善报表
和上边的步骤类似,首先运行向导添加订单行,这次布局风格选择“表”,分组选择PO_Line,结果如下,排序选择Line_Number:
其中的F和E是分组起始、终止标志,注意这次它们所处的位置,这样可以做到根据数量自动扩张行。
同样我们需要做下调整,比如:
这个例子还缺少很多元素,仅供练习,源文件为CUXXMLPDEMO.rtf。
1.6.8. 预览报表
通过菜单Template Builder/预览,可以选择PDF、Excel、HTML、RTF等多种格式,我们选择Excel的输出结果如下:
完整的输出文件请看CUXXMLPDEMO.xls。
1.7. 最简单的例子.注册数据源和模版
1.7.1. 注册数据源
N: XML Publisher Administrator/Home/Data Definitions/Create Data Definition
定义数据源,需要注意,数据源代码需要和并发请求的代码一致,也可以上传预览数据:
1.7.2. 注册模版,并和数据源关联
N: XML Publisher Administrator/Home/Templates/Create Template
定义并上传模版,需要注意选对类型和上一步注册的数据源:
可以为每种语言上传一个模版。
不过这里有点缺陷,就是一个模版只能用于一个数据源。如果我编写了多个数据源,想用同一个模版来显示,就只能重复定义和上传模版了。
1.8. 最简单的例子.运行报表
1.8.1. 提交请求
操作和提交普通的请求类似,唯一注意的是多了个Layout选项,默认会选中同语言的模版:
在11.5.10 CU1或Patch3435480之前,需要分两步完成,第一步运行请求,第二步运行XML Report Publisher来生成输出:
1.8.2. 查看输出
运行结果和我们在XMLP Desktop中预览的基本一样,下面是个PDF的结果:
2. RTF模版开发
2.1. 本章概述
2.1.1. 关注内容
相信随着XMLP版本的不断升级,其Desktop端的可视化功能将大大简化我们的设计工作,不过目前还有些地方不通过手工编写命令是无法完成的;此外,虽然模版开发是依托Word的功能完成,但有些“鲜为人知”的Word功能需要额外提示下。
所以本章收录的是常见问题的处理办法,并未包括完整的User Guide功能,当然也不包括Word的使用帮助。
2.1.2. XMLP和XSL-FO
可以采取两种方式编写布局语言,一是XSL语句,二是XMLP简易语句,个人建议使用前者,因为其是国际通行标准。另外,这两种语法可以混合使用,比如上面的条件格式化行和单元格。
在RTF中直接写的只能是XMLP简易语句;在窗体域中则上述两者皆可。
标准的页眉页脚中不允许使用窗体域;但扩展的页眉页脚中可以使用。
XMLP提供的语法,都是一种简化的“代号”,实际都要翻译成XSL,如果你精通XSL-FO,那么也可以在窗体域中直接用该语法,自由而灵活!如下SQL可以查到转换后的XSL-FO:
SELECT t2.application_short_name,
t2.template_code,
t1.LANGUAGE,
t1.template_name,
t3.file_name,
t3.xdo_file_type,
t3.file_data
FROM xdo.xdo_templates_tl t1, xdo.xdo_templates_b t2, xdo.xdo_lobs t3
WHERE t1.template_code = t2.template_code
AND t2.template_code = t3.lob_code
AND t1.LANGUAGE = ‘US’
AND t1.template_code = ‘CUXXMLPDEMO’
Tips:C:\Program Files\Oracle\XML Publisher Desktop\samples\RTF templates有非常好的例子可供参考。
2.2. 布局格式化
2.2.1. 建议做法
充分利用Word的格式化功能:纸张自定义、颜色、字号、字体、标题样式、背景、水印、对齐、表格、分栏、模版日期、窗体域的数字/日期格式、文件图片、页眉页脚、自动图文集。
虽然可以代码控制,但既然依托Word作为可视化设计工具,我们就尽量使用Word功能来设计报表吧!
2.2.2. Word表格
和做网页一样,表格在报表布局中的地位至关重要,要熟练掌握,尤其是:
1、 标题行重复,可以实现新页重复标题。
2、 嵌套表格、行列合并、边框、底纹,可以实现特殊的布局。
3、 固定列宽、自动调整、禁止跨页断行,可以实现一些严格的布局控制。
2.2.3. 行截断与禁止折行
单据打印中对格式的要求比较高,如果某一行过长或者出现多次折行,就会破坏版面,尤其是套打等要求较高的场合,这里把各种方法作个小结。
1、 Word功能,不理想
固定列宽功能可以用,但固定行高不行,虽然设计时看到“固定”了,如果不加控制,运行后多出列宽的数据会自动折行。
2、 单行+截断,即控制只有以行,多余截断,禁止折行
在字段后,再加两个命令:
<xsl:attribute xdofo:ctx="block" name="wrap-option">no-wrap</xsl:attribute>
<xsl:attribute xdofo:ctx="block" name="overflow">hidden</xsl:attribute>
3、 多行+截断,难
如固定显示3行,多余部分截断,目前通过模版无法实现,只有在数据源中先将数据截至刚好3行的字符数,然后利用自动折行功能。这里还要注意空格,如果遇到空格,后面的单词又显示不下,将会提前自动折行。
2.2.4. 条件格式化
在不同的条件下显示不同的颜色、不同的列数、不同的标题、不同的布局风格等等,这些都属于条件格式化,需要借助IF命令。
1、 比如不同币种凭证打印格式不同
<?if:CURRENCY_CODE="CNY"?>任何布局<?end if?>
<?if:CURRENCY_CODE!="CNY"?>任何布局<?end if?>
2、 比如货币为CNY时才显示列,在目标列的单元格内写如下语句
<?if@column:CURRENCY_CODE="CNY"?>字段值和格式<?end if?>
注:这还不是真正的动态列。
3、 比如偶数行底色为灰色,在行的任何单元格内写如下语句
<?if@row:position() mod 2=0?>
<xsl:attribute xdofo:ctx="incontext" name="background-color">gray</xsl:attribute>
<?end if?>
4、 比如超过100单元格呈红色,在目标单元格内写如下语句
<?if:QUANTITY>100?>
<xsl:attribute xdofo:ctx="block" name="background-color">red</xsl:attribute>
<?end if?>
2.3. 字段计算技巧
2.3.1. 建议做法
1、 计算字段可以在SQL中先完成。
2、 如果使用Oracle Reports做数据源,那么计算字段、统计字段也可以先完成。
3、 在SQL中的数据,都不带格式,格式在模版中设置;需要在模版中完成计算的字段,必须不带格式,主要指数字不能带千位符号。
2.3.2. 组内合计
N: Template Builder/插入/字段
向导可以完成基本的统计,目前支持分组内的:Sum、Count、Min、Max、Avarage。
自动生成的代码示例:<?sum (QUANTITY)?>。
2.3.3. 页内合计
要实现本页合计数,需分两步:声明合计变量、显示合计变量(可带格式)。
1、 对QUANTITY进行本页合计,声明变量QTYTOTAL,注意写在QUANTITY对应的组内,不然引用不到
<?add-page-total:QTYTOTAL;’QUANTITY’?>
2、 可在任意地方显示合计数
<?show-page-total:QTYTOTAL?>
那么如何实现组内+页内合计呢?
2.3.4. 结转合计
把上页的合计数显示到下页,与“页内合计”类似,需分两步:声明合计变量、显示合计变量。
用得少,可参考User Guide“Brought Forward/Carried Forward Totals”部分。
2.3.5. 累计数Running Totals
累计每行数字,实际上是这样完成的:先声明一个变量,初始化为0;累加;在需要的地方显示累计。
1、 在分组标记前初始化,Set变量
<?xdoxslt:set_variable($_XDOCTX,’RTotalVar’, 0)?>
2、 计算累计值,通常写在欲累计的字段同一单元格内,比如下面的QUANTITY
<?xdoxslt:set_variable($_XDOCTX, ‘RTotalVar’, xdoxslt:get_variable($_XDOCTX,’RTotalVar’) + QUANTITY)?>
3、 任意地方显示累计值,Get变量
<?xdoxslt:get_variable($_XDOCTX,’RTotalVar’)?>
2.4. 任何Page相关问题
2.4.1. 新组分页
分页是自然的,但如果想在某处强制分页如新组新页,那么可以使用Word的分页符(CTRL+ENTER快捷键),但会导致最后出现空白页;这样只能使用如下几种方式:
1、 分组声明中加@section,如<?for-each@section:G_PO_HEADER?>。
2、 <?end for-each?>前加<?split-by-page-break:?>。这个翻译后,实际上是:
<xsl:if test="position()<last()">
<xsl:attribute name="break-before">page</xsl:attribute>
</xsl:if>
3、 <?end for-each?>前加<xsl:attribute name="break-after">page</xsl:attribute>,此法下RTF最后无空白页,但PDF有空白页。
4、 <?end for-each?>前加<xsl:attribute name="break-before">page</xsl:attribute>此法下RTF、PDF最后都有空白页。
2.4.2. 条件分页、固定行分页
1、 任意条件分页,需要借助IF + 上面的break-after或者break-before,如:
<?if:CURRENCY_CODE="CNY"?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>
2、 固定行分页,需要借助IF + 上面的break-after或者break-before,在行<?end for-each?>前,如下语句控制每页5行:
<?if:position() mod 5 =0?>
<xsl:attribute name="break-before">page</xsl:attribute>
<?end if?>
2.4.3. 页眉页脚
1、 标准的页眉页脚,即单个页眉页脚,使用Word的功能即可。
2、 扩展的页眉页脚,可使用<?start:body?><?end body?>把主体部分“框”起来,凡是在这两个标记之外的东西,都将被当作页眉页脚。
2.4.4. 页码和页数
1、 可以用Word的“自动图文集”
展开阅读全文