金蝶BOS套打二次开发

所需积分/C币:44 2014-03-28 09:28:27 274KB PDF
22
收藏 收藏
举报

金蝶BOS套打二次开发
2集成开发 2.1套打调用 业务开发中,通常界面上会有[打印]打印预览]按钮,在框架的EiUI类中,会 有 action Print action Performed或 action PrintPreview actionPerformed方法与之对应,套 打的调用代码写在这样的方法或类似的方法( ListEl可能不同)中。请注意,在 ListEl中, 我们还提供了对表格控件的打印,通常称之为序时簿打印,请注意区别 以下接口都是 KDNoteHelper类的。 211打印 APl public void print(String templateType, Object dataProvider, Component owner, boolean is Show PrinterDialog 参数说明: template Type 业务对应的路径,即套打管理中模板所在文件夹 (注:在框架中,由 getTDFileName(方法指定。) data Provider 数据提供者对象,参考数据提供。 owner 父窗口或其上的一个控件,用以实现弹出窗口的模态 [is ShowPrintcrDialog] I可省略。打印前是否弹出选择打印机的对话框。标准业务 通常省略(缺省为tue)ε参考直接打印 使用示例: KDNoteHelper helper=new KDNoteHelperO helper. print("/FI/GL/Voucher", dataProvider, ctrl) 212预览 APIa public void printPreview(String tcmplatcTypc, Object data Provider, Componcnt owner 参数说明: template Type 业务对应的路径,即套打管理中模板所在文件夹。 (注:在框架中,由 getTDFileNameo方法指定。) dataProvider 数据提供者对象,参考数据提供。 owner 父窗口或其上的一个控件,用以实现弹出窗口的模态。 使用示例 KDNoteHelper helper= new KDNoteHelperO helper.printPreview("/FI/GL/Voucher", dataProvider, ctrl) 213直接打印 在某些定制的业务中,用户希望录入完一个单据后点一下打印按钮就将内容直接 输出到打印机。此处,“直接”指不需要弹岀选择模板和打印机的对话框作人机交互 其中,不用选择打印机是靠打印API中,第4个参数 is Show PrinterDialog为 false 指定的,使用时自动启用系统默认的打印机。不用选模板,依赖于用户第一次使用弹岀 选择模板的窗口时,将目标模板记为“缺省模板”来实现 医选择积板 Q中国口只显示当前组织的模板 口套打配置 采购订单 口③供应链(CM) 白③供应管理8M 采购订单( Purorcer 将本次选中保存为缺铛很楼(可在“系统平台套打套打配置”中更改 L确定匚职消 图“直接打印”依赖于将模板记为缺省模板 22数据提供者 221套打取数接口 package com kingdee bos ctrl. reportone rl print data; import com kingdee jdbc rowset. IRow Set (since EAS 5. 4 public abstract class AbstractPrintDataProvider A public abstract IRowSet get Data(RIPrintData Source data Source)throws Exception; 六。该抽象类的实现,称为数据提供者。套打模板中一个“数据源”,在执行过程中, 统会通过此数据提供者找集成环境要数据 如果模板中存在多个数据源,执行时也都是通过这个唯一的接口取数。实现代码 中通过 data Source. getlo以别不同数据源。换句话说,数据源名称是集成坏境预先定义 好的,模板中必须按此命名。当然,如果模板中直接引用 Query,而取薮实现又对查 Query 做了支持(例如使用了 DefaultNoteDataProvider),则名称无关紧要 通常多数据源存在“主-从”结构,即有依赖的情况,主数据源被依赖的字段值发 生变化,从数据源会被要求重新取数。所以,即使是模板设计时逻辑上的一个“数据源”, 也可能是多次由 getData取得 Row Set。此时,从数据源的取数是必须通过 data Source getAssociateParameter(: get value取得所依赖的值作过滤的。 getDate方法的参数,描述了模板中的数据源信息。 public class RIPrintData Source /**数据源名称*/ public String getlo **取得表示数据源依赖」其它数据源的参数* public RiPrintData Parameter getAssociateParameter( *取得指定名称的参数* public RlPrintData Parameter get Param(String id) *引用 BOS Query的信息, MelaDataPk的 uIIName* public String getReferenceo) *取得所有排序字段(目前只是分组字段)* public RlPrintData Sortltem[ getSort FieldsO *创建BOS查 Query所需的 Entily viewInfo, *亡包括了动态査询、模板中指定的排序等信息。 注意它不包含参数信息(如 getAssociateParameter)。*/ public Entity VicwInfo crcatc Wrapped Bos RuntimcInfoO 222查 Query的缺省实现(推荐使用) com kingdee bosctrl report. forapp. kdnote. client: Defauitnote dataprovider类是抽象 类 Abstractprintdata Provider的实现,提供了查 Query的功能 例1 kdNoteHelper. printPreview(path, new DefaultNoteDataProvider(datalds) ctrl) 这是最简单的使用方法,创建实例后直接使用。其中, datalds是单据的”id”字段 的值, java. util. List或 java util. Sct.。它可以是FdtU一个单据的i,也可以是IstU选 中的批单据的id 此种与法要求模板中一定要直接引用αuery。如果是多数据源的情况,依赖关系中 参数名称一定要当前数据源作为“外键”的字段。 例2 为了兼容模板中引用套打元数据(无 Query信息)的方式,通常应该指定缺省的 Q DcfaultNotcData Provider dataProvider=new DcfaultNotcDataProvidcr(datalds) dataProvider. setMetaDataPK(com kingdee.XxX Query") kdNote Helper printPreview(path, data Provider, ctrl) 例3 多数据源的情况,对每个数据源都指定缺省的 Query,且为从数据源的依赖关系指 定作为“外键”的字段(则模板中数据源做依赖关系的参数名称可以随意写)。 此例中,偎设从数据源名称为" subData",字段为" parented",下同。 dataProvider. addMetaDataPK('subDatal",com.Xxx"); dataProvider. add Foreign Key("subDataI","parentId); 例4:(自定义过滤条件) dataProvider. add Custom FilterMaker("subDatal new DcfaultNotcData Provider. Custom FilterMakero public void customize(FilterInfo filter, RIPrint Data Parameter[] params) filter. getFilterltems( add(new FilterltemInfo( status", MultiApproveStatusEnum.SBM∥U∠); I Custom filter maker是 DefaultnoteDataProvider的内部接口,允许在查 Query的时 候通过代码指定固定的过滤条件。其实在 DefaultnoteDatah' rovider内部,主数据源也已 经包含」如下的过滤条件 filter: getFilterItemsO add(new FilterltemInfo("id", datalds, Compare Type INCLUDD); 所以在上面出现的例子中,可以在构造函数中传 datalds。如果主数据源不是要过 滤"id"字段,也可以通过 setCustomFilterMaker接口修改。 例5:(代理) 可以将 data Provider作为代理,而将真实的取数任务转发给另外个实现。 DefaultNote Data Provider dataProvider= new DefaultNote Data Provider( datalds) AbstractPrintDataProvider anotherDataProvider- new My DataProvider 0 dataProvidcr. addProxy Target ("subData", anothcr Data Provider) 例6:(性能优化) 在具有主从关系的多数据源中,主数据源被依赖字段值的变化(很可能是每一行), 都会导致每个从数据源取一次数。如果每次都是通过远程执行一次查询,在广域网的环 境中,多次的RPC可能成为性能的瓶颈。 DefaullnoteData provider提供了批量査询的功 能,可以通过开关开启。请注意,如果使用了代理,则批量不能生效。 dataProvider. setBatch Supported( true): dataProvider. setNumberOfEachBatch(100 223取数的自定义实现 有些时候,查 Query不能满足业务场景的取数需求,那么可以写自已的数据提供 public class My DaLa Provider extends AbstractPrintDataProvider public IRow Set get Data (RIPrint Data Source data Source) throws Exception if("主数据源ID" equals( data Source. getlo) /能会以选中数据的I做过滤条件查数据 构造 RowSet return rowset else if("从数据源I": equals(data Source. getlo RIPrintDataParameter parm=data Source. getAssociateParameterO String parm value-mu;/参数值 if(parm !=null) parm Value=parm. get Value(). toString 0: 以参数值为过滤条件取数据,构造 RowSet return rowset 其它分支 自行构造 RowSet的参考代伯: DynamicRowSet drs-new DynamicRowSet(3); //3 31) drs set Collnfo(l, "fieldI","fieldI", Types. VARCHAR, null) drs. setcollnfo(, field2", " field2", Types. DECIMAL, null) drs. setCollnfo(3, " field3", "field3", Types. BINARY, nul); for(inti=1;i<=10;i++)/10行 drs move TolnsertRowo ds. update String(" field","第"+i+"行"); drs update BigDecimal("field2, new Big Decimal(1); drs. updateBytes(" field3", new byte[o);/可支持图片 drs tRoW drs before First 23其它常用接口 23.1打印次数控制 public int getMaxPrintTimes( String template Type) throws KDRSException 在套打管理中,可以对一个业务单元(文件夹)设置数据的最多打印次数。此方 法用于获取该设置值。 public boolean is PrintTimes Controllable(String template Type) 如果在一个业务路径上设置了打印次数控制,该静态方法将返回truc public int get Copies 取得打印设置中,一次打印的份数 public void set Copies(int times) 设置次打印的份数 public void addKDNoteAction Listener(IPrint ActionListcncr listener) 添加打印事件,可获得打卬前处理事情的机会 public void diposePrinto 取消打印 通常的实现逻辑:数据的实际打印次数由业务丌发自行管理。每次打印前,判断 已打份数是否达到最多打印次数( getMax PrintTimes),达到了不能打,取消打印 ( diposeprint)。再判断已打份数加上将打份数( getCopies)是否超过最多打印次数,超 过则调整当前打印份数( setCopies)。记录凵打次数。 以上逻辑都是在 IPrintaction listener的 bcforcPrint事件中完成。注意, bcforc Print 发生在点了打印按钮(可能是业务界面上的打印,也可能是预览后在预览界面中点打) 后数据传送给打印机之前,打印时是与外部设备(打印机)通讯,由于技术上的原因, 目前不存在“打印后”或“打印顺利完成”事件 232组织过滤 有些客户,不同的组织使用不同的打印模板。于是在同业务中,可能存在数十 个甚至更多的模板,使用时很不方便。系统提供了选择模板时可以组织过滤的功能。模 板设计者在套打管理界面屮,可以将模板“绑定当前组织"。使用者在选择模板时,就 可以过滤出当前组织对应的模板 API public void setOrg FilterMode(boolean is Selected, boolean is Enabled) 控制选择模板时出现的组织过滤勾选框状态。 参数说明 is Selected 组织过滤勾选框是否勾上。 缺省为 falsc;自动启用用户的上次操作状态。 可置为tue;每次进入都勾上,用户的上次操作状态不生效。 is Enabled 缺省为truc。允许置为 falsc,让控廾禁灰。 使用示例: KDNotcHclpcr helper= new KDNotcHclpcrO; helper. setOrg FilterMode(true, true) helper.print("/FI/GL/Voucher, data Provider, ctrl) 选释模板 Q中只显示当前组的很板 口白套打配置 采购订单 }供应链(sC 白供应管理(M ③采购订单( Purordel □将本次选中保存为缺省模板〔可在“系统平台套打套打配置”中更改〕 匚确定匚取 图组织过滤 3模板发布 二次开发基本上不需要关心模板发布的问题。如果是开发时制作的模板,保存在 开发时连接的数据库屮,做完后导出、导入到客户的真实场景屮即可。可能需要适当做 些备份,因为套打管理中对模板的删狳功能是不能恢复的 由研发中心开发人员制作的山厂模板(也称标准模板),以文件的形式发布在服务 端的 deploy ctrlhomeIserveristorage日汞下。初始数据库是不带模板的 服务器启动后,套打第一次被连接,系统自动将所有标准模板导入到数据库屮。 视坏境,此时可能会有几丨秒钟的等待,通常被实施人员承受。然后系统自动在 dcployctrIhomcIscrvcr'istoragcicaskdnotc下创建一个 upgrade. xml的文件,用以标识经过 了“第次 此后,所有模板的存储、使用,都是通过数据库。而模板的补丁依然是以标准模 板的方式发布,用户〔或实迤人员)需要在套打管理屮,通过“从标准模板导入”功能 进行导入。这样看似不够自动化的方式最大限度保证了用户自定义模板(包括对标准模 板的修改)的安全,不会因为升级、打补丁等原因使其丢失 注意到前面所述第·次连接的处理方式,有二种特殊情况:、研发经常做的, 个服务器连多个数据库。后续増加的初始库,个能自动得到模板。可在套打管理中手 工做“从标准模板导入”解决。二、重新安装服务器使标识文件丢尖,或版本升级,会 増量式(只处理新増资源)地自动导入所有新増模板,此时数据库中凵存在的模板是安全 的。对于以前发布的现在修改内容的模板,须手工做“从标准模板导入”才能覆盖。

...展开详情
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
qq_24623965 假的,都什么鬼啊
2018-08-29
回复
  • 分享宗师

    成功上传21个资源即可获取
关注 私信 TA的资源
上传资源赚积分or赚钱
    最新推荐