Oracle 公 司 作 為 全 球 最 大 的 數(shù) 據(jù) 庫 廠 商 之 一, 其 數(shù) 據(jù) 庫 系 統(tǒng) 是 優(yōu) 秀 的 數(shù) 據(jù) 庫 管 理 系 統(tǒng), 在 大 型 系 統(tǒng) 象 保 險(xiǎn)、 金 融 等 部 門 的 廣 泛 應(yīng) 用 是 眾 所 周 知 的, 但 其 數(shù) 據(jù) 庫 前 端 開 發(fā) 工 具DEVEPER/2000 在 業(yè) 界 中 介 紹 的 卻 相 對(duì) 較 少。 其 實(shí) 其 開 發(fā) 工 具Developer/2000 也 是 一 功 能 強(qiáng) 大 的、 方 便 靈 活 的 開 發(fā) 工 具。Developer/2000 在 構(gòu) 建 企 業(yè) 管 理 信 息 系 統(tǒng) 上, 其 編 程 簡 便、 開 發(fā) 周 期 短、 維 護(hù) 方 便 等 優(yōu) 勢(shì) 更 是 軟 件 開 發(fā) 商 所 中 意 之 處, 筆 者 所 在 公 司 在 開 發(fā) 社 保 系 統(tǒng) 中 就 采 用Developer/2000, 在 遼 寧 省 的 應(yīng) 用 中 取 得 良 好 效 果。 下 面 就 本 人 在Developer/2000 開 發(fā) 社 保 系 統(tǒng) 中 所 遇 問 題 與 各 位 進(jìn) 行 交 流。
---- 1. Developer/2000 FROMS 4.5 中 的" 宏" 代 換
---- 在 早 期FOXPRO 數(shù) 據(jù) 庫 編 程 中, 經(jīng) 常 用 到 宏 代 換 功 能, 但 在FORMS 中 卻 沒 有 此 功 能, 象"&","*" 等 在 編 程 中 經(jīng) 常 用 到 的, 在FORMS 中 只 得 一 行 一 行 代 碼 的 寫, 但 后 來 發(fā) 現(xiàn)FORMS 中 也 有 類 似 功 能, 用NAME_IN()、COPY() 可 以 實(shí) 現(xiàn) 類 似 的 功 能。Name_in() 用 于 取 出 參 數(shù) 名 代 表 的 對(duì) 象 了 數(shù) 值, 而COPY() 把 一 個(gè) 參 數(shù) 值 傳 遞 給 另 一 參 數(shù) 值 表 示 的 對(duì) 象。 的 如 下 例:
FORM 結(jié) 構(gòu):
塊B
項(xiàng) L1,L2,L3,L4,L5,L6
在 作 錄 入 程 序 時(shí) 要 對(duì)L1。。。L6 項(xiàng) 清 零
DELCATE
strItemName varchar2(20);
BEGIN
for I in 1 …6 loop
strItemName:=':b.l"to_char(i);
copy(null,strItemNmae);
end loop;
END;
---- 對(duì) 于NAME_IN 的 應(yīng) 用 可 能 更 多 一 些, 筆 者 在 做 社 保 軟 件 時(shí), 作 保 險(xiǎn) 繳 費(fèi) 錄 入 時(shí) 曾 用 它 少 寫 了 許 多 代 碼。 當(dāng) 然 代 碼 的 減 少 就 義 意 味 維 護(hù) 工 作 量 的 減 少
----
FORM結(jié)構(gòu):
養(yǎng)老:
塊:YLYJ(養(yǎng)老應(yīng)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
塊:YLSJ (養(yǎng)老實(shí)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
工傷:
塊:GSYJ(工傷應(yīng)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
塊:GSSJ (工傷實(shí)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
醫(yī)療:
塊:YILYJ(醫(yī)療應(yīng)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
塊:YILSJ (醫(yī)療實(shí)繳)
項(xiàng):DWJTC(單位繳統(tǒng)籌),DWJZH(單位繳帳戶),GRJF(個(gè)人繳費(fèi))
---- 三 個(gè) 塊 的 結(jié) 構(gòu) 相 同, 只 是 塊 名 稱 不 同, 繳 費(fèi) 時(shí) 時(shí) 行 的 操 作 也 一 樣, 實(shí) 繳 名 項(xiàng) 不 能 大 于 應(yīng) 繳, 不 用NAME_IN 時(shí), 只 能 寫 三 段 程 序, 但 用 了NAME_IN 后 只 用 一 段 寫 一 個(gè) 函 數(shù) 就 能 達(dá) 到 目 的。 如 下:
FUNCTION FUN_JF (PRE_BLOCK_NAME
IN VARCHAR) RETURN BOOLEAN IS
BEGIN
if name_in(pre_block_name'sj.dwjtc')
>name_in(pre_block_name'yj.dwjtc') or
name_in(pre_block_name'sj.dwjzh')
>name_in(pre_block_name'yj.dwjzh') or
name_in(pre_block_name'sj.grjf')
>name_in(pre_block_name'yj.grjf') then
message(' 實(shí) 繳 大 于 應(yīng) 繳');
return false;
end if;
return true;
END;
---- 從 上 面 的 兩 個(gè) 例 子 來 看NAME_IN 和COPY 的 應(yīng) 用 能 起 到 其 它 編 程 語 言 的" 宏" 代 換 功 能, 代 碼 的 優(yōu) 化 方 面 確 實(shí) 能 起 不 少 的 作 用, 減 少 了 程 序 源 代 碼 的 維 護(hù) 工 作。
2. 用FORMS 實(shí) 現(xiàn)ORACLE 數(shù) 據(jù) 庫 與 其 它 數(shù) 據(jù) 源 數(shù) 據(jù) 的 交 換
---- Developer/2000 不 能 實(shí) 現(xiàn) 同 時(shí) 多 數(shù) 據(jù) 源 的 同 時(shí) 連 接, 在 多 系 統(tǒng) 和 異 種 數(shù) 據(jù) 源 的 操 作 中 功 能 確 實(shí) 大 打 折 扣, 雖 然 可 以 用3GL 加ODBC 作 一DLL 應(yīng) 用 能 實(shí) 現(xiàn), 但 一 般 的 應(yīng) 用 中 又 有 點(diǎn) 沒 用 必 要 作 的 那 么 復(fù) 雜。
實(shí) 際 上Developer/2000 內(nèi) 嵌 包TEXT_IO 為 我 們 提 供 了 一 個(gè) 更 簡 單 的 方 法。 幾 乎 所 有 的 數(shù) 據(jù) 庫 或 數(shù) 據(jù) 庫 前 端 開 發(fā) 工 具 都 提 供 文 本 文 件 的 操 作, 這 樣 我 們 完 全 可 以 用 文 本 文 件 作 為 數(shù) 據(jù) 交 換 的 通 用 格 式。 下 例 是 在 保 險(xiǎn) 業(yè) 中 的 一 應(yīng) 用:( 要 用 到d2kwfile.dll 應(yīng) 用)
DECLARE
filename varchar2(128):=null;
filenum text_io.file_type;
linebuf varchar2(100);
r_temp temp%rowtype;
BEGIN
filename:=d2k_file_dialog.show
('請(qǐng)選擇繳費(fèi)工資臺(tái)帳原文件','c:/','源文件(*.txt)*.txt');
if filename is null then
raise form_trigger_failure; end if;
filenum:=text_io.fopen(filename,'r');
loop
BEGIN
text_io.get_line(filenum,linebuf);
TEXT_IO.PUT(linebuf);TEXT_IO.NEW_LINE;
exception when no_data_found then
exit;
END;
BEGIN
v_temp.l1=substr(linebuf,1,9);
v_temp.l2:= to_number(substr(linebuf,10,5));
insert into temp(l1,l2) values (v_temp.l1,v_temp.l2);
exception when others then
END;
< < end_loop > >
null;
end loop;
END;
---- 3. FORMS 4.5 實(shí) 現(xiàn) 的 列 表 查 詢、 多 行 錄 入 中 的 實(shí) 現(xiàn) 行 累 計(jì)
---- 在PB 和VB 中 都 用 類 似 的 求 和 或 者 說 累 計(jì) 列, 但 在 早 期 的FORMS4。5 中 沒 有 此 功 能, 對(duì) 于 多 條 記 錄 的 錄 入 中 需 要 進(jìn) 行 求 和 時(shí) 很 不 方 便, 其 實(shí) 利 用FORM 的 觸 發(fā) 子 很 容 易 實(shí) 現(xiàn)。 如 下 例:
塊:b1 項(xiàng):l1,l2.l3,l4
塊:b2 項(xiàng):l1,l2,l3,l4
塊b2是B1的求和塊
在塊B1中的PRE_TEXT_ITEM中代碼:
IF SUBSTR(:SYSTEM.CURRENT_ITEM,1,1) IN ('L') THEN
:GLOBAL.ITEM_PREVALUES:=NAME_IN
('B1.':SYSTEM.CURRENT_ITEM);
END IF;
在塊 B2中的POST_TEXT_ITEM中代碼:
DECLARE
num_cz number; --數(shù)據(jù)項(xiàng)在錄入或修改前后的差值
num_hz number; --數(shù)據(jù)項(xiàng)在修改后的求合
BEGIN
if substr(:system.current_item,1,1) in ('l') then
:global.item_nextvalues:=name_in
('b1.':system.current_item);
num_cz:=nvl(to_number(:global.item_nextvalues),0)-
nvl(to_number(:global.item_prevalues),0);
--新的和值
num_hz:=nvl(to_number(name_in('b_sum.'
:system.current_item)),0)+num_cz;
copy(to_char(num_hz),'b2.':system.current_item);
end if;
END;
---- 通 過 前 后 兩 值 的 比 較 很 容 易 的 實(shí) 現(xiàn) 一 個(gè) 較 通 用 的 求 和 算 法, 另 外 又 一 次 用 到NAME_IN 和 COPY , 減 少 了 代 碼 量。 在 塊 上 實(shí) 現(xiàn) 觸 發(fā) 子 也 減 少 了 代 碼 維 護(hù) 工 作 量。
---- 4. REPORT 2.5 中 實(shí) 現(xiàn) 的 動(dòng) 態(tài) 報(bào) 表( 一 張 表 利 用 多 個(gè)QUERY 語 句, 生 成 一 樣 格 式 的 多 張 報(bào) 表
---- 在 做 報(bào) 表 時(shí) 經(jīng) 常 要 遇 到 類 似 的 報(bào) 表 有 多 張 的 情 況, 雖 然 通 過 簡 單 的 拷 貝 可 以 減 少 編 程 的 工 作 量, 但 在 后 期 的 維 護(hù) 中 卻 增 加 了 難 度, 一 張 表 改 完 后 又 改 另 一 張 表, 進(jìn) 行 大 量 的 重 復(fù) 勞 動(dòng) 不 是 每 個(gè) 程 序 員 想 做 的 工 作。 其 實(shí) 在REPORT 2。5 中 有 一 很 好 的 功 能 可 能 完 成 這 樣 的 工 作。 就 是REPORT 的" 宏" 代 換。 如 下 例:
兩個(gè)表:tab_temp1 (a number,b number,c number)
tab_temp2 (d number,e number,f number)
---- 作 兩 張 報(bào) 表, 表 頭 一 樣, 但 查 詢 不 一 樣, 分 別 取 自 兩 個(gè) 表
建 一 用 戶 參 數(shù)(user parameters) p_1 類 型 CHAR 長 度 200, 缺 省 值 是 SELECT A,B,C FROM TAB_TEMP
建 一 查 詢(QUERIES), 在 查 詢 語 句 中 輸 入:&P_1
生 成 布 局, 可 按 要 求 畫 出 報(bào) 表。
---- 因 在 查 定 義 中 用 的 是&p_1 定 義, 所 以 可 以 在 運(yùn) 行 時(shí) 動(dòng) 態(tài) 的 給P_1 傳 遞 能 數(shù) 只 要 能 滿 足 其 列 名 定 義 即 可, 例 可 用 如 下 語 句 代 入P_1
SELECT D A,E B,F C FROM TAB_TEMP2
---- 這 樣 就 生 成 了 一 個(gè) 多 功 能 報(bào) 表, 把 編 寫REPROT 工 作 從 簡 單 的 布 局 編 輯 中 解 脫 出 來, 而 投 入 到 實(shí) 質(zhì) 性 的 工 作SQL 語 句 的 生 成 上 去。