点击查看代码
REPORT zcuitest94.
TABLES:t004f,tmodg,rfcdes.
DATA:gt_t004f TYPE TABLE OF t004f,
gs_t004f TYPE t004f,
gt_t004f_dest TYPE TABLE OF t004f,
gs_t004f_dest TYPE t004f,
gt_tmodu TYPE TABLE OF tmodu,
gs_tmodu TYPE tmodu,
gt_tmodo TYPE TABLE OF tmodo,
gs_tmodo TYPE tmodo.
DATA:gs_layout TYPE lvc_s_layo,
gs_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE TABLE OF lvc_s_fcat.
DATA dyn_table TYPE REF TO data.
DATA dyn_wa TYPE REF TO data.
FIELD-SYMBOLS:<dyn_table> TYPE STANDARD TABLE,
<dyn_wa> TYPE any,
<dyn_wa_dest> TYPE any,
<dyn_wa_result> TYPE any,
<dyn_value> TYPE any.
FIELD-SYMBOLS:<fs>,<fs_dest>,<fs_result>.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) bukrs.
PARAMETERS:p_bukrs TYPE t004f-bukrs.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE b1.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_1allg TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(23) 1allg.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_2kont TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(23) 2kont.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_3mate TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) 3mate.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_4zahl TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(23) 4zahl.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_5anla TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(23) 5anla.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_6quel TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) 6quel.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_7ausl TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) 7ausl.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_8kons TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) 8kons.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_9immo TYPE char1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(23) 9immo.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_9verm TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) 9verm.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b1.
SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE b2.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) dest.
PARAMETERS:p_dest TYPE rfcdes-rfcdest.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_row TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) row.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_col TYPE char1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(23) col.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK b2.
INITIALIZATION.
bukrs = '字段状态变式'.
b1 = '查询字段'.
b2 = '与其他系统对比'.
dest = 'RFC链接'.
row = '隐藏完全相同的字段状态组'.
col = '隐藏完全相同的列'.
SELECT *
FROM tmodg
WHERE fauna = 'SKB1-FAUS1' AND
spras = '1'.
ASSIGN (tmodg-ggrup) TO <fs>.
<fs> = tmodg-ftext.
ENDSELECT.
AT SELECTION-SCREEN.
IF p_dest IS NOT INITIAL.
SELECT SINGLE *
INTO rfcdes
FROM rfcdes
WHERE rfcdest = p_dest.
IF sy-subrc <> 0.
MESSAGE 'RFC链接不存在!' TYPE 'E'.
ENDIF.
IF rfcdes-rfctype <> '3'.
MESSAGE '只能选择类型为3的RFC链接!' TYPE 'E'.
ENDIF.
ENDIF.
START-OF-SELECTION.
SELECT *
FROM t004f
INTO TABLE gt_t004f
WHERE bukrs = p_bukrs.
IF p_dest IS NOT INITIAL.
DATA:gt_data TYPE TABLE OF tab512,
gs_data TYPE tab512,
gt_options TYPE TABLE OF rfc_db_opt,
gt_fields TYPE TABLE OF rfc_db_fld.
CALL FUNCTION 'RFC_READ_TABLE' DESTINATION p_dest
EXPORTING
query_table = 'T004F'
TABLES
options = gt_options
fields = gt_fields
data = gt_data
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE '读取其他系统数据出错!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
LOOP AT gt_data INTO gs_data.
gs_t004f_dest = gs_data.
APPEND gs_t004f_dest TO gt_t004f_dest.
ENDLOOP.
ENDIF.
SELECT *
FROM tmodo
INTO TABLE gt_tmodo
WHERE fauna = 'SKB1-FAUS1'.
SELECT *
FROM tmodu
INTO TABLE gt_tmodu
WHERE fauna = 'SKB1-FAUS1' AND
koart = 'S'.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = 'FSTAG'.
gs_fieldcat-coltext = '字段状态组'.
gs_fieldcat-key = 'X'.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-tabname = 'T004G'.
gs_fieldcat-fieldname = 'FSTTX'.
gs_fieldcat-coltext = '字段状态组名称'.
gs_fieldcat-key = 'X'.
gs_fieldcat-outputlen = 40.
APPEND gs_fieldcat TO gt_fieldcat.
LOOP AT gt_tmodu INTO gs_tmodu.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = gs_tmodu-feldn.
gs_fieldcat-coltext = gs_tmodu-feldn.
READ TABLE gt_tmodo INTO gs_tmodo WITH KEY modif = gs_tmodu-modif.
IF sy-subrc = 0.
DATA lv_field TYPE char50.
lv_field = 'P_' && gs_tmodo-ggrup.
ASSIGN (lv_field) TO <fs>.
IF <fs> <> 'X'.
gs_fieldcat-no_out = 'X'."隐藏
ENDIF.
DATA gs_tmodp TYPE tmodp.
CLEAR gs_tmodp.
SELECT SINGLE *
INTO gs_tmodp
FROM tmodp
WHERE spras = '1' AND
fauna = gs_tmodo-fauna AND
modif = gs_tmodo-modif.
gs_fieldcat-coltext = gs_fieldcat-coltext && '(' && gs_tmodp-ftext && ')'.
ENDIF.
APPEND gs_fieldcat TO gt_fieldcat.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat[] " Field Catalog
IMPORTING
ep_table = dyn_table.
ASSIGN dyn_table->* TO <dyn_table>.
CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
ASSIGN dyn_wa->* TO <dyn_wa>.
CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
ASSIGN dyn_wa->* TO <dyn_wa_dest>.
CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
ASSIGN dyn_wa->* TO <dyn_wa_result>.
LOOP AT gt_t004f INTO gs_t004f.
CLEAR <dyn_wa>.
ASSIGN COMPONENT 1 OF STRUCTURE <dyn_wa> TO <fs>.
<fs> = gs_t004f-fstag.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa> TO <fs>.
SELECT SINGLE fsttx
INTO <fs>
FROM t004g
WHERE fstag = gs_t004f-fstag AND
spras = '1' AND
bukrs = p_bukrs.
DATA:lv_value TYPE char140.
lv_value = gs_t004f-faus1.
lv_value+90(50) = gs_t004f-faus2.
DATA:lv_index TYPE i.
LOOP AT gt_tmodu INTO gs_tmodu.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa> TO <fs>.
lv_index = gs_tmodu-modif - 1.
CASE lv_value+lv_index(1).
WHEN '.'.
<fs> = '可选'.
WHEN '+'.
<fs> = '必输'.
WHEN '-'.
<fs> = '隐藏'.
ENDCASE.
ENDLOOP.
APPEND <dyn_wa> TO <dyn_table>.
*目标系统行
IF p_dest IS NOT INITIAL.
CLEAR <dyn_wa_dest>.
ASSIGN COMPONENT 1 OF STRUCTURE <dyn_wa_dest> TO <fs_dest>.
<fs_dest> = gs_t004f-fstag && '(' && '目标系统' && ')'.
READ TABLE gt_t004f_dest INTO gs_t004f_dest WITH KEY bukrs = gs_t004f-bukrs
fstag = gs_t004f-fstag.
IF sy-subrc = 0.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa_dest> TO <fs_dest>.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa> TO <fs>.
<fs_dest> = <fs>.
lv_value = gs_t004f_dest-faus1.
lv_value+90(50) = gs_t004f_dest-faus2.
LOOP AT gt_tmodu INTO gs_tmodu.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa_dest> TO <fs_dest>.
lv_index = gs_tmodu-modif - 1.
CASE lv_value+lv_index(1).
WHEN '.'.
<fs_dest> = '可选'.
WHEN '+'.
<fs_dest> = '必输'.
WHEN '-'.
<fs_dest> = '隐藏'.
ENDCASE.
ENDLOOP.
ELSE.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa_dest> TO <fs_dest>.
<fs_dest> = '目标系统不存在数据'.
ENDIF.
APPEND <dyn_wa_dest> TO <dyn_table>.
*对比每个字段是否相同
CLEAR <dyn_wa_result>.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa_result> TO <fs_result>.
<fs_result> = '对比结果'.
LOOP AT gt_tmodu INTO gs_tmodu.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa> TO <fs>.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa_dest> TO <fs_dest>.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa_result> TO <fs_result>.
IF <fs> <> <fs_dest>.
<fs_result> = '不相同'.
ELSE.
<fs_result> = '相同'.
ENDIF.
ENDLOOP.
APPEND <dyn_wa_result> TO <dyn_table>.
ENDIF.
ENDLOOP.
IF p_dest IS NOT INITIAL.
IF p_row = 'X'."隐藏完全相同的字段状态组
LOOP AT <dyn_table> INTO <dyn_wa>.
lv_index = sy-tabix."记录一下
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa> TO <fs>.
IF <fs> <> '对比结果'.
CONTINUE.
ENDIF.
DATA lv_flag TYPE char1.
CLEAR lv_flag.
LOOP AT gt_tmodu INTO gs_tmodu.
ASSIGN COMPONENT gs_tmodu-feldn OF STRUCTURE <dyn_wa> TO <fs>.
IF <fs> = '不相同'.
lv_flag = 'X'.
EXIT.
ENDIF.
ENDLOOP.
IF lv_flag = ''."说明字段都是相同的,删除当前行和前两行
DELETE <dyn_table> INDEX lv_index.
lv_index = lv_index - 1.
DELETE <dyn_table> INDEX lv_index.
lv_index = lv_index - 1.
DELETE <dyn_table> INDEX lv_index.
ENDIF.
ENDLOOP.
ENDIF.
IF p_col = 'X'."隐藏完全相同的字段状态组
LOOP AT gt_fieldcat INTO gs_fieldcat FROM 3.
CLEAR lv_flag.
LOOP AT <dyn_table> INTO <dyn_wa>.
ASSIGN COMPONENT 2 OF STRUCTURE <dyn_wa> TO <fs>.
IF <fs> <> '对比结果'.
CONTINUE.
ENDIF.
ASSIGN COMPONENT gs_fieldcat-fieldname OF STRUCTURE <dyn_wa> TO <fs>.
IF <fs> = '不相同'.
lv_flag = 'X'.
EXIT.
ENDIF.
ENDLOOP.
IF lv_flag = ''."所有此列所有值都是相同的
gs_fieldcat-no_out = 'X'.
ELSE.
gs_fieldcat-no_out = ''.
ENDIF.
MODIFY gt_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDIF.
ENDIF.
gs_layout-cwidth_opt = 'X'.
gs_layout-zebra = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
it_fieldcat_lvc = gt_fieldcat
is_layout_lvc = gs_layout
i_save = 'U'
TABLES
t_outtab = <dyn_table>
EXCEPTIONS
OTHERS = 1.