在应用开发过程中,我们经常会遇到下级单位需要向上级单位上报数据的情况,这些上报的数据在上报后往往需要进行审核以确保上报数据的准确性,例如上报数据集中某几项之和应等于另一项等,即上报的数据集中的数据项间存在着某些特定的关系,经过审核若不满足这些关系则需要对上报数据进行修改并重新上报。需要进行审核的上报数据存储在以下表1所示的库表结构中:在该交叉表结构中每行记录中的数据一项由其他几项唯一确定,单位代码确定该数据集是由哪一单位上报的,数据集代码确定某一数据集,行列值指明该数据在数据集中的位置,报表时间指明该数据集的时间特性,当然,会有几个不同的码表表明它们的具体含义。假如该表中的数据存在着如下的关系:第68行第2列的数值除以第45行第2列的数值应在0.037与0.06之间,那么我们如何针对该关系对上报数据进行审核呢?
|
单位代码
|
数据集代码
|
行
|
列
|
报表时间
|
数据
|
|
11200121
|
01020001
|
1
|
1
|
2001/02/01
|
56
|
|
11200121
|
01020001
|
2
|
1
|
2001/02/01
|
79
|
|
11200121
|
01030002
|
45
|
2
|
2001/02/01
|
210
|
|
11200121
|
01030002
|
68
|
2
|
2001/02/01
|
13
|
|
|
|
|
|
|
|
表1 上报数据存储结构
以手工方式进行审核不但工作量大而且易于出错,由于审核关系比较复杂,以往通过程序自动实现数据审核经常需要将审核关系固化在程序中,不但程序工作量大流程复杂并且可扩展性不好。通过查看PowerBuilder中DateWindows的SetFilter功能,我们看到筛选标准中支持丰富的运算符及逻辑关系符,这正是审核关系所需要的,利用该功能可以快速方便地实现以上的数据审核需求。
对上报数据进行审核就要定义一些审核公式,对审核公式的定义应考虑到公式的规范性、简洁性及可扩展性。对于一个数据集若它们的数据项间存在多种关系,可能会对应多个审核公式。进行数据审核时,可选取不同的单位、不同的报送时间进行审核,最终以行列值的形式指明哪一数据项不符合审核关系。
SetFilter的句法为:integer dwcontrol.SetFilter ( string format ),其中dwcontrol是一个DataWindow control, DataStore或child DataWindow的名字,format这一字符串是一布尔型的表达式,它决定了对dwcontrol进行筛选的标准,其中可含有DataWindows的column的名字、数值及运算符,通过在审核公式中使用这些运算符可极大地扩展审核的范围。对审核公式的定义应考虑到规范性,以利于程序对不同的审核公式统一进行解析,在规范性的前提下通过充分利用Filter中丰富的运算符及逻辑关系符可以涵盖不同类型的审核关系,以下是几种审核公式的定义及其说明:
[01020001(8,1)]=[01020001(9,1)]+[01020001(16,1)]表明数据集01020001的第8行第1列的数值应等于第9行第1列与10行第1列的数值相加;
[01030002(68,2)]/[01030002(45,2)]*1000>37 AND
[01030002(68,2)]/[01030002(45,2)]*1000<60表明数据集01030002的第68行第2列的数值除以第45行第2列的数值应 在0.037与0.06之间;用户可以根据需要定义一些更加灵活的审核公式。我们看到公式中通过括号将数据代码及行列 值规范起来,以利于程序对其进行解析。
数据审核的过程就是对每一个审核公式进行解析,并利用解析结果进行相应处理(使用DateWindows的Filter功能)的过程,我们将审核公式中[ ]内所实际表示的数值通过SQL语句从表1所示的上报数据库表中提取出来并插入到一个临时DateWindows中,即上面SetFilter句法中的dwcontrol;同时将审核公式中的[ ]内容替换为以上DateWindows的column的名字,最后形成以上SetFilter句法中的format所要求的格式。以上面第2个审核公式为例,解析后DateWindows中的结果为:
|
d1
|
d2
|
d3
|
d4
|
d5
|
d6
|
| 13 |
210 |
13 |
210 |
|
|
| |
|
|
|
|
|
| |
|
|
|
|
|
在format中的结果为d1/d2*1000>37 AND d3/d4*1000<60,注意其中的d1、d2等正是DateWindows的column的名字。
通过执行
DW_1.setfilter(NOT format)
DW_1.filter()
并判断DW_1.ROWCOUNT()是否大于0即可判断是否有不符合审核关系的数据。
通过循环语句可实现所有单位、多种数据集、对所有审核关系的数据审核。
从实现的过程中我们可以看到,一个复杂的数据审核问题最终转化为极其简单的PowerBuilder中对DateWindows 的Filter操作,而正是由于DateWindows强大的Filter功能使得该转换成为可能。由于Filter的筛选标准中支持丰富的运算符及逻辑关系符,因而可以构造出丰富的符合审核关系的审核公式,以满足广泛的数据审核需求。
本文介绍的应用实现只是用到了PowerBuilder中的一个很小的功能,通过使用PowerBuilder进行应用开发,我们会不断地感受到PowerBuilder强大的功能。 |