销售发票选项卡没有增强和屏幕用户出口,SAP标准只有业务加载项(BADI_SD_CUST_HEAD , BADI_SD_CUST_ITEM)可以使用,但是这两个业务加载项使用SAP内部。SAP Note 864944有详细说明,SAP 只打算让这些业务加载项使用在单独的 SAP 解决方案中。
经过DEBUG发现,业务加载项定义BADI_SD_CUST_ITEM的实施WB2_IVGUI_LAYOUT_I是为全球贸易这个行业解决方案实现的,存储在WB2B_CORE这个包中。照此完整来看,为发票凭证增加自定义选项卡的业务加载项实施正是与屏幕6002和6102有关,既然这个业务加载项不允许我们自己来实施,我们可以尝试在屏幕6002和6102中注入类似的代码来成就目标。
增强步骤
1.为主表增加一个附加结构
2.创建一个函数组用于存放所有的处理代码
创建6002屏幕(抬头6001)
增加PBO逻辑
PROCESS BEFORE OUTPUT.
MODULE STATUS_6002.
*
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_6002.
*&---------------------------------------------------------------------*
*& Module STATUS_6002 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_6002 OUTPUT.
IF sy-tcode EQ 'VF03'.
LOOP AT SCREEN.
screen-input = '0'.
MODIFY SCREEN .
ENDLOOP.
ENDIF.
ENDMODULE.
3.屏幕增强
在主程序SAPMV60A的屏幕6002中进行屏幕逻辑流增强
创建四代增强,模式为声明
PERFORM cust_item_active IN PROGRAM saplzfgfico_mv60a1 IF FOUND
USING vbrp vbrk vbuk
CHANGING gs_cust_tab-item_caption
gs_cust_tab-item_program
gs_cust_tab-item_dynpro
gs_cust_tab-item_caption.
在自建的函数组包含文件中写FORM逻辑
FORM cust_item_active USING fvbrp TYPE vbrp
fvbrk TYPE vbrk
fvbuk TYPE vbuk
CHANGING
fcaption TYPE char40
fprogram TYPE syrepid
fdynpro TYPE sydynnr
ftab TYPE char40 .
DATA:lv_zswitch TYPE ztzq_switch-zswitch.
SELECT SINGLE zswitch INTO lv_zswitch FROM ztzq_switch WHERE ztype = '4' AND zmk = 'FICO' AND zname = 'ZFGFICO_MV60A1'.
CHECK lv_zswitch = 1.
PERFORM check_badi_activate.
CHECK badi_activate EQ abap_false .
fcaption = '金税数据'(c01).
fprogram = 'SAPLZFGFICO_MV60A1'.
fdynpro = '6002'.
ftab = fcaption.
LOOP AT SCREEN.
IF screen-name EQ 'TABSTRIP_TAB08' ."'TABSTRIP_TAB06'.
screen-active = 1.
screen-invisible = 0 .
ENDIF.
ENDLOOP.
ENDFORM .
业务加载项BADI_SD_CUST_ITEM的另外三个是用在屏幕6102中的方法,建议不管当前有使用到,都应该增强到增强点中以能够随时使用,最好使用相同的实施名称,这样我们可以方便地使用SE20查看所有的增强。
具体代码逻辑可参考SAP内部实施点(抬头:WB2_IVGUI_LAYOUT_H;行项目:WB2_IVGUI_LAYOUT_I)
注:抬头屏幕增强则是业务加载项BADI_SD_CUST_HEAD,在屏幕6101同样方法中实施增强即可。
PERFORM cust_item_set_data IN PROGRAM saplzfgfico_mv60a1 IF FOUND
USING vbrk
vbrp
xvbrp_tabix
t180
CHANGING rv60a
yvbadr[]
xvbadr[]
xvbpa[]
yvbrk[]
xvbrk[]
yvbpa[]
xvbrp[]
yvbrp[]
vbrk.
* 发票数据到子屏幕
FORM cust_item_set_data USING f_vbrk TYPE vbrk
f_vbrp TYPE vbrp
f_tabix TYPE sytabix
ft180 TYPE t180
CHANGING
frv60a TYPE rv60a
fxyvbadr TYPE shp_sadrvb_t
fxvbadr TYPE shp_sadrvb_t
fxvbpa TYPE va_vbpavb_t
fxyvbrk TYPE vbrkvb_t
fxvbrk TYPE vbrkvb_t
fxyvbpa TYPE va_vbpavb_t
fxvbrp TYPE vbrpvb_t
fxyvbrp TYPE vbrpvb_t
fvbrk TYPE vbrk.
PERFORM check_badi_activate.
CHECK badi_activate EQ abap_false .
* check ADD ON active
check not a_gtm_active is initial.
* check enhancement active
check a_enhance = 2 or not a_cc_active is initial.
* set atributs
a_vbrk = f_vbrk.
a_vbrkvb = f_vbrk.
a_vbrp = f_vbrp.
* set data
call function 'WB2_IV_GET_ITEM_DATA'
exporting
i_t180 = ft180
changing
c_vbrk = a_vbrk
c_vbrp = a_vbrp
ct_vbpa = fxvbpa
ct_yvbpa = fxyvbpa
ct_vbadr = fxvbadr
ct_yvbadr = fxyvbadr.
* get komv
if a_cc_active is not initial.
* fill condition data
call function 'WB2_PROCESS_SERVICE_IV1'
exporting
it_vbrp = fxvbrp
i_vbrk = a_vbrkvb.
endif.
ENDFORM.
PERFORM cust_item_pass_code IN PROGRAM saplzfgfico_mv60a1 IF FOUND
USING fcode_gleiche_seite fcode.
FORM cust_item_pass_code USING ffcode_same_page TYPE fcode
ffcode TYPE fcode .
PERFORM check_badi_activate.
CHECK badi_activate EQ abap_false .
* check ADD ON active
check not a_gtm_active is initial.
* check enhancement active
check a_enhance = 2 or not a_cc_active is initial.
* Fcode setzen
call function 'WB2_TRADE_PASS_FCODE_ITEM'
exporting
i_fcode = ffcode.
ENDFORM.
PERFORM cust_item_get_data IN PROGRAM saplzfgfico_mv60a1 IF FOUND
USING t180
CHANGING vbrk
vbrp
rv60a
xvbpa[]
yvbrk[]
xvbrk[]
yvbadr[]
xvbadr[]
yvbpa[]
xvbrp[]
yvbrp[]
fcode.
* 子屏幕到发票数据
FORM cust_item_get_data USING
ft180 TYPE t180
CHANGING
fvbrk TYPE vbrk
fvbrp TYPE vbrp
frv60a TYPE rv60a
fxvbpa TYPE va_vbpavb_t
fxyvbrk TYPE vbrkvb_t
fxvbrk TYPE vbrkvb_t
fxyvbadr TYPE shp_sadrvb_t
fxvbadr TYPE shp_sadrvb_t
fxyvbpa TYPE va_vbpavb_t
fxvbrp TYPE vbrpvb_t
fxyvbrp TYPE vbrpvb_t
ffcode TYPE fcode.
PERFORM check_badi_activate.
CHECK badi_activate EQ abap_false .
* check ADD ON active
check not a_gtm_active is initial.
* check enhancement active
check a_enhance = 2 or not a_cc_active is initial.
* Get fcode
call function 'WB2_TRADE_FETCH_FCODE'
importing
e_fcode = ffcode.
* get changed data
call function 'WB2_TRADE_DATA_GET'
importing
e_header_data = a_vbrk
e_item_data = a_vbrp.
* set data
fvbrk = a_vbrk.
fvbrp = a_vbrp.
call function 'WB2_PROCESS_SERVICE_IV_FREE'.
ENDFORM.
DATA:badi_activate TYPE abap_bool.
FORM check_badi_activate .
INCLUDE wb2_param_control_global.
DATA:lr_badi TYPE REF TO if_ex_badi_sd_cust_item .
CALL FUNCTION 'GET_HANDLE_SD_CUST_ITEM'
IMPORTING
handle = lr_badi
active = badi_activate.
IF badi_activate EQ 'X'.
IF cl_wb2_check_add_on_active=>a_gtm_active EQ ' '.
badi_activate = 'X' .
ENDIF.
IF cl_wb2_check_add_on_active=>a_enhance NE addon_all_active.
badi_activate = ' ' .
ENDIF.
ENDIF.
ENDFORM.
增强效果