随着信息时代的快速发展,报表工具的应用也越来越普遍,其中难免会涉及到很多填报需求。
比如:
数据采集录入填报时如何只更新当前修改行、用报表工具实现树状层级结构的填报表、web 操作数据留痕等等,今天我们主要来介绍一下 web 操作数据留痕,简单说就是填报表从 A 表取数,将 web 端修改记录更新到 B 表保存操作记录……如果您还不明白,其实就相当于记录您某个账号的登录时间地点。
下面我们具体看一下。
工具:润乾报表 oracle11g
数据库表结构(SQL 语句):
A表:create table GDFW_RB_FHQK_MX(
ID NUMBER,
JCSJ DATE not null,
TJRQ DATE,
TJSJ VARCHAR2(12),
QKJFH NUMBER(12,2)
)
B表:create table GDFW_RB_FHQK_MX_HISTORY(
ID NUMBER,
JCSJ DATE not null,
TJRQ DATE,
TJSJ VARCHAR2(12),
QKJFH NUMBER(12,2),
CREATER NVARCHAR2(20) default ‘SYSTEM’,
CREATETIME DATE default SYSDATE,
XGYY NVARCHAR2(200) default ‘暂未填写’
)
当前报表设计如下,首先实现基本的行式填报操作:
数据来源:
数据去向:
至此,填报表的基本功能已经实现, 下面我们继续以这个报表为例看一下怎么实现web 操作数据留痕。
保证数据来源、数据去向、报表中涉及到的字段个数名称一致。
在数据去向执行 update 前对要插入到 B 表的数据做处理。方式如下:
通过对比新旧对象的记录来实现,以获取到 web 端操作的记录,因为行式填报表在 web 页面上支持做增、删、改三种操作,故不能保证新旧对象的记录条数一致,所以这里需要通过双层循环来获取新旧对象的差集(即 web 页面操作的记录集)。
注:旧对象保存的是修改前的数据,新对象保存的是修改后的数据。
具体的数据处理过程:
数据来源脚本增加 XGYY,并且以对象(如对象:GDFW_RB_F HQK_MX)的方式返回新增后的结果集。如下:
数据去向脚本修改如下:
其中:
第 2 行、第 8 行以及第 10 行的 debug 部分,是为了观察各部操作前后数据的变化,有助于排查问题,最终可以视实际情况删除或注释。
3-7 行 使用双层 for 循环对比 GDFW_RB_FHQK_MX 与 GDFW_RB_FHQK_MX_old 对象记录并从 GDFW_RB_FHQK_MX 中删除两者相同的记录,从而整理出 web 端操作的行;
for 循环原理:
for 旧对象
if(新对象主键对比旧对象主键)
for 新对象
if (旧对象记录 == 新对象记录)从新对象里删除
else 将 web 页面删除的记录插入新对象
注:if…else…作用是对比主键保证 web 页面上删除的记录也被记录下来。
最后新对象中保留的记录既是 web 端操作的行。
A9 单元格 使用 db.update@i() 函数实现更新入库, 其中 @i 选项代表的是仅执行插入操作。
通过上面的修改后,我们就可以实现 web 操作数据留痕了。
效果如下:
web 操作前,B 表数据记录。
在 web 端访问报表,修改原有数据,并增加行(动图)
web 操作后,在数据库端查询数据,检查一下,我们会发现仅把 web 端操作的数据插入到数据库中了,Bingo! 没想到吧,就这么轻松搞定了。
最后,课外知识扩展
怎样在不改变数据库表结构的基础上,增加字段。
使用集算器函数 P.derive(xi :Fi,…),给序表 / 排列 P 增加 Fi,…字段,形成 "P 中原有的字段, Fi,…" 结构的序表,然后对 P 的每条记录遍历,给每个 Fi 赋值为 xi。简单说就是使用此函数可以复制原序表也可以在原序表的基础上追加字段。
数据更新时,如何控制仅执行插入操作。
灵活运用 db_.update_(A:A’,tbl,Fi:xi,…;P,…) 函数的选项。
@i 对比主键只生成 INSERT。无 A’ 时不再对比,直接用 A 插入到数据库。
@u 对比主键只生成 UPDATE。无 A’ 时不再对比,直接用 A 更新到数据库。
@k 完成后不提交事务,缺省将提交。
等等,具体参考集算器函数参考 doc.raqsoft.com.cn/esproc/func/update.html
填报更新原理:
目前,行式填报表在提交的时会自动对比修改前和修改后的数据:首先对比主键,根据主键是否有新增或缺失确定数据的增删操作;然后再针对前后都有的记录对比每条记录值是否有不同,如有不同则执行 update 操作。
所以,建议数据处理(数据来源、数据去向)中的字段名称与报表中的字段名称个数要保持一致,不然填报更新时就会因新旧对象字段不匹配导致更新失败。
另外细心的你也一定找到了更新前后的数据是分开编辑的的好处了吧–灵活、*、不受约束!
实例报表