基于报表框架的开发文档

报表框架做了大部分非具体业务的工作,如打印/临时表/虚模式/数据显示/动态表头等, 使在其基础上的开发效率更高.(如简单的HelloReport例子总开发时间为1~2小时)。

例子路径:com.kingdee.eas.framework.report.sample.client.HelloReportUI。

BOS设计

  1. 主页面继承CommRptBaseUI.ui
  2. 条件查询页面继承CommRptBaseConditionUI.ui
  3. 功能对象继承 CommRptBase.facade

 

编写代码

  1. UI类实现abstract方法
  2. session bean 根据需要重载父类方法

代码流程

1-->用户点击菜单进入

2-->客户端准备初始数据getParamsForInit(),如果返回null, 转入第4步

3-->服务端取初始数据init,参数为上一步getParamsForInit()返回值

4-->客户端条件查询设置setCustomCondition,参数为上一步init返回值

5-->用户点击确定查询

6-->调用客户端主界面query方法,查询条件在属性params里,该params是条件界面getCustomCondition()返回的.

 

详解

       具体使用请参考HelloReportUI例子.

  1. 是否使用虚模式/临时表, 没有强制要求.
  2. 数据处理,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)

等等.

  1. 单元格显示格式, 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);

  1. 动态表头的处理例子
    1. 可自动融合表头
    2. 表头行数没限制,只要数组二维长度与列数量相等就可以了.

           header.setLabels(new Object[][]{

                         {"融合块","融合块","融合块","测试","测试"},

                            {"科目编码","科目名称","级别","方向","是否现金流量"}},true);

 

打印

com.kingdee.eas.framework.report.client.CommRptBaseUI

设置打印表头格式

protected void preparePrintPageHeader(HeadFootModel header)

设置打印表头变量

protected Map preparePrintVariantMap()

集成权限

报表框架将增加数据、字段权限的控制。

现有报表增加权限步骤:

  1. 增加权限配置文件
  2. 客户端指定字段权限
  3. 服务端过滤数据权限

权限配置文件

存放于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"));           

       }

主页面

 

主页面

        //设置虚模式等,tblKDTable

        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;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书耳朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值