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

本文探讨了在SAP系统中如何根据不同类型的采购业务,在MIRO过程中实现统驭科目的灵活替换,尤其针对材料与非材料采购的区别。文章介绍了替代技术的局限性,并提出了解决方案,包括使用BTE技术和自定义函数来实现对特定条件下统驭科目的更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应付账款中,供应商的统驭科目(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)。

参考资料

### 关于SAP系统的替代方案及校验方法 #### 替代方案概述 在SAP系统中,替代功能通常用于处理复杂的业务场景,例如材料替换、会计凭证调整等。这些替代机制可以通过配置而非编程实现复杂逻辑[^1]。对于具体的替代需求,如BOM中的替代优先级和库存管理,需综合考虑业务流程和技术实现方式。 以下是针对不同场景下的替代方案: #### 材料替代(BOM) 当涉及BOM中的替代品时,核心在于如何平衡替代优先级与库存可用性。一种常见的解决思路是引入自定义逻辑来扩展标准功能。具体而言: - **优先级设定**:通过维护替代组并分配权重值,确保高优先级的替代品被优先选用。 - **库存检查**:利用ABAP开发或增强现有事务码,在运行替代算法前增加库存验证步骤[^2]。 示例代码展示了一个简单的库存检查函数模块: ```abap FUNCTION check_stock_availability. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(MATERIAL) TYPE MATNR *" EXPORTING *" VALUE(IS_AVAILABLE) TYPE FLAG *"---------------------------------------------------------------------- DATA: lv_stock TYPE INT4. SELECT SINGLE SUM(STOCK) INTO lv_stock FROM MARC WHERE MATNR = MATERIAL AND WERKS = 'YOUR_PLANT'. IF lv_stock IS INITIAL OR lv_stock <= 0. is_available = abap_false. ELSE. is_available = abap_true. ENDIF. ENDFUNCTION. ``` 此函数可用于动态评估特定工厂内的物料库存状态,并作为后续决策依据之一。 #### 发票校验统驭科目替代 对于供应商发票校验过程中遇到无物料编码的情况,可通过创建定制化程序完成数据映射与转换工作。例如,基于GR/IR记录重新计算成本中心归属关系或者更新财务科目字段值[^3]。 下面是一段伪代码片段说明可能的操作路径: ```abap LOOP AT it_grir ASSIGNING FIELD-SYMBOL(<fs_grir>). CALL FUNCTION 'Z_GET_ACCOUNT_ASSIGNMENT' EXPORTING vendor = <fs_grir>-lifnr document_no = <fs_grir>-belnr IMPORTING account_code = <fs_grir>-konto. MODIFY it_grir INDEX sy-tabix TRANSPORTING konto. ENDLOOP. ``` 上述过程假设已存在名为`Z_GET_ACCOUNT_ASSIGNMENT`的服务接口负责解析输入参数并返回匹配的目标账户编号。 #### 替代程序调试技巧 如果发现某些预置脚本未能按预期执行,则应该仔细审查其内部结构是否存在硬编码依赖项或其他潜在缺陷[^4]。比如,确认所调用子例行程序的实际版本号是否一致;另外还要留意外部条件变量初始化顺序可能导致的行为偏差等问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值