【问题标题】:How to generate a table with dynamic amount of colums (and a fixed set of rows)?如何生成具有动态列数(和一组固定行)的表?
【发布时间】:2017-10-07 16:34:23
【问题描述】:

我在工资单方面进行了一些计算,每个月/年都会产生大量数据和两个日期:开始日期 (mm/yyyy) 和结束日期 (mm/yyyy)。

我想要的是:生成一个内部表,该表的列数与 begda-year 到 endda-year 一样多(以年为单位)。例如,我的 begda 是 05/2010,endda 是 03/2013,那么我需要一个这样的表,其中包含 2010、2011、2012、2013 列和每个月的行:

对我来说困难的部分是,表格列(或 endda 和 begda)总是在变化,我怎么能意识到这一点?创建某种动态表?

【问题讨论】:

  • 您需要表格来显示内容还是仅用于内部计算?

标签: dynamic abap


【解决方案1】:

一般要工作几年?与其根据行来考虑它,不如记住,表中的行数与您附加到它的行数一样多。

您可以通过任何方式创建动态结构,通过 create_data 或 cl_alv_table_create (只要您没有几千列就可以正常工作)。

所以做伪代码并帮助你一点:

Step 1) Create a structure which contains a column for each year
Step 2) Pass the structure to CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE and get the table
        with the unique structure
Step 3) Append 12 rows to the table, 1 row representing each month of the year
Step 4) When needing to read the data, READ TABLE <table> WITH TABLE KEY monthname = 'MONTHNAME' INTO <structure>.
Step 5) ASSIGN <year>->* OF STRUCTURE <structure> TO <data>.
Step 6) <data> = whatever.

我不记得如何使用运行时创建的数据,但在 google 上快速搜索可以让你知道。

【讨论】:

    【解决方案2】:

    查看CREATE DATA HANDLE 文档。我不建议使用cl_alv_table_create=&gt;create_dynamic_table,因为它有内部限制。

    【讨论】:

      【解决方案3】:

      检查此代码。希望对您有所帮助:

      report  zdynamiccol.
      
      type-pools: slis.
      
      data: gt_fieldcat type slis_t_fieldcat_alv with header line,
      
      gs_layout type slis_layout_alv,
      g_repid type sy-repid.
      
      types: begin of ty_years,
        zyear(4) type c,
      end of ty_years.
      
      data it_years type table of ty_years. " The structure that will hold the years to create the dynamic columns
      
      types: begin of st_output, " Sample data
        zmonth type string,
        zyear(4) type c,
        zvalue type i,
        check type c,
      end of st_output,
      gt_tbl_data type standard table of st_output.
      
      data: gt_output type standard table of st_output ,
            gt_output2 type standard table of st_output.
      
      data:
      r_dyn_table type ref to data,
      t_fieldcat1 type lvc_t_fcat,
      wa_fieldcat1 type lvc_s_fcat.
      
      data:
      t_fieldcat2 type slis_t_fieldcat_alv,
      wa_fieldcat2 like line of t_fieldcat2.
      
      field-symbols:
      <t_dyn_table> type standard table,
      <wa_dyn_table> type any,
      <w_field> type any,
      <fs_st_output> type st_output,
      <wa_years> type ty_years.
      
      initialization.
        g_repid = sy-repid.
      
      select-options s_dats for sy-datum.
      
      start-of-selection.
      
        perform get_years. " Make the year column structure
      
        perform create_catalog. " Make the field catalog with the columns
      
        perform get_data. " Sample data
      
        perform process_data. " Fill table
      
        perform build_alv. " Create ALV
      
      form get_years.
      
        refresh: it_years.
      
        data zline like line of it_years.
        data year type i.
      
        year = s_dats-low(4).
        while year <= s_dats-high(4).
          clear zline.
          zline-zyear = year.
          append zline to it_years.
          add 1 to year.
        endwhile.
      
      endform.
      
      form create_catalog.
        data: cont type i.
      
        refresh: t_fieldcat1, t_fieldcat2.
        clear: wa_fieldcat1, wa_fieldcat2.
        cont = 1.
      
        wa_fieldcat1-fieldname = 'ZMONTH'.
        wa_fieldcat1-col_pos = cont.
        wa_fieldcat1-coltext = 'MONTH'.
        wa_fieldcat1-key = 'X'.
        wa_fieldcat1-seltext = wa_fieldcat1-coltext.
      
        append wa_fieldcat1 to t_fieldcat1.
      
        wa_fieldcat2-fieldname = 'ZMONTH'.
        wa_fieldcat2-ref_fieldname = 'MONTH'.
        wa_fieldcat2-seltext_l  = 'Month'.
        wa_fieldcat2-seltext_m  = 'Month'.
        wa_fieldcat2-seltext_s  = 'Month'.
        wa_fieldcat2-key = 'X' .
        wa_fieldcat2-outputlen = 10.
        wa_fieldcat2-col_pos = cont.
        append wa_fieldcat2 to t_fieldcat2.
      
        loop at it_years assigning <wa_years>.
          at new zyear.
            clear: wa_fieldcat1, wa_fieldcat2.
      
            wa_fieldcat1-fieldname = <wa_years>-zyear.
            wa_fieldcat1-inttype = 'I'.
            wa_fieldcat1-col_pos = cont.
            wa_fieldcat1-coltext = <wa_years>-zyear.
            wa_fieldcat1-seltext = wa_fieldcat1-coltext.
      
            append wa_fieldcat1 to t_fieldcat1.
      
            wa_fieldcat2-fieldname = wa_fieldcat1-fieldname.
            wa_fieldcat2-seltext_l  = wa_fieldcat1-seltext.
            wa_fieldcat2-col_pos = cont.
            append wa_fieldcat2 to t_fieldcat2.
      
            add 1 to cont.
          endat.
        endloop.
      
        call method cl_alv_table_create=>create_dynamic_table
          exporting
            it_fieldcatalog           = t_fieldcat1
          importing
            ep_table                  = r_dyn_table
          exceptions
            generate_subpool_dir_full = 1
            others                    = 2.
      
        assign r_dyn_table->* to <t_dyn_table>.
      endform.
      
      form get_data.
        data zrows type i value 10.
        data month type i.
        data line like line of gt_output.
        field-symbols <wa_gt_output> type st_output.
      
        clear line.
        line-zmonth = 'January'.
        line-zyear = 2010.
        line-zvalue = 100.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'February'.
        line-zyear = 2010.
        line-zvalue = 150.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'March'.
        line-zyear = 2010.
        line-zvalue = 160.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'April'.
        line-zyear = 2010.
        line-zvalue = 240.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'April'.
        line-zyear = 2013.
        line-zvalue = 233.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'January'.
        line-zyear = 2012.
        line-zvalue = 151.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'May'.
        line-zyear = 2012.
        line-zvalue = 101.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'June'.
        line-zyear = 2012.
        line-zvalue = 762.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'September'.
        line-zyear = 2012.
        line-zvalue = 666.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'October'.
        line-zyear = 2012.
        line-zvalue = 500.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'November'.
        line-zyear = 2012.
        line-zvalue = 101.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'December'.
        line-zyear = 2013.
        line-zvalue = 829.
        append line to gt_output.
        append line to gt_output2.
      
        clear line.
        line-zmonth = 'December'. " Sum to the same month
        line-zyear = 2013.
        line-zvalue = 1.
        append line to gt_output.
        append line to gt_output2.
      endform.
      
      form process_data.
      
        field-symbols <fs_data> type st_output.
        field-symbols <fs_check> type st_output.
        data lv_index type sy-tabix.
      
        loop at gt_output assigning <fs_st_output>.
      
          check <fs_st_output>-check eq space.
      
          append initial line to <t_dyn_table> assigning <wa_dyn_table>.
      
          assign component 'ZMONTH' of structure <wa_dyn_table> to <w_field>.
          <w_field> = <fs_st_output>-zmonth.
      
          loop at gt_output2 assigning <fs_data> where zmonth = <fs_st_output>-zmonth and check eq space.
            lv_index = sy-tabix.
      
            check <wa_dyn_table> is assigned.
            assign component <fs_data>-zyear of structure <wa_dyn_table> to <w_field>.
            <w_field> = <w_field> + <fs_data>-zvalue.
      
            read table gt_output assigning <fs_check> index lv_index. " Check so the position will never be processed later
            <fs_check>-check = 'X'.
          endloop.
      
        endloop.
      
      endform.
      
      form build_alv.
        data: x_layout  type slis_layout_alv,
              t_fieldcat type slis_t_fieldcat_alv.
      
        refresh t_fieldcat.
        clear x_layout.
      
        g_repid = sy-repid.
      
        call function 'REUSE_ALV_GRID_DISPLAY'
            exporting
              i_callback_program       = g_repid
              is_layout                = gs_layout
              it_fieldcat              = t_fieldcat2
                tables
              t_outtab = <t_dyn_table>
          exceptions program_error = 1
          others = 2 .
        if sy-subrc <> 0.
          message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        endif.
      endform.
      

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2019-01-30
        • 2017-07-09
        • 1970-01-01
        • 2012-06-06
        • 1970-01-01
        • 2021-07-31
        • 2012-06-19
        相关资源
        最近更新 更多