应付账款中,供应商的 Recon. account 是从主数据中带过来的。如果需要对不同的业务使用不同的 Recon. account 科目,比如某笔业务是 “应付票据”,而不是 “应付账款”,则通过界面上的 SGI (Special G/L indicator) 选择 W
(表示应付票据业务),将科目调整为 “应付票据”。原理就是后台配置了 Recon. account 针对 SGI (比如 W) 的调整科目。
FI 模块手工编制的会计凭证都可以这样做。 但采购发票校验 (LIV, T-code: MIRO ) 时,SAP 并没有提供特殊总账标记。这样应付账款科目就只能从供应商主数据带过来,而不能根据业务类型进行区分。
这么多 SAP 的客户,自然有些客户有个性化的需求。比如要求根据购买的物资不同,计入到不同的科目。购买一般物料,要计入 “应付账款-物资” 科目;购买固定资产的时候,要计入 “应付账款-项目” 科目。这个时候,应该怎么解决呢?
首先想到的自然是替代 (substitution) 技术。但这个需求,替代却不容易实现?为什么呢?
供应商的行项目没有物料编码 (MATNR
)信息,是空的。因为 SAP
中一张发票校验可以包含多个收货行,集成到 FI 的会计凭证有多个 GR/IR 行,如下所示 (省略应交税金):
DR: GR/IR (material #1)
DR: GR/IR (material #2)
DR: ...
CR: 供应商
因为一对多的关系,供应商的行项目没有物料编码数据。那么进行替代的话,要用完全凭证替代 (Complete document substitution),从凭证的其他行项目 (Line item) 获取信息,比如 GR/IR 行,再根据业务规则对供应商的总账科目进行替代。
但是,对 MM / SD 这种外部模块与 FI 的接口凭证, 完全凭证替代却不会被调用(参见 OSS Note: 386696)。也就是说用不到了。而行项目 (Line item)替代,则没有做够的信息对会计科目进行区分。所以想用替代作为解决方案,存在限制。
解决方案概述
基于以上分析,以及查找相关资料,大致有如下解决方案有:
- 会计凭证行项目替代,用户给出其他判断条件,比如通过屏幕增强,用户输入他想让应付账款这行用的会计科目;或在摘要中给出判断条件,行项目替代时候可用到这个条件,从而替换成其他科目
- BTE: Process 1120
- BADI: AC_Document
BTE 解决方案示例
向 BSEG_SUBST
结构添加字段
Process 1120 event 在 MIRO 的时候能被触发,但这个 event 能被修改字段只能是 T_BKPFSUB
和 T_BSEGSUB
。
样本函数 SAMPLE_PROCESS_00001120
的帮助文档有如下说明:
The current document headers (there will be more than one for cross-company code transactions, for example), the corresponding line items and the recurring entry data for the document header and the one-time account data are transferred to the additional component, for information purposes only. You must not edit this data. Instead, two additional tables (T_BKPFSUB and T_BSEGSUB) and the structure BKDF_SUBST are also transferred. The contents of the fields that can be substituted are entered in these tables. Field TABIX contains a line number which shows from which line in T_BSEG or T_BKPF the field contents originate.
简单地说,就是 T_BKPF
, T_BSEG
和 T_BSEG
三个 table 参数的作用是提供信息,但不能被修改。能修改的只有 T_BKPFSUB
和 T_BSEGSUB
。OSS Note 996552 对此亦有说明。
T_BSEGSUB
对应的数据类型是结构 BSEG_SUBST
,只有下面这些字段:
总账科目并没有包含在其中。所以,要向 BSEG_SUBST
添加 HKONT
这个字段。使用事务码 SE11
显示结构 BSEG_SUBST
,然后通过菜单 【Goto】-> 【Append structure】,创建一个名为 ZHKONT
的 append。并向 ZHKONT
添加 HKONT
字段:
维护 Enhancement category
,然后激活。
拷贝 SAMPLE_PROCESS_00001120
并编写代码
Process 1120 的样本函数是 SAMPLE_PROCESS_00001120
。用事务码 SE37 将函数拷贝一个函数,命名为 ZSAMPLE_PROCESS_00001120
。注意拷贝的时候使用另外的函数组,函数组需要激活。在 ZSAMPLE_PROCESS_00001120
中编写如下代码:
function zsample_process_00001120.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_BKDF) TYPE BKDF OPTIONAL
*" TABLES
*" T_BKPF STRUCTURE BKPF
*" T_BSEG STRUCTURE BSEG
*" T_BKPFSUB STRUCTURE BKPF_SUBST
*" T_BSEGSUB STRUCTURE BSEG_SUBST
*" T_BSEC STRUCTURE BSEC OPTIONAL
*" CHANGING
*" REFERENCE(I_BKDFSUB) TYPE BKDF_SUBST OPTIONAL
*"----------------------------------------------------------------------
data: l_flag(1) type c. " type: 材料采购还是非材料采购
check ( sy-tcode = 'MIRO' or sy-tcode = 'MR8M' ).
read table t_bkpf index 1.
check t_bkpf-bukrs = 'Z900'.
* 代码并未严格考虑实际业务,仅作为示例
loop at t_bseg.
if t_bseg-hkont = '0019800000'. " GR/IR account
if t_bseg-matnr <> ''. " 物料编码不为空
l_flag = 'X'. " 是材料采购
else.
l_flag = ''. " 不是材料采购
endif.
endif.
endloop.
check l_flag = ''.
loop at t_bseg.
if t_bseg-hkont = '0021210100'. " 应付账款
read table t_bsegsub with key tabix = sy-tabix.
t_bsegsub-hkont = '0021210101'. " 应付项目款
modify t_bsegsub index sy-tabix.
endif .
endloop.
endfunction.
配置 BTE
通过事务码 FIBF, 配置一个 Product, 并且激活 (菜单 Settings -> of a customer )
然后将事件 (event) 1120 ,ZSAMPLE_PROCESS_00001120
与 ZMIRO product 关联 (菜单 Settings -> Processes moduls -> of a customer)。
参考资料
- 百度文库:财务凭证的替代(复杂)
- FI posting 替換 RECN account
- Text field in FI Document automatically from MIRO line item
- MIRO做发票校验时实现替代功能的多种方式
- OSS Note: 996552 - Open_FI: Incorrect interfaces for BTE 1120