2015年2月3日 星期二

Upload CSV file Insert to Table [ Data Type = Blob ]

哈哈哈哈, 終於找到在Oracle ERP 裡面上傳檔案的方案


我討厭 SQL Loader...因為這樣子使用者要知道格式, 再將檔案放到特定的位置
而且有問題, 還要看得懂Log檔

實在是太麻煩了

參考網址: http://lyhpcha.blogspot.tw/2012/06/oracle-erp.html

寫到讀取上傳檔案的方法 ( Data Type = Blob)

declare
     tempdata        varchar2(32767);
     li_pos             INTEGER  := 0;
     li_old_pos       INTEGER  := 0;
begin

loop
    tempdata :='';
    --chr(10)換行符號,li_pos為符合的字串長度,
    -- (li_old_pos +1)開始位置,1為符合chr(10)的第一筆資料
    --存在Blob欄位的資料是連續的raw字元
    --下列SQL會取出文字檔一行的資料,因為每一行是以斷行chr(10)做為分行
    select dbms_lob.instr(file_data, utl_raw.cast_to_raw(chr(10)),li_old_pos+1,1)
      into li_pos      --取出的資料格式是raw類型,不是一般的文字格式。
      from fnd_lobs
     where file_id = P04_FILE_ID;  --指定File_id
                  
 exit when li_pos = 0 ;  -- no more data            
      
    begin
    --取出指定字串,(li_pos - li_old_pos-1) 字串長度,(li_old_pos +1) 開始的位置                 
    select utl_raw.cast_to_varchar2(
              dbms_lob.substr(file_data, (li_pos - li_old_pos-1), li_old_pos +1))
      into  tempdata
      from  fnd_lobs
     where file_id = P04_FILE_ID;  --指定File_id
     end;
     
     -- 讀取出來的資料動態組成我要的內容       
     V01_SQL := 'begin insert into table_name(Col01, Col02) values(''' || replace(replace(replace(tempdata, chr(13), ''), ',', ''','), chr(10), '); end;';
      
      -- 若有問題, 可以在 log file 看到insert 語法
      fnd_file.put_line(fnd_file.log,V01_SQL);

      -- 執行動態組合的語法
      execute immediate V01_SQL;
           
      li_old_pos := li_pos;  -- pos of a file
  end loop;

Form - Button - When-button-pressed

FUNCTION UPLOAD_CSV_FILE RETURN NUMBER IS
  ACCESS_ID     NUMBER;
  L_SERVER_URL  VARCHAR2 (255);
  L_URL         VARCHAR2 (255);
  FLE_GFM_ID    NUMBER;
  BUTTON_CHOICE NUMBER;
BEGIN
-- Get process ID
ACCESS_ID := FND_GFM.AUTHORIZE (NULL);

-- Get web server address
FND_PROFILE.GET ('APPS_WEB_AGENT', L_SERVER_URL);

-- Call web page - web 顯示: Package: FND_FILE_UPLOAD

L_URL := RTRIM (L_SERVER_URL, '/')|| '/fnd_file_upload.displayGFMform?access_id='
                                  || TO_CHAR(ACCESS_ID)
                                  || CHR(38)
                                  || 'l_server_url='
                                  || L_SERVER_URL;

IF (L_URL IS NULL) THEN
  RAISE FORM_TRIGGER_FAILURE;
END IF;

 FND_MESSAGE.DEBUG('web: '||L_URL);

-- Open web page
FND_UTILITIES.OPEN_URL(L_URL);

-- This action is waiting for user select file, and check upload
--設定提示視窗,用來決定是否完成上傳的動作
FND_MESSAGE.SET_NAME('FND', 'ATCHMT-FILE-UPLOAD-COMPLETE');

BUTTON_CHOICE := FND_MESSAGE.QUESTION (BUTTON1 => 'YES'
, BUTTON2 => NULL
, BUTTON3 => 'NO'
, DEFAULT_BTN => 1
, CANCEL_BTN => 3
, ICON => 'question'
);

-- Get file ID
FLE_GFM_ID := FND_GFM.GET_FILE_ID (ACCESS_ID);

IF FLE_GFM_ID IS NOT NULL AND FLE_GFM_ID > 0 THEN
  IF BUTTON_CHOICE = 1 THEN
     RETURN FLE_GFM_ID; -- File is selected and upload
  ELSE
     RETURN 0; -- File is selected but not upload
  END IF;

ELSE
  RETURN -1; -- File is not selected
END IF;

END YL_OPEN_FILE;

[ Package] FND_FILE_UPLOAD.DisplayGFMForm 這裡就是生成 Upload File 的 Web

原本ERP的網址, 會長成以下的樣子
http://erpap.xxxxx.com:8001/pls/TEST/fnd_file_upload.displayGFMform?access_id=7088649330&l_server_url=http://erpap.xxxxx.com:8001/pls/TEST



2015年1月28日 星期三

FRM-47023: no SUCH PARAMETER NAMED G_QUERY_FIND exists in form FORM_Name



在客製 FORM 或是由Standard Form 利用Zoom 的方式呼叫 另一個Form 時
若是發生  "FRM-47023: no SUCH PARAMETER NAMED G_QUERY_FIND exists in form FORM_Name"



由於已經成功的用Zoom的方式, 呼叫另一個FORM, 但呼叫另一個FORM的時候, 發現出現上面的訊息, 非常的火大而且不甘心, 強烈的懷疑,可能是一開始或是後來有修改的人, 動到了Reference !! 所以......直接砍掉重練, 將一個正常可以呼叫而且確定Reference正常的form 拿來做Template, 然後重新搬 Window / Canvas / Radio Group / LOV / Program Unit / Form-Level - Trigger / Block 檢查內容後, 重新 Compile 證明, 我的懷疑沒有錯, 真的是這樣子




2015年1月15日 星期四

[ GL ] ORACLE GL 模組 - 自動Journal Import 與 Reverse Journals

--========================================================
-- Journal Import,  Short Name: GLLEZL
--========================================================

-- 取得GL_JOURNAL_IMPORT_S Sequence最新序號
v_journal_import_id := GL_INTERFACE_CONTROL_PKG.GET_UNIQUE_RUN_ID;

GL_INTERFACE_CONTROL_PKG.INSERT_ROW(1, v_journal_import_id, ls_JE_SOURCE_NAME, FND_GLOBAL.CONC_REQUEST_ID, NULL);

-- submit Request

ln_req_id := fnd_request.submit_request
            ('SQLGL'
            ,'GLLEZL'
            ,'YLGLR113:--'  -- Request 顯示別名, 得知是那個Request丢出來的
            ,'',FALSE,
            ,TO_CHAR(v_journal_import_id), --GL_JOURNAL_IMPORT_S Sequence最新序號
            ,1 -- Set of Books ID
            ,'N'        -- Post errors to suspense
            ,NULL -- Start Date
            ,NULL -- End Date
            ,'N' -- Create Summary Journal
            ,'W' -- Import Descriptive Flexfields-- N:No W:With Validation
);

--========================================================
-- Reverse Journals,   Short Name: GLPREV
--========================================================
Dig dig dig
1: [ FORM ] GLXJEENT 
2: [ Program Unit] HEADER_REVERSE_PRIVATE_REVPD.accrual_rev_period_name
3: [ Program ]  gl_autoreverse_date_pkg.get_reversal_period_date(
              X_Sob_Id => gl_sob.sob_id,
              X_Je_Category => :HEADER.je_category,
              X_Je_Source => 'Manual',
              X_Je_Period_Name => :HEADER.period_name,
              X_Je_Date => :HEADER.default_effective_date,
              X_Reversal_Method => new_rev_method,
              X_Reversal_Period
                 => :HEADER.accrual_rev_period_name,
              X_Reversal_Date => new_rev_date);

4: accrual_rev_change_sign_flag
   設定 GL \ Setup \ Journal \ AutoReverse \ Method \

   Y= Swith Dr/Cr 借貸相反的回轉分錄
   N=Change Sign  借貸一致, 但以負數呈現
 


-- gl_je_headers.ACCRUAL_REV_STATUS = R 表示此分錄已回轉

       UPDATE gl_je_headers
          SET accrual_rev_flag             = 'Y'
             ,accrual_rev_period_name      = P03_GL_PERIOD
             ,accrual_rev_change_sign_flag = 'Y'
             ,accrual_rev_effective_date   = SYSDATE

        WHERE JE_HEADER_ID = I.JE_HEADER_ID;

-- SUBMIT Reverse Journals  
ln_req_id := fnd_request.submit_request
            ('SQLGL'
            ,'GLPREV'
            ,'YLGLR113:回轉'
            ,'',FALSE
            , TO_CHAR(V_JE_HEADER_ID) -- GL_JOURNAL_IMPORT_S Sequence最新序號
            );

2014年12月26日 星期五

[ FA ] Fixed Assets \ Assignment (APP-OFA-48240 / APP-OFA-47038 / APP-OFA-47661)

使用固定資產若當初AP轉入時有分割, 但產生過折舊後卻無法再合併(merge)
只是點選Assignment 之後, 再點進去看就出現Error

APP-OFA-48240: The units in FA_ASSET_HISTORY and FA_DISTRIBUTION_HISTORY and different





查詢FA \ Inquiry \ Transaction History 時會有多筆的錯誤


Run Depreciation Request has error


1) 檢查移轉的交易資料

畫面路徑: FA \ Inquiry \ Transaction History
TABLE 1: FA_DISTRIBUTION_HISTORY
TABLE 2:fa_transaction_headers.transaction_header_id
TABLE 3:fa_transfer_details.transf_header_id

2) 檢查累計折舊金額

畫面:FA \ Assets \ Asset Workbench \ books按鈕 \ Accumulated Depr (累計折舊)
TABLE: fa_deprn_summary.DEPRN_RESERVE
REPORT 

執行RUN Depreciation \ 完成後會有Request : Journal Entry Reserve Ledger Report 查詢各類資產的折舊與累計折舊金額
Report 


3) 檢查本期折舊金額(注意期間)

3.1 FA_DEPRN_DETAIL. COST / DEPRN_RESERVE 金額有誤
3.2 FA_DEPRN_SUMMARY. DEPRN_RESERVE 金額有誤
3.3 更新fa_adjustments. ADJUSTMENT_AMOUNT
update fa_adjustments set ADJUSTMENT_AMOUNT = 255 where asset_id = 100000963   and transaction_header_id = 7161   and adjustment_type = 'COST'

update fa_adjustments set ADJUSTMENT_AMOUNT = 235 where asset_id = 100000963   and transaction_header_id = 7161   and adjustment_type = 'RESERVE'

4) APP-OFA-47038: Error: An inactive distribution has a nonzero DEPRN_RESERVE balance: 978 -833

檢查LOG檔內的LOG 明細, DISTRIBUTION_ID帶入查詢

SELECT *
  FROM fa_adjustments
 WHERE DISTRIBUTION_ID = 978

5) APP-OFA-47661: Error: Unable to insert into FA_DEPRN_DETAIL table
檢查LOG檔內的LOG 明細, DISTRIBUTION_ID帶入查詢

SELECT H.DISTRIBUTION_ID
       ,ASSET_ID
       ,UNITS_ASSIGNED
       ,H.TRANSACTION_HEADER_ID_IN
       ,H.TRANSACTION_HEADER_ID_OUT
  FROM FA_DISTRIBUTION_HISTORY H
 WHERE DISTRIBUTION_ID IN (1098, 1099, 1100)

刪除錯誤或多餘的交易資料

delete fa_adjustments
 WHERE ASSET_ID IN (100000963)
   AND LAST_UPDATE_DATE >= TO_DATE('20141201','YYYYMMDD')
  and transaction_header_id  in (7154,7156)

 delete fa_transaction_headers
 where asset_id = 100000963
   and transaction_header_id in (7154, 7156)

delete fa_transfer_details


where transfer_header_id in (7154, 7156)

2014年10月6日 星期一

[ FORM ] 新增TOOLBAR

Document: Oracle Applications Developer’s Guide
File Name: 115devg.pdf

結果呈現


Form-Level: PRE-FORM

-- Toolbar
app_special.instantiate('SPECIAL1','&Book Order','bkord');


FORM-level: PRE-BLOCK
-- tool bar
app_special.enable('SPECIAL1',PROPERTY_ON);


BLOCK-level: user-named trigger





[ AP ] Void Payment 產生分錄借貸不平, Accounting fatal error - 含修改APXPAWKB.fmb bug

User 在Payment 輸入完成時還沒有點選存檔, 就發現Payment 日期錯誤, 點選Action Void 系統會帶入void datea & gl_date 為sysdate, 只要GL_date 小於payment date , void的payment  分錄就會產生不平, 而且在第一次的payment 分錄, 出現借貸金額不符, void payment 的分錄, 則出現分錄不全的狀況, 就要自己補分錄



Payment 沒有存檔, 就以系統日期或小於payment date 日期輸入時, 只會出現Caution 訊息

如果payment 存過檔或是重新查詢, 則會出現Error 錯誤訊息, 則要求必須在Payment GL Date 之後




User 於月底時執行 Request : Payables Accounting Process
有Error 在Request 不會出現, 只會顯示Complete......Orz

要自已點到View output 跟log 檔才會看到錯誤~


當Void Payment 時, 若GL_Date 小於Payment Date 時, 會產生借貸不平的分錄



如果User沒注意到accounting 的output內有Fatal Error, 又執行了
Request: Payables Transfer to General Ledger 然後再自動呼叫了Journal Import
在Journal Import 就會看到 總借貸金額不符
前方則會顯示有問題的Payment Invoice Number




解決方法:
說明
相關語法
1.           
找出有借貸不平的資料
未轉GL

select ae_line_id
       ,ae_header_id
       , entered_dr
       ,accounted_dr
       , entered_cr
       ,accounted_cr
       , reference1  -- supplier
       , reference3  -- ap_invoice_payments.invoice_payment_id 沖帳的
       , reference4  -- check number
  from ap_ae_lines_all
 where  (entered_dr <> accounted_dr
     or entered_cr <> accounted_cr)
  and currency_code = 'TWD'
2.           
更新分錄借貸金額不平ap_ae_lines_all
update ap_ae_lines_all
set entered_dr = 7848
where ae_line_id = 1682587

3.           
找出有借貸不平的資料
已轉GL

SELECT reference21  -- supplier
      , reference24  -- pay document no 47439
      , reference25  -- invoice no
      , entered_dr
      , entered_cr
      , accounted_dr
      , accounted_cr
      , je_header_id
      , je_line_num
 from gl_interface  T
where user_je_source_name = 'Payables'
  and status != 'P'
  and (entered_dr <> accounted_dr
     or entered_cr <> accounted_cr)
4.           
更新GL
update gl_interface
set entered_dr = 7848
where user_je_source_name = 'Payables'
  and status != 'P'
  and je_line_num = 3611

5.           
執行 Request: Payables Accounting Process

執行結束後,Void 的分錄會產生, 但分錄產生不完全
6.           
檢查分錄, 新增分錄
SELECT AIP.INVOICE_PAYMENT_ID  --ap_ae_lines_all.source_id
      ,AC.DOC_SEQUENCE_ID      --ap_ae_lines_all.subledger_doc_sequence_id
      ,AC.DOC_SEQUENCE_VALUE   --ap_ae_lines_all.subledger_doc_sequence_value
      ,AIP.AMOUNT
  FROM ap_invoice_payments AIP
      ,AP_CHECKS_ALL AC
 WHERE AIP.CHECK_ID = AC.CHECK_ID
   AND AC.CHECK_NUMBER = 47439  -- VOIDED CHECK NUMBER


insert into ap.ap_ae_lines_all
(ae_line_id,
 ae_header_id,
 ae_line_number,
 ae_line_type_code,
 code_combination_id,
 currency_code,
 entered_dr,
 accounted_dr,
 source_table,
 source_id,
 third_party_id,
 third_party_sub_id,
 subledger_doc_sequence_id,
 subledger_doc_sequence_value,
 org_id, creation_date, created_by,
 last_update_date,
 last_updated_by,
 last_update_login,
 program_update_date,
 program_application_id,
 program_id, request_id, reference1, reference2,
 reference3, reference4, reference5, reference6,
 reference7, reference9, reference10)
values
(ap_ae_lines_s.nextval,
 456350,  --ae_header_id
 5,  --ae_line_number
 'LIABILITY', --ae_line_type_code
 1365,  --code_combination_id
 'TWD', --currency_code
 3924,  --entered_dr
 3924,  --accounted_dr
 'AP_INVOICE_PAYMENTS', --source_table
 269069,  --source_id  ap_invoice_payments.invoice_payment_id –沖帳的INVOICE
 18579,  --third_party_id  = VENDER_ID
 18833,  --third_party_sub_id = VENDER SITE ID
 105,    --subledger_doc_sequence_id = AP_CHECK_ALL.DOC_SEQUENCE_ID -- VOID
 63699,  --subledger_doc_sequence_value
 82,    --org_id
 sysdate,  --creation_date
 4399,    --created_by
 sysdate, --last_update_date
 4399,   --last_updated_by
 4399, --last_update_login
 sysdate, --program_update_date
 200,    --program_application_id
 -1,    -- program_id
 -1,    --request_id
 'XXXX Vendor Name'-- reference1 
 57814-- reference2 AP_INVOICES.INVOICE_ID
 28379,  -- reference3 AP_CHECKS_ALL.CHECK_ID
 1894-- reference4 AP_CHECKS_ALL.CHECK_NUMBER
 ' 140924XXXXXX',  -- reference5 立費用的INVOICE NUMBER
 'AP Payments',  -- reference6
 1, -- reference7
 269069,  -- reference9 = source_id ap_invoice_payments.invoice_payment_id 沖帳的INVOICE
 'LIABILITY');  -- reference10

7.           
檢查/更新 voidcheck number 狀態
update ap_checks_all
set status_lookup_code = 'VOIDED'
where check_id = 24985

8.           
更新Error
update ap_ae_headers_all
set accounting_error_code = null
where ae_header_id = 79085

9.           
更新accounting 狀態
update ap_ae_headers_all
set accounting_error_code =  null
where ae_header_id = 456350

10.       
執行 Request: Payables Accounting Process
檢查View output
Fatal Error 不見
11.       
若已轉GL
重新執行 GL\Journals \ Import \ RUN



Fix FORM bug....

Program Unit: PAY_ACTIONS_VOID
if (event = 'INIT' and :PAY_ACTIONS.void = 'Y') then
--=========================================================
-- 防止發生void_date payment date , 而產生分錄不平
-- 修改系統預設值, VOID DATE = PAYMENT DATE
--============================================= by JIAMIN ==
       --
       -- :PAY_ACTIONS.void_date := sysdate;
     
      :PAY_ACTIONS.void_date := NVL(:PAY_SUM_FOLDER.CHECK_DATE  , sysdate);

Program Unit: pay_sum_folder_multi
elsif (action = 'PRE-VOID') then
  --======================================================================
  -- Verify that the user wishes to perform action
  --fnd_message.set_name('SQLAP', 'AP_PAY_MULTI_PAY_VOID');  -- 2014.10.03 
  --======================================================== BY JIAMIN ==

  IF :PAY_ACTIONS.VOID_DATE < :PAY_SUM_FOLDER.CHECK_DATE
     OR :PAY_ACTIONS.GL_DATE < :PAY_SUM_FOLDER.CHECK_DATE THEN
       
     Form_Utilities.Display_Failure_Message('AP_VOID_DATE_BEF_INVPAY_DATE',
                     'GL_DATE', app_date.date_to_chardate(:parameter.payment_max_gl_date));     

  END IF;