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会被执行
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)