动态报表的实现与报表数据的组织(一)
动态报表的实现与报表数据的组织(一)
[摘要]本文介绍了一种实现复杂数据集合的灵活运算、储存、汇总、查询功能和数据的动态组合的简单方法,做到“使用一个软件,管理所有数据”,提高了工作效率,减少重复劳动。
1引言
为了解决复杂数据集合的灵活运算、储存、汇总、查询功能,设计了一个数据管理软件,该软件可以管理多种报表,每种报表可含有多个机构,每个机构内可有多个数据集合。各种报表可以有自己独立的运算公式、平衡检查公式,以及错误提示信息。每种报表可以进行数据汇总、平均以及其它各种数学运算,等等。
如果用户用Excel结合Access,可以满足上述功能,但缺点显而易见,就是使用复杂、数据不安全、维护不便。用PowerBuilder的动态SQL语句生成动态数据窗口,并结合专用的数据库进行数据组织,可以方便地实现上述功能,下面将软件设计思路介绍如下。
2.设计思路
为了实现数据的动态组合,软件需要特设三张表,一张记录动态表的数据(记为Bbdata),一张记录动态表行的格式定义(记为Bbhdy),一张记录动态表列的格式定义(记为Bbldy),格式分别如下:
1.Bbdata表(表1)
AgencyReportbmBmHsLsValue
10022121348895.00
100221315740.00
10022141326505.00
100221523436.00
10022162592.00
字段含义为:
Agency:报表机构编码(例:假定分公司A为1,分公司B为2,等等)
Reportbm:报表编码(例:资产负债表为1,损益表为2,等等)
Bm:报表中数据集合编码(例:资产负债表1月份报表为1,2月份报表表为2,等等)
Hs:数据在表中的具体位置所在行数
Ls:数据在表中的具体位置所在列数
Value:数据值
2.Bbhdy表(表2)
BbbmHmcHssSfjsx
3固定资产10
3累计资产20
3工资支出30
3合计支出41
字段含义为:
Bbbm:报表编码(与Bbdata表的Reportbm字段关联)
Hmc:行项目名称
Hss:行顺序(即:行在报表中的行序)
Sfjsx:该行是否为计算性行,取值1或0(即:值由其它的行或者常数运算得出)
3.Bbldy表(表3)
字段含义为:
Bbbm:报表编码(与Bbdata表的Reportbm字段关联)
Lmc:列项目名称
Llen:列宽度(即:报表中每列列的`宽度)
Lss:列顺序(即:列在报表中的列序)
Sfjsx:该列是否为计算性列,取值1或0(即:值由其它的列或者常数运算得出)
下列代码中的dw_1用于放置动态数据窗口,dw_2为Bbhdy数据库得出数据窗口,dw_3为Bbldy数据库得出数据窗口,dw_4为Bbdata数据库得出数据窗口,调入内存后,进行下列算法:
integer i,j,hs,ls
string model1,model2,a,a1
decimal value
model1=""
model2=""
a="'a' 项目,"
for i=1 to dw_3.rowcount()
// dw_3.rowcount()为报表的实际列数
model1="0.00 "
a1=dw_3.object.data[i,2]
// dw_3.object.data[i,2]为报表的列名称
j=0
do while j <= len(a1)
j++
if right(left(a1,j),1)=" " then
a1=Replace(a1,1,j,trim(left(a1,j)))
j=j - 1
end if
loop
model2=model2+model1+a1+","
next
a=a+model2
a=left(a,len(a) - 1)
经过上述算法之后,字符串a最终变成动态SQL可辨析的串,上列表格所示的列项目会被组合为: 'a' 项目,0.00 第一季度,0.00 第二季度,0.00 第三季度,0.00 第四季度,0.00 全年合计,请有兴趣的读者自己验证。
接着就可以利用动态SQL语句生成动态数据窗口对象:
new_sql = "SELECT "+a+" from reportbm"
// reportbm为报表编码表
new_syntax=sqltrans.SyntaxFromSQL(new_sql,'Style(Type=grid)',error_syntaxfromSQL)
dw_1.Create(new_syntax, error_create)
//根据SQL字符串创建动态数据窗口
for i=1 to dw_2.rowcount()
dw_1.insertrow(0)
dw_1.object.data[dw_1.rowcount(),1]=dw_2.object.data[i,2]
//根据行元素的多少在生成的数据窗口中插入行,并在第一列输入行项目
next
for i=1 to dw_4.rowcount()
hs=dw_4.object.data[i,4]
ls=dw_4.object.data[i,5]
value=dw_4.object.data[i,6]
dw_1.object.data[hs,ls]=value
//将Bbdata中的数据填入生成表
next
最后,生成的动态报表如表4所示,调整列宽度、颜色、是否可为空等属性的代码不再赘述。
如要在上表中输入新数据并将之保存为一组数据集合,代码如下:
integer bm,i,j,hs,ls,value
SELECT max(bm)
INTO :bm
FROM bbdata
where reportbm=:num
//num为已知报表编码
USING sqltrans;
if isnull(bm) then
bm=1
else
bm++
end if
//系统自动得出数据集合编码,取最大值+1
for i=1 to hs
for j=2 to ls+1
//hs为报表行数,ls为报表列数
value= dw_1.object.data[i,j]
if not isnull(value) then
INSERT INTO bbdata(agency,reportbm,bm,hs,ls,value)
VALUES (:agency,:num,:bm,:i,:j,:value)
using sqltrans;
commit using sqltrans;
end if
next
next
3.结束语
该程序在Windows98操作系统和PowerBuilder6.5环境下调试通过,对数据的管理取得了预期的效果,能实现数据集合的多维操作,在一定场合下可作为企业的数据管理系统软件使用,也可为个人提供数据管理,使用范围广、操作难度小,是一个功能较好的程序。
[参考文献]
1.《PowerBuilder 7.0编程员指南》,王鹏主编,北京希望电子出版社,2000.12
2.《POWERBUILDER 7.0高级教程》,马晖编,电子工业出版社,2000.1
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 yyfangchan@163.com (举报时请带上具体的网址) 举报,一经查实,本站将立刻删除