BOS进阶培训-套打二次开发.ppt
《BOS进阶培训-套打二次开发.ppt》由会员分享,可在线阅读,更多相关《BOS进阶培训-套打二次开发.ppt(76页珍藏版)》请在三一办公上搜索。
1、BOS进阶培训 套打二次开发,金蝶软件(中国)有限公司,商业分析系统部 李馥龙,目录,1、相关概念2、模板设计概述3、套打调用基本API4、数据提供者5、二次开发6、高级应用及API7、常见问题分析处理8、附:模板中的脚本,目录,1、相关概念2、模板设计概述3、套打调用基本API4、数据提供者5、二次开发6、高级应用及API7、常见问题分析处理8、附:模板中的脚本,相关概念套打,什么是套打?套打能做什么?,行业:在印刷好的表格中打印内容(凭证、帐簿、支票),EAS中的“套打”:自定义格式的票据、单据、报表的打印,广义的概念,EAS中的套打功能,处理除序时簿打印之外所有打印需求。,名称由来?沿袭
2、,狭义,套打模式 主要特征:每页格式一样,不在于是否用套打纸,相关概念套打,报表模式,相关概念基本原理,“平台”?“控件”?,模板,+数据,=结果,相关概念基本原理,模板统一管理,使用(调用)分散在各业务界面,“平台”?“控件”。,不是子系统树目录名称不能乱改,相关概念文件类型,套打元数据提供一种集成方式、字段的描述信息、只影响模板设计(*.bos-query)KDF 模板(废)KDF系列的Form格式(*.kdrs-form)ReportOne 模板ReportOne系列的Print格式(*.r1-print),相关概念KDF/ReportOne,2003,2006,2007,2008,1,
3、2,3,KDTable,报表平台,套打,控件,KDForm(),R1-Form(),4,R1-Print,5,1,扩展报表,KDF,ReportOne,扩展报表,目录,1、相关概念2、模板设计概述数据源设置组件及规则基本模式3、套打调用基本API4、数据提供者5、二次开发6、高级应用及API7、常见问题分析处理8、附:模板中的脚本,模板设计概述参考资料,参考 用户手册 BOS6.2 全参考 BOS开发者网络 http:/开发文档-BOS开发指南-BOS开发指南_套打模板制作(主要讲模板规则)研发内网 商业分析知识库 http:/ctrlsrv/ctrls设计器 示例模板生成向导,模板设计概述数
4、据源设置,添加、删除、重命名、参数设置、查看引用信息,重命名(可能有代码依赖),模板设计概述组件及规则:页,一个模板,自动对应了一个页对象。页是模板的可设计区域。通常,页的大小为纸张大小减去四边距后的尺寸,此时页与纸张一一对应,套打模式和大部分报表模式就是这种情形。当多数据源的报表模式,设计时内容就很多,此设计区域容纳不下的时候,允许修改页的高度。运行时,页自动与主数据源绑定。如果不存在“能引起分页的对象(如数据表)”绑定主数据源,则主数据源自动移至其下一条记录使页重复输出。,模板设计概述组件及规则:单元对象,单元对象包括:文字对象、金额对象、图片对象,它提供了一块固定的区域,用于展现对应的内
5、容。此内容可以是绑定字段,或自定义的固定内容。执行时,单元对象本身不引起分页,也不会引起数据源行集移动至下一条记录。注意区别,“单元对象”是离散的矩形区域,不等同于表格的“单元格”。,模板设计概述组件及规则:数据表,数据表是一种表格,它由规整的行、列组成,行列的交汇处为单元格。行、列、单元格是组成表格的基本元素。(注意区别“单元格”不等同于“单元对象”)数据表具有分组展现、统计功能,其数据行能根据数据源行集的每一行重复输出,它是一种可能引起分页的对象。数据表必须绑定唯一的一个数据源。行:普通行、分组行、数据行“套打型”和“报表型”单元格,类型(文字、字段、统计、容器等),融合,模板设计概述组件
6、及规则:网格,网格也是一种表格,同样由行、列、单元格是组成。网格本身不绑定数据,它的行没有类型;单元格可以输入文字、绑定字段或者作为容器放置其它对象。二个主要作用:布局(展示)、组合多个数据表,为了满足不确定内容的横向、折行排列需求。设计期定义的一块可供重复内容的区域,以及区域中的一个容器(可以直接绑定字段或放置内容组合)。区域绑定数据源。执行时,数据源的行集,每一行对应输出一个容器,并按预先设置好的方向排列:横向折行或纵向换列。,模板设计概述组件及规则:动态列表,模板设计概述基本模式,票据模式单据套打模式多数据源单据套打模式报表模式多数据源报表模式,票据模式单据套打模式多数据源单据套打模式报
7、表模式多数据源报表模式,模板设计概述基本模式1,主要特征:*单数据源*数据源的每一行记录对应一张票据*不带分录直接在页面上放置单元对象、可导入背景图片执行时,页自动与数据源绑定,对应行集的每一条记录重复输出多张票据。,票据模式单据套打模式多数据源单据套打模式报表模式多数据源报表模式,模板设计概述基本模式2,RowSet 形如:单据ID单据其它字段分录ID分录其它字段第1行单据A分录A-1第2行单据A分录A-2第3行单据B分录B-1第4行单据B分录B-2第5行单据B分录B-3第6行单据C分录C-1单数据源,数据表按单据ID分组,数据行设置套打型,分组行设置每页出现。,HD,模板设计概述基本模式3
8、,票据模式单据套打模式多数据源单据套打模式(如带审批的单据)报表模式多数据源报表模式,并列放二个数据表,套打型在前例的数据源(分组)的基础上,只能做成套打型。若希望做成报表型,必须修改数据源结构(变成多数据源报表模式)。,HmD,H,D1,D2,Btw.HDD,H,D1,D2,合起来,做分组,票据模式单据套打模式多数据源单据套打模式报表模式多数据源报表模式,模板设计概述基本模式4,“报表型”区别于“套打型”的特点是:不限定每页显示数据行数,行高可随内容自动调整(行高自适应),通常为第一页开头是表头,表体内容跨若干页,最后一页是表尾的形式。和单据套打类似,用一个数据表就可以解决问题。对数据表做必
9、要的分组;数据行设置为“报表型”;普通行、分组行的“每页出现”属性按需要设置。分组统计如果做在分组行,就是这一层分组的小计;做在普通行则是总计。,票据模式单据套打模式多数据源单据套打模式报表模式多数据源报表模式(简历模式),模板设计概述基本模式5,HmD,H,D1,D2,目录,1、相关概念2、模板设计概述3、套打调用基本API4、数据提供者5、二次开发6、高级应用及API7、常见问题分析处理8、附:模板中的脚本,套打调用基本API,KDNoteHelpercom.kingdee.bos.ctrl.report.forapp.kdnote.client.KDNoteHelper 类提供了统一的套
10、打调用API。数据提供者套打控件只识别取数接口(现在也提供查询Query的缺省实现DefaultNoteDataProvider,且推荐使用),具体的取数实现都是各业务集成时各自实现。对于实现取数接口的、给套打执行时提供数据的类,称之为DataProvider数据提供者。业务开发中,通常界面上会有 打印/打印预览 按钮,在框架的ListUI/EditUI类中,会有类似actionPrint_actionPerformed或actionPrintPreview_actionPerformed方法与之对应,套打的调用代码写在这样的方法中。,套打调用基本API,打印public void print
11、(String templateType,Object dataProvider,Component owner,boolean isShowPrinterDialog)参数说明:,这不是套打控件规定的用法了解,但不要被束缚。,套打调用基本API,打印预览public void printPreview(String templateType,Object dataProvider,Component owner)参数说明:,套打调用基本API,R1模板,取数接口AbstractPrintDataProvider,KDF模板,取数接口BOSQueryDelegate,适配器,DataProvi
12、der的类型声明是Object的附加说明,控件的内部实现,业务开发不用关心。了解,不会有疑惑。,代码只能有一份(要么旧的,要么新的);模板可能是任意的。怎么办?,套打调用基本API,为什么套打管理的目录名称不能乱改?(大小写敏感),目录,1、相关概念2、模板设计概述3、套打调用基本API4、数据提供者取数接口说明自定义实现查Query的缺省实现KDF取数接口对比5、二次开发6、高级应用及API7、常见问题分析处理8、附:模板中的脚本,数据提供者取数接口说明,package com.kingdee.bos.ctrl.reportone.r1.print.data;import com.kingd
13、ee.jdbc.rowset.IRowSet;/*since EAS 5.4*/public abstract class AbstractPrintDataProvider public abstract IRowSet getData(R1PrintDataSource dataSource)throws Exception;,套打模板中一个“数据源”,在执行过程中,执行引擎会通过此取数接口找集成环境要数据。,客户端,数据提供者取数接口说明,业务场景,套打控件,DataProvider,API,UI,执行引擎,数据提供者取数接口说明,实现示例(注意,不是套打控件规定的用法)public c
14、lass DemoDataProvider extends AbstractPrintDataProviderprivate Set billIds=null;private IMetaDataPK qpk=null;public DemoDataProvider(List billIdList,IMetaDataPK qpk)this.billIds=new HashSet(billIdList);this.qpk=qpk;public IRowSet getData(R1PrintDataSource dataSource)throws ExceptionIQueryExecutor ex
15、ec=QueryExecutorFactory.getRemoteInstance(qpk);exec.option().isAutoTranslateEnum=true;EntityViewInfo ev=new EntityViewInfo();FilterInfo filter=new FilterInfo();filter.getFilterItems().add(new FilterItemInfo(id,billIds,CompareType.INCLUDE);ev.setFilter(filter);exec.setObjectView(ev);IRowSet iRowSet=e
16、xec.executeQuery();return iRowSet;,public abstract class AbstractDemoEditUI extends.public void actionPrint_acrionPerformed(ActionEvent e)throws ExceptionKDNoteHelper hlp=new KDNoteHelper();DemoDataProvider dataProvider=new DemoDataProvider(.,new MetaDataPK(getTDQueryPK();hlp.print(getTDFileName(),d
17、ataProvider,this);protected String getTDFileName()protected String getTDQueryPK()public class DemoEditUI extends AbstractDemoEditUIprotected String getTDFileName()return/DemoA/DemoB/DemoC;protected String getTDQueryPK()return com.kingdee.demo.DemoQuery;,数据提供者取数接口说明,public abstract class AbstractPrin
18、tDataProvider public abstract IRowSet getData(R1PrintDataSource dataSource)throws Exception;public class R1PrintDataSource/*数据源名称*/public String getId()/*取得表示数据源依赖于其它数据源的参数*/public R1PrintDataParameter getAssociateParameter()/*取得指定名称的参数*/public R1PrintDataParameter getParam(String id)/*引用BOS Query的信
19、息,MetaDataPK的fullName*/public String getReference()/*取得所有排序字段(目前只是分组字段)*/public R1PrintDataSortItem getSortFields()/*创建BOS查Query所需的EntityViewInfo,*它包括了动态查询、模板中指定的排序等信息。*注意它不包含参数信息(如getAssociateParameter)。*/public EntityViewInfo createWrappedBosRuntimeInfo(),数据提供者取数接口说明,如果模板中存在多个数据源,执行时也都是通过这个唯一的接口取数
20、。实现代码中通过dataSource.getId()识别不同数据源。换句话说,数据源名称是集成环境预先定义好的,模板中必须按此命名。当然,如果模板中直接引用Query,而取数实现又对查Query做了支持(例如使用了DefaultNoteDataProvider),则名称无关紧要。通常多数据源存在“主-从”结构,即有依赖的情况,主数据源被依赖的字段值发生变化,从数据源会被要求重新取数。所以,即使是模板设计时逻辑上的“一个”数据源,也可能是多次由getData取得RowSet。此时,从数据源的取数是必须通过dataSource.getAssociateParameter().getValue()取
21、得所依赖的值作过滤的。,数据提供者自定义实现,publicclassDemoDataProviderextendsAbstractPrintDataProvider publicIRowSetgetData(R1PrintDataSourcedataSource)throwsExceptionif(主数据源名称.equals(dataSource.getId()/可能会以选中数据的ID做过滤条件查数据/构造RowSet returnrowset;elseif(从数据源名称.equals(dataSource.getId()R1PrintDataParameterparm=dataSource.
22、getAssociateParameter();StringparmValue=null;/参数值 if(parm!=null)parmValue=parm.getValue().toString();/以参数值为过滤条件取数据,构造RowSet returnrowset;/其它分支,数据提供者自定义实现,自行构造RowSet的参考代码:DynamicRowSet drs=new DynamicRowSet(3);/3列drs.setColInfo(1,field1,field1,Types.VARCHAR,null);drs.setColInfo(2,field2,field2,Types.
23、DECIMAL,null);drs.setColInfo(3,field3,field3,Types.BINARY,null);for(int i=1;i=10;i+)/10行drs.moveToInsertRow();drs.updateString(field1,第+i+行);drs.updateBigDecimal(field2,new BigDecimal(i);drs.updateBytes(field3,new byte0);/可支持图片drs.insertRow();drs.beforeFirst();,Btw.图片字段代码拼RowSet:rowset.setColInfo(,T
24、ypes.BINARY,);rowset.updateBytes(,byte);查Query:数据库,字段类型BLOBQuery,字段类型Object,数据提供者查Query的缺省实现,/*since EAS 5.9*/com.kingdee.bos.ctrl.report.forapp.kdnote.client.DefaultNoteDataProvider,数据提供者查Query的缺省实现,例1:kdNoteHelper.print(path,new DefaultNoteDataProvider(dataIds),ctrl);这是最简单的使用方法,创建实例后直接使用。其中,dataId
25、s是单据的“id”字段的值,java.util.List或java.util.Set。它可以是EditUI一个单据的id,也可以是ListUI选中的一批单据的id。此种写法要求模板中一定要直接引用Query。如果是多数据源的情况,依赖关系中参数名称一定要当前数据源作为“外键”的字段。,数据提供者查Query的缺省实现,例2:为了兼容模板中引用套打元数据(无Query信息)的方式,可以指定缺省的Query。DefaultNoteDataProvider dataProvider=new DefaultNoteDataProvider(dataIds);dataProvider.setMetaDa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BOS 进阶 培训 二次开发
链接地址:https://www.31ppt.com/p-2308310.html