SAP ABAP VF01/MIRO/AFAB BADI AC_DOCUMENT VF01/MIRO/HR集成凭证替代

一般情况适用SAP提供的标准替代GGB1即可实现替代功能,一些业务场景下不走标准的替代功能。或者尝试FIBF 00001120 BTE

1,创建BADI实施并重定义方法 CHANGE_AFTER_CHECK

将更改后的数据放入到EX_DOCUMENT中

如果替换的字段不在ACC_DOCUMENT_SUBST中,则添加相应的字段到结构中。

代码示例如下:

  METHOD IF_EX_AC_DOCUMENT~CHANGE_AFTER_CHECK.
    DATA:LV_FLAG  TYPE CHAR01 .
    DATA:LV_KUNNR TYPE BSEG-KUNNR .
    DATA:LV_ZTERM TYPE BSEG-ZTERM .
    DATA:LS_CONFIG TYPE ZFIT0004 .
    DATA:LS_ITEM     TYPE ACCIT,
         LS_SUB_ITEM TYPE ACCIT_SUB.
    DATA:LV_LIFNR TYPE LFA1-LIFNR .
    DATA:LV_TEXT TYPE STRING .
    DATA:
      LT_TINLINETAB TYPE TABLE OF TLINE,
      LT_TLINETAB   TYPE TABLE OF TLINE,
      LS_TINLINETAB TYPE  TLINE,
      LS_TLINETAB   TYPE  TLINE.
    DATA:LS_THEAD TYPE THEAD .
    DATA:LV_NAME TYPE THEAD-TDNAME .
    IF IM_DOCUMENT-HEADER-TCODE EQ 'VF01' OR  IM_DOCUMENT-HEADER-TCODE EQ 'VF04' OR IM_DOCUMENT-HEADER-TCODE EQ 'VF02'.
*获取付款条件 分期开票的,需要替代税科目2221* 为“待转销项税”,付款条件=Z4*开头2221180000
      LOOP AT  IM_DOCUMENT-ITEM  INTO LS_ITEM  WHERE KUNNR IS NOT INITIAL  AND ZTERM IS NOT INITIAL  AND ZTERM CP 'Z4*'.
        LV_ZTERM = LS_ITEM-ZTERM .
        LV_FLAG = 'X' .
        EXIT .
      ENDLOOP .
      IF LV_FLAG EQ 'X' .
        LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '2221*' .
          MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
          LS_SUB_ITEM-HKONT = '2221180000'.
          APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
        ENDLOOP .
        LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '6001*' .
          MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
          LS_SUB_ITEM-HKONT = '6001030101'.
          APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
        ENDLOOP .
        LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '6401*' .
          MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
          LS_SUB_ITEM-HKONT = '6401030101'.
          APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
        ENDLOOP .
        CLEAR LS_CONFIG .
        SELECT
          SINGLE
          *
          INTO LS_CONFIG
          FROM
          ZFIT0004
          WHERE ZTERM = LV_ZTERM .
        IF SY-SUBRC  = 0 .
          IF LS_CONFIG-ZFQS > 12 .
            LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '1122*' .
              MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
              LS_SUB_ITEM-HKONT = '1531020101'.
              APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
            ENDLOOP .
          ENDIF .
        ENDIF .
      ENDIF .
    ENDIF .
*发票过账时,将供应商替代到  进项税科目2221* 的 ZZFI001
    IF IM_DOCUMENT-HEADER-TCODE EQ 'MIR6'  OR IM_DOCUMENT-HEADER-TCODE EQ 'MIRO' OR IM_DOCUMENT-HEADER-TCODE  EQ 'MIR7' .
      LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE LIFNR IS NOT INITIAL .
        LV_LIFNR = LS_ITEM-LIFNR.
        LV_FLAG = 'X' .
        EXIT  .
      ENDLOOP.
      IF LV_FLAG EQ 'X' .
        LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '2221*'  OR HKONT EQ  '2202000000'.
          MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
          LS_SUB_ITEM-ZZFI001 =  LV_LIFNR .
          APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
        ENDLOOP .
      ENDIF .
    ENDIF .

*    IF IM_DOCUMENT-HEADER-TCODE = 'AFAB' OR IM_DOCUMENT-HEADER-TCODE = 'AFABN' .
*      LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE BUKRS EQ '2600' AND ANLKL EQ 'Z108' AND KOSTL = '2600060000' AND HKONT CP '6601*'.
*        MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
*        LS_SUB_ITEM-HKONT  =  '6401010401' .
*        LS_SUB_ITEM-KOSTL = SPACE .
*        APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
*      ENDLOOP.
*    ENDIF .
*当事务代码=VF01,VF02时,检查发票抬头问题“免税/免抵退 文本”,根据文本内容替代科目2221* 的ZZFI002
*免税=Z01
*免抵退=Z02
    DATA:LV_VBELN TYPE VBRK-VBELN .
    DATA:LT_TLINE TYPE TABLE OF TLINE,
         LS_TLINE TYPE TLINE.
    CLEAR LV_FLAG .
    IF IM_DOCUMENT-HEADER-TCODE EQ 'VF01' OR  IM_DOCUMENT-HEADER-TCODE EQ 'VF04' OR IM_DOCUMENT-HEADER-TCODE EQ 'VF02'.
      LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE VBELN IS NOT INITIAL .
        LV_VBELN = LS_ITEM-VBELN .
        LV_FLAG = 'X' .
        EXIT .
      ENDLOOP .
      IF LV_FLAG IS NOT INITIAL .
*获取发票抬头长文本
        LV_NAME =   LV_VBELN .
        CALL FUNCTION 'READ_TEXT'
          EXPORTING
*           CLIENT                  = SY-MANDT
            ID                      = 'TX18'
            LANGUAGE                = SY-LANGU
            NAME                    = LV_NAME
            OBJECT                  = 'VBBK'
*           ARCHIVE_HANDLE          = 0
*           LOCAL_CAT               = ' '
*       IMPORTING
*           HEADER                  =
*           OLD_LINE_COUNTER        =
          TABLES
            LINES                   = LT_TLINE
          EXCEPTIONS
            ID                      = 1
            LANGUAGE                = 2
            NAME                    = 3
            NOT_FOUND               = 4
            OBJECT                  = 5
            REFERENCE_CHECK         = 6
            WRONG_ACCESS_TO_ARCHIVE = 7
            OTHERS                  = 8.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.
        LOOP AT LT_TLINE INTO LS_TLINE .
          CONCATENATE LV_TEXT LS_TLINE-TDLINE INTO LV_TEXT .
        ENDLOOP .
        LOOP AT IM_DOCUMENT-ITEM INTO LS_ITEM WHERE HKONT CP '6001*' or HKONT CP '6051*' .
          MOVE-CORRESPONDING LS_ITEM TO LS_SUB_ITEM .
          IF LV_TEXT CP '*免税*'.
            LS_SUB_ITEM-ZZFI002 =  'Z01'.
          ELSEIF LV_TEXT CP '*免抵退*' .
            LS_SUB_ITEM-ZZFI002 =  'Z02'.
          ENDIF .
          APPEND LS_SUB_ITEM TO EX_DOCUMENT-ITEM .
        ENDLOOP .
      ENDIF .
    ENDIF .
  ENDMETHOD.

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是在 SAP ABAP 中使用 OData 过滤语句来过滤两个参数的示例代码,其中使用了 SEGW (SAP Gateway Service Builder) 来创建实体集合: 1. 在 SEGW 中创建实体集合 首先,在 SEGW 中创建一个实体集合,例如名为 ztest02Set 的实体集合,其中包含有关测试信息的字段,例如 Id 和 Ifno。 2. 在实体集合中添加查询方法 在实体集合中添加一个查询方法,例如名为 GetTestInfoByFilter 的方法,用于根据 Id 和 Ifno 这两个参数来过滤出符合条件的测试信息。 3. 在查询方法中添加过滤语句 在查询方法的源代码中,添加以下过滤语句来过滤两个参数: ``` lt_test_info = lt_test_info WHERE ( Id EQ @iv_id ) AND ( Ifno EQ @iv_ifno ). ``` 其中,lt_test_info 是包含所有测试信息的内部表,iv_id 和 iv_ifno 是输入参数,表示要过滤的 Id 和 Ifno。 4. 在前端应用中调用查询方法 在前端应用中,使用以下代码来调用查询方法并获取符合条件的测试信息: ``` var sUrl = "/sap/opu/odata/SAP/ZTEST01_SRV/GetTestInfoByFilter"; sUrl += "?$filter=Id eq '00000858' and Ifno eq 'KUZI'"; var oModel = new sap.ui.model.odata.ODataModel(sUrl, true); oModel.read("/ztest02Set", { success: function(oData) { // 处理返回的测试信息 } }); ``` 在上述代码中,我们使用 sap.ui.model.odata.ODataModel 类来创建 OData 模型,并使用 read 方法来调用 GetTestInfoByFilter 方法,并将过滤语句作为参数传递给 sUrl 变量。最后,我们使用 success 回调函数来处理返回的测试信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值