「FRM-40202: Field must be entered」、「FRM-40350: Query caused no records retrieved」—— 這類英文系統訊息在中文環境下嚴重影響使用體驗。Oracle Forms 提供兩種原生機制解決。
Forms 將訊息分 6 級(0, 5, 10, 15, 20, 25),數字越大越嚴重。開發者可壓縮最高至 25 級。
-- 表單啟動觸發器 WHEN-NEW-FORM-INSTANCE
:SYSTEM.MESSAGE_LEVEL := '25'; -- 僅顯示 >25 級(實際無),等於屏蔽所有可壓縮訊息
:SYSTEM.SUPPRESS_WORKING := 'TRUE'; -- 禁止「正在處理...」工作訊息
效果:
缺點:
兩大核心觸發器:
ERROR_CODE, ERROR_TYPE, ERROR_TEXT)MESSAGE_CODE, MESSAGE_TYPE, MESSAGE_TEXT)-- ON-ERROR 觸發器
DECLARE
v_code NUMBER := ERROR_CODE;
v_type VARCHAR2(3) := ERROR_TYPE;
v_text VARCHAR2(200) := ERROR_TEXT;
BEGIN
IF v_code = 40202 AND v_type = 'FRM' THEN
MESSAGE('欄位值必須輸入!'); -- 自訂中文
BELL; -- 蜂鳴提醒
RAISE FORM_TRIGGER_FAILURE; -- 關鍵:阻止預設訊息顯示
END IF;
END;
避免在觸發器寫死成百上千的 IF-ELSE。
CREATE TABLE form_msg_map (
msg_type VARCHAR2(3) NOT NULL, -- 'FRM' 或 'ORA'
msg_code NUMBER NOT NULL,
custom_text VARCHAR2(500) NOT NULL,
lang VARCHAR2(5) DEFAULT 'ZH_TW',
CONSTRAINT pk_form_msg_map PRIMARY KEY (msg_type, msg_code, lang)
);
-- 範例資料
INSERT INTO form_msg_map VALUES ('FRM', 40202, '欄位值必須輸入!', 'ZH_TW');
INSERT INTO form_msg_map VALUES ('FRM', 40350, '查詢無資料,請調整條件', 'ZH_TW');
INSERT INTO form_msg_map VALUES ('ORA', 00001, '資料重複,請檢查唯一鍵', 'ZH_TW');
COMMIT;
DECLARE
v_custom VARCHAR2(500);
BEGIN
SELECT custom_text INTO v_custom
FROM form_msg_map
WHERE msg_type = ERROR_TYPE
AND msg_code = ERROR_CODE
AND lang = USERENV('LANG'); -- 或應用層傳入的語系參數
IF v_custom IS NOT NULL THEN
MESSAGE(v_custom);
RAISE FORM_TRIGGER_FAILURE;
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- 無對照則走預設顯示
END;
MESSAGE_CODE/MESSAGE_TYPE/MESSAGE_TEXT)。ERROR_TEXT/MESSAGE_TEXT **唯讀**,不可直接修改,必須用 MESSAGE() 覆蓋。LANG 欄位,應用登入時設定 Session 語系參數。| 層級 | 手段 | 處理訊息類型 |
|---|---|---|
| 全域 | MESSAGE_LEVEL=25 + SUPPRESS_WORKING=TRUE | 低級資訊噪音(處理中、查無資料等) |
| 精準 | ON-ERROR / ON-MESSAGE + 對照表 | 核心業務錯誤、關鍵確認提示(中文化) |
| 審計 | 觸發器中記錄 ERROR_CODE、用戶、時間到日誌表 | 所有攔截訊息,事後分析高頻錯誤優化 UI |
CALL_FORM/OPEN_FORM,子表單繼承父表單觸發器,**確認範圍**是否需在子表單重寫。BELL 可能無聲,改用 JavaScript alert() 或前端 Toast。中文化提示不是「把英文翻成中文」,而是**用業務語言引導用戶完成任務**。建議採用「全域過濾噪音 + 觸發器精準中文化 + 對照表可維護 + 審計日誌可優化」四位一體架構。一次建置,終身受益,並為未來多語系、無障礙存取奠基。