- 相關推薦
動態報表的實現與報表數據的組織(一)
[摘要]本文介紹了一種實現復雜數據集合的靈活運算、儲存、匯總、查詢功能和數據的動態組合的簡單方法,做到“使用一個軟件,管理所有數據”,提高了工作效率,減少重復勞動。
1引言
為了解決復雜數據集合的靈活運算、儲存、匯總、查詢功能,設計了一個數據管理軟件,該軟件可以管理多種報表,每種報表可含有多個機構,每個機構內可有多個數據集合。各種報表可以有自己獨立的運算公式、平衡檢查公式,以及錯誤提示信息。每種報表可以進行數據匯總、平均以及其它各種數學運算,等等。
如果用戶用Excel結合Access,可以滿足上述功能,但缺點顯而易見,就是使用復雜、數據不安全、維護不便。用PowerBuilder的動態SQL語句生成動態數據窗口,并結合專用的數據庫進行數據組織,可以方便地實現上述功能,下面將軟件設計思路介紹如下。
2.設計思路
為了實現數據的動態組合,軟件需要特設三張表,一張記錄動態表的數據(記為Bbdata),一張記錄動態表行的格式定義(記為Bbhdy),一張記錄動態表列的格式定義(記為Bbldy),格式分別如下:
1.Bbdata表(表1)
Agency Reportbm Bm Hs Ls Value
100 2 2 1 2 1348895.00
100 2 2 1 3 15740.00
100 2 2 1 4 1326505.00
100 2 2 1 5 23436.00
100 2 2 1 6 2592.00
字段含義為:
Agency:報表機構編碼(例:假定分公司A為1,分公司B為2,等等)
Reportbm:報表編碼(例:資產負債表為1,損益表為2,等等)
Bm:報表中數據集合編碼(例:資產負債表1月份報表為1,2月份報表表為2,等等)
Hs:數據在表中的具體位置所在行數
Ls:數據在表中的具體位置所在列數
Value:數據值
2.Bbhdy表(表2)
Bbbm Hmc Hss Sfjsx
3 固定資產 1 0
3 累計資產 2 0
3 工資支出 3 0
3 合計支出 4 1
字段含義為:
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
【動態報表的實現與報表數據的組織(一)】相關文章:
淺析會計報表審計06-06
財務報表分析論文12-26
財務報表分析論文參考文獻03-02
構筑企業數據中心 實現理性分析決策06-04
淺析新會計準則中財務報表的變化06-08
局域網數據庫環境下數據采集及處理05-08
對行政組織中的非正式組織問題探討06-13
都市頻道制作網的設計與實現05-29