03EASBOS开发新手入门固定报表.docx

上传人:b****8 文档编号:30540198 上传时间:2023-08-16 格式:DOCX 页数:25 大小:374.13KB
下载 相关 举报
03EASBOS开发新手入门固定报表.docx_第1页
第1页 / 共25页
03EASBOS开发新手入门固定报表.docx_第2页
第2页 / 共25页
03EASBOS开发新手入门固定报表.docx_第3页
第3页 / 共25页
03EASBOS开发新手入门固定报表.docx_第4页
第4页 / 共25页
03EASBOS开发新手入门固定报表.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

03EASBOS开发新手入门固定报表.docx

《03EASBOS开发新手入门固定报表.docx》由会员分享,可在线阅读,更多相关《03EASBOS开发新手入门固定报表.docx(25页珍藏版)》请在冰豆网上搜索。

03EASBOS开发新手入门固定报表.docx

03EASBOS开发新手入门固定报表

 

EASBOS开发新手入门

——如何使用固定报表框架进行报表开发

导读

固定报表框架支持普通报表开发、虚模式取数方式报表开发、多页报表开发、左树右表形式报表开发。

同时,对于特殊报表,可以通过二次开发插件来进行扩展。

固定报表框架还将作为扩展报表数据源,在扩展报表中得到扩展。

作者结合实际开发工作中的一些技巧进行总结,在本文中详细介绍了如何使用固定报表框架进行报表开发。

对开发人员初学固定报表开发很有帮助。

 

 

请注意:

本文件只作为产品介绍之用,不属于您与金蝶签署的任何协议。

本文件仅包括金蝶既定策略、产品及功能方面的信息,不能以本文件作为要求金蝶履行商务条款、产品策略以及开发义务的依据。

本文件内容可能随时变更,恕不另行通知。

1.简介

1.1.目的

本文档参考陈连力的《固定报表开发指南》,重新排版整理而成。

结合实际开发中的一些技巧进行修正和扩充,旨在详细介绍如何使用固定报表框架进行报表开发。

固定报表框架支持普通报表开发(客户端模式、服务器端模式)、虚模式取数方式报表开发(服务器端模式)、多页报表开发(服务器端模式)、左树右表形式报表开发。

同时,对于特殊报表,可以通过二次开发插件来进行扩展。

固定报表框架还将作为扩展报表数据源,在扩展报表中得到扩展。

1.2.范围

本文档适用于:

开发工程师遵循本文档进行固定报表开发

2.固定报表开发基础

2.1.概述

固定报表是由元数据和继承类组成。

元数据涉及三个表:

(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.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

必须填写内容如下:

字段名称

字段类型

描述

FID

Varchar(44)

报表主键

FName

Nvarchar(100)

报表名称,支持多语言

FREPORTSRVCLASSNAME,

Varchar(255)

服务器端扩展类名称,需要开发的服务器端类名称。

FFILTERPANELNAME,

Varchar(255)

过滤条件面板的UI类名称

FVIEWPERMISSION,

Nvarchar(80)

报表查看权限项

FPRINTPERMISSION

Nvarchar(80)

报表打印权限项

2.2.3.3.填写T_BAS_ReportHeader

ReportHeader,描述的报表表格表体内容。

该内容也在扩展类中通过代码完成。

固定列报表推荐通过元数据填写。

名称

类型

说明

FID

Varchar(44)

主键

FParentFieldName

Varchar(50)

父项,对于需要双重,或者多重表头,需要填写。

FReportID

Varchar(44)

报表ID

FCaption

Nvarchar(255)

标题

FFieldName

Varchar(50)

对应结果集的FieldName,关键字,必须唯一。

FDecimalField

Varchar(50)

对应精度控制字段。

通过该字段对应数值,控制本字段的精度

FDECIMAL

Int

数量精度,如果未指定FdecimalField,则取该值

FColType

Int

列类型,字符串1,数量类型:

2

FWidth

Int

列宽度,默认100

FAlign

Int

列对齐方式,左对齐1中间对齐2右对齐3

FLevel

Int

所在级次

FIndex

Int

显示顺序

FMergeable

Int

该列是否支持合并

2.2.3.4.填写T_BAS_RPTFormatConditions

条件格式化应用场景是某个单元格数据满足一定条件的时候,需要对该单元格或者单元格所在行进行一些修饰。

如:

修改字体,前景色、背景色等。

典型应用是:

如报表小计会要求淡黄色显示,某种状态单据行颜色不同等等。

该内容也在扩展类中通过代码完成,对于固定的条件格式化内容,推荐通过填写元数据来完成。

名称

类型

说明

FID

Varchar(44)

主键

FIndex

Int

顺序号

FReportID

Varchar(44)

报表ID

FFieldName

Varchar(50)

对应结果集的FieldName,关键字

FCellValue

Varchar(50)

字段值1

FCellValue2

Varchar(50)

字段值2

FCondition

Int

条件:

值参加Java代码

FApplyRow

Int

是否应用整行

FBackColor

Int

背景色。

-1代表不设置。

RGB颜色值

FForeColor

Int

前景色。

-1代表不设置。

RGB颜色值

FFontBold

Int

字体是否粗体,-1代表不设置0:

正常>0:

粗体

2.2.4.EAS主界面增加报表调用入口

UI类对应:

com.kingdee.eas.base.report.client.ReportViewerUI。

界面参数对应T_BAS_Report.FID。

3.报表分类

3.1.普通报表

3.1.1.概述

普通报表是指二维表形式的报表,服务器端完成数据构造,并将结果返回到客户端。

客户端根据服务器端返回结果进行展现。

对于需要支持虚模式取数的报表,请参考虚模式取数方式报表开发。

下面以科目余额表为例,描述普通报表开发过程。

假设需要的科目余额表如下:

Ø过滤界面:

Ø报表展示界面:

3.1.2.过滤界面

在BOS中,新增过滤界面UI,UI有两种继承方式:

Ømon.client.SCMBillFilterUI.SCMBillFilterUI

通过BOS放入需要的界面元素。

如科目F7等。

处理完界面后,将其发布,生成AbstractXXXFilterUI.java代码,继承自mon.client.SCMBillFilterUI,在构造函数中填写:

publicXXXFilterUI()throwsException{

super();

isReport=true;

}

同时,填写其它需要在界面初始化的代码。

将需要放入过滤条件中的界面元素放入FilterManager中,参考代码如下:

CompositeFilterElementelements=newCompositeFilterElement(

CompositeFilterElement.AND);

elements.add(newSingleFilterElement("number",prmtNumber));

......

getFilterManager().setElement(elements);

getFilterManager().setMainOrgElement(mainOrgElement,

getPropertyOfMainBizOrg());

Øcom.kingdee.eas.base.report.client.ReportFilterUI

继承这个基类能帮助减少些工作量,不需要再从控件取值传给服务端。

开发人员工作量基本只剩下initComp()方法的开发,因业务需求初始化一些控件。

3.1.3.服务端类

继承自com.kingdee.eas.base.report.app.ReportServerBase。

该类需要完成的方法如下:

//实模式取数

protectedIRowSetgetReportData(StringreportID,RptParamsfilter)

throwsException{

returnDbUtil.executeQuery(getContext(),"Select*fromMyTestReport");

}

protectedReportTitlesgetReportTitles(Stringarg0,RptParamsarg1)

throwsBaseException{

ReportTitlestitles=newReportTitles();

String[]bizDate=getBizDateFromFilter(arg1);

titles.AddTitle(0,getResource("BIZ_DATE")+":

"+getResource("FROM")

+bizDate[0]+""+getResource("TO")+""+bizDate[1]);

returntitles;

}

getReportData方法:

构造报表数据集,并通过IRowSet返回,属于实模式取数。

传入参数是reportID对应T_BAS_Report.FID,filter是从过滤界面中获取的内容,可以用于构造SQL的查询条件。

getReportTitles方法:

返回报表的Title区域。

每行放置3列,最多支持4行,也就是Index最大数量是11。

3.2.虚模式取数报表

3.2.1.概述

虚模式取数是指从服务器端到客户端数据不是一次性传递完成,而是根据界面填充要求,每次获取较少的数据量传输到客户端。

报表的虚模式取数基本原理说明:

Ø在服务器端构造完整报表数据,并将结果存入到EAS的临时表中。

Ø客户端展示数据时,向服务器端发送请求,服务器端返回数据范围(默认为100行),从临时表中取出数据返回。

Ø客户端将获取到的数据缓存,下次客户端展示数据时,会检查缓存中是否存在该数据,如果存在,则直接从缓存中获取即可。

Ø客户端报表退出,则清除临时表内容。

3.2.2.过滤界面

开发过程中仅服务器端类不同,过滤界面与普通报表相同。

3.2.3.服务端类

服务器端类仍然继承自com.kingdee.eas.base.report.app.ReportServerBase。

不同的是需要覆盖两个方法:

//与buildReportData方法区别在于该方法并不返回结果集而是返回临时表名称。

protectedStringbuildReportDataForVirtual(StringreportID,RptParamsfilter)

//该方法用于返回一页数据。

注意数据排序一致性,避免取数混乱。

publicIRowSetgetDataForOnePage(StringreportID,RptParamsfilter,

StringtableName,intstart,introws)throwsBOSException

3.3.多页面报表

3.3.1.概述

与普通报表区别在于,多页面报表可以通过导航按钮对报表内容进行翻页浏览。

多页面报表基本原理说明:

Ø需要提供用于导航的结果集。

Ø显示数据需要按照导航结果过滤。

多页面报表如下图:

3.3.2.过滤界面

开发过程中仅服务器端类不同,过滤界面与普通报表相同。

3.3.3.服务端类

服务器端类仍然继承自com.kingdee.eas.base.report.app.ReportServerBase。

不同的是提供getList方法。

//该方法返回导航结果集合

publicIRowSetgetList()throwsException

在getReportData的filter中,可以通过如下方法获取导航内容:

HashMapmap=(HashMap)filter.getObject(IReportMove.POSISTION);

参考示例如下:

DbUtil.execute(getContext(),sql,newString[]{

(String)map.get("fnumber"),

(String)map.get("fname_l2")});

注意:

Key必须是小写的。

如果是虚模式,需要实现buildReportDataForVirtual和getDataForOnePage方法。

4.过滤界面

过滤界面样式为(汇总方式页签放置KDTable控件):

由于过滤界面本身并未处理该控件类型,如果不进行特殊处理,保存方案将不会保存这部分设置。

同时“下次直接以该方案进入”也将由于参数对象不能获取而导致每次都会弹出过滤界面。

可以增加处理类,将以下代码直接拷贝到过滤界面的UI类中,作为内部类直接调用:

/**

*

*描述:

该类用于将KDTable内容传递到服务器端

*/

publicclassKDTableFilterElementextendsSingleFilterElement{

privateKDTabletable;

/**

*

*描述:

构造函数

*/

publicKDTableFilterElement(Stringid,KDTablecomponent){

super(id,component);

this.table=component;

}

/**

*

*描述:

获取KDTable的Name

*/

protectedStringgetName(Objectobj){

if(objinstanceofKDTable){

return((KDTable)obj).getName();

}

returnnull;

}

/**

*

*描述:

由于SingleFilterElement本身不支持KDTABLE控件需要进行特殊处理

*/

publicvoidaddCustomerParam(CustomerParamscp,Stringkey,Objectobj){

for(inti=0;i

for(intj=0;j

IColumncol=table.getColumn(j);

cp.addCustomerParam("_"+col.getKey()+":

"+i,table.getRow(

i).getCell(col.getKey()).getValue().toString());

}

}

}

/**

*

*描述:

将CustomerParams设置的值,解析回KDTable控件中

*/

publicvoidsetElementValue(CustomerParamscp){

if(cp!

=null){

SetkeySet=(Set)cp.getKeys();

if(keySet!

=null&&keySet.size()>0){

Stringkey=null;

for(Iteratorit=keySet.iterator();it.hasNext();){

key=(String)it.next();

if(key!

=null&&key.startsWith("_")){

intindex=Integer.parseInt(key.substring(key

.lastIndexOf(":

")+1));

StringfieldKey=key

.substring(1,key.lastIndexOf(":

"));

if(fieldKey.equals("isTotal")){

table.getRow(index).getCell(fieldKey).setValue(

Boolean.valueOf(cp.getCustomerParam(key)));

}

}

}

}

}

}

/**

*

*描述:

将单元格的值,增加到RptParams中

*/

publicvoidaddRptParams(RptParamscp){

ArrayListlist=getParamterFromKDTable();

cp.setObject(getId(),list);

}

/**

*

*描述:

从表格中获取参数

*/

privateArrayListgetParamterFromKDTable(){

ArrayListlist=newArrayList();

for(inti=0;i

HashMapmap=newHashMap();

for(intj=0;j

IColumncol=table.getColumn(j);

map.put(col.getKey(),table.getRow(i).getCell(col.getKey())

.getValue());

}

list.add(map);

}

returnlist;

}

}

5.套打

报表框架已经实现套打,但套打模板的设置需要通过eas的套打管理来实现.

5.1.生成数据源

根据报表生成bos-query的数据源:

执行后将产生两个数据源,可以在“套打管理”中查看。

分别为报表数据源(报表类名+.bos-query)和标题数据源(报表类名+_title.bos-query)

5.2.新建套打模板

进入“套打管理”,新建套打模板:

对报表套打页面进行编辑:

通过上面设置保存后可以在报表中选择套打模板进行报表打印。

6.权限

6.1.添加权限项

进入BOSStudio中,打开需要增加报表权限的permission元数据文件,增加报表的查看权限,“详细信息”中的“实体对象”不设置,“引用对象”不设置,由于所有的报表都是采用同一个reportViewUI。

扩展属性中需要增加主业务组织的设置,如下图:

6.2.同步权限

以administrator方式登录EAS,选择【用户管理\文件\同步权限数据】功能,进行权限同步。

6.3.修改T_BAS_Report权限字段

修改T_BAS_Report的打印和查看权限字段:

Updatet_bas_report

setFPrintPermission='OtherFeeTotalReportPrint',FViewPermission='OtherFeeTotalReportView'where

fid='vlA6ApdoikO58k6tGbRmlM5PzmM='

7.二次开发

日志记录、增加个性化的菜单功能、单元格事件处理、单元格格式化的处理,需要继承ReportListener类实现。

7.1.新建插件类

二次开发插件类必须继承ReportListener类,ReportListener是一个abstract类,插件类参考代码:

publicclassXXXReportPluginextendsReportListener{

/**

*

*描述:

初始化处理

*

*/

publicvoidonInitialize()throwsException{

super.onInitialize();

}

/**

*

*描述:

打印完成后的事件处理

*/

publicvoidfireAfterPrint()throwsException{

super.fireAfterPrint();

}

/**

*

*描述:

获取语言资源文件对应的值

*/

privateStringgetResource(StringstrKey){

}

/**菜单单击事件

*@paramname菜单名称

*@throwsException

*/

publicvoidonMenuClick(Stringname)throwsException{

}

/**单元格格式化事件

*@paramevent

*@throwsException

*/

publicvoidonCellFormat(CellEventevent)throwsException{

}

/**单元格单击事件

*@paramevent

*@throwsException

*/

publicvoidonCellClick(CellEventevent)throwsException{

}

}

PlanerPluginClassName类中覆盖onInitialize()方法,这个方法的作用是动态的添加菜单,并在工具栏上建立相应的按钮。

只能在这个方法中添加,目前添加菜单后不能删除。

7.2.修改元数据表

修改T_BAS_Report表,设置报表对应的FpluginClassName字段为对应的插件类:

updatet_bas_reportset

FPluginClassN

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1