发票校验替换 Recon. Account 解决方案

应付账款中,供应商的 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_BKPFSUBT_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_BSEGT_BSEG 三个 table 参数的作用是提供信息,但不能被修改。能修改的只有 T_BKPFSUBT_BSEGSUB 。OSS Note 996552 对此亦有说明。

T_BSEGSUB 对应的数据类型是结构 BSEG_SUBST,只有下面这些字段:

发票校验替换 Recon. Account 解决方案_第1张图片

总账科目并没有包含在其中。所以,要向 BSEG_SUBST 添加 HKONT 这个字段。使用事务码 SE11 显示结构 BSEG_SUBST,然后通过菜单 【Goto】-> 【Append structure】,创建一个名为 ZHKONT 的 append。并向 ZHKONT 添加 HKONT 字段:

发票校验替换 Recon. Account 解决方案_第2张图片

维护 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 )

发票校验替换 Recon. Account 解决方案_第3张图片

然后将事件 (event) 1120 ,ZSAMPLE_PROCESS_00001120 与 ZMIRO product 关联 (菜单 Settings -> Processes moduls -> of a customer)。

发票校验替换 Recon. Account 解决方案_第4张图片

参考资料

  • 百度文库:财务凭证的替代(复杂)
  • 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

你可能感兴趣的:(发票校验替换 Recon. Account 解决方案)