2015年12月28日 星期一

Oracle EBS: SO已book, 但無對應的workflow

Oracle EBS: SO已book, 但無對應的workflow

狀況:

1.Bill-only的SO, header已是Booked
2.在7個line中, 前6個line都已是Closed, 但第7個line仍是Booked
3.查看line 7的workflow, 完全沒有activities項目

查了metalink, 是bug, 因資料有問題所以沒有workflow:

  Sales Order Line Error: No Workflow Background Process For Line (Doc ID 2013487.1)

  Sales Order Lines in 'booked' Status with Missing Workflow Assignment. (Doc ID 861908.1)

要create SR才能取得datafix script.

想到的笨方法是新增line 8, 並cancel line 7, 但還是想試試workflow.

對workflow table沒這麼熟, 想補資料也不知怎麼補.

土法煉鋼, 找了wf_engine中看起來派得上用場的procedure逐一嘗試.

  StartProcess: 出現訊息提示已有相同資料
  CreateProcess: 出現訊息提示已有相同資料
  LauchProcess: 似乎沒用, workflow還是沒有activities
  ResumeProcess: 似乎沒用, workflow還是沒有activities

看起來殘念了, 時間已晚, 預計隔天找user確認後用笨方法.

第二天, 有人說line 7已經close並拋AR, 什麼狀況?

或許是先前執行的procedure有產生影響, 待特定程式執行後才有後續的資料. 目前也只能猜想了.

REF:
--------------------
itemtype: OEOL
itemkey:  1371397
user_key: Return Order 702000355, Line 7.1..

begin
 wf_engine.StartProcess('OEOL' , --itemtype in varchar2,
                       1371397   --itemkey  in varchar2
                       );

end;                     

begin
 wf_engine.CreateProcess('OEOL',  --itemtype in varchar2,
               1371397,  --1         itemkey  in varchar2,
               'Line Flow - Return for Credit Only',--         process  in varchar2,
               'Return Order 702000355, Line 7.1..', --         user_key in varchar2,
               'XX01899' );        -- owner_role in varchar2)
                      
end;

begin
 wf_engine.launchProcess('OEOL',  --itemtype in varchar2,
               1371397,  --1         itemkey  in varchar2,
               'Line Flow - Return for Credit Only',--         process  in varchar2,
               'Return Order 702000355, Line 7.1..', --         user_key in varchar2,
               'XX01899' );        -- owner_role in varchar2)
                       
end;


begin
wf_engine.ResumeProcess('OEOL',  --itemtype in varchar2,
                        '1371397', --itemkey  in varchar2,
                        'Line Flow - Return for Credit Only') ; --process  in varchar2)
end;



2015年12月16日 星期三

Oracle SQL: 檢查email欄位是否有異常字元

緣起: 因email結尾異常字元的A0, 造成發信程式一直running不會結束, 但怎麼都試不出來user是怎麼把這A0放進去的.

想法1: 寫function檢查ASCII code

想法2: 用replace取代字串中正常字元, 判斷是否還有非正常字元殘留

想法3: 用translate取代字串中正常字元, 判斷是否還有非正常字元殘留

這都有不夠單純精簡的問題.

最後是以regular expression function來作:


select nvl(length(regexp_replace(x_email_address,'[a-zA-Z0-9@,.]','')),0)
  from dual

當長度不為0時, 就是有異常字元了.

允許逗號是因為資料中有以逗號分隔多個email address, 如果只會放單一email, 把逗號排除、不作為取代項目即可. 若有其他字元(例如破折號 - 或底線 _ )要視為正常, 就再加進列表中.

完成~

2015年12月14日 星期一

Oracle EBS: GL Calendar period type原先設定13期, 下年度可否改為16期

依畫面上的設定功能, 不能改.

依Oracle所提供資訊, 不能改.

如果硬改底層table, 或許有機會實現, 但不知會有什麼後遺症, 還是不要亂賭.

Ref:
1.How to Change The Calendar Period Types From Monthly to 4-4-5 (Doc ID 158699.1)
2.How to Add an Adjusting Period to an Existing Year (Doc ID 158887.1)


Oracle SQL: 把只有小數的數字轉為文字並補上0之作法

直接使用to_char時, 整數位的0不會帶出:

  select to_char(0.123) from dual


單純版, 缺點是整數位只能到個位數, 小數位數只能有3位:

  select to_char(0.123, '0.999') from dual


進階版:

  select rtrim(trim(to_char(12320.123,'9999999990.9999')),'0') from dual

多了rtrim和trim, 用來處理前置的多餘空白和結尾的0.

針對只有整數時, 會多個結尾的點號, 再加個rtrim:

  select rtrim(rtrim(trim(to_char(12320,'9999999990.9999')),'0'),'.') from dual

大功告成.