Building a Dynamic Table in ALV Report - SAP ABAP

 Building a Dynamic Table in ALV Report - SAP ABAP


    In this tutorial, I will show you how to build a dynamic ALV table where the columns are generated based on a date range. For example, if the input is from 01.01.2025 to 31.01.2025, the ALV will dynamically render 31 columns, one for each day.

1. Data Declaration and Selection Screen

FIELD-SYMBOLS : <dyn_table> TYPE STANDARD TABLE,
                <dyn_wa>,
                <fs1>.

DATA: new_table TYPE REF TO data,
      new_line  TYPE REF TO data.

DATA: fieldname(20)  TYPE c,
      fieldvalue(60) TYPE c.

DATA: it_fldcat  TYPE lvc_t_fcat,
      wa_fldcat  TYPE lvc_s_fcat,
      gs_layout1 TYPE lvc_s_layo.

DATA: v_date TYPE acdoca-budat.

DATA: daysbetween TYPE i.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    s_bukrs FOR acdoca-rbukrs OBLIGATORY NO-EXTENSION NO INTERVALS,
    s_racct FOR acdoca-racct, 
    s_budat FOR acdoca-budat OBLIGATORY. "This is the field we'll be using to build the dynamic ALV
SELECTION-SCREEN END OF BLOCK b1.


2. Build Dynamic Table

  CLEAR wa_fldcat.
  wa_fldcat-fieldname = 'RACCT'.
  wa_fldcat-coltext   = 'G/L Account'.
  wa_fldcat-datatype  = 'CHAR'.
  wa_fldcat-outputlen  = '10'.
  wa_fldcat-key = 'X'.
  APPEND wa_fldcat TO it_fldcat.

  CLEAR wa_fldcat.
  wa_fldcat-fieldname = 'TXT50'.
  wa_fldcat-coltext   = 'G/L Account Name'.
  wa_fldcat-datatype  = 'CHAR'.
  wa_fldcat-outputlen  = '50'.
  wa_fldcat-key = 'X'.
  APPEND wa_fldcat TO it_fldcat.

  CLEAR wa_fldcat.
  wa_fldcat-fieldname  = 'BEGINNING'.
  wa_fldcat-coltext    = 'Beginning Balance'.
  wa_fldcat-datatype   = 'CURR'.
  wa_fldcat-outputlen  = '23'.
  wa_fldcat-cfieldname = 'RWCUR'.
  wa_fldcat-key = 'X'.
  APPEND wa_fldcat TO it_fldcat.

  CLEAR wa_fldcat.
  wa_fldcat-fieldname = 'RWCUR'.
  wa_fldcat-coltext   = 'Currency'.
  wa_fldcat-outputlen = '5'.
  wa_fldcat-key = 'X'.
  APPEND wa_fldcat TO it_fldcat.

  daysbetween = s_budat-high - s_budat-low.

  v_date = s_budat-low.

  DO daysbetween + 1 TIMES.

    CONCATENATE v_date+6(2) v_date+4(2) v_date(4) INTO lv_datestr SEPARATED BY '-'.

    CLEAR wa_fldcat.
    CONCATENATE lv_datestr '_BALANCE' INTO wa_fldcat-fieldname.
    CONCATENATE 'Balance-' lv_datestr INTO wa_fldcat-coltext.
    wa_fldcat-datatype   = 'CURR'.
    wa_fldcat-cfieldname = 'RWCUR'.
    wa_fldcat-outputlen  = '23'.
    wa_fldcat-do_sum = 'X'.
    APPEND wa_fldcat TO it_fldcat.

    v_date = v_date + 1.

  ENDDO.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = it_fldcat
    IMPORTING
      ep_table                  = new_table
    EXCEPTIONS
      generate_subpool_dir_full = 1
      OTHERS                    = 2.
  IF sy-subrc <> 0.
  ENDIF.

  ASSIGN new_table->* TO <dyn_table>.

  CREATE DATA new_line LIKE LINE OF <dyn_table>.
  ASSIGN new_line->* TO <dyn_wa>.

ENDFORM.


3. Build the Data Into the ALV

  SORT lt_data BY racct rwcur.
  SORT lt_data2 BY racct rwcur budat.

  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING racct rwcur.
  LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>).

    CLEAR <dyn_wa>.

    CLEAR: fieldname, fieldvalue.
    fieldname = 'RACCT'.
    fieldvalue = <fs_data>-racct.
    CONDENSE fieldvalue.
    ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs1>.
    IF sy-subrc = 0.
      <fs1> = fieldvalue.
    ENDIF.

    CLEAR: fieldname, fieldvalue.
    fieldname = 'TXT50'.
    fieldvalue = <fs_data>-txt50.
    CONDENSE fieldvalue.
    ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs1>.
    IF sy-subrc = 0.
      <fs1> = fieldvalue.
    ENDIF.

    CLEAR: fieldname, fieldvalue.
    fieldname = 'BEGINNING'.
    fieldvalue = <fs_data>-beginning.
    CONDENSE fieldvalue.
    ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs1>.
    IF sy-subrc = 0.
      <fs1> = fieldvalue.
    ENDIF.

    CLEAR: fieldname, fieldvalue.
    fieldname = 'RWCUR'.
    fieldvalue = <fs_data>-rwcur.
    CONDENSE fieldvalue.
    ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs1>.
    IF sy-subrc = 0.
      <fs1> = fieldvalue.
    ENDIF.

    DATA: lv_last_balance TYPE acdoca-wsl.

    lv_last_balance = <fs_data>-beginning.

    v_date = s_budat-low.

    DO daysbetween + 1 TIMES.

"Inside this loop, we populate the dynamic columns, I'm using the specific logic required for my program here, but you can easily swap this part with your own business logic, whether it's daily sales, goods movement, etc.

      READ TABLE lt_data2 ASSIGNING FIELD-SYMBOL(<fs_data2>)
           WITH KEY racct = <fs_data>-racct
                    rwcur = <fs_data>-rwcur
                    budat = v_date
           BINARY SEARCH.

      IF sy-subrc = 0.
        lv_last_balance = lv_last_balance + <fs_data2>-balance.
      ENDIF.

      CONCATENATE v_date+6(2) v_date+4(2) v_date(4)
       INTO lv_datestr SEPARATED BY '-'.

      CLEAR: fieldname.
      fieldname = lv_datestr && '_BALANCE'.
      ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs1>.
      IF sy-subrc = 0.
        <fs1> = lv_last_balance.
      ENDIF.

      v_date = v_date + 1.

    ENDDO.

    APPEND <dyn_wa> TO <dyn_table>.

  ENDLOOP.

ENDFORM.

4. Display the Data into ALV


FORM alv_display.
  gs_layout1-cwidth_opt = 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program     = sy-repid
      i_callback_top_of_page = 'TOP_OF_PAGE'
      is_layout_lvc          = gs_layout1
      it_fieldcat_lvc        = it_fldcat[]
      i_default              = 'X'
      i_save                 = 'A'
      is_variant             = gt_variant
      i_html_height_top      = 15
    TABLES
      t_outtab               = <dyn_table>
    EXCEPTIONS
      program_error          = 1
      OTHERS                 = 2.
  IF sy-subrc <> 0.
  ENDIF.

ENDFORM.

5. Result

    And here is the final result! As you can see, the ALV has successfully generated dynamic columns for each date. Each column header is labeled based on the date range we processed in the loop.



Comments

Popular posts from this blog

SAP ABAP Mass Download Attachment

Learn How to Use STVARV for Dynamic ABAP Programs

Why Can't I Find This Text in SE16N? Mastering the READ_TEXT Function Module