REPORT ZTEST0021 NO STANDARD PAGE HEADING
LINE-SIZE 170.
*----------------------------------------------------------------------*
* 声明数据库表
*----------------------------------------------------------------------*
TABLES MARA.
*----------------------------------------------------------------------*
* 定义类型、内表与变量
*----------------------------------------------------------------------*
TYPES:BEGIN OF TYP_DATA, "输出内表的结构类型
MATNR TYPE MAKT-MATNR,
MATKL TYPE MARA-MATKL,
MAKTX TYPE MAKT-MAKTX,
SPRAS TYPE MAKT-SPRAS,
END OF TYP_DATA.
* ALV下拉菜单的输出内表类型
TYPES:BEGIN OF TYP_ALV,
MATNR TYPE MAKT-MATNR,
MATKL TYPE MARA-MATKL,
MAKTX TYPE MAKT-MAKTX,
SPRAS TYPE MAKT-SPRAS,
DD_HANDLE TYPE INT4,
END OF TYP_ALV.
*----------------------------------------------------------------------*
* 全局变量
DATA I_RESULT TYPE TABLE OF TYP_DATA WITH HEADER LINE.
*----------------------------------------------------------------------*
* ALV 工作区、变量与内表
TYPE-POOLS: SLIS.
DATA:I_FIELDCAT TYPE LVC_T_FCAT, "输出的内表字段
WA_FIELDCAT TYPE LVC_S_FCAT,
I_EVENTS TYPE SLIS_T_EVENT, "事件存储内表
WA_EVENTS TYPE SLIS_ALV_EVENT,
I_DDVAL TYPE LVC_T_DROP, "存储下拉列表的数据
WA_DDVAL TYPE LVC_S_DROP,
I_ALV TYPE TABLE OF TYP_ALV, "ALV
WA_ALV TYPE TYP_ALV.
DATA:WA_SORT TYPE SLIS_T_SORTINFO_ALV,
WA_VARIANT TYPE DISVARIANT,
V_REPID TYPE SY-REPID VALUE SY-REPID.
*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECT-OPTIONS S_MATNR FOR MARA-MATNR.
*----------------------------------------------------------------------*
* Executing program's events
*----------------------------------------------------------------------*
INITIALIZATION.
START-OF-SELECTION.
PERFORM F_QUERY_DATA.
PERFORM F_CREATE_FIELDCAT.
PERFORM F_CREATE_DROPDOWN_LIST.
PERFORM F_CREATE_EVENT_EXITS.
PERFORM F_DISPLAY_ALV.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Form f_query_data
*----------------------------------------------------------------------*
* 从数据库表中查询数据
*----------------------------------------------------------------------*
FORM F_QUERY_DATA .
SELECT MARA~MATNR
MARA~MATKL
MAKT~MAKTX
MAKT~SPRAS
INTO TABLE I_RESULT UP TO 50 ROWS
FROM MARA INNER JOIN MAKT ON MARA~MATNR = MAKT~MATNR
WHERE MARA~MATNR IN S_MATNR AND
MAKT~SPRAS EQ '1'.
LOOP AT I_RESULT.
MOVE-CORRESPONDING I_RESULT TO WA_ALV.
APPEND WA_ALV TO I_ALV.
ENDLOOP.
ENDFORM. " f_query_data
*----------------------------------------------------------------------*
* Form f_create_fieldcat
*----------------------------------------------------------------------*
* 初始化输出内表的格式与字段
*----------------------------------------------------------------------*
FORM F_CREATE_FIELDCAT .
DEFINE M_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = &1.
WA_FIELDCAT-REF_FIELD = &2.
WA_FIELDCAT-REF_TABLE = &3.
IF &1 = 'MATKL'.
WA_FIELDCAT-INTTYPE = 'C'.
WA_FIELDCAT-INTLEN = '9'.
WA_FIELDCAT-EDIT = 'X'.
WA_FIELDCAT-OUTPUTLEN = '12'.
WA_FIELDCAT-DD_OUTLEN = '12'.
WA_FIELDCAT-DRDN_FIELD = 'DD_HANDLE'. "设置下拉菜单
ENDIF.
APPEND WA_FIELDCAT TO I_FIELDCAT.
END-OF-DEFINITION.
M_FIELDCAT 'MATNR' 'MATNR' 'MAKT'.
M_FIELDCAT 'MATKL' 'MATKL' 'MARA'.
M_FIELDCAT 'MAKTX' 'MAKTX' 'MAKT'.
ENDFORM. " f_create_fieldcat
*----------------------------------------------------------------------*
* Form f_create_dropdown_list
*----------------------------------------------------------------------*
* 创建下拉菜单内表
*----------------------------------------------------------------------*
FORM F_CREATE_DROPDOWN_LIST .
DATA: L_MATKL TYPE MARA-MATKL,
L_COUNT TYPE I.
LOOP AT I_ALV INTO WA_ALV.
ADD 1 TO L_COUNT.
CLEAR WA_DDVAL.
WA_DDVAL-HANDLE = L_COUNT.
WA_DDVAL-VALUE = ' '.
APPEND WA_DDVAL TO I_DDVAL.
SELECT MATKL
INTO L_MATKL
FROM MARA
WHERE MATNR = WA_ALV-MATNR.
CLEAR WA_DDVAL.
WA_DDVAL-HANDLE = L_COUNT.
WA_DDVAL-VALUE = L_MATKL.
APPEND WA_DDVAL TO I_DDVAL.
ENDSELECT.
*设置对应
WA_ALV-DD_HANDLE = L_COUNT.
MODIFY I_ALV FROM WA_ALV.
ENDLOOP.
ENDFORM. " f_create_dropdown_list
*----------------------------------------------------------------------*
* Form f_create_event_exits
*----------------------------------------------------------------------*
* 添加下拉菜单事件
*----------------------------------------------------------------------*
FORM F_CREATE_EVENT_EXITS .
WA_EVENTS-NAME = 'CALLER_EXIT'. "固定值
WA_EVENTS-FORM = 'F_CALLER_EXIT'.
APPEND WA_EVENTS TO I_EVENTS.
ENDFORM. " f_create_event_exits
*----------------------------------------------------------------------*
* Form f_display_alv
*----------------------------------------------------------------------*
* 调用 FUNCTION 输出ALV报表
*----------------------------------------------------------------------*
FORM F_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = V_REPID
IT_FIELDCAT_LVC = I_FIELDCAT
IT_EVENTS = I_EVENTS[]
TABLES
T_OUTTAB = I_ALV.
ENDFORM. " f_display_alv
*----------------------------------------------------------------------*
* FORMf_caller_exit
*----------------------------------------------------------------------*
* 设置下拉列表,使Grid和内表能链接上
*----------------------------------------------------------------------*
FORM F_CALLER_EXIT USING LS_DATA TYPE SLIS_DATA_CALLER_EXIT.
DATA: L_REF_ALV TYPE REF TO CL_GUI_ALV_GRID.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_REF_ALV.
CALL METHOD L_REF_ALV->SET_DROP_DOWN_TABLE
EXPORTING
IT_DROP_DOWN = I_DDVAL.
ENDFORM. "CALLER_EXIT
LINE-SIZE 170.
*----------------------------------------------------------------------*
* 声明数据库表
*----------------------------------------------------------------------*
TABLES MARA.
*----------------------------------------------------------------------*
* 定义类型、内表与变量
*----------------------------------------------------------------------*
TYPES:BEGIN OF TYP_DATA, "输出内表的结构类型
MATNR TYPE MAKT-MATNR,
MATKL TYPE MARA-MATKL,
MAKTX TYPE MAKT-MAKTX,
SPRAS TYPE MAKT-SPRAS,
END OF TYP_DATA.
* ALV下拉菜单的输出内表类型
TYPES:BEGIN OF TYP_ALV,
MATNR TYPE MAKT-MATNR,
MATKL TYPE MARA-MATKL,
MAKTX TYPE MAKT-MAKTX,
SPRAS TYPE MAKT-SPRAS,
DD_HANDLE TYPE INT4,
END OF TYP_ALV.
*----------------------------------------------------------------------*
* 全局变量
DATA I_RESULT TYPE TABLE OF TYP_DATA WITH HEADER LINE.
*----------------------------------------------------------------------*
* ALV 工作区、变量与内表
TYPE-POOLS: SLIS.
DATA:I_FIELDCAT TYPE LVC_T_FCAT, "输出的内表字段
WA_FIELDCAT TYPE LVC_S_FCAT,
I_EVENTS TYPE SLIS_T_EVENT, "事件存储内表
WA_EVENTS TYPE SLIS_ALV_EVENT,
I_DDVAL TYPE LVC_T_DROP, "存储下拉列表的数据
WA_DDVAL TYPE LVC_S_DROP,
I_ALV TYPE TABLE OF TYP_ALV, "ALV
WA_ALV TYPE TYP_ALV.
DATA:WA_SORT TYPE SLIS_T_SORTINFO_ALV,
WA_VARIANT TYPE DISVARIANT,
V_REPID TYPE SY-REPID VALUE SY-REPID.
*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECT-OPTIONS S_MATNR FOR MARA-MATNR.
*----------------------------------------------------------------------*
* Executing program's events
*----------------------------------------------------------------------*
INITIALIZATION.
START-OF-SELECTION.
PERFORM F_QUERY_DATA.
PERFORM F_CREATE_FIELDCAT.
PERFORM F_CREATE_DROPDOWN_LIST.
PERFORM F_CREATE_EVENT_EXITS.
PERFORM F_DISPLAY_ALV.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Form f_query_data
*----------------------------------------------------------------------*
* 从数据库表中查询数据
*----------------------------------------------------------------------*
FORM F_QUERY_DATA .
SELECT MARA~MATNR
MARA~MATKL
MAKT~MAKTX
MAKT~SPRAS
INTO TABLE I_RESULT UP TO 50 ROWS
FROM MARA INNER JOIN MAKT ON MARA~MATNR = MAKT~MATNR
WHERE MARA~MATNR IN S_MATNR AND
MAKT~SPRAS EQ '1'.
LOOP AT I_RESULT.
MOVE-CORRESPONDING I_RESULT TO WA_ALV.
APPEND WA_ALV TO I_ALV.
ENDLOOP.
ENDFORM. " f_query_data
*----------------------------------------------------------------------*
* Form f_create_fieldcat
*----------------------------------------------------------------------*
* 初始化输出内表的格式与字段
*----------------------------------------------------------------------*
FORM F_CREATE_FIELDCAT .
DEFINE M_FIELDCAT.
CLEAR WA_FIELDCAT.
WA_FIELDCAT-FIELDNAME = &1.
WA_FIELDCAT-REF_FIELD = &2.
WA_FIELDCAT-REF_TABLE = &3.
IF &1 = 'MATKL'.
WA_FIELDCAT-INTTYPE = 'C'.
WA_FIELDCAT-INTLEN = '9'.
WA_FIELDCAT-EDIT = 'X'.
WA_FIELDCAT-OUTPUTLEN = '12'.
WA_FIELDCAT-DD_OUTLEN = '12'.
WA_FIELDCAT-DRDN_FIELD = 'DD_HANDLE'. "设置下拉菜单
ENDIF.
APPEND WA_FIELDCAT TO I_FIELDCAT.
END-OF-DEFINITION.
M_FIELDCAT 'MATNR' 'MATNR' 'MAKT'.
M_FIELDCAT 'MATKL' 'MATKL' 'MARA'.
M_FIELDCAT 'MAKTX' 'MAKTX' 'MAKT'.
ENDFORM. " f_create_fieldcat
*----------------------------------------------------------------------*
* Form f_create_dropdown_list
*----------------------------------------------------------------------*
* 创建下拉菜单内表
*----------------------------------------------------------------------*
FORM F_CREATE_DROPDOWN_LIST .
DATA: L_MATKL TYPE MARA-MATKL,
L_COUNT TYPE I.
LOOP AT I_ALV INTO WA_ALV.
ADD 1 TO L_COUNT.
CLEAR WA_DDVAL.
WA_DDVAL-HANDLE = L_COUNT.
WA_DDVAL-VALUE = ' '.
APPEND WA_DDVAL TO I_DDVAL.
SELECT MATKL
INTO L_MATKL
FROM MARA
WHERE MATNR = WA_ALV-MATNR.
CLEAR WA_DDVAL.
WA_DDVAL-HANDLE = L_COUNT.
WA_DDVAL-VALUE = L_MATKL.
APPEND WA_DDVAL TO I_DDVAL.
ENDSELECT.
*设置对应
WA_ALV-DD_HANDLE = L_COUNT.
MODIFY I_ALV FROM WA_ALV.
ENDLOOP.
ENDFORM. " f_create_dropdown_list
*----------------------------------------------------------------------*
* Form f_create_event_exits
*----------------------------------------------------------------------*
* 添加下拉菜单事件
*----------------------------------------------------------------------*
FORM F_CREATE_EVENT_EXITS .
WA_EVENTS-NAME = 'CALLER_EXIT'. "固定值
WA_EVENTS-FORM = 'F_CALLER_EXIT'.
APPEND WA_EVENTS TO I_EVENTS.
ENDFORM. " f_create_event_exits
*----------------------------------------------------------------------*
* Form f_display_alv
*----------------------------------------------------------------------*
* 调用 FUNCTION 输出ALV报表
*----------------------------------------------------------------------*
FORM F_DISPLAY_ALV .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = V_REPID
IT_FIELDCAT_LVC = I_FIELDCAT
IT_EVENTS = I_EVENTS[]
TABLES
T_OUTTAB = I_ALV.
ENDFORM. " f_display_alv
*----------------------------------------------------------------------*
* FORMf_caller_exit
*----------------------------------------------------------------------*
* 设置下拉列表,使Grid和内表能链接上
*----------------------------------------------------------------------*
FORM F_CALLER_EXIT USING LS_DATA TYPE SLIS_DATA_CALLER_EXIT.
DATA: L_REF_ALV TYPE REF TO CL_GUI_ALV_GRID.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_REF_ALV.
CALL METHOD L_REF_ALV->SET_DROP_DOWN_TABLE
EXPORTING
IT_DROP_DOWN = I_DDVAL.
ENDFORM. "CALLER_EXIT