二维码

[基础语法] ABAP实现根据选择的字段名进行动态汇总

Twilight发表于 2018-08-22 10:00zlzt 最后回复于 2019-10-31 16:28 [复制链接] 3115 1

注意动态排序的使用方法,其次就是动态语法的运用了。

1、程序代码
  1. TYPES:BEGIN OF ty_ALV,
  2.    length     TYPE i,
  3.    width      TYPE i,
  4.    high       TYPE i,
  5.    qty1       TYPE i,
  6.    qty2       TYPE i,
  7.     END OF ty_alv.
  8. DATA:gt_alv TYPE TABLE OF ty_alv,
  9.      gs_alv TYPE ty_alv.

  10. TYPES:BEGIN OF ty_field,
  11.   fieldname TYPE fieldname,
  12.      END OF ty_field.
  13. DATA:gt_total_field TYPE TABLE OF ty_field,
  14.      gs_total_field TYPE  ty_field.
  15. DATA:gt_criterion_field TYPE TABLE OF ty_field,
  16.      gs_criterion_field TYPE  ty_field.


  17. DATA:gt_data TYPE REF TO data.
  18. FIELD-SYMBOLS:<f_t> TYPE STANDARD TABLE,
  19.               <f_wa> ,
  20.               <f_1>.

  21. PARAMETERS: p_l TYPE c AS CHECKBOX,
  22.             p_w TYPE c AS CHECKBOX,
  23.             p_h TYPE c AS CHECKBOX.

  24. START-OF-SELECTION.
  25.   PERFORM frm_initial_tab USING 1 2 3 12 13.
  26.   PERFORM frm_initial_tab USING 1 2 3 12 16.
  27.   PERFORM frm_initial_tab USING 1 2 4 1  3 .
  28.   PERFORM frm_initial_tab USING 1 3 4 12 13.
  29.   PERFORM frm_initial_tab USING 1 4 3 12 16.
  30.   PERFORM frm_initial_tab USING 1 4 5 12 17.

  31.   " CRITERION_FIELD
  32.   IF  p_l = 'X'.
  33.     gs_criterion_field-fieldname = 'LENGTH'.
  34.     APPEND gs_criterion_field TO gt_criterion_field.
  35.   ENDIF.

  36.   IF  p_w = 'X'.
  37.     gs_criterion_field-fieldname = 'WIDTH'.
  38.     APPEND gs_criterion_field TO gt_criterion_field.
  39.   ENDIF.

  40.   IF  p_h = 'X'.
  41.     gs_criterion_field-fieldname = 'HIGH'.
  42.     APPEND gs_criterion_field TO gt_criterion_field.
  43.   ENDIF.

  44.   IF p_l IS INITIAL AND
  45.      p_w IS INITIAL AND
  46.      p_h IS INITIAL.

  47.     LOOP AT gt_alv ASSIGNING <f_wa>.
  48.       ULINE.
  49.       DO.
  50.         ASSIGN COMPONENT sy-index OF STRUCTURE <f_wa> TO <f_1>.
  51.         IF sy-subrc NE 0.
  52.           EXIT.
  53.         ELSE.
  54.           WRITE:<f_1>.
  55.         ENDIF.
  56.       ENDDO.
  57.     ENDLOOP.
  58.     EXIT.
  59.   ENDIF.

  60.   "TOTAL_FIELD
  61.   gs_total_field-fieldname = 'QTY1'.
  62.   APPEND gs_total_field TO gt_total_field.

  63.   gs_total_field-fieldname = 'QTY2'.
  64.   APPEND gs_total_field TO gt_total_field.

  65.   "传入内表
  66.   "汇总的数量字段(在内表中的字段名)
  67.   "汇总的标准(在内表中的字段名)
  68.   PERFORM frm_subtotal TABLES   gt_alv
  69.                                 gt_total_field
  70.                                 gt_criterion_field
  71.                        CHANGING gt_data .
  72.   "输出类型为DATA的动态内表(字段为:汇总的标准+汇总的数量字段)
  73.   ASSIGN gt_data->* TO <f_t>.

  74.   LOOP AT <f_t> ASSIGNING <f_wa>.
  75.     ULINE.

  76.     DO.
  77.       ASSIGN COMPONENT sy-index OF STRUCTURE <f_wa> TO <f_1>.
  78.       IF sy-subrc NE 0.
  79.         EXIT.
  80.       ELSE.
  81.         WRITE:<f_1>.
  82.       ENDIF.
  83.     ENDDO.
  84.   ENDLOOP.
  85. *&---------------------------------------------------------------------*
  86. *&      Form  FRM_INITIAL_TAB
  87. *&---------------------------------------------------------------------*
  88. *       text
  89. *----------------------------------------------------------------------*
  90. *      -->P_1      text
  91. *      -->P_2      text
  92. *      -->P_3      text
  93. *      -->P_12     text
  94. *      -->P_13     text
  95. *----------------------------------------------------------------------*
  96. FORM frm_initial_tab  USING  p1 p2 p3 p4 p5.
  97.   CLEAR:gs_alv.
  98.   gs_alv-length = p1.
  99.   gs_alv-width  = p2.
  100.   gs_alv-high   = p3.
  101.   gs_alv-qty1   = p4.
  102.   gs_alv-qty2   = p5.
  103.   APPEND gs_alv TO gt_alv.
  104. ENDFORM.                    " FRM_INITIAL_TAB
  105. *&---------------------------------------------------------------------*
  106. *&      Form  FRM_SUBTOTAL
  107. *&---------------------------------------------------------------------*
  108. *       text
  109. *----------------------------------------------------------------------*
  110. *      -->P_GT_ALV  text
  111. *      -->P_GT_TOTAL_FIELD  text
  112. *      -->P_GS_CRITERION_FIELD  text
  113. *----------------------------------------------------------------------*
  114. FORM frm_subtotal  TABLES   t_alv             STRUCTURE gs_alv
  115.                             t_total_field     STRUCTURE gs_total_field
  116.                             t_criterion_field STRUCTURE gs_criterion_field
  117.                    CHANGING t_data            TYPE REF TO data.
  118.   TYPE-POOLS abap.

  119.   DATA:lv_tabix  TYPE sy-tabix.

  120.   "Get FIELD Name
  121.   DATA:ls_comp TYPE abap_compdescr,
  122.        ref_descr TYPE REF TO cl_abap_structdescr.

  123.   "Dynamic Sort
  124.   DATA:sort_tab  TYPE abap_sortorder_tab,
  125.        sort_line TYPE abap_sortorder.

  126.   "Build New Table
  127.   DATA: xfc       TYPE lvc_s_fcat,
  128.         ifc       TYPE lvc_t_fcat.
  129.   FIELD-SYMBOLS: <f_out> TYPE STANDARD TABLE,
  130.                  <f_out_wa> ,
  131.                  <f_1>,
  132.                  <f_2>.

  133.   DATA: lr_out_wa     TYPE REF TO data,
  134.         lr_out        TYPE REF TO data,
  135.         out_wa        TYPE REF TO data,
  136.         out_t         TYPE REF TO data.

  137.   "Out Table
  138.   FIELD-SYMBOLS:<t_out> TYPE STANDARD TABLE,
  139.                 <wa_out>.

  140.   ref_descr ?= cl_abap_typedescr=>describe_by_data( t_alv ).

  141.   "Build New Table
  142.   LOOP AT t_criterion_field.
  143.     READ TABLE ref_descr->components INTO ls_comp
  144.                                      WITH KEY name = t_criterion_field-fieldname.
  145.     IF sy-subrc = 0.
  146.       CLEAR xfc.
  147.       xfc-fieldname = ls_comp-name .
  148.       xfc-inttype   = ls_comp-type_kind.
  149.       xfc-intlen    = ls_comp-length.
  150.       xfc-decimals  = ls_comp-decimals.
  151.       APPEND xfc TO ifc.

  152.       sort_line-name = ls_comp-name.
  153.       APPEND sort_line TO sort_tab.
  154.     ENDIF.
  155.   ENDLOOP.

  156.   LOOP AT t_total_field.
  157.     READ TABLE ref_descr->components INTO ls_comp
  158.                                      WITH KEY name = t_total_field-fieldname.
  159.     IF sy-subrc = 0.
  160.       CLEAR xfc.
  161.       xfc-fieldname = ls_comp-name .
  162.       xfc-inttype   = ls_comp-type_kind.
  163.       xfc-intlen    = ls_comp-length.
  164.       xfc-decimals  = ls_comp-decimals.
  165.       APPEND xfc TO ifc.
  166.     ENDIF.
  167.   ENDLOOP.

  168.   CALL METHOD cl_alv_table_create=>create_dynamic_table
  169.     EXPORTING
  170.       it_fieldcatalog = ifc
  171.     IMPORTING
  172.       ep_table        = lr_out.

  173.   ASSIGN lr_out->* TO <f_out>.

  174.   CREATE DATA lr_out_wa LIKE LINE OF <f_out>.
  175.   ASSIGN lr_out_wa->* TO <f_out_wa>.

  176.   CALL METHOD cl_alv_table_create=>create_dynamic_table
  177.     EXPORTING
  178.       it_fieldcatalog = ifc
  179.     IMPORTING
  180.       ep_table        = out_t.

  181.   ASSIGN out_t->* TO <t_out>.

  182.   CREATE DATA out_wa LIKE LINE OF <t_out>.
  183.   ASSIGN out_wa->* TO <wa_out>.

  184.   DESCRIBE TABLE t_criterion_field LINES lv_tabix.
  185.   READ TABLE t_criterion_field INDEX lv_tabix.

  186.   LOOP AT t_alv.
  187.     MOVE-CORRESPONDING  t_alv TO  <f_out_wa>.
  188.     APPEND <f_out_wa> TO <f_out>.

  189.     CHECK <f_out> IS NOT INITIAL.
  190.   ENDLOOP.
  191.   "Sort Dynamic
  192.   SORT <f_out> BY (sort_tab).


  193.   LOOP AT <f_out> ASSIGNING <f_out_wa>.
  194.     LOOP AT t_total_field.
  195.       ASSIGN COMPONENT t_total_field-fieldname OF STRUCTURE <f_out_wa> TO <f_1>.
  196.       ASSIGN COMPONENT t_total_field-fieldname OF STRUCTURE <wa_out>   TO <f_2>.
  197.       <f_2> =  <f_2> + <f_1> .
  198.     ENDLOOP.

  199.     AT END OF (t_criterion_field-fieldname).
  200.       LOOP AT t_criterion_field.
  201.         ASSIGN COMPONENT t_criterion_field-fieldname OF STRUCTURE <f_out_wa> TO <f_1>.
  202.         ASSIGN COMPONENT t_criterion_field-fieldname OF STRUCTURE <wa_out>    TO <f_2>.
  203.         <f_2> = <f_1> .
  204.       ENDLOOP.

  205.       APPEND <wa_out> TO <t_out> .
  206.       CLEAR:<wa_out>.
  207.     ENDAT.
  208.   ENDLOOP.

  209.   t_data = out_t.
  210. ENDFORM.                    " FRM_SUBTOTAL
复制代码
2、执行结果
动态汇总1.jpg
动态汇总2.jpg
回复

使用道具 举报

zlzt
学习一下,感谢
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表