在Oracle中實(shí)現(xiàn)報(bào)表的定長(zhǎng)輸出
摘自:中國(guó)計(jì)算機(jī)報(bào)
|
郭華玲
Oracle*Reports是Oracle的數(shù)據(jù)統(tǒng)計(jì)及圖形化報(bào)表工具,它提供了六種風(fēng)格的報(bào)表格式,而我們通常使用的只有其中的兩種,即Tabular和Matrix,無(wú)論用哪種風(fēng)格生成的報(bào)表,打印出的表格數(shù)都是動(dòng)態(tài)變化的。其中Tabular風(fēng)格的報(bào)表,列數(shù)固定,而行數(shù)不定;Matrix風(fēng)格的報(bào)表,行數(shù)和列數(shù)均不定。那么在Oracle*Reports中如何實(shí)現(xiàn)報(bào)表的定長(zhǎng)與定寬輸出呢?筆者在實(shí)際開發(fā)過(guò)程中對(duì)上述兩種風(fēng)格的報(bào)表各總結(jié)出一種行之有效的方法,供大家參考。
一、對(duì)于Tabular風(fēng)格的報(bào)表,可用報(bào)表觸發(fā)子After Parameter Form和After Report實(shí)現(xiàn)定長(zhǎng)輸出。其方法是:根據(jù)實(shí)際情況確定每頁(yè)打印的行數(shù),當(dāng)最后一頁(yè)的記錄數(shù)少于每頁(yè)打印的行數(shù)時(shí),則用空記錄補(bǔ)齊。在觸發(fā)子After Parameter Form插入空記錄,在觸發(fā)子After Report中再將空記錄刪除,下面舉例說(shuō)明。
假設(shè)有一數(shù)據(jù)基表WZDM:存放物資代碼信息,其數(shù)據(jù)結(jié)構(gòu)為:
字段名 |
含義 |
長(zhǎng)度 |
類型 |
wzdm |
物資代碼 |
9 |
c |
wzmc |
物資名稱 |
20 |
c |
xhgg |
型號(hào)規(guī)格 |
20 |
c |
jldw |
計(jì)量單位 |
6 |
c |
要求:按定長(zhǎng)輸出物資代碼表,并且每頁(yè)均輸出x行(x可根據(jù)實(shí)際情況而定)。
1.啟動(dòng)Oracle*Reports,建立物資代碼打印報(bào)表(略),然后在報(bào)表觸發(fā)子After Parameter Form中加入以下代碼:
Declare
v―jls number(2);
i number(2):=1;
Begin
Select Count(*) Into V―jls From Wzdm;
If Mod(V―jls,x)〈〉0 Then
Loop
Exit When i〉=(x-mod(v―jls,x))+1;
Insert Into Wzdm(Wzdm,Wzmc,Xhgg,Jldw)
Values(′′,′′,′′,′′);
i:=i+1;
End Loop;
Commit;
End If;
End;
在報(bào)表觸發(fā)子After Report中分別加入以下代碼:
Begin
Delete From Wzdm Where Wzdm Is Null;
Commit;
End;
2.運(yùn)行報(bào)表后即可輸出定長(zhǎng)的物資代碼表。
說(shuō)明:對(duì)于其它Tabular風(fēng)格的報(bào)表,在編寫上述兩個(gè)觸發(fā)子時(shí)只需將基表名與列名根據(jù)實(shí)際情況修改一下,并確定x的值即可。
二、對(duì)于Matrix風(fēng)格的報(bào)表,可利用視圖實(shí)現(xiàn)定長(zhǎng)與定寬輸出,其思路是:當(dāng)行記錄數(shù)和列記錄少于實(shí)際報(bào)表的行數(shù)和列數(shù)時(shí),均以空記錄補(bǔ)齊。下面舉例說(shuō)明。
假設(shè)有一物資資金消耗去向統(tǒng)計(jì)月報(bào),該表橫向顯示本期消耗去向,縱向顯示物資類別,由于每月物資消耗去向和消耗物資均不定,所以此類報(bào)表即為一矩陣報(bào)表。該報(bào)表的數(shù)據(jù)存放在基表T―ZJXHQX中,其數(shù)據(jù)結(jié)構(gòu)如下:
字段名 |
含義 |
長(zhǎng)度 |
類型 |
lbmc |
類別名稱 |
20 |
c |
dwmc |
單位名稱 |
20 |
c |
je |
金額 |
14,2 |
n |
要求:按定長(zhǎng)定寬輸出物資資金消耗去向統(tǒng)計(jì)月報(bào),并且每頁(yè)均輸出x行y列(行數(shù)和列數(shù)可根據(jù)實(shí)際情況而定)。
1.首先建一基表T―kjl,用來(lái)存放空記錄,其數(shù)據(jù)結(jié)構(gòu)為:
字段名 |
含義 |
長(zhǎng)度 |
類型 |
no |
序號(hào) |
2 |
n |
建完該數(shù)據(jù)表后,再往其中插入記錄,記錄數(shù)可根據(jù)實(shí)際情況而定,一般為一頁(yè)所能打印的最大行數(shù),這里假設(shè)為z條,即No的值為1,2,3…z。
2.建視圖,其過(guò)程如下:
Create View V―TJBB As
Select Dwmc,Lbmc,Je From T―zjxhqx
Union
Select Dwmc,Null,To―Number(Null) From T―zjxhqx,T―kjl
Where No-(z-x)〉(Select Mod(Count(Distinct Lbmc)-1,x)+1 From T―zjxhqx)
Union
Select Null,Lbmc,To―Number(Null) From T―zjxhqx,T―kjl
Where No-(z-y)〉(Select Mod(Count(Distinct Dwmc)-1,y)+1 From T―zjxhqx);
3. 啟動(dòng)Oracle*Reports,建立矩陣報(bào)表查詢時(shí)直接引用視圖V―TJBB即可。這樣運(yùn)行時(shí)輸出的報(bào)表每頁(yè)都是x行y列,即實(shí)現(xiàn)了定長(zhǎng)和定寬輸出。
|