Oracle Ebs R12 SLA与GL关系变化
SLA概念:SLA(Subledger Accounting) 子帐是子分类帐会计的简称,字面上的含义就是子分类帐会计分录
SLA&GL关系:
R12功能模块上面都启用了MOAC特性,新增了子模块和税模块,OPM和离散库存也集成了,所有的子模块会计分录都可以使用特定的公司配置出来;之间的关系分位三种:
1、子分类帐会计其实就是连接子模块会计和GL凭证之间的桥梁。就是子模块和GL之间的桥梁。所有子模块(包括FA)产生的会计分录都是使用SLA产生的,存放在SLA的表中,然后通过过帐程序过帐到GL。有点类gl_interface表的功能。
2、子分类帐会计的第二层意思:在各个子模块都有一套独立的会计分录,看起来跟GL其实没太大区别,这就意味着在子模块其实就可以计算科目余额了。只是可惜,到目前为止我还没有类似gl_balance的表来存放科目余额。
3、各子模块目前还是可以有自己的分配帐户(就是以前查看会计科目看到的东西),分别存放在自己的分配表中,比如,AP还是存放在ap_invoices_distributions中,引入SLA后,把这个功能称为“事物处理会计”,和子分类帐会计的不同点在于,事物处理会计是通过自动会计或分配产生,而子分类帐会计是根据定义会计事件等公式产生的,分别存于不同的地方。
SLA&GL关系模型 关联模型,
1、 子分类帐的产生有两种方式,一种方式是直接从子模块的事物处理会计,一种是直接从子模块的事物处理上取得。
2、 子模块的事物处理会计和子分类帐会计是两个不同的东西,一定要区别对待,传送到GL的是子分类帐会计,并非事物处理会计。
3、 由于子分类帐会计的来源可能是事物处理,也可能是事物处理会计,因此很可能存在差异,这是SLA目前的缺陷。
SLA带来的益处
1、 灵活的定义会计分录的产生规则,包括摘要,借方和贷方
2、 一个事物处理可以过帐到多个ledger(就是11i的帐簿),这给跨国集团管理多个帐簿带来很大的好处
3、 统一了子模块会计分录的存放和产生规则,也就是说,各个子模块都可以根据自身的情况设置会计规则,但是这些规则产生的会计分录都回存放在SLA的表中。
4、 利于扩展,ORACLE委托外包的子模块产生的会计分录更容易集成到EBS SLA的几个重要关键词
基础事件关系图
SLA中的关键词
会计事件(account event) 会计事件,就是一个事物处理的不同事件类型产生的记录,它结合了主要分类帐,事件类型,事件分类。一个事物处理可能会有多个会计时间,因为一个事物处理可能发生多种动作,而每个动作都需要产生相应的会计凭证。因此,我们可以把一个会计事件看成是一张完整的凭证,我们把这张凭证录入到子模块的会计分录表里就形成了完整的会计分录。所以,我对会计事件的理解通俗归纳为以下几点:
1、 会计事件就相当于一张凭证,录入到GL就是一对会计分录
2、 同一个事物处理,比如收款可能会对应多个会计事件,因为收款创建会产生会计事件,收款核销也是一个会计事件。
查看路径:子模块超级用户/查询/会计事件
主要分类帐(leadger) 分类帐的概念在12i中表示的是帐簿,也就是11i的SOB,主要分类帐决定了过帐到哪个SOB
事件实体(EVENT ENTITY) 事件实体决定了会计分录来源,以应收为例子,事件实体决定了到底是从 “应收事物处理”过来的还是从“收款”过来的。存放在表:xla_entity_types_vl中,会计分录和事物处理关联的表是是xla_transaction_entities ,事件实体同时定义了关联的标识是哪个字段,存放在xla_entity_id_mappings,下面我会详细介绍怎么做关联。
设置路径路径:子模块超级用户/设置/会计/子分类帐会计/事件/事件模型
事件分类(EVENT CLASS) 事件分类是根据事件实体进一步区分会计分录的方法。比如,收款分为“收款”和“杂项收款”,事件分类的表为:xla_event_classes_v,属于xla_transaction_entities的子表。
设置路径路径:子模块超级用户/设置/会计/子分类帐会计/事件/事件模型
事件类型(EVENT TYPE) 事件类型是比事件分类更小的事件划分方法,每个事件分类会细分成多个事件类型。比如:收款会分成:收款已核销,收款未核销,收款已更新等等类型。存放在表:xla_event_types_vl 中。
设置路径路径:子模块超级用户/设置/会计/子分类帐会计/事件/事件模型
基础事件关系图
xla_entity_types_vl(事件实体)
|――xla_entity_id_mappings(实体ID对应表)
|――xla_event_classes_vl(事件分类)
|――xla_event_types_vl(事件类型)
子分类帐关系图
xla_transaction_entities(会计事物处理实体)
|――xla_events(会计事件)
|――xla_ae_headers(子帐头)
|――xla_ae_lines(子帐行)
|――xla_distribution_links(关联事物处理信息)
子模块和GL关系图
gl_import_references(总帐参考)
|(gl_sl_link_id,gl_sl_link_table)
xla_ae_lines(子帐行)
说明:GL和子模块之间的关联是通过gl_import_reference实现的,关键字段是gl_sl_link_id,gl_sl_link_table。
GL->子模块追溯
前面的都是业务方面的,现在进行技术简析,更多的内容还在整理中。
在SLA中技术方面最常用的就是日记帐来源追溯,在追溯的过程中从GL到SLA和11i差别不大,
使通过gl_import_references表来进行,该表的je_batch_id,je_header_id,je_line_num
是和GL关联,该表字段gl_sl_link_id是和SLA中的行表(XLA_AE_LINES)关联,
在SLA中重要的几张表如下:
xla_transaction_entities:The table XLA_ENTITIES
contains information about
sub-ledger document or transactions.
XLA_EVENTS:The XLA_EVENTS table record all information related to a
specific
event. This table is created as a type XLA_ARRAY_EVENT_TYPE.
XLA_AE_HEADERS:The XLA_AE_HEADERS table stores subledger journal
entries.
There is a one-to-many relationship between accounting events and journal entry
headers.
XLA_AE_LINES:The XLA_AE_LINES
table stores the subledger journal entry lines.
There is a one-to-many relationship between subledger journal entry headers and
subledger
journal entry lines
XLA_DISTRIBUTION_LINKS:The
XLA_DISTRIBUTION_LINKS table stores the link between
transactions and subledger journal entry lines.
在一个系统PKG中有如下结构的插值语句,从而可以清楚的得出几个表之间的联系:
Insert All When (Line_Id = 1) Then Into Xla_Transaction_Entities (Upg_Batch_Id , Entity_Id, ……) Values (……) Into Xla_Events (Upg_Batch_Id, Entity_Id, Event_Id, ……) Values (……) Into Xla_Ae_Headers (Upg_Batch_Id, Entity_Idnt_Id , Ae_Header_Id , ……) Values (……) When (1 = 1) Then Into Xla_Ae_Lines (Upg_Batch_Id, Ae_Header_Id, Ae_Line_Num, ……) Values (……) Into Xla_Distribution_Links (Upg_Batch_Id , Event_Id, Ae_Header_Id, Ae_Line_Num , ……) Values (……) Select …… From ……;
上面提到的gl_import_references.gl_sl_link_id字段就是和xla_ae_lines.gl_sl_link_id字段关联,在这些表中和子模块关联的字段在xla_transaction_entities中,该表中有如下形式的字段
源表关联字段
source_id_int_num 对应的源ID 例如:ap_invoices_all
source_id_char_num
这两个字段是用来和源模块关联,该字段的设置是在各个子模块:
路径是:设置->会计科目设置->子分类帐会计设置->会计方法生成器->事件->事件模型
界面如下:该界面的实体代码就是对应xla_transaction_entities表中的ENTITY_CODE字段,每个来源就标示了该子分类帐是哪个模块产生的。
点击[标示]进入如下界面:该界面中的实体表列字段时子模块相关源表的字段,标示列就是SLA中
xla_transaction_entities表的列,SLA和字模块的联系就是通过该界面的设置来完成的。
安全性控制字段
security_id_char_num
security_id_int_num
这两个字段是用来进行安全验证,数据屏蔽使用
xla_transaction_entities是有VDP验证的表,各个模块使用的策略函数是
通过设置>>会计科目设置>>子分类帐会计设置>>子分类帐应用产品 来设置的,
如AP模块使用的是:XLA_SECURITY_POLICY_PKG.MO_POLICY,在该方法中有一句很重要
Function Mo_Policy(p_Obj_Schema In Varchar2, p_Obj_Name In Varchar2) Return Varchar2 Is l_Mo_Policy Varchar2(4000); l_Log_Module Varchar2(240); Begin If g_Log_Enabled Then l_Log_Module := c_Default_Module || '.MO_Policy'; End If; If (c_Level_Procedure >= g_Log_Level) Then Trace('MO_Policy.Begin', c_Level_Procedure, l_Log_Module); End If; l_Mo_Policy := Mo_Global.Org_Security(Obj_Schema => Null, Obj_Name => Null); If (c_Level_Statement >= g_Log_Level) Then Trace('l_mo_policy after calling mo_global.org_security = ' || l_Mo_Policy, c_Level_Statement, l_Log_Module); End If; l_Mo_Policy := Regexp_Replace(l_Mo_Policy, 'org_id', 'security_id_int_1', 1, 1); -- Security identifiers are not populated. In case of, manual journal entires -- or third party merge events. -- bug 4717192, add the if condition If (l_Mo_Policy Is Not Null) Then l_Mo_Policy := l_Mo_Policy || ' OR security_id_int_1 IS NULL '; End If; Xla_Utility_Pkg.Print_Logfile('l_mo_policy after replace = ' || l_Mo_Policy); If (c_Level_Procedure >= g_Log_Level) Then Trace('MO_Policy.End', c_Level_Procedure, l_Log_Module); End If; Return(l_Mo_Policy); End Mo_Policy;
一般的MOAC
VPD使用的字段时ORG_ID该处是将ORG_ID替换为security_id_int_1,很明显了
现在分析了GL和SLA以及 SLA和字模块之间联系,在加上上面的那段插值代码中对应的表关系,就很容易整理
出常见的追溯关系了,可能也有特殊情况没有涉及到。
下面是一个实例 :
首先看**这边的分配,该分配是对应于SLA中的表xla_distribution_links
在该情况下可以查询出每个会计帐户的明细来历,这是AP**的分配
Select Aid.Invoice_Id , Aid.Invoice_Distribution_Id 分配ID , Aid.Invoice_Line_Number 行号, Distribution_Line_Number 分配行号, Aid.Rcv_Transaction_Id 接收事务id, Aid.Amount 金额 From Ap_Invoice_Distributions Aid, Ap_Invoices Api Where Api.Invoice_Id = Aid.Invoice_Id -- And Aid.Invoice_Id = 35357 Order By Aid.Invoice_Line_Number, Distribution_Line_Number; Begin mo_global.init('M'); End;
-- And Xal.Ae_Header_Id = 14012 And Xdl.Application_Id = 200 Order By Xdl.Source_Distribution_Id_Num_1; Begin mo_global.init('M'); End;
分析:应付分配中的账户,在SLA中会产生两行数据,并且这两行数据借贷相反 金额相同。
从GL查行数据,在GL的一个header下的行有可能是经过合并后的行,因此GL的行并不能准确的表示出帐户源的帐户信息,在GL的同一个帐户行可能对应着AP这边很多张**的帐户信息,但会计行中的子分类帐日记帐分录行的每一行则一定对应着同一张**。
如下代码是整理的追溯一般代码
Select '_^_' Key, Gir.Je_Batch_Id , --======xla_transaction_entities=========-------- Xte.Application_Id 应用, Xte.Entity_Id, Xte.Ledger_Id 分类帐sob, Xte.Entity_Code, Xett.Name 事务实体类型, Le.Name 法人主体, Le.Legal_Entity_Identifier 人主体所得税纳税登记 ,--legal_entity_tax ------------------------------ /* --AP_INVOICES Ap ** Invoice_Id --AP_PAYMENTS Ap付款 Check_Id --RECEIPTS 收款 Cash_Receipt_Id --TRANSACTIONS 事务处理 销售 ** Customer_Trx_Id , Xte.Source_Id_Int_1 事务源对应ID , ------------------------------ /*--下面两个字段折旧的时候会有值 ,xte.source_id_int_2 ,xte.source_id_int_3*/ Xte.Security_Id_Int_1 Org_Id, Xte.Source_Application_Id 源对应应用, --======xla_event=========-------- Xe.Event_Type_Code, --Event type code Xent.Name 事件类型, Xe.Event_Status_Code, --Event status code Xe.Process_Status_Code, --Processing status code /*This flag indicates whether the event is on hold or not. possible values: (Y)--yes, (N)--No*/ Xe.On_Hold_Flag, --==============xla_ae_headers=======----- Xah.Ledger_Id Sob, Xah.Je_Category_Name, --General Ledger category name Xah.Accounting_Date, Xah.Period_Name 期间, /* ,xah.balance_type_code --Balance type (Actual, Budget, or Encumbrance) ,xah.gl_transfer_date ,xah.accounting_entry_status_code ,xah.accounting_entry_type_code ,xah.zero_amount_flag*/ --==============xla_ae_line=======----- Xal.Ae_Line_Num 行号, Xal.Code_Combination_Id 账户id, Gjl.Code_Combination_Id 日记帐gcc, /* ,xal.gl_transfer_mode_code ,xal.accounting_class_code "会计分类"*/ Xlp.Meaning 会计分类, Xal.Accounted_Dr 入账借项本位币, Xal.Accounted_Cr 入账贷项本位币, Xal.Currency_Code 币种, Xal.Entered_Dr 账户原币借项, Xal.Entered_Cr 账户原币贷项, Gir.Je_Line_Num 日记帐行号, Xte.Entity_Id, Xte.Application_Id, Xe.Event_Id, Xah.Ae_Header_Id, Xal.Ae_Line_Num From Xla_Transaction_Entities Xte, Xla_Entity_Types_Tl Xett, Xle_Entity_Profiles Le, Xla_Events Xe, Xla_Event_Types_Tl Xent, Xla_Ae_Headers Xah, Xla_Ae_Lines Xal, Xla_Lookups Xlp, Gl_Import_References Gir, Gl_Je_Lines Gjl Where 1 = 1 And Xte.Entity_Id = Xe.Entity_Id And Xte.Application_Id = Xe.Application_Id And Xte.Legal_Entity_Id = Le.Legal_Entity_Id(+) And Xah.Event_Id = Xe.Event_Id And Xah.Application_Id = Xe.Application_Id And Xent.Event_Type_Code = Xe.Event_Type_Code And Xent.Application_Id = Xe.Application_Id And Xent.Language = 'ZHS' And Xah.Ae_Header_Id = Xal.Ae_Header_Id And Xah.Application_Id = Xal.Application_Id And Xlp.Lookup_Type(+) = 'XLA_ACCOUNTING_CLASS' And Xlp.Lookup_Code(+) = Xal.Accounting_Class_Code And Gir.Gl_Sl_Link_Id = Xal.Gl_Sl_Link_Id And Gir.Gl_Sl_Link_Table = Xal.Gl_Sl_Link_Table And Gjl.Je_Header_Id = Gir.Je_Header_Id And Gjl.Je_Line_Num = Gir.Je_Line_Num And Xett.Entity_Code = Xte.Entity_Code And Xett.Application_Id = Xte.Application_Id And Xett.Language = 'ZHS' And Gir.Je_Batch_Id = 5511 ;