润乾报表的表间校验
在客户的业务系统中,客户在访问某张报表时需要在该表下方输出表间的一些校验关系,比如在收入系统中,访问某收入汇总表,要求在该表下方输出该表内的某些单元格的值是否和其他几张表中的值相等,如果不相等则表明在该系统中某环节中出现错误,这样能快速定位问题出现点.
可以看到,收入中汇总值和明细表中数据对不上,这样就可以通过润乾的钻取分析等相关功能迅速找到出错点并及时解决问题。
首先要定义校验关系,校验关系可保存在数据库中,这样就要求在数据库中定义一张数据表来存储校验关系,建表sql语句如下:
create table T_VALIDATION
(
ID NUMBER(10) not null,
REPORT_CODE VARCHAR2(16),
VALIDATE_EXP VARCHAR2(1024),
ERROR_PROMPT VARCHAR2(1024)
)
里边数据如下图:
几个字段分别为:
ID:表中主键
REPORT_CODE:报表名称,如页面访问test表时需要有校验信息,此处写test
VALIDATE_EXP:校验表达式,写法为表名.行号.列号=表名.行号.列号,此处可写多表的加减操作
ERROR_PROMPT:条件表达式不成立时提示的出错信息。
这样,访问某张报表时就能从这个数据库表中检索出校验信息并进行校验,注意:因为涉及到数据库的连接,要在web服务器中增加数据库连接池配置,名称为mis2dataSource.
页面展现时,要求在报表下方输出校验信息,所以要在报表展现的页面中增加相关代码进行相应的处理。
<%!
private List<String[]> getValidation(String reportName){
List<String[]> rlt = new ArrayList<String[]>();
Connection conn = getConnection();
String sql = “select * from t_validation where report_code=?”;
……
}
//报表校验关系验证
private String reportValidate(HttpServletRequest request,String exp,String error,String params){
ExpressionParser test = new ExpressionParser();
……
}
具体代码见附件的jsp文件。
在表间校验时会出现一种情况,可能在一个校验表达式中要引用同一个报表的不同单元格,这样就要求该引用的报表如果第一次已经计算过要将该结果保存起来,再引用同一报表时直接从该保存后的结果中进行数据的抽取即可,避免了报表的重复运算对服务器带来不必要的压力,并且为了保证数据的即时性,在该报表的校验表达式全部校验完成后要将保存的报表结果文件删除。具体代码见附件jar包中的com/runqianapp/flexdesigner/ ExpressionParser
这样就能实现客户的表间校验要求,快速为客户定位问题的出现点,即时解决问题。