好久沒寫了, 一來是都在寫 API, 也分享不出個什麼東西, 二來是一個忙完就接下一個, 慢慢就懶得寫了 (廢話的一段)


需求是這樣的, 因為公司的 Routing 沒有使用 Primary Routing, 都是利用 Alternate Routing Name 跟 Release Form 上的 Process Name 做連接, 但, Oralce 的成本計算又一定要用 Primary Routing 來做, 所以, 現階段要的是, 系統要知道哪一個 Alternate Routing 才是真正的 Primary Routing, 之後如果要把 Resource 自動轉過去 Primary Routing 或什麼自動的功能就有個依據.

所以第一個想法是, 開彈性欄位只作用在 Primary Routing 中, Alternate Routing 看不到這個彈性欄位. 所以我們要在 Context Field Values 中, 不把欄位開在 Global Data Elements, 而是新增一行: Primary 與 Alternate.

又, 我不希望這個值是由 User 來決定的, 所以我們可以加上 Reference Field 的功能. Reference Field 可以指定畫面中的欄位作為 Context Value 的預設值, 甚至不能修改, 太完美了....嗎?

 

Reference Field: 可以設定以下五種方式的變數

  1. :Block.Item
  2. :Parameter.Name
  3. :SYSTEM.Name
  4. :$PROFILES$.Name
  5. :$FLEX$.???
  • Displayed: 是否要顯示 Context Field Prompt 欄位
  • Synchronize with Reference Field: 是否允許使用者修改 Context Field 的值 (Checked 為不能改, Unchecked 為可以改)

 

問題是, Primary 跟 Alternate Routing 的區別只在於 ALTERNATE_ROUTING_DESIGNATOR 這個欄位, 空值為 Primary, 有值為 Alternate. 既然是空值, 又怎麼可能設定在 Context Field Value List 裡呢? 更不幸的, 不能在 Reference Field 中下 DECODE / NVL 等語法.

所以, 就換個方式囉. Value Set 是一個比較可以彈性設定的 LOV, 那我們產生一個新的 Value Set, 這個 Value Set 只負責轉譯 Primary or Alternate 這件事

 

Value Set Name: XX_ROUTING_TRANSLATE

Validation Type: Table

Table Application: Bills of Material

Table Name: BOM_OPERATIONAL_ROUTINGS

Value: DECODE(ALTERNATE_ROUTING_DESIGNATOR, NULL, 'Primary', 'Alternate')

ID: DECODE(ALTERNATE_ROUTING_DESIGNATOR, NULL, 'PRIMARY', 'ALTERNATE') => 一定要有設定, 不然會選不到

Where/Order By: WHERE ROUTING_SEQUENCE_ID = :B_OP_RTGS.ROUTING_SEQUENCE_ID

 

然後把這個 Value Set 設在 Context Field 中的 Value Set 欄位. Compile 後, 每一筆 Routing 的 Context 就只會有一個值, 我覺得這也就變向的達到需求, 至少使用者沒辦法亂選一個不正確的值

 

Aloz 發表在 痞客邦 留言(0) 人氣()

一般在查詢模式下最常用的就是輸入特定資料來查詢, 好比說, 直接輸入訂單號碼, 不然就是用 % 來做 Like 查詢. 不過其實還有一些隱藏功能可以讓你的查詢更有彈性喔~

1. 此欄位資料為空值 (#IS NULL)
2. 此欄位資料不為空值 (#IS NOT NULL)
3. 此欄位資料大於某個數字 (#>XXXX)
4. 此欄位資料介於某兩個值之間 (#BETWEEN A and B)
5. IN 查詢 (#IN (A, B))

Aloz 發表在 痞客邦 留言(0) 人氣()

標準功能中, 其實已經提供了一個還蠻 OK 的上傳檔案功能, 只是預設的 Category 都沒有我們要用的 (例: Customer PO ... 等以供分類的), 我們要怎麼調整呢?

Aloz 發表在 痞客邦 留言(0) 人氣()

直接就貼 Sample Code 上來 (以 Update "Schedule Ship Date" 為例)

DECLARE
  L_USER_ID NUMBER;
  L_RESP_ID NUMBER;
  L_APPL_ID NUMBER;
  L_HEADER_REC_IN OE_ORDER_PUB.HEADER_REC_TYPE;
  L_LINE_TBL_IN OE_ORDER_PUB.LINE_TBL_TYPE;
  L_ACTION_REQUEST_TBL_IN OE_ORDER_PUB.REQUEST_TBL_TYPE;
  L_HEADER_REC_OUT OE_ORDER_PUB.HEADER_REC_TYPE;
  L_LINE_TBL_OUT OE_ORDER_PUB.LINE_TBL_TYPE;
  L_HEADER_VAL_REC_OUT OE_ORDER_PUB.HEADER_VAL_REC_TYPE;
  L_HEADER_ADJ_TBL_OUT OE_ORDER_PUB.HEADER_ADJ_TBL_TYPE;
  L_HEADER_ADJ_VAL_TBL_OUT OE_ORDER_PUB.HEADER_ADJ_VAL_TBL_TYPE;
  L_HEADER_PRICE_ATT_TBL_OUT OE_ORDER_PUB.HEADER_PRICE_ATT_TBL_TYPE;
  L_HEADER_ADJ_ATT_TBL_OUT OE_ORDER_PUB.HEADER_ADJ_ATT_TBL_TYPE;
  L_HEADER_ADJ_ASSOC_TBL_OUT OE_ORDER_PUB.HEADER_ADJ_ASSOC_TBL_TYPE;
  L_HEADER_SCREDIT_TBL_OUT OE_ORDER_PUB.HEADER_SCREDIT_TBL_TYPE;
  L_HEADER_SCREDIT_VAL_TBL_OUT OE_ORDER_PUB.HEADER_SCREDIT_VAL_TBL_TYPE;
  L_LINE_VAL_TBL_OUT OE_ORDER_PUB.LINE_VAL_TBL_TYPE;
  L_LINE_ADJ_TBL_OUT OE_ORDER_PUB.LINE_ADJ_TBL_TYPE;
  L_LINE_ADJ_VAL_TBL_OUT OE_ORDER_PUB.LINE_ADJ_VAL_TBL_TYPE;
  L_LINE_PRICE_ATT_TBL_OUT OE_ORDER_PUB.LINE_PRICE_ATT_TBL_TYPE;
  L_LINE_ADJ_ATT_TBL_OUT OE_ORDER_PUB.LINE_ADJ_ATT_TBL_TYPE;
  L_LINE_ADJ_ASSOC_TBL_OUT OE_ORDER_PUB.LINE_ADJ_ASSOC_TBL_TYPE;
  L_LINE_SCREDIT_TBL_OUT OE_ORDER_PUB.LINE_SCREDIT_TBL_TYPE;
  L_LINE_SCREDIT_VAL_TBL_OUT OE_ORDER_PUB.LINE_SCREDIT_VAL_TBL_TYPE;
  L_LOT_SERIAL_TBL_OUT OE_ORDER_PUB.LOT_SERIAL_TBL_TYPE;
  L_LOT_SERIAL_VAL_TBL_OUT OE_ORDER_PUB.LOT_SERIAL_VAL_TBL_TYPE;
  L_ACTION_REQUEST_TBL_OUT OE_ORDER_PUB.REQUEST_TBL_TYPE;
  L_CHR_PROGRAM_UNIT_NAME VARCHAR2 (100);
  L_CHR_RET_STATUS        VARCHAR2 (1000) := NULL;
  L_MSG_COUNT             NUMBER := 0;
  L_MSG_DATA              VARCHAR2 (2000);
  L_NUM_API_VERSION       NUMBER := 1.0;
  
  CURSOR C_SO_DETAILS IS
    SELECT  OH.HEADER_ID
          , OL.LINE_ID
          , OH.ORDER_NUMBER AS SO_NUMBER
          , MSI.SEGMENT1
          , OL.LINE_NUMBER || '.' || OL.SHIPMENT_NUMBER AS LINE
          , OL.INVENTORY_ITEM_ID
    FROM    OE_ORDER_HEADERS_ALL OH
          , OE_ORDER_LINES_ALL OL
          , MTL_SYSTEM_ITEMS MSI
    WHERE   0 = 0
    AND     OH.HEADER_ID = OL.HEADER_ID
    AND     OL.INVENTORY_ITEM_ID = MSI.INVENTORY_ITEM_ID
    AND     MSI.ORGANIZATION_ID = OL.SHIP_FROM_ORG_ID
    AND     OL.LINE_ID = 1
    ;
BEGIN
  SELECT  USER_ID 
  INTO    L_USER_ID 
  FROM    FND_USER 
  WHERE   USER_NAME = 'ABC'
  ;
  
  SELECT  RESPONSIBILITY_ID
        , APPLICATION_ID
  INTO    L_RESP_ID
        , L_APPL_ID
  FROM    FND_RESPONSIBILITY_VL
  WHERE   RESPONSIBILITY_NAME LIKE 'Order Management Super User'
  ;
  
  FND_GLOBAL.APPS_INITIALIZE (L_USER_ID, L_RESP_ID, L_APPL_ID);
  
  FOR ISO_REC IN C_SO_DETAILS LOOP
    L_LINE_TBL_IN (1) := OE_ORDER_PUB.G_MISS_LINE_REC;
    
    L_LINE_TBL_IN (1).LINE_ID := ISO_REC.LINE_ID;
    L_LINE_TBL_IN (1).SCHEDULE_SHIP_DATE := SYSDATE; --TO_DATE(ISO_REC.UPDATE_SSD,'DD-MON-RRRR HH24:MI:SS');
    L_LINE_TBL_IN (1).OPERATION := OE_GLOBALS.G_OPR_UPDATE;
    
    OE_MSG_PUB.DELETE_MSG;
    
    OE_ORDER_PUB.PROCESS_ORDER (
        P_API_VERSION_NUMBER => L_NUM_API_VERSION
      , P_INIT_MSG_LIST => FND_API.G_FALSE
      , P_RETURN_VALUES => FND_API.G_FALSE
      , P_ACTION_COMMIT => FND_API.G_FALSE
      , P_LINE_TBL => L_LINE_TBL_IN
      , X_HEADER_REC => L_HEADER_REC_OUT
      , X_HEADER_VAL_REC => L_HEADER_VAL_REC_OUT
      , X_HEADER_ADJ_TBL => L_HEADER_ADJ_TBL_OUT
      , X_HEADER_ADJ_VAL_TBL => L_HEADER_ADJ_VAL_TBL_OUT
      , X_HEADER_PRICE_ATT_TBL => L_HEADER_PRICE_ATT_TBL_OUT
      , X_HEADER_ADJ_ATT_TBL => L_HEADER_ADJ_ATT_TBL_OUT
      , X_HEADER_ADJ_ASSOC_TBL => L_HEADER_ADJ_ASSOC_TBL_OUT
      , X_HEADER_SCREDIT_TBL => L_HEADER_SCREDIT_TBL_OUT
      , X_HEADER_SCREDIT_VAL_TBL => L_HEADER_SCREDIT_VAL_TBL_OUT
      , X_LINE_TBL => L_LINE_TBL_OUT
      , X_LINE_VAL_TBL => L_LINE_VAL_TBL_OUT
      , X_LINE_ADJ_TBL => L_LINE_ADJ_TBL_OUT
      , X_LINE_ADJ_VAL_TBL => L_LINE_ADJ_VAL_TBL_OUT
      , X_LINE_PRICE_ATT_TBL => L_LINE_PRICE_ATT_TBL_OUT
      , X_LINE_ADJ_ATT_TBL => L_LINE_ADJ_ATT_TBL_OUT
      , X_LINE_ADJ_ASSOC_TBL => L_LINE_ADJ_ASSOC_TBL_OUT
      , X_LINE_SCREDIT_TBL => L_LINE_SCREDIT_TBL_OUT
      , X_LINE_SCREDIT_VAL_TBL => L_LINE_SCREDIT_VAL_TBL_OUT
      , X_LOT_SERIAL_TBL => L_LOT_SERIAL_TBL_OUT
      , X_LOT_SERIAL_VAL_TBL => L_LOT_SERIAL_VAL_TBL_OUT
      , X_ACTION_REQUEST_TBL => L_ACTION_REQUEST_TBL_OUT
      , X_RETURN_STATUS => L_CHR_RET_STATUS
      , X_MSG_COUNT => L_MSG_COUNT
      , X_MSG_DATA => L_MSG_DATA
    );
    
    L_MSG_DATA := NULL;
    
    IF L_CHR_RET_STATUS <> 'S' THEN
      FOR IINDX IN 1 .. L_MSG_COUNT LOOP
        L_MSG_DATA := L_MSG_DATA || '  ' || OE_MSG_PUB.GET (IINDX);
      END LOOP;
    END IF;
    
    DBMS_OUTPUT.ENABLE (10000);
    DBMS_OUTPUT.PUT_LINE ('Sales Order => ' || ISO_REC.SO_NUMBER || ' - Line Number => ' || ISO_REC.LINE);
    DBMS_OUTPUT.PUT_LINE ('Return Status: ' || L_CHR_RET_STATUS);
    DBMS_OUTPUT.PUT_LINE ('Error Message: ' || L_MSG_DATA);
  END LOOP;
  
  COMMIT;
END;

Aloz 發表在 痞客邦 留言(1) 人氣()

因為需求, 使用者需要可以針對特定客戶做 Credit Hold, 就算開客戶的信用額度是足夠的情況下, 都要被 Hold 住

Oracle 本身就有提供這樣的功能, 在客戶主檔的 Account Profile 中, "Credit Hold" 這個選項就是

這個功能其實就是幫你產生一筆 Order Hold Source 資料, 所以在使用者打單時會就依照條件而自動 Hold 住

雖然知道有這功能, 在跟使用者講之前還是習慣地來測一下, 結果發現不 Work!! 把選項勾起來也不會被 Hold 住, Order Hold Source 也沒資料

當機立斷就發信到 Oracle Support, 經過好幾個星期的確認, 終於發現問題了

Aloz 發表在 痞客邦 留言(0) 人氣()

今天試著新增一個員工帳號, 步驟如下:

1. 輸入帳號

2. 輸入預設密碼 x 2

3. 選擇 Employee

4. 存檔

5. 到 "Direct Responsibilities" 頁面選擇一 Responsibility (這邊我選擇 HR Foundation)

6. 再存檔

結果卻跳出 ORA-20002 [WF_NO_USER] NAME=XXX ORIG_SYSTEM=NULL ORIG_SYSTEM_ID=NULL has been detected in FND_USER_RESP_GROUPS_API.INSERT_ASSIGNMENT 的錯誤

Aloz 發表在 痞客邦 留言(0) 人氣()

這幾天在研究是否可以在客製 Table 上利用 DB Trigger 直接呼叫標準 API 來用. 雖然, 可以用 Concurrent Program 來做, 了不起就排個一分鐘一次, 可是呢, 總是覺得 "一分鐘" 還是有個時間差, 而且交易量不大, 用排程的方式會造成很大量的時間都是浪費沒有交易的, 反而變成對 Server 是一個 Loading, 所以, 如果可以在當資料進來時, "馬上" 執行對應的處理程序, 不是很好嗎 :)

Aloz 發表在 痞客邦 留言(2) 人氣()

調整三個 Profile 的設定 (建議是 by User Level, 或是有特定的 Responsibility)

 

FND: Personalization Region Link Enabled : Yes

Personalize Self-Service Defn : Yes

Disable Self-Service Personal : No

 

Aloz 發表在 痞客邦 留言(0) 人氣()

最近研究了一下 Pick Release 的做法, 總覺得, 標準畫面上有很多設定跟功能可以選擇, 為什麼用 API 就不行呢? 原來有新的做法呢!

Aloz 發表在 痞客邦 留言(0) 人氣()

最近都在做 IR/ISO Automation 的程式, 因為 Pick Release 很難去要求系統 Pick 到指定的 Lot (就目前的了解, 最多就是指定到 Subinv. 與 Locator, 如果裡面有多筆資料, 就沒辦法了), 所以就來做 Item Reservation 吧...

Aloz 發表在 痞客邦 留言(0) 人氣()

Close

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

reload

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼