在Oracle的前端工具FORM4.5中,封裝過(guò)程資源相當(dāng)豐富,且用途廣泛。筆者在系統(tǒng)設(shè)計(jì)中,借助其中的封裝過(guò)程“FORMS_DDL”,解決了許多應(yīng)用難題。以下就所實(shí)現(xiàn)部分功能作簡(jiǎn)要介紹。
一、 實(shí)現(xiàn)數(shù)據(jù)的批量復(fù)制
在應(yīng)用系統(tǒng)中,經(jīng)常存在需要成批量處理的數(shù)據(jù),采用程序?qū)崿F(xiàn)后,可以大大地提高工作效率。如以電表電耗DHJL(電表柜號(hào)DBGH,電表號(hào)DBH,倍率BL,月份YF CHAR(6),上月表底數(shù)BS1,本月表底數(shù)BS2)為例,用戶當(dāng)月的工作是將上月數(shù)據(jù)再追加一次,然后將BS2值自動(dòng)替換為本月(A1)的BS1值,而用戶只需輸入本月的BS2值。編程實(shí)現(xiàn)如下:
根據(jù)上月產(chǎn)生當(dāng)月(A1〔的記錄的查詢
H1:='SELECT DBGH,DBH,BL,'''''A1
'''''"YF",BS2,BS2 FROM NHJL
WHERE YF=TO_CHAR(ADD_MONTHS(TO_DATE
(A1,'YYYYMM'),-1),'YYYYMM');
生成臨時(shí)表DHJL1
FORMS_DDL('CREATE TABLE DHJL1 AS 'H1);
將臨時(shí)表追加到DHJL中,但不能重復(fù)
H1:='INSERT INTO NHJL SELECT * FROM
DHJL1 WHERE (DBGH,DBH,BL,YF)
NOT IN (SELECT DBGH,DBH,BL,YF NHJL)';
FORMS_DDL(H1);
刪除臨時(shí)表
FORMS_DDL('DROP TABLE DHJL1');
提交
COMMIT_FORM;
二、 解決按周期換算問(wèn)題
日常應(yīng)用中,還有一類具有典型周期性的應(yīng)用。如在設(shè)備治理中,設(shè)備的周期性維修保養(yǎng)計(jì)劃WXJH(設(shè)備編號(hào)SBBH,保養(yǎng)部位WXBW,保養(yǎng)內(nèi)容WXNR,維修周期WXZQ,開(kāi)始月份KSRQ CHAR(6)),用戶在進(jìn)行數(shù)據(jù)初始化之后,只要輸入一個(gè)年份值(A1),就根據(jù)維修周期和輸入年份換算出當(dāng)年設(shè)備維修保養(yǎng)計(jì)劃(WXJH1)的內(nèi)容。程序?qū)崿F(xiàn)如下:
A1:='01'; 初始化
產(chǎn)生出1月份的維修保養(yǎng)項(xiàng)目的查詢語(yǔ)句的字符串,并初始化H1
H1:='SELECT SBBH,WXBW,WXNR,
'''''A1A2'''''"YF" FROM WXJH
WHERE MOD('A1A2'-TO_NUMBER(KSRQ),WXZQ)=0 AND
KSRQ< ='''''A1A2'''';
K1:=2; 初始化
產(chǎn)生出2到12月份的維修保養(yǎng)項(xiàng)目的查詢語(yǔ)句的字符串,并用UNION連接
WHILE K1< 13 LOOP
A2:=TO_CHAR(K1);
A2:=LPAD(A2,2,'0'); 格式轉(zhuǎn)換
H1:=H1' UNION ''SELECT SBBH,WXBW,WXNR,
'''''A1A2'''''"YF" FROM
WXJH WHERE MOD('A1A2'-TO_NUMBER(KSRQ),WXZQ)=0
AND KSRQ< ='''''A1A2'''';
K1:=K1+1;
END LOOP;
刪除舊表并創(chuàng)建新表
FORMS_DDL('DROP VIEW WXJH1');
FORMS_DDL('CREATE VIEW WXJH1 AS 'H1);
三、 實(shí)現(xiàn)用戶自定義公式列
對(duì)于應(yīng)用系統(tǒng)來(lái)說(shuō),絕大部分的編程和維護(hù)工作是由報(bào)表的調(diào)整引起的。用戶會(huì)提出自己輸入公式定義新列的要求。實(shí)現(xiàn)方法如下:
1、定義基表
T1(行要害字ROWKEY, 列要害字COLKEY char(2) ,值VALUE number );
T2(行要害字ROWKEY,列1COL00 ,列2 COL01,。。。。。。,列nnCOLmn);
T3(列編碼COLKEY char(2), 公式FORMU varchar2(300));
基表T1和基表T2中存放要查詢的基本數(shù)據(jù),實(shí)現(xiàn)N:1的對(duì)應(yīng)關(guān)系。在T1上創(chuàng)建實(shí)現(xiàn)這種關(guān)系的數(shù)據(jù)庫(kù)觸發(fā)子,實(shí)現(xiàn)自動(dòng)維護(hù)中間表T2(具體實(shí)現(xiàn)不再贅敘)。建立基表T1的主要目的,是為了REPORT中采用“矩陣風(fēng)格”輸出報(bào)表。基表T3中存放著所有可維護(hù)的列編碼和列的公式。
2、具體實(shí)現(xiàn)
DECLARE
H1 VARCHAR2(3000),
H VARCHAR2(3000),
CURSOR ZB IS SELECT 'SELECT ROWKEY,'''''COLKEY''''
'"COLKEY",'FORMU'"VALUE" FROM T2' FROM T3
WHERE FORMU IS NOT NULL; 定義按公式產(chǎn)生的新記錄的游標(biāo)
BEGIN
產(chǎn)生對(duì)基本T1的查詢的字符串
H1:='SELECT ROWKEY,COLKEY,VALUE FROM T1';
將產(chǎn)生的新記錄查詢的“UNION”到基本T1上
OPEN ZB;
FETCH ZB INTO H;
WHILE ZB%FOUND LOOP
H1:=H1' UNION 'H;
FETCH ZB INTO H;
END LOOP;
CLOSE ZB;
刪除舊視圖并創(chuàng)建新視圖V1
FORMS_DDL('DROP VIEW V1');
FORMS_DDL('CREATE VIEW V1 AS 'H1);
END;