在一些企业,像京东、当当以及以及一些采购业务量大的企业,有客户向企业采购了货物,那么企业相应的会向生产商采购相应的货物,因此会有大量的采购付款业务。在采购付款量大的情况,仅仅靠手工处理,将是一个非常繁重的工作任务。在Oracle EBS中操作一个付款通常情况要点击至少10次鼠标才能完成,而且要操作熟练。本部分实例给出了如何让系统自动付款,这样可以大大的减轻用户的工作量。
===============================================================
我们淘宝店铺:https://shop108514483.taobao.com/
资料共享地址:https://pan.baidu.com/s/1PMWeRpUU0e12cYPt5UeUxg
需要进入Oracle/SAP ERP/EBS咨询顾问行业的朋友 请联系我们
QQ:2961704946 微信号:8399425
顾问成功之路的后台表研究中有详细的程序代码
===============================================================设计思路:1,首先需要一个付款数据导入的临时接口表xxx_ap_AutoPMTs_iFace,此表主要用于将用户整理好的付款导入数据存储在此接口表中,然后依据此表的数据进行付款的生成以及是付款和发票的关联;
2,从导入数据中整理付款数据,即将来需要创建付款的数据信息。需要一个临时表xxx_ap_AutoPMTs_selected来存储此信息。在本例中,我们举了两个例子,一种按照发票来进行自动付款,即需要的供应商、付款银行、付款金额以及给出需要付款的发票信息;另外一种是只给出需要进行付款供应商、付款银行账号、付款金额,系统自动挑选需要付款的发票信息。(本实例程序包:Ora_ERP.Admin.xxx_STD_AP_AutoPMTs_pkg.pck)
3,需要付款的发票信息整理,整理好发票信息,然后保存在临时表xxx_ap_AutoInvs_selected中。
4,在整理好付款数据,挑选出需要付款的发票信息后,可以进行付款并关联发票了。我们可以回顾一下系统标准的付款操作,首先是创建付款头信息,即选择付款的供应商,付款银行,金额,付款日期等信息,然后需要挑选出那些本次付款那些发票。在此过程中,后台主要需要更新三个表,ap_checks_all,ap_payment_history_all,ap_invoice_payments_all。其分别是生成付款信息,付款历史信息以及会计事件的记录和发票的关联,当然系统也会去更新发票的未付金额和状态,即ap_payment_schedules_all和ap_invoices_all中的相关字段。本部分拿两个实例进行举例,一个是可以进行部分付款(<=发票未付金额),另外一个是完全支付(=发票未付金额),即:将发票的剩余金额全部支付,其实也就是模拟从付款界面进行的付款和从发票界面进行的完全支付。但是部分支付功能可以将发票剩余未付金额进行全部支付,但完全支付则只能将发票剩余未付金额全部付款完。
5,主程序调用和程序包运行情况。
/*===========================================================
---- Procedure Name: xxxMain()
---- The Main Procedure Of This pkg.
=============================================================*/
Procedure xxxMain(P_Suc_Flag Out Varchar2,
P_Suc_Log Out Varchar2,
P_Org_ID in Number,
P_TPName in varchar2,
P_PMT_Mode in varchar2,
P_FULLPMT_Flag in varchar2Default P_FULLPMT_DFlag) is
L_Suc_Log varchar2(32000);
L_Suc_Flag varchar2(2);
x_Request_ID Number;
L_Org_ID Number :=P_Org_ID;
L_TPName varchar2(7) :=P_TPName;
L_Period_Opening Number;
L_Start_Date Date;
L_End_Date Date;
L_Batch_ID Number;
L_PMT_Mode varchar2(4) :=P_PMT_Mode;
L_FULLPMT_Flag varchar2(4) :=P_FULLPMT_Flag;
Cursor xx_AccountingDate(P_Org_ID in Number) is
select *
from xxx_ap_AutoPMTs_iFace xxx
where xxx.imported_status = 'I'
and xxx.org_id = P_Org_ID
For Update Of xxx.pmt_date;
Begin
---- ---- ---- ---- Get the Org_ID
if L_Org_ID is Null Or L_Org_ID <> fnd_global.Org_ID Then
L_Org_ID := fnd_global.Org_ID;
End If;
if L_Org_ID is Null Then
Print_Output('PLS Set the OU Of the Profile!');
End if;
Print_Logs('L_Org_ID:xxxxxx' || L_Org_ID);
if L_FULLPMT_Flag is null Then
L_FULLPMT_Flag := P_FULLPMT_DFlag;
End if;
Print_Logs('xxx_vFullPMTs_Flag:' || L_FULLPMT_Flag);
---- ---- ---- ---- To Check the Period and gl Accounting Date.进行期间和gl Date的判断
select Sum(1)
into L_Period_Opening
from gl_period_statuses gps
where gps.set_of_books_id = fnd_profile.value('GL_SET_OF_BKS_ID')
and gps.application_id = fnd_global.resp_appl_id
and gps.period_name = L_TPName
and gps.adjustment_period_flag = 'N'
and gps.closing_status = 'O';
---- ---- ---- ---- To Build The PMTs Data Info.
if L_Period_Opening < 0 Then
dbms_output.put_line('Then Periodx U Selected is Not Openning');
Print_Logs('Then Periodx U Selected is Not Openning');
Print_Output('Then Periodx U Selected is Not Openning');
End if;
if L_Period_Opening > 0 then
select min(gdd.accounting_date), max(gdd.accounting_date)
into L_Start_Date, L_End_Date
from gl_ledgers gll, gl_date_period_map gdd
where gll.ledger_id = fnd_profile.value('GL_SET_OF_BKS_ID')
and gdd.period_set_name = gll.period_set_name
and gdd.period_name = L_TPName;
For xoo in xx_AccountingDate(L_Org_ID) Loop
if xoo.pmt_date < L_Start_Date Or xoo.pmt_date > L_End_Date Then
Update xxx_ap_AutoPMTs_iFace iii
Set iii.pmt_date = L_End_Date
Where Current Of xx_AccountingDate;
End if;
End Loop;
Commit;
if L_PMT_Mode = 'IS' Then----输入参数为人工导入发票
Build_PMTISs(L_Batch_ID, L_Org_ID, L_TPName, L_PMT_Mode);
Build_InvISs(L_Batch_ID, L_Org_ID, L_TPName, L_PMT_Mode);
End if;
if L_PMT_Mode = 'AS' Then----输入参数为系统自动选择发票
Build_PMTASs(L_Batch_ID, L_Org_ID, L_TPName, L_PMT_Mode);
Build_InvASs(L_Batch_ID, L_Org_ID, L_TPName, L_PMT_Mode);
End if;
if L_FULLPMT_Flag = 'P' Then----P为部分支付
Auto_PPMTs(L_Suc_Flag,
L_Suc_Log,
L_Batch_ID,
L_Org_ID,
L_TPName,
L_PMT_Mode);
End if;
if L_FULLPMT_Flag = 'FM' Then----完全支付多张发票和多个付款分批,输入参数为发票和批次,即本例所示
Auto_FMPMTs(L_Suc_Flag,
L_Suc_Log,
L_Batch_ID,
L_Org_ID,
L_TPName,
L_PMT_Mode);
End if;
if L_FULLPMT_Flag = 'FO' Then----只是输入发票ID,不输入付款批次,本实例程序在程序包中,书中为列出本实例程序
Auto_FOPMTs(L_Suc_Flag,
L_Suc_Log,
L_Batch_ID,
L_Org_ID,
L_TPName,
L_PMT_Mode);
End if;
End if;
---- ---- ---- ----
Print_Logs('L_Suc_Flag:' || L_Suc_Flag);
Print_Logs('L_Suc_Log:' || L_Suc_Log);
End xxxMain;