Oracle 公 司 作 為 全 球 最 大 的 數 據 庫 廠 商 之 一
其 數 據 庫 系 統 是 優 秀 的 數 據 庫 管 理 系 統
在 大 型 系 統 象 保 險
金 融 等 部 門 的 廣 泛 應 用 是 眾 所 周 知 的
但 其 數 據 庫 前 端 開 發 工 具DEVEPER/
在 業 界 中 介 紹 的 卻 相 對 較 少
其 實 其 開 發 工 具Developer/
也 是 一 功 能 強 大 的
方 便 靈 活 的 開 發 工 具
Developer/
在 構 建 企 業 管 理 信 息 系 統 上
其 編 程 簡 便
開 發 周 期 短
維 護 方 便 等 優 勢 更 是 軟 件 開 發 商 所 中 意 之 處
筆 者 所 在 公 司 在 開 發 社 保 系 統 中 就 采 用Developer/
在 遼 寧 省 的 應 用 中 取 得 良 好 效 果
下 面 就 本 人 在Developer/
開 發 社 保 系 統 中 所 遇 問 題 與 各 位 進 行 交 流
Developer/
FROMS
中 的
宏
代 換
在 早 期FOXPRO 數 據 庫 編 程 中
經 常 用 到 宏 代 換 功 能
但 在FORMS 中 卻 沒 有 此 功 能
象
&
*
等 在 編 程 中 經 常 用 到 的
在FORMS 中 只 得 一 行 一 行 代 碼 的 寫
但 後 來 發 現FORMS 中 也 有 類 似 功 能
用NAME_IN()
COPY() 可 以 實 現 類 似 的 功 能
Name_in() 用 於 取 出 參 數 名 代 表 的 對 象 了 數 值
而COPY() 把 一 個 參 數 值 傳 遞 給 另 一 參 數 值 表 示 的 對 象
的 如 下 例
FORM 結 構
塊B
項 L
L
L
L
L
L
在 作 錄 入 程 序 時 要 對L
L
項 清 零
DELCATE
strItemName varchar
(
);
BEGIN
for I in
…
loop
strItemName:=
:b
l
||to_char(i);
copy(null
strItemNmae);
end loop;
END;
對 於NAME_IN 的 應 用 可 能 更 多 一 些
筆 者 在 做 社 保 軟 件 時
作 保 險 繳 費 錄 入 時 曾 用 它 少 寫 了 許 多 代 碼
當 然 代 碼 的 減 少 就 義 意 味 維 護 工 作 量 的 減 少
FORM結構
養老
塊
YLYJ(養老應繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
塊
YLSJ (養老實繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
工傷
塊
GSYJ(工傷應繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
塊
GSSJ (工傷實繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
醫療
塊
YILYJ(醫療應繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
塊
YILSJ (醫療實繳)
項
DWJTC(單位繳統籌)
DWJZH(單位繳帳戶)
GRJF(個人繳費)
三 個 塊 的 結 構 相 同
只 是 塊 名 稱 不 同
繳 費 時 時 行 的 操 作 也 一 樣
實 繳 名 項 不 能 大 於 應 繳
不 用NAME_IN 時
只 能 寫 三 段 程 序
但 用 了NAME_IN 後 只 用 一 段 寫 一 個 函 數 就 能 達 到 目 的
如 下
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(
實 繳 大 於 應 繳
);
return false;
end if;
return true;
END;
從 上 面 的 兩 個 例 子 來 看NAME_IN 和COPY 的 應 用 能 起 到 其 它 編 程 語 言 的
宏
代 換 功 能
代 碼 的 優 化 方 面 確 實 能 起 不 少 的 作 用
減 少 了 程 序 源 代 碼 的 維 護 工 作
用FORMS 實 現ORACLE 數 據 庫 與 其 它 數 據 源 數 據 的 交 換
Developer/
不 能 實 現 同 時 多 數 據 源 的 同 時 連 接
在 多 系 統 和 異 種 數 據 源 的 操 作 中 功 能 確 實 大 打 折 扣
雖 然 可 以 用
GL 加ODBC 作 一DLL 應 用 能 實 現
但 一 般 的 應 用 中 又 有 點 沒 用 必 要 作 的 那 麼 復 雜
實 際 上Developer/
內 嵌 包TEXT_IO 為 我 們 提 供 了 一 個 更 簡 單 的 方 法
幾 乎 所 有 的 數 據 庫 或 數 據 庫 前 端 開 發 工 具 都 提 供 文 本 文 件 的 操 作
這 樣 我 們 完 全 可 以 用 文 本 文 件 作 為 數 據 交 換 的 通 用 格 式
下 例 是 在 保 險 業 中 的 一 應 用
( 要 用 到d
kwfile
dll 應 用)
DECLARE
filename varchar
(
):=null;
filenum text_io
file_type;
linebuf varchar
(
);
r_temp temp%rowtype;
BEGIN
filename:=d
k_file_dialog
show
(
請選擇繳費工資台帳原文件
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
l
=substr(linebuf
);
v_temp
l
:= to_number(substr(linebuf
));
insert into temp(l
l
) values (v_temp
l
v_temp
l
);
exception when others then
END;
< < end_loop > >
null;
end loop;
END;
FORMS
實 現 的 列 表 查 詢
多 行 錄 入 中 的 實 現 行 累 計
在PB 和VB 中 都 用 類 似 的 求 和 或 者 說 累 計 列
但 在 早 期 的FORMS
中 沒 有 此 功 能
對 於 多 條 記 錄 的 錄 入 中 需 要 進 行 求 和 時 很 不 方 便
其 實 利 用FORM 的 觸 發 子 很 容 易 實 現
如 下 例
塊
b
項
l
l
l
l
塊
b
項
l
l
l
l
塊b
是B
的求和塊
在塊B
中的PRE_TEXT_ITEM中代碼
IF SUBSTR(:SYSTEM
CURRENT_ITEM
) IN (
L
) THEN
:GLOBAL
ITEM_PREVALUES:=NAME_IN
(
B
||:SYSTEM
CURRENT_ITEM);
END IF;
在塊 B
中的POST_TEXT_ITEM中代碼
DECLARE
num_cz number;
數據項在錄入或修改前後的差值
num_hz number;
數據項在修改後的求合
BEGIN
if substr(:system
current_item
) in (
l
) then
:em_nextvalues:=name_in
(
b
||:system
current_item);
num_cz:=nvl(to_number(:em_nextvalues)
)
nvl(to_number(:em_prevalues)
);
新的和值
num_hz:=nvl(to_number(name_in(
b_sum
||:system
current_item))
)+num_cz;
copy(to_char(num_hz)
b
||:system
current_item);
end if;
END;
通 過 前 後 兩 值 的 比 較 很 容 易 的 實 現 一 個 較 通 用 的 求 和 算 法
另 外 又 一 次 用 到NAME_IN 和 COPY
減 少 了 代 碼 量
在 塊 上 實 現 觸 發 子 也 減 少 了 代 碼 維 護 工 作 量
REPORT
中 實 現 的 動 態 報 表( 一 張 表 利 用 多 個QUERY 語 句
生 成 一 樣 格 式 的 多 張 報 表
在 做 報 表 時 經 常 要 遇 到 類 似 的 報 表 有 多 張 的 情 況
雖 然 通 過 簡 單 的 拷 貝 可 以 減 少 編 程 的 工 作 量
但 在 後 期 的 維 護 中 卻 增 加 了 難 度
一 張 表 改 完 後 又 改 另 一 張 表
進 行 大 量 的 重 復 勞 動 不 是 每 個 程 序 員 想 做 的 工 作
其 實 在REPORT
中 有 一 很 好 的 功 能 可 能 完 成 這 樣 的 工 作
就 是REPORT 的
宏
代 換
如 下 例
兩個表
tab_temp
(a number
b number
c number)
tab_temp
(d number
e number
f number)
作 兩 張 報 表
表 頭 一 樣
但 查 詢 不 一 樣
分 別 取 自 兩 個 表
建 一 用 戶 參 數(user parameters) p_
類 型 CHAR 長 度
缺 省 值 是 SELECT A
B
C FROM TAB_TEMP
建 一 查 詢(QUERIES)
在 查 詢 語 句 中 輸 入
&P_
生 成 布 局
可 按 要 求 畫 出 報 表
因 在 查 定 義 中 用 的 是&p_
定 義
所 以 可 以 在 運 行 時 動 態 的 給P_
傳 遞 能 數 只 要 能 滿 足 其 列 名 定 義 即 可
例 可 用 如 下 語 句 代 入P_
SELECT D A
E B
F C FROM TAB_TEMP
這 樣 就 生 成 了 一 個 多 功 能 報 表
把 編 寫REPROT 工 作 從 簡 單 的 布 局 編 輯 中 解 脫 出 來
而 投 入 到 實 質 性 的 工 作SQL 語 句 的 生 成 上 去
From:http://tw.wingwit.com/Article/program/Oracle/201311/18657.html