ABAP:财务的增强

1.替代

T-CODE:OBBH 

配置公司代码下的调用点及替代步骤

 这里需要进入T-CODE:GCX2中进行配置,然后再出口程序中进行代码编写,下面详解

T-CODE:GCX2

维护应用区域的退出程序 复制RGGBS000到ZRGGBS000,更改GBLS的退出程序名

进入出口程序编写代码:首先把出口FORM添加到EXITS表中

复制代码
FORM get_exit_titles TABLES etab.

  DATA: BEGIN OF exits OCCURS 50,
          name(5)   TYPE c,
          param     LIKE c_exit_param_none,
          title(60) TYPE c,
        END OF exits.

  exits-name  = 'U100'.
  exits-param = c_exit_param_none.
*  exits-param = c_exit_param_field.
  exits-title = TEXT-100.             "Cost center from CSKS
  APPEND exits.

  exits-name  = 'U101'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-101.             "Cost center from CSKS
  APPEND exits.

  exits-name  = 'U401'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-401.             "原因代码
  APPEND exits.

* begin of insertion                                          "wms092357
  exits-name  = 'U200'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-200.             "Cons. transaction type
  APPEND exits.                       "from xref1/2
* end of insertion                                            "wms092357

  exits-name  = 'U500'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-401.             "原因代码
  APPEND exits.

************************************************************************
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
*        IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM:         *
*  EXITS-NAME  = 'U102'.
*  EXITS-PARAM = C_EXIT_PARAM_CLASS.
*  EXITS-TITLE = TEXT-102.             "Sum is used for the reference.
*  APPEND EXITS.


***********************************************************************
** EXIT EXAMPLES FROM PUBLIC SECTOR INDUSTRY SOLUTION
**
** PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINE
** TO ENABLE PUBLIC SECTOR EXAMPLE SUBSTITUTION EXITS
***********************************************************************
  INCLUDE rggbs_ps_titles.

  REFRESH etab.
  LOOP AT exits.
    etab = exits.
    APPEND etab.
  ENDLOOP.

ENDFORM.   
复制代码
复制代码
FORM get_exit_titles TABLES etab.

  DATA: BEGIN OF exits OCCURS 50,
          name(5)   TYPE c,
          param     LIKE c_exit_param_none,
          title(60) TYPE c,
        END OF exits.

  exits-name  = 'U100'.
  exits-param = c_exit_param_none.
*  exits-param = c_exit_param_field.
  exits-title = TEXT-100.             "Cost center from CSKS
  APPEND exits.

  exits-name  = 'U101'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-101.             "Cost center from CSKS
  APPEND exits.

  exits-name  = 'U401'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-401.             "原因代码
  APPEND exits.

* begin of insertion                                          "wms092357
  exits-name  = 'U200'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-200.             "Cons. transaction type
  APPEND exits.                       "from xref1/2
* end of insertion                                            "wms092357

  exits-name  = 'U500'.
  exits-param = c_exit_param_field.
  exits-title = TEXT-401.             "原因代码
  APPEND exits.

************************************************************************
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
*        IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM:         *
*  EXITS-NAME  = 'U102'.
*  EXITS-PARAM = C_EXIT_PARAM_CLASS.
*  EXITS-TITLE = TEXT-102.             "Sum is used for the reference.
*  APPEND EXITS.


***********************************************************************
** EXIT EXAMPLES FROM PUBLIC SECTOR INDUSTRY SOLUTION
**
** PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINE
** TO ENABLE PUBLIC SECTOR EXAMPLE SUBSTITUTION EXITS
***********************************************************************
  INCLUDE rggbs_ps_titles.

  REFRESH etab.
  LOOP AT exits.
    etab = exits.
    APPEND etab.
  ENDLOOP.

ENDFORM.   
复制代码

 创建对应的Perform完成代码编写

复制代码
*&---------------------------------------------------------------------*
*&      Form  u401
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM u401 USING rstgr.

  "add by jt-tansh 20210422
  "从配置表ZFIT008中获得原因代码
  BREAK jt-tansh.
  SELECT SINGLE rstgr INTO bseg-rstgr FROM zfit008 WHERE hkont = bseg-hkont.
  IF sy-subrc = 0.
    gv_rstgr = bseg-rstgr.
  ENDIF.

  IF bkpf-blart = 'ZP' OR bkpf-blart = 'DZ'.
    IF ( bseg-hkont+0(4) = '1001' OR bseg-hkont+0(4) = '1002').
      IF bseg-rstgr IS INITIAL.
        bseg-rstgr = gv_rstgr.
        CLEAR:gv_rstgr.
      ENDIF.

    ENDIF.
  ENDIF.


ENDFORM.
复制代码

2.校验

TCODE:OB28

配置公司代码下的调用点及校验步骤

 这里可以修改消息类,一个组下面只能共用一个消息类,消息类要更改的话,只能选中组进行更改

 3.BTE增强

T-Code:FIBF

 点击执行

 

复制代码
FUNCTION zsample_process_00001120.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  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:lv_bkpf TYPE bkpf.

  IF sy-tcode = 'F-44' OR sy-tcode = 'F-32' OR sy-tcode = 'F-53'.


    DATA zbseg TYPE TABLE OF bseg WITH HEADER LINE.
    DATA:hz TYPE bseg-wrbtr.

    zbseg[] = t_bseg[].
    LOOP AT t_bseg INTO DATA(ls_bseg).
      IF ls_bseg-koart = 'D'.
        CLEAR: hz,zbseg[],zbseg.
        LOOP AT zbseg WHERE koart = ls_bseg-koart
                        AND saknr = ls_bseg-saknr
                      AND kunnr = ls_bseg-kunnr .
          IF zbseg-shkzg = 'S'.
            hz = hz + zbseg-wrbtr.
          ELSE.
            hz = hz - zbseg-wrbtr.
          ENDIF.
        ENDLOOP.
        IF hz IS INITIAL.
          IF ls_bseg-shkzg = 'S'.

            READ TABLE t_bsegsub ASSIGNING FIELD-SYMBOL(<line>) WITH KEY tabix = sy-tabix.
            IF <line> IS ASSIGNED .
              <line>-xnegp = 'X'.
            ENDIF.
          ELSEIF ls_bseg-shkzg = 'H'..
            READ TABLE t_bsegsub ASSIGNING FIELD-SYMBOL(<line2>) WITH KEY tabix = sy-tabix.
            IF <line2> IS ASSIGNED .
              <line2>-xnegp = ''.
            ENDIF.
          ENDIF.
        ENDIF.



      ELSEIF ls_bseg-koart = 'K'.
        CLEAR: hz,zbseg.
        LOOP AT zbseg WHERE koart = ls_bseg-koart
                        AND saknr = ls_bseg-saknr
                      AND lifnr = ls_bseg-lifnr .
          IF zbseg-shkzg = 'S'.
            hz = hz + zbseg-wrbtr.
          ELSE.
            hz = hz - zbseg-wrbtr.
          ENDIF.
        ENDLOOP.
        IF hz IS INITIAL.
          IF ls_bseg-shkzg = 'S'.
            UNASSIGN <line>.
            READ TABLE t_bsegsub ASSIGNING <line> WITH KEY tabix = sy-tabix.
            IF <line> IS ASSIGNED .
              <line>-xnegp = 'X'.
            ENDIF.
          ELSEIF ls_bseg-shkzg = 'H'.
            UNASSIGN <line2>.
            READ TABLE t_bsegsub ASSIGNING <line2> WITH KEY tabix = sy-tabix.
            IF <line2> IS ASSIGNED .
              <line2>-xnegp = ''.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.

    ENDLOOP.

  ENDIF.


*  DATA:hz TYPE bseg-wrbtr.
*  DATA zbseg TYPE TABLE OF bseg WITH HEADER LINE.
*  CLEAR: hz,zbseg[],zbseg.
*
*  zbseg[] = t_bseg[].
*  " 客户    先对所有行项目
*  LOOP AT zbseg WHERE koart = 'D'.
*    IF zbseg-shkzg = 'S'.
*      hz = hz + zbseg-wrbtr.
*    ELSE.
*      hz = hz - zbseg-wrbtr.
*    ENDIF.
*  ENDLOOP.
*  IF sy-subrc = 0.
*    IF hz IS INITIAL.
*      LOOP AT  t_bseg WHERE koart = 'D'.
*        IF t_bseg-shkzg = 'S'.
*          READ TABLE t_bsegsub ASSIGNING FIELD-SYMBOL(<line>) WITH KEY tabix = sy-tabix.
*          IF <line> IS ASSIGNED .
*            <line>-xnegp = 'X'.
*          ENDIF.
*        ELSE.
*          IF t_bseg-shkzg = 'H' AND t_bseg-xnegp IS NOT INITIAL.
*            READ TABLE t_bsegsub ASSIGNING FIELD-SYMBOL(<line2>) WITH KEY tabix = sy-tabix.
*            IF <line2> IS ASSIGNED .
*              <line>-xnegp = ''.
*            ENDIF.
*          ENDIF.
*
*        ENDIF.
*
*      ENDLOOP.
*    ENDIF.
*  ENDIF.
*
*
*  " 供应商
*  CLEAR: hz,zbseg[],zbseg.
*  LOOP AT zbseg WHERE koart = 'K'.
*    IF zbseg-shkzg = 'S'.
*      hz = hz + zbseg-wrbtr.
*    ELSE.
*      hz = hz - zbseg-wrbtr.
*    ENDIF.
*  ENDLOOP.
*  IF sy-subrc = 0.
*    IF hz IS INITIAL.
*      LOOP AT  t_bseg WHERE koart = 'K'.
*        IF t_bseg-shkzg = 'S'.
*          UNASSIGN <line>.
*          READ TABLE t_bsegsub ASSIGNING <line> WITH KEY tabix = sy-tabix.
*          IF <line> IS ASSIGNED .
*            <line>-xnegp = 'X'.
*          ENDIF.
*        ELSE.
*          IF t_bseg-shkzg = 'H' AND t_bseg-xnegp IS NOT INITIAL.
*            UNASSIGN <line2>.
*            READ TABLE t_bsegsub ASSIGNING <line2> WITH KEY tabix = sy-tabix.
*            IF <line2> IS ASSIGNED .
*              <line>-xnegp = ''.
*            ENDIF.
*          ENDIF.
*
*        ENDIF.
*
*      ENDLOOP.
*    ENDIF.
*  ENDIF.




  READ TABLE t_bkpf INTO lv_bkpf INDEX 1.
  IF sy-subrc = 0.

    IF lv_bkpf-blart = 'RE' OR lv_bkpf-blart = 'RV'.
      LOOP AT t_bsegsub .
        t_bsegsub-sgtxt = lv_bkpf-bktxt.
        MODIFY t_bsegsub INDEX sy-tabix.
      ENDLOOP.
    ENDIF.
*    LOOP AT t_bseg ASSIGNING FIELD-SYMBOL(<fs_bg>).
*      <fs_bg>-sgtxt = lv_bkpf-bktxt.
*    ENDLOOP.
  ENDIF.

ENDFUNCTION.
复制代码

返回FIBF界面.在设置中创建PRDUCT 然后配置对应的EVENT及函数模块

后面的A要打√,表示激活

 4.ACDOCA字段与BSEG字段不一致问题

上述BTE增强是针对BSEG做字段替代,针对ACDOCA的字段覆盖在另一个BADI增强中:BADI_FINS_ACDOC_POSTING_EVENTS

 

复制代码
METHOD if_badi_fins_acdoc_post_events~subst_acdoca_extension_fields.

*   Example implementation to substitute or derive extension fields in ACDOCA

    DATA: ls_acdoc_subst TYPE LINE OF finst_acdoc_subst.

    CLEAR et_acdoc_subst.
    DATA:ls_acdoca TYPE acdoca.
    DATA:lt_acdoca TYPE TABLE OF acdoca.
    DATA:lv_zz004  TYPE zz004.
    "销售业务板块替代
    LOOP AT it_acdoc REFERENCE INTO DATA(lr_acdoc1).
      MOVE-CORRESPONDING lr_acdoc1->* TO ls_acdoca      ##DE_SUZW.
      IF ls_acdoca-racct+0(4) = '1122' AND
          ls_acdoca-kunnr IS NOT INITIAL AND
          ls_acdoca-blart+0(1) <> 'Z'. "ADD BY HW 20231215 Z开头的凭证类型不走增强替代ZZ004

        SELECT SINGLE kdgrp
          FROM knvv
        WHERE kunnr = @ls_acdoca-kunnr
          AND vkorg = @ls_acdoca-rbukrs
        INTO @lv_zz004.

        EXIT.
      ENDIF.
    ENDLOOP.

    LOOP AT it_acdoc REFERENCE INTO DATA(lr_acdoc).
*     Fill key fields and standard fields for ET_ACDOC_SUBST
      MOVE-CORRESPONDING lr_acdoc->* TO ls_acdoc_subst ##enh_ok.
      MOVE-CORRESPONDING lr_acdoc->* TO ls_acdoca      ##DE_SUZW.

*    "销售业务板块替代
      IF lv_zz004 IS NOT INITIAL.
        CASE ls_acdoca-racct+0(4).
          WHEN '6001' OR '6051' OR '6401' OR '6402'.
            ls_acdoc_subst-zz004 = lv_zz004.
          WHEN '1122'.
            ls_acdoc_subst-zz004 = lv_zz004.
          WHEN OTHERS.
        ENDCASE.
      ENDIF.

      DATA:lv_aufnr TYPE aufnr.

      "ZZ002 替代
      CALL FUNCTION 'ZFM_ENHANCEMENT_ZZ002'
        EXPORTING
          iv_belnr = ls_acdoca-belnr
        IMPORTING
          ev_aufnr = lv_aufnr.
      IF lv_aufnr IS NOT INITIAL.
        ls_acdoc_subst-zz002 = lv_aufnr.
      ENDIF.

      "ZZ003 替代
*      IF ls_acdoca-kunnr IS NOT INITIAL OR
*         ls_acdoca-lifnr IS NOT INITIAL.
*
*        SELECT SINGLE
*            b~country,
*            b~region
*          FROM but020 AS a
*          INNER JOIN adrc AS b
*             ON a~addrnumber = b~addrnumber
*        WHERE ( a~partner = @ls_acdoca-kunnr OR
*                a~partner = @ls_acdoca-lifnr )
*        INTO @DATA(ls_adrc).
*        IF sy-subrc = 0.
*          SELECT SINGLE zhanqu
*            FROM ztsd0009
*          WHERE country = @ls_adrc-country
*            AND region  = @ls_adrc-region
*          INTO @DATA(lv_zhanqu).
*          IF sy-subrc = 0.
*            ls_acdoc_subst-zz003 = lv_zhanqu.
*          ENDIF.
*        ENDIF.
*      ENDIF.
      APPEND ls_acdoc_subst TO et_acdoc_subst.
    ENDLOOP.

*     Example 1: move another ACDOCA field to an extension field
*      ls_acdoc_subst-yy1_prctr_jei = lr_acdoc->prctr.

*     Example 2: copy a field from ACCIT to an extension field
*     First we have to lookup the corresponding ACCIT item
*     With note 2827405 the lines in it_acdoc and it_acdoc_item are linked also via temporary DOCLN
*     to retrieve also split data in it_acdoc_item.
*     Furthermore it_acdoc_item has also a secondary key ACDOCA_KEY with the following fields:
*     RLDNR BUKRS GJAHR BELNR BUZEI DOCLN
*     Via this secondary key the data in it_acdoc_item can be found very quickly
*      READ TABLE it_acdoc_item REFERENCE INTO DATA(lr_acdoc_item)
*        WITH KEY acdoca_key COMPONENTS
*        rldnr = lr_acdoc->rldnr
*        bukrs = lr_acdoc->rbukrs
*        gjahr = lr_acdoc->gjahr
*        belnr = lr_acdoc->belnr
*        buzei = lr_acdoc->buzei
*        docln = lr_acdoc->docln.
*      CHECK sy-subrc = 0.
*      CHECK lr_acdoc_item->xref3 IS NOT INITIAL.
*     If XREF3 is filled, copy it to extension field (commented out as extension field doesn't exist in the standard)
*      ls_acdoc_subst-yy1_xref3_jei = lr_acdoc_item->xref3.

*     Extension fields for this item have been filled, add to ET_ACDOC_SUBST
  ENDMETHOD.
复制代码

需要批量修正ACDOCA的数据的话,SAP提供了一个类:cl_fins_acdoc_change

复制代码
FORM frm_change_acdoca .

  DATA: lo_acdoc_change  TYPE REF TO cl_fins_acdoc_change,
        lt_change_fields TYPE finst_fieldname,
        ls_change_fields LIKE LINE OF lt_change_fields,
        lt_acdoca_upd    TYPE finst_acdoca,
        lt_acdoca_sort   TYPE if_fins_acdoc_util_types=>tt_acdoca_sorted WITH HEADER LINE.

  CLEAR:lt_acdoca_sort,lt_acdoca_upd.

  " 需要更新字段
  ls_change_fields = 'KUNNR'.
  COLLECT ls_change_fields INTO lt_change_fields.

  ls_change_fields = 'LIFNR'.
  COLLECT ls_change_fields INTO lt_change_fields.

  ls_change_fields = 'MWSKZ'.
  COLLECT ls_change_fields INTO lt_change_fields.

  SORT gt_data BY rldnr rbukrs gjahr belnr docln.
  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE sel = 'X'.

    APPEND VALUE #( rldnr   = <fs_data>-rldnr
                    rbukrs  = <fs_data>-rbukrs
                    gjahr   = <fs_data>-gjahr
                    belnr   = <fs_data>-belnr
                    docln   = <fs_data>-docln
                    mwskz   = '' " 销售/购买税代码
                    lifnr   = <fs_data>-bseg_lifnr
                    kunnr   = <fs_data>-bseg_kunnr ) TO lt_acdoca_sort.

  ENDLOOP.
  IF sy-subrc NE 0.
    MESSAGE '请选择行' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  IF lt_acdoca_sort[] IS NOT INITIAL.

    lt_acdoca_upd = lt_acdoca_sort[].
    CREATE OBJECT lo_acdoc_change.

    lo_acdoc_change->set_support_mode(
       EXPORTING
         it_change_fields = lt_change_fields ).

    lo_acdoc_change->change_acdoca(
       EXPORTING
         it_change_fields     = lt_change_fields
         it_acdoca_upd        = lt_acdoca_upd
         iv_write_change_docs = abap_false
         iv_direct_update     = abap_true ).

    COMMIT WORK.
    MESSAGE '更新成功' TYPE 'S'.

  ENDIF.

ENDFORM.
复制代码

 5.如何查找对应的BTE增强

函数模块:BF_FUNCTIONS_FIND(P/S),PC_FUNCTION_FIND(处理)

在对应的函数模块中打断点,然后执行前台T-Code就可以看到,对应的T-CODE有哪些EVENT会被执行

posted @   阿胖的阿多  阅读(1094)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示