摘要:在Oracle ERP系統中,提供了自動開票主程式的介面,方便使用者資料匯入,形成應收交易處理。在此文章中,我們提供一個自動開票匯入執行個體,以便您更加高效地瞭解AR模組中的自動開票介面匯入程式。
您可以使用“提交請求”視窗來提交自動開票匯入程式、主程式和清除程式。但是,您只能使用“運行自動開票”視窗來提交自動開票主程式和清除程式。主程式允許您運行多個自動開票執行個體,以提高系統效能並更快速地匯入交易處理。
您可以運行自動開票清除程式,以刪除由自動開票匯入程式處理並成功傳送至應收款管理系統的介面行。如果“系統選項”視窗中的“清除介面表”選項設定為“是”,則不必運行此程式。在這種情況下,應收款管理系統會在您運行自動開票之後自動刪除介面行。
應收款管理系統使用以下表,臨時儲存由其它系統傳送的資料:
RA_INTERFACE_LINES_ALL
RA_INTERFACE_SALESCREDITS_ALL
RA_INTERFACE_DISTRIBUTIONS_ALL
“自動開票”使用第四個表 RA_INTERFACE_ERRORS_ALL,儲存未通過驗證的介面資料資訊。有關這些表的詳情,請參閱Oracle的使用者手冊。
1. 自動開票介面匯入執行個體簡介
2. 在系統中進行相關設定
步驟1:定義一個外部業務來源(Transaction Source)
如果要使用手工編號,請不要選擇‘自動編號’選項;修改’客戶資訊’ 中如下項: 採購客戶,收單客戶, 收單地址, 設定成’值’而非’標識’。
步驟2:定義一個應收系統中的描述性彈性域---‘行交易處理彈性域’, (Line Transaction Flexfield),定義一個新的彈性域段, 定義其各段及段值集.
對應用於控制檔案:
INTERFACE_LINE_CONTEXT ---彈性域段
INTERFACE_LINE_ATTRIBUTE1 -----彈性域第一段
INTERFACE_LINE_ATTRIBUTE2 -----彈性域第二段
INTERFACE_LINE_ATTRIBUTE3 -----彈性域第三段
步驟3:定義自動開票行定序
您可以為使用“自動開票”匯入到應收款管理系統中的交易處理行定義發票行定序。“自動開票”在將所建立的交易處理歸組為發票、借項通知單和貸項通知單時,使用這些規則對交易處理行排序。您可以將行定序分配給每個分組規則。
步驟4:定義自動開票分組規則
定義自動開票用來將收入和貸項交易處理分組為發票、借項通知單和貸項通知單的分組規則。分組規則所指定的屬性必須與相同交易處理中顯示的行一致。
“ 自動開票”要求對“幣種代碼”和“收單客戶”交易處理屬性進行強制分組(每個發票僅允許其中一種屬性)。應收款管理系統會將這些要求的分組規則自動應用到您分配給分組規則的任何附加交易處理屬性中。交易處理彈性域的所有屬性在分組規則中均可選,您可以在“分組規則”視窗中將這些屬性作為可選分組特性進行分配。
圖2 分組規則詳解
3. 定製資料來源檔案模板(Data.csv)
為了讓SQL*Loader程式準確上傳外部檔案中的資料,我們需要將外部檔案的資料應與SQL*Loader檔案中的欄位一一對應。
4. 開發主機並發程式(ARIMPORT.prog)
主機並發程式使用作業系統的 Script 程式進行編寫。主要目的是用來調用“資料匯入程式”。“資料匯入程式”的目的是將外部資料來源資料(如:csv文檔、txt文檔)自動匯入的介面表(RA_INTERFACE_LINES_ALL)中。
圖4 Oracle中的主機程式
//主機程式碼 ################################################################################### # Filename : ARIMPORT.prog ################################################################################### PROGRAM_NAME=`basename $0` PROGRAM_NAME=`basename $PROGRAM_NAME .prog` START_TIME=`date +%d-%b-%Y" "%H:%M` echo $PROGRAM_NAME " begin .... " $START_TIME DATENOW=`date +%Y%m%d` USER_PASSWD=$1 VAR_USER_ID=$2 VAR_USER_NAME=$3 VAR_REQUEST_ID=$4 OUT_FILE=`echo $APPLCSF/$APPLOUT/o$VAR_REQUEST_ID.out` LOCAL_PATH=$AR_TOP/data CTL_FILE_NAME=`echo $LOCAL_PATH/"arcontrol.ctl"` DATA_FILE_NAME=`echo $LOCAL_PATH/"data.csv"` CTL_FILE_LOG=`echo $LOCAL_PATH"/"data"$DATENOW".log"` #echo $CTL_FILE_NAME #echo $DATA_FILE_NAME #echo $CTL_FILE_LOG ##########sqlldr########## cd $LOCAL_PATH #$ORACLE_HOME/bin/sqlldr $USER_PASSWD control=$CTL_FILE_NAME log=$CTL_FILE_LOG $ORACLE_HOME/bin/sqlldr $USER_PASSWD control=arcontrol.ctl log=$CTL_FILE_LOG cat $CTL_FILE_LOG >> $OUT_FILE ##########update interface data########## sqlplus -s $USER_PASSWD @$AR_TOP/sql/ARIMPORT_UPD.sql { printf("hello, world/n"); }
5. 開發SQL*Loader程式(ARCONTROL.ctl)
開發資料匯入程式的目的是,通過被主機程式調用,從而自動將外部資料(如:txt檔案、CSV檔案)匯入至Oracle AR模組的介面表。
//SQL*Loader程式 LOAD DATA INFILE 'data.csv' REPLACE INTO TABLE AR.RA_INTERFACE_LINES_ALL FIELDS TERMINATED BY ',' optionally enclosed by '"' ( TRX_NUMBER CHAR(20) "trim(:TRX_NUMBER)", TRX_DATE DATE 'YYYY-MM-DD' , CURRENCY_CODE CHAR(15) "trim(:CURRENCY_CODE)", CUST_TRX_TYPE_NAME CHAR(20) "trim(:CUST_TRX_TYPE_NAME)", GL_DATE DATE 'YYYY-MM-DD', ORIG_SYSTEM_BILL_CUSTOMER_REF CHAR(240) "trim(:ORIG_SYSTEM_BILL_CUSTOMER_REF)", TERM_NAME CHAR(15) "trim(:TERM_NAME)", LINE_NUMBER , DESCRIPTION CHAR(240), QUANTITY , UNIT_SELLING_PRICE , BATCH_SOURCE_NAME CHAR(50), SET_OF_BOOKS_ID , LINE_TYPE CHAR(20) "trim(:LINE_TYPE)", CONVERSION_TYPE CHAR(30) "trim(:CONVERSION_TYPE)" )
6. 開發SQL指令碼(ARIMPORT_UPD.sql)
為了讓使用者更方便地使用模板檔案,我們在主機程式中,嵌入了一段SQL指令碼,此段SQL的指令碼目的是,通過使用者輸入的一些資訊,自動從Oracle資料庫中找到想對應的資訊。比如在模組檔案中,使用者要輸入“客戶名稱”,而在Oracle系統的介面表中要求填入客戶的標示(orig_system_bill_customer_ref)。而對於使用者來說,客戶標示是透明的,故開發此段程式,以使得使用者模板更加友好。
//SQL指令碼 declare begin update ra_interface_lines_all iall set iall.conversion_type = substr(iall.conversion_type,1,9); commit; update ra_interface_lines_all iall set iall.orig_system_bill_customer_ref = (select a.customer_id from ar_customers_v a where a.customer_name = iall.orig_system_bill_customer_ref ), iall.orig_system_bill_address_ref = (select b.address_id from ar_customers_v a ,ar_addresses_v b where a.customer_name = iall.orig_system_bill_customer_ref and a.customer_id = b.customer_id ); update ra_interface_lines_all t set t.interface_line_context = '外部匯入', t.interface_line_attribute1 = 'INTERFACE', t.interface_line_attribute2 = t.trx_number, t.interface_line_attribute3 = t.line_number, t.amount = t.quantity * t.unit_selling_price, t.memo_line_name = t.description, t.conversion_date = gl_date, t.org_id = 81; update ra_interface_lines_all uila set uila.conversion_type = 'User', uila.conversion_date = uila.gl_date, uila.conversion_rate = 1 where uila.currency_code = 'CNY'; commit; exception when others then rollback; end; / exit;