点击查看代码
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.
posted on 2026-02-05 09:27  北上  阅读(8)  评论(0)    收藏  举报