报表框架做了大部分非具体业务的工作,如打印/临时表/虚模式/数据显示/动态表头等, 使在其基础上的开发效率更高.(如简单的HelloReport例子总开发时间为1~2小时)。
例子路径:com.kingdee.eas.framework.report.sample.client.HelloReportUI。
BOS设计
- 主页面继承CommRptBaseUI.ui
- 条件查询页面继承CommRptBaseConditionUI.ui
- 功能对象继承 CommRptBase.facade
编写代码
- UI类实现abstract方法
- session bean 根据需要重载父类方法
代码流程
1-->用户点击菜单进入
2-->客户端准备初始数据getParamsForInit(),如果返回null, 转入第4步
3-->服务端取初始数据init,参数为上一步getParamsForInit()返回值
4-->客户端条件查询设置setCustomCondition,参数为上一步init返回值
5-->用户点击确定查询
6-->调用客户端主界面query方法,查询条件在属性params里,该params是条件界面getCustomCondition()返回的.
详解
具体使用请参考HelloReportUI例子.
- 是否使用虚模式/临时表, 没有强制要求.
- 数据处理,KDTableUtil类辅助把RptRowSet数据显示在KDTable中, 并提供了用户修改/计算数据处理的接口:
public static void insertRows(RptRowSet rs,int insertRowIndex,KDTable table,KDTableInsertHandler handler)
接口KDTableInsertHandler
public void setTableRowData(IRow row,Object[] rowData);
系统使用缺省的DefaultKDTableInsertHandler.
可自定义处理类, 可作处理有:
1)单元格数据 row.getCell(i).setValue(rowData[i]);
2)行背景颜色 row.getStyleAttributes().setBackground(#Color);
3)行对象 row.setUserObject(#row_object)
等等.
- 单元格显示格式, KDTable本身的单元格格式外,还可以使用自定义格式:
使用方法:
设置表头格式(非动态表头,可以在客户端直接对table column进行设置)
col=new RptTableColumn("fdc");
col.setWidth(80);
col.setAligment(RptTableColumn.HALIGN_CENTER);
col.setFormatPattern("@=1?借:贷");//自定义显示格式
header.addColumn(col);
效果, 自行显示
再如:
col.setFormatPattern("@=1001?现金$_日出东方-唯我不败:$_");//自定义显示格式
自定义格式规则
@see RptCellFormatter
一、三元表达式
1)以@开头;
2)忽略首尾空格;
3)目前只支持?号表达式,不支持嵌套;
4)表达式中$_表示需要格式化的变量,只在?号后面有效.
5)比较值无须考虑类型,将自行根据需要格式化的变量类型转换进行比较.
二、自定义函数
@f(bean_full_path#method,param1,param2...)
本类提供了缺省数字格式化, getNumberFormat(int precision,boolean emptyWithZero). 用户可实现自定义格式.
提供了默认的精度显示格式:
//获取进度为3的格式化字符
//true: 表为0时显示为空
String format=RptCellFormatter.getNumberFormat(3,true);
$RptTableColumn.setFormatPattern(format);
- 动态表头的处理例子
- 可自动融合表头
- 表头行数没限制,只要数组二维长度与列数量相等就可以了.
header.setLabels(new Object[][]{
{"融合块","融合块","融合块","测试","测试"},
{"科目编码","科目名称","级别","方向","是否现金流量"}},true);
打印
com.kingdee.eas.framework.report.client.CommRptBaseUI
设置打印表头格式
protected void preparePrintPageHeader(HeadFootModel header)
设置打印表头变量
protected Map preparePrintVariantMap()
集成权限
报表框架将增加数据、字段权限的控制。
现有报表增加权限步骤:
- 增加权限配置文件
- 客户端指定字段权限
- 服务端过滤数据权限
权限配置文件
存放于config目录下,config目录与client/app平级。
内容形如config/Sample.xml:
客户端
指定字段权限,主界面类覆盖getFieldPermissions方法返回权限:
服务端
父类将提供下面方法:
使用范例:
若不使用上面方法,可用appendPermission自行增加权限过滤:sql=appendPermission(sql…)
例子
以下例子仅供参考,实际开发应遵循相关约定(如多语言等)。
查询页面
条件页面 |
public void onInit(RptParams initParams)throws Exception{ ktTitle.setText("初始化参数:"+initParams.getString("title")); }
public RptParams getCustomCondition() { RptParams pp=new RptParams(); pp.setString("title",this.ktTitle.getText()); return pp; } public void setCustomCondition(RptParams params) { ktTitle.setText(params.getString("title")); } |
主页面
主页面 |
//设置虚模式等,tbl为KDTable tbl.checkParsed(); //立即解析formatXml和绑定信息。 tbl.getDataRequestManager().addDataRequestListener(this); tbl.getDataRequestManager().setDataRequestMode(KDTDataRequestManager.VIRTUAL_MODE_PAGE); enableExportExcel(tbl); |
public void tableDataRequest(KDTDataRequestEvent e){ try { int from=e.getFirstRow(); int len=e.getLastRow()-from+1; RptParams pp=new RptParams();
if(from==0){ //临时表/表头 pp.setString("tempTable",this.getTempTable()); pp.setString("cuId",SysContext.getSysContext().getCurrentCtrlUnit().getId().toString()); RptParams rpt=HelloReportFactory.getRemoteInstance().createTempTable(pp); this.setTempTable(rpt.getString("tempTable")); RptTableHeader header=(RptTableHeader)rpt.getObject("header"); KDTableUtil.setHeader(header,tbl); tbl.setRowCount(rpt.getInt("verticalCount")); }
//查询并填充数据 pp.setString("tempTable",this.getTempTable()); RptParams rpt=HelloReportFactory.getRemoteInstance().query(pp,from,len); RptRowSet rs=(RptRowSet)rpt.getObject("rowset"); KDTableUtil.insertRows(rs,from,tbl); } catch (Exception ex) { this.handleException(ex); } } |
protected void query() { String title=params.getString("title"); this.lblTitle.setText(title); tbl.removeColumns(); tbl.removeRows();//触发取数 } |
服务端 |
/** * 初始化数据 */ protected RptParams _init(Context ctx, RptParams params)throws BOSException, EASBizException { RptParams pp=new RptParams(); pp.setString("title",params.getString("init_title")+"BBB"); return pp; }
/** * 创建临时表(非必要) */ protected RptParams _createTempTable(Context ctx, RptParams params)throws BOSException, EASBizException { String cuId=params.getString("cuId");
//删除旧临时表(结构可能与新查询不同,本例子临时表结构不变) dropTable(params.getString("tempTable"),ctx);
String tempTable=this.getTempTableName("报表例子",ctx);
String sql="select fnumber, fname_"+getLoc(ctx)+" fname, flevel, fdc, FIsCash " + " into "+tempTable +" from t_bd_accountview where fcontrolUnitId=?"; //创建临时表 executeCreateAsSelectInto(sql,new SqlParams().setString(1,cuId),ctx);
//统计总行数 String countSql="select count(1) cc from "+tempTable; RptRowSet rs=this.executeQuery(countSql,null,ctx); rs.next(); int count=rs.getInt(0);
//构造表头 RptTableHeader header=new RptTableHeader(); RptTableColumn col=null;
col=new RptTableColumn("fnumber"); col.setWidth(200); col.setFormatPattern("@=1001?现金$_日出东方-唯我不败:$_");//自定义显示格式 header.addColumn(col);
col=new RptTableColumn("fname"); col.setWidth(200); header.addColumn(col);
col=new RptTableColumn("flevel"); col.setWidth(80); col.setAligment(RptTableColumn.HALIGN_CENTER); header.addColumn(col);
col=new RptTableColumn("fdc"); col.setWidth(80); col.setAligment(RptTableColumn.HALIGN_CENTER); col.setFormatPattern("@=1?借:贷");//自定义显示格式 header.addColumn(col); col=new RptTableColumn("fisCash"); col.setWidth(80); col.setAligment(RptTableColumn.HALIGN_CENTER); col.setFormatPattern(RptCellFormatter.FORMAT_ZERO2EMPTY);//自定义显示格式 header.addColumn(col);
// header.setLabels(new Object[][]{{"科目编码","科目名称","级别","方向","是否现金流量"}}); //自动融合表头,表头行数没限制,只要数组二维长度与列数量相等就可以了. header.setLabels(new Object[][]{ {"融合块","融合块","融合块","测试","测试"}, {"科目编码","科目名称","级别","方向","是否现金流量"}},true);
//设置返回数据 RptParams result=new RptParams(); result.setString("tempTable",tempTable); result.setObject("header",header); result.setInt("verticalCount",count); return result; }
/** * 分页查询数据 * 在这里查询必要的数据 */ protected RptParams _query(Context ctx, RptParams params, int from, int len)throws BOSException, EASBizException { RptRowSet rs=this.executeQuery("select * from "+params.getString("tempTable")+" order by fnumber",null,from,len,ctx); RptParams pp=new RptParams(); pp.setObject("rowset",rs); return pp; } |