什麼是 Oracle Fusion 呢?我想 Google 一下或是去 Oracle 官網就會有很多漂亮的解釋,我就不複製貼上了。

對我個人來說,Oralce Fusion 就是 Oracle 的 Future (未來),Oracle 最終會把 EBS (也就目前的 E-Business Suite) 的客戶,都轉移到 Fusion 上。

雖然 Oracle 在去年 (2015) 的 Oracle Open World 上,還是有承諾 EBS 在五年內 (2020 前) 還是會持續的維護或進版 (除了目前的 12.2,餅已經畫到 12.5 了呢!),但 Oracle 把很多的新產品都只放在 Fusion,目的就已經夠明顯了。

目前雖然有一些 Oracle 客戶已經慢慢地開始使用 Fusion (像我公司),但是也都不太敢全盤使用,大多是挑一下可以獨立運作的模組,例如:HRMS、GL,來試用看看。

, , , ,

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

Timestamp 的操作

1. 如果原始欄位只是 DATE 或是 DATETIME, 可手動加上時區, 變成 TIMESTAMP 後, 再轉換成其他 Timezone

SELECT TO_TIMESTAMP_TZ(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || ' -08:00', 'YYYY-MM-DD HH24:MI:SS TZH:TZM') AT TIME ZONE 'Asia/Taipei' FROM DUAL;

* -08:00 是手動加上的時區標籤, 就依伺服器的時間自行調整

** Asia/Taipei 是我想要看到的新時區, 這邊也可以放上 +08:00 這樣的表示方式


2. 如果原始欄位已經是 TIMESTAMP

SELECT CAST(CS.DATE_FROM AS TIMESTAMP) AT TIME ZONE 'Asia/Taipei' FROM DUAL

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

到美國不知不覺也快要一星期了, 雖然已經出差來過很多次, 但這次感覺特別深, 因為出差就是上班 / 吃飯 / 睡覺 / 買東西, 不論是多長的時間, 都是這樣渡過. 但這次, 一來是時間很長(一個多月後才把老婆小孩接來), 二來第一個星期要盡量把生活都安頓好, 所以算是又更深地了解美國的一切日常生活吧(?)

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

今天成本結帳時, 發現有一筆 Transaction 出現在 Uncosted Material/WSM, 因為這個基本上沒出現過, 所以去了 Matelink 研究了一下

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

有時, 在 Toad 跑一些 SQL 要放日期的變數值的時候, 會遇到日期格式的問題. 

比如, 我個人偏愛的格式是 2015-01-14, 這樣的格式在我家的系統是不行的, 所以我 SQL 寫成

DATE = '2015-01-14'

它會報錯 "ORA-01861: Literal Does Not Match Format String". 然後我就必須改寫成

DATE = TO_DATE('2015-01-14', 'YYYY-MM-DD')

今天發現一種作法, "或許" 可以省掉一點麻煩

DATE = FND_DATE.CANONICAL_TO_DATE('2015-01-14')

不過前題是你要記得這一大串 XD

 

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

How To Setup Password Security? (Doc. ID 564125.1)

Signon Password Failure Limit
The Signon Password Failure Limit profile option determines the maximum number of log in attempts before the user's account is disabled.
Users cannot see or update this profile option.
The internal name for this profile option is SIGNON_PASSWORD_FAILURE_LIMIT.

Signon Password Hard to Guess
The Signon Password Hard to Guess profile option sets rules for choosing passwords to ensure that they will be "hard to guess." A password is considered hard-to-guess if it follows these rules:
- The password contains at least one letter and at least one number.
- The password does not contain the user name.
- The password does not contain repeating characters.
Users can see but not update this profile option.
The internal name for this profile option is SIGNON_PASSWORD_HARD_TO_GUESS.

Signon Password Length
Signon Password Length sets the minimum length of an Applications signon password.
If no value is entered the minimum length defaults to 5.
Users can see but not update this profile option.
The internal name for this profile option is SIGNON_PASSWORD_LENGTH.

Signon Password No Reuse
This profile option specifies the number of days that a user must wait before being allowed to reuse a password.
Users can see but not update this profile option.
The internal name for this profile option is SIGNON_PASSWORD_NO_REUSE.

Signon Password Case
This profile option is not available from the beginning.
With 11i.ATG_PF.H RUP3 comes the system profile 'Password Case Option'
After 11i.ATG_PF.H.RUP4 this system profile option was renamed to 'Signon Password Case'.
There are two settings: 'Sensitive' and 'Insensitive'.
The default is 'Insensitive'.
Setting this profile option to 'Sensitive' will make the password case sensitive.
'Mixed' is no longer supported.

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

好久沒寫了, 一來是都在寫 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 發表在 痞客邦 PIXNET 留言(0) 人氣()

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

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

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

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

Aloz 發表在 痞客邦 PIXNET 留言(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 發表在 痞客邦 PIXNET 留言(1) 人氣()

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

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

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

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

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼