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最新序號
            );