QA11屏幕增强:
效果图:

BADI: QEVA_SUBSCREEN_1101

SE11添加客制化字段:QALS或者决策表。

创建自定义函数组,添加屏幕信息:


全局定义:
FUNCTION-POOL ZFG_QM_EN. "MESSAGE-ID ..
TABLES: qals_cust.
CONSTANTS: BEGIN OF C_TABS,
TAB1 LIKE SY-UCOMM VALUE 'TAB1',
TAB2 LIKE SY-UCOMM VALUE 'TAB2',
TAB3 LIKE SY-UCOMM VALUE 'TAB3',
TAB4 LIKE SY-UCOMM VALUE 'TAB4',
TAB5 LIKE SY-UCOMM VALUE 'TAB5',
TAB6 LIKE SY-UCOMM VALUE 'TAB6',
TAB7 LIKE SY-UCOMM VALUE 'TAB7',
END OF C_TABS.
*&SPWIZARD: DATA FOR TABSTRIP 'TABS'
CONTROLS: TABS TYPE TABSTRIP.
DATA: BEGIN OF G_TABS,
SUBSCREEN LIKE SY-DYNNR,
PROG LIKE SY-REPID VALUE 'SAPLZFG_QM_EN',
PRESSED_TAB LIKE SY-UCOMM VALUE C_TABS-TAB1,
END OF G_TABS.
DATA: OK_CODE LIKE SY-UCOMM.
DATA: g_display TYPE c.
data:gs_qals type qals .
data:
REF_SUBSCR_1101_QEVA TYPE REF TO IF_EX_QEVA_SUBSCREEN_1101.
data:gv_FLT_VAL type QHERK ,
gs_RQEVA TYPE RQEVA.
屏幕数据传输到主程序:

主程序数据传输到自定义屏幕

*屏幕逻辑
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
module GET_DATA .
MODULE TABS_ACTIVE_TAB_SET.
CALL SUBSCREEN:
SUBarea INCLUDING G_TABS-PROG G_TABS-SUBSCREEN.
PROCESS AFTER INPUT.
CALL SUBSCREEN:
SUBarea .
MODULE TABS_ACTIVE_TAB_GET.
MODULE USER_COMMAND_0100.
*屏幕PBO和PAI MODULE
MODULE STATUS_0100 OUTPUT.
IF REF_SUBSCR_1101_QEVA IS INITIAL.
CALL METHOD CL_EXITHANDLER=>GET_INSTANCE_FOR_SUBSCREENS
CHANGING
INSTANCE = REF_SUBSCR_1101_QEVA
EXCEPTIONS
NO_REFERENCE = 1
NO_INTERFACE_REFERENCE = 2
NO_EXIT_INTERFACE = 3
DATA_INCONS_IN_EXIT_MANAGEM = 4
CLASS_NOT_IMPLEMENT_INTERFACE = 5
others = 6 .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
* if REF_SUBSCR_1101_QEVA is not INITIAL .
* CALL METHOD REF_SUBSCR_1101_QEVA->GET_DATA
* EXPORTING
* FLT_VAL = GV_FLT_VAL
* IMPORTING
* E_QALS = GS_QALS
* E_RQEVA = GS_RQEVA.
*endif .
* MOVE-CORRESPONDING GS_QALS TO QALS_CUST .
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
LOOP AT SCREEN.
IF GS_QALS-ART EQ 'J61' OR GS_QALS-ART EQ 'J91'.
IF SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR SCREEN-NAME EQ 'TAB4' OR
SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J81'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB3' OR SCREEN-NAME EQ 'TAB4' OR
SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J82'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB4' OR
SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J83'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J85'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J88'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB4' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J62'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB4' OR SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSEIF GS_QALS-ART EQ 'J63'.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB4' OR SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' .
SCREEN-ACTIVE = 0 .
ENDIF .
ELSE.
IF SCREEN-NAME EQ 'TAB1' OR SCREEN-NAME EQ 'TAB2' OR SCREEN-NAME EQ 'TAB3' OR
SCREEN-NAME EQ 'TAB4' OR SCREEN-NAME EQ 'TAB5' OR SCREEN-NAME EQ 'TAB6' OR SCREEN-NAME EQ 'TAB7' .
SCREEN-ACTIVE = 0 .
ENDIF .
ENDIF .
MODIFY SCREEN .
ENDLOOP .
ENDMODULE. " STATUS_0100 OUTPUT
*&SPWIZARD: OUTPUT MODULE FOR TS 'TABS'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: SETS ACTIVE TAB
MODULE TABS_ACTIVE_TAB_SET OUTPUT.
CASE GS_QALS-ART .
WHEN 'J61' .
G_TABS-PRESSED_TAB = 'TAB1' .
WHEN 'J91' .
G_TABS-PRESSED_TAB = 'TAB1' .
WHEN 'J81'.
G_TABS-PRESSED_TAB = 'TAB2' .
WHEN 'J82'.
G_TABS-PRESSED_TAB = 'TAB3' .
WHEN 'J83'.
G_TABS-PRESSED_TAB = 'TAB4' .
WHEN 'J83'.
G_TABS-PRESSED_TAB = 'TAB5' .
WHEN 'J88'.
G_TABS-PRESSED_TAB = 'TAB5' .
WHEN 'J62'.
G_TABS-PRESSED_TAB = 'TAB6' .
WHEN 'J63'.
G_TABS-PRESSED_TAB = 'TAB7' .
ENDCASE .
TABS-ACTIVETAB = G_TABS-PRESSED_TAB.
CASE G_TABS-PRESSED_TAB.
WHEN C_TABS-TAB1.
G_TABS-SUBSCREEN = '0101'.
WHEN C_TABS-TAB2.
G_TABS-SUBSCREEN = '0102'.
WHEN C_TABS-TAB3.
G_TABS-SUBSCREEN = '0103'.
WHEN C_TABS-TAB4.
G_TABS-SUBSCREEN = '0104'.
WHEN C_TABS-TAB5.
G_TABS-SUBSCREEN = '0105'.
WHEN C_TABS-TAB6.
G_TABS-SUBSCREEN = '0106'.
WHEN C_TABS-TAB7.
G_TABS-SUBSCREEN = '0107'.
WHEN OTHERS.
G_TABS-SUBSCREEN = '9999'.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE. "TABS_ACTIVE_TAB_SET OUTPUT
*&SPWIZARD: INPUT MODULE FOR TS 'TABS'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GETS ACTIVE TAB
MODULE TABS_ACTIVE_TAB_GET INPUT.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN C_TABS-TAB1.
G_TABS-PRESSED_TAB = C_TABS-TAB1.
WHEN C_TABS-TAB2.
G_TABS-PRESSED_TAB = C_TABS-TAB2.
WHEN C_TABS-TAB3.
G_TABS-PRESSED_TAB = C_TABS-TAB3.
WHEN C_TABS-TAB4.
G_TABS-PRESSED_TAB = C_TABS-TAB4.
WHEN C_TABS-TAB5.
G_TABS-PRESSED_TAB = C_TABS-TAB5.
WHEN C_TABS-TAB6.
G_TABS-PRESSED_TAB = C_TABS-TAB6.
WHEN C_TABS-TAB7.
G_TABS-PRESSED_TAB = C_TABS-TAB7.
WHEN OTHERS.
*&SPWIZARD: DO NOTHING
ENDCASE.
ENDMODULE. "TABS_ACTIVE_TAB_GET INPUT
*----------------------------------------------------------------------*
***INCLUDE LZFG_QM_ENI01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
MOVE-CORRESPONDING QALS_CUST TO GS_QALS .
*触发BADI get_data方法
IF REF_SUBSCR_1101_QEVA IS NOT INITIAL .
CALL METHOD REF_SUBSCR_1101_QEVA->get_DATA
EXPORTING
FLT_VAL = GV_FLT_VAL
IMPORTING
e_QALS = GS_QALS
e_RQEVA = GS_RQEVA.
ENDIF .
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module GET_DATA OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE GET_DATA OUTPUT.
ENDMODULE. " GET_DATA OUTPUT
BADI方法:

PUT_DATA将数据传输子屏幕:
METHOD IF_EX_QEVA_SUBSCREEN_1101~PUT_DATA.
data:ls_qals type qals .
IF IF_EX_QEVA_SUBSCREEN_1101~G_QALS IS NOT INITIAL .
MOVE-CORRESPONDING IF_EX_QEVA_SUBSCREEN_1101~G_QALS TO LS_QALS .
ELSE .
MOVE-CORRESPONDING I_QALS TO LS_QALS .
ENDIF .
CALL FUNCTION 'ZQM_FM_PUT_DATA'
EXPORTING
I_QALS = LS_QALS
I_RQEVA = I_RQEVA
I_QHERK = FLT_VAL.
ENDMETHOD.
GET_DATA从子屏幕获取数据:
METHOD IF_EX_QEVA_SUBSCREEN_1101~GET_DATA.
data:lv_string type string VALUE '(SAPMQEVA)QALS' .
data:ls_infos type ci_qals .
data:ls_cust type ci_qals .
FIELD-SYMBOLS:<fs_info> type qals .
CALL FUNCTION 'ZQM_FM_GET_DATA'
IMPORTING
E_QALS = E_QALS
E_RQEVA = E_RQEVA
.
MOVE-CORRESPONDING E_QALS to IF_EX_QEVA_SUBSCREEN_1101~G_QALS .
ASSIGN (lv_string) to <fs_info> .
if sy-subrc = 0 .
MOVE-CORRESPONDING E_QALS to ls_cust .
MOVE-CORRESPONDING ls_cust to <fs_info> .
endif .
ENDMETHOD.
本文档展示了在SAP系统中如何通过BADI(业务添加件接口)进行屏幕增强,添加客制化字段,并实现数据在自定义屏幕与主程序之间的传输。主要涉及屏幕逻辑处理、自定义函数组的创建以及数据获取与设置的方法,如GET_DATA和PUT_DATA,以根据不同的业务场景动态控制屏幕元素的可见性。
1775

被折叠的 条评论
为什么被折叠?



