1、03EASBOS开发新手入门固定报表EAS BOS开发新手入门 如何使用固定报表框架进行报表开发 导读固定报表框架支持普通报表开发、虚模式取数方式报表开发、多页报表开发、左树右表形式报表开发。同时,对于特殊报表,可以通过二次开发插件来进行扩展。固定报表框架还将作为扩展报表数据源,在扩展报表中得到扩展。作者结合实际开发工作中的一些技巧进行总结,在本文中详细介绍了如何使用固定报表框架进行报表开发。对开发人员初学固定报表开发很有帮助。 请注意:本文件只作为产品介绍之用,不属于您与金蝶签署的任何协议。本文件仅包括金蝶既定策略、产品及功能方面的信息,不能以本文件作为要求金蝶履行商务条款、产品策略以及开发
2、义务的依据。本文件内容可能随时变更,恕不另行通知。1.简介1.1.目的本文档参考陈连力的固定报表开发指南,重新排版整理而成。结合实际开发中的一些技巧进行修正和扩充,旨在详细介绍如何使用固定报表框架进行报表开发。固定报表框架支持普通报表开发(客户端模式、服务器端模式)、虚模式取数方式报表开发(服务器端模式)、多页报表开发(服务器端模式)、左树右表形式报表开发。同时,对于特殊报表,可以通过二次开发插件来进行扩展。固定报表框架还将作为扩展报表数据源,在扩展报表中得到扩展。1.2.范围 本文档适用于:开发工程师遵循本文档进行固定报表开发2.固定报表开发基础2.1.概述固定报表是由元数据和继承类组成。元
3、数据涉及三个表:(1)固定报表描述表T_BAS_Report(2)固定报表列描述表T_BAS_ReportHeader(3)固定报表条件格式化描述表T_BAS_RPTFormatConditions对于服务端模式,基类是com.kingdee.eas.base.report.app.ReportServerBase对于客户端模式,基类是com.kingdee.eas.base.report.client.ReportBase推荐采用服务器端模式扩展类。2.2.基本开发步骤固定报表基本界面如下: 其中:包括二次开发新增菜单、ReportTitles、ReportHeader和条件格式化内容。2.
4、2.1.过滤条件面板通过BOS,绘制过滤条件面板,该面板继承自SCMBillFilterUI。2.2.2.编写继承类 对于服务器端,继承com.kingdee.eas.base.report.app.ReportServerBase编写扩展类。2.2.3.生成元数据表2.2.3.1.通过Excel模板生成数据脚本 填写Excel中的信息,点击生成SQL可以生成报表的元数据SQL脚本。在报表开发之前必须先将元数据表生成到数据源中。2.2.3.2.填写元数据表T_BAS_Report必须填写内容如下:字段名称字段类型描述FIDVarchar(44)报表主键FNameNvarchar(100)报表名
5、称,支持多语言FREPORTSRVCLASSNAME, Varchar(255)服务器端扩展类名称,需要开发的服务器端类名称。FFILTERPANELNAME, Varchar(255)过滤条件面板的UI类名称FVIEWPERMISSION, Nvarchar(80)报表查看权限项FPRINTPERMISSIONNvarchar(80)报表打印权限项2.2.3.3.填写T_BAS_ReportHeaderReportHeader,描述的报表表格表体内容。该内容也在扩展类中通过代码完成。固定列报表推荐通过元数据填写。名称类型说明FIDVarchar(44)主键FParentFieldNameVa
6、rchar(50)父项,对于需要双重,或者多重表头,需要填写。FReportIDVarchar(44)报表IDFCaptionNvarchar(255)标题FFieldNameVarchar(50)对应结果集的FieldName,关键字,必须唯一。FDecimalFieldVarchar(50)对应精度控制字段。通过该字段对应数值,控制本字段的精度FDECIMALInt数量精度,如果未指定FdecimalField,则取该值FColTypeInt列类型,字符串1,数量类型:2FWidthInt列宽度,默认100FAlignInt列对齐方式,左对齐1 中间对齐 2 右对齐 3FLevelInt所
7、在级次FIndexInt显示顺序FMergeableInt该列是否支持合并2.2.3.4.填写T_BAS_RPTFormatConditions条件格式化应用场景是某个单元格数据满足一定条件的时候,需要对该单元格或者单元格所在行进行一些修饰。如:修改字体,前景色、背景色等。典型应用是:如报表小计会要求淡黄色显示,某种状态单据行颜色不同等等。该内容也在扩展类中通过代码完成,对于固定的条件格式化内容,推荐通过填写元数据来完成。名称类型说明FIDVarchar(44)主键FIndexInt顺序号FReportIDVarchar(44)报表IDFFieldNameVarchar(50)对应结果集的Fi
8、eldName,关键字FCellValueVarchar(50)字段值1FCellValue2Varchar(50)字段值2FConditionInt条件:值参加Java代码FApplyRowInt是否应用整行FBackColorInt背景色。-1代表不设置。RGB颜色值FForeColorInt前景色。-1代表不设置。RGB颜色值FFontBoldInt字体是否粗体,-1代表不设置 0:正常 0:粗体2.2.4.EAS主界面增加报表调用入口UI类对应:com.kingdee.eas.base.report.client.ReportViewerUI。界面参数对应T_BAS_Report.FI
9、D。3.报表分类3.1.普通报表3.1.1.概述 普通报表是指二维表形式的报表,服务器端完成数据构造,并将结果返回到客户端。客户端根据服务器端返回结果进行展现。对于需要支持虚模式取数的报表,请参考虚模式取数方式报表开发。 下面以科目余额表为例,描述普通报表开发过程。假设需要的科目余额表如下:过滤界面:报表展示界面: 3.1.2.过滤界面 在BOS中,新增过滤界面UI,UI有两种继承方式:mon.client.SCMBillFilterUI.SCMBillFilterUI 通过BOS放入需要的界面元素。如科目F7等。处理完界面后,将其发布,生成AbstractXXXFilterUI.java代码
10、,继承自mon.client.SCMBillFilterUI,在构造函数中填写: public XXXFilterUI() throws Exception super(); isReport = true; 同时,填写其它需要在界面初始化的代码。将需要放入过滤条件中的界面元素放入FilterManager中,参考代码如下: CompositeFilterElement elements = new CompositeFilterElement(CompositeFilterElement.AND); elements.add(new SingleFilterElement(number, p
11、rmtNumber); . getFilterManager().setElement(elements); getFilterManager().setMainOrgElement(mainOrgElement, getPropertyOfMainBizOrg();com.kingdee.eas.base.report.client.ReportFilterUI 继承这个基类能帮助减少些工作量,不需要再从控件取值传给服务端。开发人员工作量基本只剩下initComp()方法的开发,因业务需求初始化一些控件。3.1.3.服务端类继承自com.kingdee.eas.base.report.app
12、.ReportServerBase。该类需要完成的方法如下: /实模式取数 protected IRowSet getReportData(String reportID, RptParams filter) throws Exception return DbUtil.executeQuery(getContext(), Select * from MyTestReport); protected ReportTitles getReportTitles(String arg0, RptParams arg1) throws BaseException ReportTitles titles
13、 = new ReportTitles(); String bizDate = getBizDateFromFilter(arg1); titles.AddTitle(0, getResource(BIZ_DATE) + : + getResource(FROM) + bizDate0 + + getResource(TO) + + bizDate1); return titles; getReportData方法:构造报表数据集,并通过IRowSet返回,属于实模式取数。传入参数是reportID对应T_BAS_Report.FID,filter是从过滤界面中获取的内容,可以用于构造SQL的
14、查询条件。 getReportTitles方法:返回报表的Title区域。 每行放置3列,最多支持4行,也就是Index最大数量是11。3.2.虚模式取数报表3.2.1.概述虚模式取数是指从服务器端到客户端数据不是一次性传递完成,而是根据界面填充要求,每次获取较少的数据量传输到客户端。报表的虚模式取数基本原理说明:在服务器端构造完整报表数据,并将结果存入到EAS的临时表中。客户端展示数据时,向服务器端发送请求,服务器端返回数据范围(默认为100行),从临时表中取出数据返回。客户端将获取到的数据缓存,下次客户端展示数据时,会检查缓存中是否存在该数据,如果存在,则直接从缓存中获取即可。客户端报表退
15、出,则清除临时表内容。3.2.2.过滤界面 开发过程中仅服务器端类不同,过滤界面与普通报表相同。3.2.3.服务端类 服务器端类仍然继承自com.kingdee.eas.base.report.app.ReportServerBase。不同的是需要覆盖两个方法:/与buildReportData方法区别在于该方法并不返回结果集而是返回临时表名称。protected String buildReportDataForVirtual(String reportID, RptParams filter)/该方法用于返回一页数据。注意数据排序一致性,避免取数混乱。public IRowSet getD
16、ataForOnePage(String reportID, RptParams filter, String tableName, int start, int rows) throws BOSException3.3.多页面报表3.3.1.概述与普通报表区别在于,多页面报表可以通过导航按钮对报表内容进行翻页浏览。多页面报表基本原理说明:需要提供用于导航的结果集。显示数据需要按照导航结果过滤。多页面报表如下图:3.3.2.过滤界面 开发过程中仅服务器端类不同,过滤界面与普通报表相同。3.3.3.服务端类服务器端类仍然继承自com.kingdee.eas.base.report.app.Rep
17、ortServerBase。不同的是提供getList方法。/该方法返回导航结果集合public IRowSet getList() throws Exception在getReportData的filter中,可以通过如下方法获取导航内容:HashMap map = (HashMap)filter.getObject(IReportMove.POSISTION);参考示例如下:DbUtil.execute(getContext(), sql, new String (String) map.get(fnumber), (String) map.get(fname_l2) ); 注意:Key必
18、须是小写的。如果是虚模式,需要实现buildReportDataForVirtual和getDataForOnePage方法。4.过滤界面 过滤界面样式为(汇总方式页签放置KDTable控件): 由于过滤界面本身并未处理该控件类型,如果不进行特殊处理,保存方案将不会保存这部分设置。同时“下次直接以该方案进入”也将由于参数对象不能获取而导致每次都会弹出过滤界面。可以增加处理类,将以下代码直接拷贝到过滤界面的UI类中,作为内部类直接调用:/* * * 描述:该类用于将KDTable内容传递到服务器端 */public class KDTableFilterElement extends Singl
19、eFilterElement private KDTable table; /* * * 描述:构造函数 */ public KDTableFilterElement(String id, KDTable component) super(id, component); this.table = component; /* * * 描述:获取KDTable的Name */ protected String getName(Object obj) if (obj instanceof KDTable) return (KDTable) obj).getName(); return null; /
20、* * * 描述:由于SingleFilterElement本身不支持KDTABLE控件需要进行特殊处理 */ public void addCustomerParam(CustomerParams cp, String key, Object obj) for (int i = 0; i table.getRowCount(); i+) for (int j = 0; j 0) String key = null; for (Iterator it = keySet.iterator(); it.hasNext();) key = (String) it.next(); if (key !=
21、 null & key.startsWith(_) int index = Integer.parseInt(key.substring(key .lastIndexOf(:) + 1); String fieldKey = key .substring(1, key.lastIndexOf(:); if (fieldKey.equals(isTotal) table.getRow(index).getCell(fieldKey).setValue( Boolean.valueOf(cp.getCustomerParam(key); /* * * 描述:将单元格的值,增加到RptParams中
22、 */ public void addRptParams(RptParams cp) ArrayList list = getParamterFromKDTable(); cp.setObject(getId(), list); /* * * 描述:从表格中获取参数 */ private ArrayList getParamterFromKDTable() ArrayList list = new ArrayList(); for (int i = 0; i table.getRowCount(); i+) HashMap map = new HashMap(); for (int j = 0
23、; j table.getColumnCount(); j+) IColumn col = table.getColumn(j); map.put(col.getKey(), table.getRow(i).getCell(col.getKey() .getValue(); list.add(map); return list; 5.套打 报表框架已经实现套打,但套打模板的设置需要通过eas的套打管理来实现.5.1.生成数据源 根据报表生成bos-query的数据源: 执行后将产生两个数据源,可以在“套打管理”中查看。分别为报表数据源(报表类名+.bos-query)和标题数据源(报表类名+_
24、title.bos-query)5.2.新建套打模板 进入“套打管理”,新建套打模板: 对报表套打页面进行编辑: 通过上面设置保存后可以在报表中选择套打模板进行报表打印。6.权限6.1.添加权限项 进入BOS Studio中,打开需要增加报表权限的permission元数据文件,增加报表的查看权限,“详细信息”中的“实体对象”不设置,“引用对象”不设置,由于所有的报表都是采用同一个reportViewUI。扩展属性中需要增加主业务组织的设置,如下图:6.2.同步权限 以administrator方式登录EAS,选择【用户管理文件同步权限数据】功能,进行权限同步。6.3.修改T_BAS_Repo
25、rt权限字段 修改T_BAS_Report的打印和查看权限字段:Update t_bas_report set FPrintPermission=OtherFeeTotalReportPrint,FViewPermission=OtherFeeTotalReportView where fid=vlA6ApdoikO58k6tGbRmlM5PzmM=7.二次开发日志记录、增加个性化的菜单功能、单元格事件处理、单元格格式化的处理,需要继承ReportListener类实现。7.1.新建插件类二次开发插件类必须继承ReportListener类,ReportListener是一个abstract类
26、,插件类参考代码:public class XXXReportPlugin extends ReportListener /* * * 描述:初始化处理 * */ public void onInitialize() throws Exception super.onInitialize(); /* * * 描述:打印完成后的事件处理 */ public void fireAfterPrint() throws Exception super.fireAfterPrint(); /* * * 描述:获取语言资源文件对应的值 */ private String getResource(Strin
27、g strKey) /*菜单单击事件 * param name 菜单名称 * throws Exception */ public void onMenuClick(String name) throws Exception /*单元格格式化事件 * param event * throws Exception */ public void onCellFormat(CellEvent event) throws Exception /*单元格单击事件 * param event * throws Exception */ public void onCellClick(CellEvent event) throws Exception PlanerPluginClassName 类中覆盖 onInitialize()方法,这个方法的作用是动态的添加菜单,并在工具栏上建立相应的按钮。只能在这个方法中添加,目前添加菜单后不能删除。7.2.修改元数据表修改T_BAS_Report表,设置报表对应的FpluginClassName字段为对应的插件类:update t_bas_report set FPluginClassN
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1