SAP 发票校验统驭科目替代解决方案

应付账款中,供应商的统驭科目(Recon. account) 是从供应商主数据中带过来的。如果需要对不同的业务使用不同的统驭科目,比如某笔业务是 “应付票据”,而不是 “应付账款”,则通过界面上的 SGI (Special G/L indicator) 选择 W (表示应付票据业务),将科目调整为 “应付票据”。原理就是后台配置了 Recon. account 针对 SGI (比如 W) 的调整科目。

FI 模块手工编制的会计凭证都可以这样做。 但采购发票校验 (LIV, T-code: MIRO ) 时,SAP 并没有提供特殊总账标记。这样应付账款科目就只能从供应商主数据带过来,而不能根据业务类型进行区分。

这么多 SAP 的客户,自然有些客户有个性化的需求。比如要求根据购买的物资不同,计入到不同的科目。购买一般物料,要计入 “应付账款-物资” 科目;购买固定资产的时候,要计入 “应付账款-项目” 科目。这个时候,应该怎么解决呢?

首先想到的自然是替代 (substitution) 技术。但这个需求,替代却不容易实现?为什么呢?

供应商的行项目没有物料编码 (MATNR)信息,是空的。因为 SAP 中一张发票校验可以对多个收货进行校验,生成的会计凭证存在多个 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,包括如下字段:

「总账科目」并没有包含在其中。所以,要向 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)。

参考资料

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值