来源:it168
在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:定义自动开票分组规则
定义自动开票用来将收入和贷项事务处理分组为发票、借项通知单和贷项通知单的分组规则。分组规则所指定的属性必须与相同事务处理中显示的行一致。
“自动开票”要求对“币种代码”和“收单客户”事务处理属性进行强制分组(每个发票仅允许其中一种属性)。应收款管理系统会将这些要求的分组规则自动应用到您分配给分组规则的任何附加事务处理属性中。事务处理弹性域的所有属性在分组规则中均可选,您可以在“分组规则”窗口中将这些属性作为可选分组特性进行分配。
3. 定制数据源文件模板(Data.csv)
为了让SQL*Loader程序准确上载外部文件中的数据,我们需要将外部文件的数据应与SQL*Loader文件中的字段一一对应。
4. 开发主机并发程序(ARIMPORT.prog)
主机并发程序使用操作系统的 Script 程序进行编写。主要目的是用来调用“数据导入程序”。“数据导入程序”的目的是将外部数据源数据(如:csv文档、txt文档)自动导入的接口表(RA_INTERFACE_LINES_ALL)中。
//主机程序代码
# 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;