一般在查詢模式下最常用的就是輸入特定資料來查詢, 好比說, 直接輸入訂單號碼, 不然就是用 % 來做 Like 查詢. 不過其實還有一些隱藏功能可以讓你的查詢更有彈性喔~
1. 此欄位資料為空值 (#IS NULL)
2. 此欄位資料不為空值 (#IS NOT NULL)
3. 此欄位資料大於某個數字 (#>XXXX)
4. 此欄位資料介於某兩個值之間 (#BETWEEN A and B)
5. IN 查詢 (#IN (A, B))
一般在查詢模式下最常用的就是輸入特定資料來查詢, 好比說, 直接輸入訂單號碼, 不然就是用 % 來做 Like 查詢. 不過其實還有一些隱藏功能可以讓你的查詢更有彈性喔~
1. 此欄位資料為空值 (#IS NULL)
2. 此欄位資料不為空值 (#IS NOT NULL)
3. 此欄位資料大於某個數字 (#>XXXX)
4. 此欄位資料介於某兩個值之間 (#BETWEEN A and B)
5. IN 查詢 (#IN (A, B))
在標準的 Sales Order Line 畫面中, Tools > Scheduling 是可以正常使用的, 但是, 一樣的 Sales Order Line 在 Order Organizer 中, 卻怎樣都不能使用, 很怪阿~
Metalink 有一篇是教怎麼外掛 View Resveration (View only), 拿來改一下就可以變成我們要的了
當需要使用 Personalize 控制 Datetime 欄位值的時候, 必須要將值轉成 CHAR 型態 (TO_CHAR), 如果直接使用 DATE 型態 (TO_DATE), 就算給的資料有時間, 寫入時仍然只有日期, 然後時間部份都會呈現 00:00:00
User希望可以寫一個客製Form, 然後用個按鈕就可以Submit Report
1. 一般報表
:result := fnd_request.submit_request(application varchar2 --模組
,program varchar2 --應用程式簡稱
,description varchar2 --請求說明(非必填)
,start_time varchar2 --RUN 時間(非必填)
,sub_request boolean --立刻提交請求 (FALSE)
,argument1 varchar2 --參數1
,argument2 varchar2 --參數2
,argument3 varchar2 --參數3
,argument4 varchar2 --參數4
,argument5 varchar2 --參數5
.......
,argument100 varchar2);
2. PDF報表
除了使用fnd_request.submit_request來Submit Report之外,
在前面還需要增加一行:
XML_LAYOUT := FND_REQUEST.ADD_LAYOUT(application varchar2 --模組
,program varchar2 --應用程式簡稱
,file language varchar2 --語言縮寫(ISO Value): 'en'
,file territory varchar2 --語系縮寫(ISO Value): 'US'
,output format varchar2 --輸出格式: 'PDF');
3. 最後, 還需要加一段 DO_KEY('COMMIT_FORM'); 喔~~
注意 : 不是每個 Form 都可以修改 Default Where, 特別是有 Query Form 的, 它的 Where 組成是寫在按下 Button 時動態產生, 那 Personalize 寫的會被蓋掉而沒有產生效果
- Example Form : Receipt (RCVRCERC)
Type : Property
Object Type : Block
Target Object : RCV_TRANSACTION
Property Name : DEFAULT_WHERE
Value : NVL(RCV_ENTER_RECEIPTS_V.Outside_operation_flag,'N') = 'N'
注意1 : 需確認標準 Form 所設定的 LOV Name 是什麼, 一般來說, 開 Form 起來看是最準的
注意2 : SQL 也最好是基於標準的 LOV SQL 下去改, 出錯的機率比較低
注意3 : 只能變動 LOV 的資料, 不能變動欄位順序或增減欄位
Example : Change Order Type LOV
Seq : 1
Type : Builtin
Builtin : Create Record Group from Query
Argument :
SELECT A.ORDER_TYPE_ID
, A.NAME
, A.DESCRIPTION
FROM OE_ORDER_TYPES_V A
WHERE TRUNC ( SYSDATE ) BETWEEN TRUNC ( A.START_DATE_ACTIVE ) AND NVL ( TRUNC ( A.END_DATE_ACTIVE ), TRUNC ( SYSDATE ))
AND A.ORDER_CATEGORY_CODE IN ( 'RETURN', 'MIXED' )
ORDER BY A.NAME
Group Name : U_ORDER_TYPE
Seq : 2
Type : Property
Object Type : LOV
Target Object : ORDER_TYPE
Property Name : GROUP_NAME
Value : U_ORDER_TYPE
- 設定 Menu
1. Condition:
Trigger Event : SPECIAL43 (數字自行選擇)
Actions:
Type : Builtin
Builtin Type : Launch a Function
Function Code : XXX (寫在 Application 註冊的Function Code)
Function Name : YYY (寫在 Application 註冊的Function Name)
Parameters : =' DELIVERY_ID = ' || ${item.dlvy.delivery_id.value} || ' ORGANIZATION_ID = ' || ${item.dlvy.organization_id.value} (寫該 Function 必須的參數值)
2. Condition:
Trigger Event : WHEN-NEW-FORM-INSTANCE
Actions:
Type : Menu
Menu Entry : SPECIAL43
Menu Label : ZZZ (在 Form 的選單呈現的字串)
Render line before menu : No (勾選的話, 這個 Menu 前面會有分隔線)
Enabled in Block(s) : DLVY
(Example Form : WSHFSTRX)
Type : Message
Message Type : Error
Message Value : ='Delivery# ' || ${item.dlvy.name.value}
* 可使用SQL字串相加的方式, 把 Form 上的變數傳進 Message 中, 讓 Message 的效果更好
* 若使用 Error Message, 順序在此之後的 Actions 不會被執行到, 要特別小心
Actual Example
- Delivery Group
因為標準的 Delivery Group Rule 只會考慮 Ship Information, 所以我們用了以下操作方式來做控制 :
1. 後端 Pick / Ship 人員只能看到 Firm 的 Delivery
2. 寫 Function 做其他條件的 Group
3. 在 OM User 要做 Firm 時做檢查
Condition :
Trigger Event : WHEN-NEW-RECORD-INSTANCE
Trigger Object : DLVY
Condition : :DLVY.STATUS_CODE='OP' AND :DLVY.PLANNED_FLAG='N' AND U_OM_COUNT_DELIVERY_DETAILS(:DLVY.NAME) > 1
Actions :
Seq : 1
Type : Property
Object Type : Item
Target Object : DLVY_BUTTONS.GO
Property Name : DISPLAYED (APPLICATIONS COVER)
Value : False
Seq : 2
Type : Message
Message Type : Error
Message Value : ='Delivery# ' || ${item.dlvy.name.value} || ' 不能被 Firm, 原因...........'
當然還有另外一段是做反向控制, 這在寫 Personalize 的時候也是一定要考慮到的, 也可以說是寫"還原動作"
如前一篇所說, Actions 是整個 Personalize 的精華, 能夠做的事很多又雜, 目前用到的應該不到一半吧
也因為功能太多, 不知道該怎麼整理起, 所以改用範例做為主題, 只寫出 Actions 的部份, 這樣應該會比較清楚.........吧
(Example Form : OEXOEORD)
Type : Property
Object Type : Line
Target Object : LINE.ORDERED_QUANTITY
Property Name : ENABLED (APPLICATIONS COVER)
Value : FALSE
- 欄位不允許修改 (Example Form : OEXOEORD)
Type : Property
Object Type : Line
Target Object : LINE.ORDERED_QUANTITY
Property Name : UPDATE_ALLOWED
Value : FALSE
- 欄位不可見 (Example Form : OEXOEORD)
Type : Property
Object Type : Line
Target Object : LINE.ORDERED_QUANTITY
Property Name : DISPLAYED (APPLICATIONS COVER)
Value : FALSE
- 欄位變必填 (Example Form : OEXOEORD)
Type : Property
Object Type : Line
Target Object : LINE.ORDERED_QUANTITY
Property Name : REQUIRED (APPLICATIONS COVER)
Value : TRUE
- 修改欄位 Prompt (Example Form : OEXOEORD) => 部份 Form 可用 Folder 達成
Type : Property
Object Type : Line
Target Object : LINE.ORDERED_QUANTITY
Property Name : PROMPT_TEXT
Value : Qty
- Block 不可 Update (Example Form : OEXOEORD)
Type : Property
Object Type : Block
Target Object : ORDER
Property Name : UPDATE_ALLOWED
Value : FALSE
在很多時候, Oracle 標準 Form 很難滿足我們的需要, 最常遇到的就是權限控制, 好比說 Receipt, 在同一個畫面可以收 PO, 也可以收 RMA, 如果對公司而言, 這兩種收料是分屬於不同的單位, 那一定要對標準 Receipt 畫面做客製.
當然, 你也可以客製 Oracle Form, 但是客製標準畫面還是最後的選擇, 這時候 Personalize 就是我們的好朋友
- 如何進入 Personalize 的編輯畫面
1. 開啟需要寫 Personalize 的 Form
2. 點選視窗上方的 Help > Diagnostics > Custom Code > Personalize
3. 輸入 Apps 的密碼
- 畫面解釋
*最上方
1. Function Name
2. Form Name
3. Debug Mode :
Off : 關閉 Debug Mode
Step-by-Step : 當所寫的 Custom Code 有問題, 可使用此模式偵錯
Show Debug Messages : 沒用過........
* 中間
1. Seq : 序號, 執行順序
2. Description : 寫給自己看的
3. Level :
Function : 只有在此 Function Name 生效
Form : 只是要這個 Form, 就算掛成不同的 Function 也會生效
4. Enabled : 生效與否
* 下方
1. Condition & Actions : 重點, 後面再說明
2. Context : 可設定要在什麼情況下生效
Industry / Site / Responsibility / User
1. Trigger Event : 觸發的事件, 當什麼情況發生時, 會啟動該 Custom Code, 需配合下方的 Trigger Object
WHEN-NEW-FORM-INSTANCE : 當 Form 開啟時, 無需指定 Trigger Object
WHEN-NEW-BLOCK-INSTANCE : 當進入 Trigger Object 指定的 Block 時觸發
WHEN-NEW-RECORD-INSTANCE : 當進入 Trigger Object 指定的 Record 時觸發
WHEN-NEW-ITEM-INSTANCE : 當進入 Trigger Object 指定的 Item 時觸發
WHEN-VALIDATE-RECORD : 當 Trigger Object 指定的 Block 存檔時觸發
MENU1~15 : 進階應用
SPECIAL1~45 : 進階應用
* 雖然在畫面上 Oracle 有註明 : You can enter additional event name. 但是也不是說加就加, 目前只有試出 WHEN-BUTTON-PRESSED, 而且限制很多, 所以, 可能看看就好......
2. Trigger Object : 觸發的物件, 可直接用 LOV 挑選
3. Condition : 當 Event 與 Object 觸發到時, 還可以在 Condition 多做判斷, 內容只需填寫 SQL 語法 WHERE 之後的部份. 如果需要用到畫面的欄位, 可使用下方的 Insert Item Value (只能選 Value) 或 Insert 'Get' Expression (可選擇多種的屬性). Condition 裡也可套用 SQL Function, 例如 :
Z_OM_PKG.ZOMR001_OQC_PASS(:DLVY.NAME)=1 AND Z_OM_PKG.ZOMR001_TRACKINGINFO_PASS(:DLVY.NAME)=1
4. Processing Mode : Not in Enter-Query Mode / Only in Enter-Query Mode / Both
5. Context : 設定只在哪些 Level 下生效. Level 有 : Industry / Site / Responsibility / User
- Actions
精華就在此, 開另外一篇寫好了