首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle Forms/Reports 開發心得:物件建置、觸發器順序、LOV、Global 變數陷阱

     編輯:Oracle 資料庫相關知識

物件建置原則

  • 實體物件 (Table、Sequence、Index) 建於應用專屬表空間;邏輯物件 (View、Synonym) 建於 APPS Schema。
  • 新手常誤將 Table 建在 APPS,導致 Synonym 建立/刪除報「物件不存在/已存在」交叉錯誤。

腳本執行細節

  • 單一 PL/SQL 區塊 (如建 View) 不可含空行,否則 @script.sql 執行失敗,但複製到 SQL Worksheet 卻能跑通。
  • EXECUTE_QUERY 前必須 GO_BLOCK('block_name'),但 GO_BLOCK 為受限程序,不一定成功。

Master-Detail 關鍵設定

  • 雙區塊皆為 Database Block,各有一欄位基於資料庫欄位顯示。
  • 關聯欄位需建立 Relation,觸發器自動生成。

多組織環境 (MOAC) 初始化

BEGIN
  fnd_client_info.set_org_context('83');  -- 設定 ORG_ID
END;

PL/SQL Developer 無環境變數,查詢多組織 View 前必須先跑此初始化。

Global/Parameter 變數初始化時機

  • PRE-FORM:正確時機,表單載入最早階段。
  • WHEN-NEW-FORM-INSTANCE:太晚,已進入第一個可導航項目後才觸發,初始化會失效。

畫布顯示/隱藏機制

  • HIDE_VIEW:僅移至最底層 (Z-order),若上層畫布未完全覆蓋,使用者仍可看見。
  • SHOW_VIEW:移至最上層。
  • 真正隱藏需設定 VISIBLE 屬性或移動座標至可視區外。

LOV 驗證與查詢行為

  • 驗證以 第一個可見欄位 為準,並一次回寫所有對應項目。
  • 查詢預設針對第一欄;在輸入框前加 % (如 %keyword) 可模糊比對所有欄位。

COPY VALUE FROM ITEM 行為

  • EXECUTE_QUERY 時自動帶入查詢條件;CREATE_RECORD 時自動初始化且不改變記錄狀態。
  • 若不想影響查詢,在 PRE-QUERY 中將該項目設為 NULL。
  • ENFORCE_KEY 屬性唯讀,由 Master-Detail 精靈自動建立/移除。

APP_QUERY.RESET 技巧

app_query.reset('block_name');
-- 首次呼叫:備份當前 DEFAULT_WHERE
-- 後續呼叫:恢復首次備份的 DEFAULT_WHERE

觸發器順序速查

場景順序
Commit 週期PRE-COMMIT → 各區塊 PRE-INSERT/ON-INSERT/POST-INSERT → POST-FORMS-COMMIT
List 驗證WHEN-LIST-CHANGED → WHEN-VALIDATE-ITEM (離開項目時才觸發)
記錄建立PRE-FORM → WHEN-CREATE-RECORD → PRE-BLOCK → WHEN-NEW-FORM-INSTANCE → WHEN-VALIDATE-RECORD → ON-INSERT → POST-FORMS

父子區塊同步陷阱

定位至 Master 新記錄 (未存檔) 時,Child 的 WHEN-CREATE-RECORD 讀取 Master 欄位會拿到「上一筆獲得焦點的記錄」值,而非當前新記錄。解法:在 Master POST-CHANGE 或 WHEN-VALIDATE-RECORD 以 Global 變數暫存,Child 端讀 Global。

Sequence 初始值陷阱

項目 Initial Value 設 :SEQUENCE.NEXTVAL,使用者反覆 Focus 新/舊記錄會導致 Sequence 持續遞增浪費號碼。建議在 PRE-INSERT 觸發器中賦值。

NULL 排序處理

ORDER BY NVL(col, CHR(0)) 讓 NULL 排在最前 (或用 CHR(255) 排最後),符合實務期望。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved