Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

CREATING DYNAMIC INTERNAL TABLE WITHOUT FINAL STRUCTURE

former_member574106
Participant
0 Kudos

Hi friends,

I am making my first dynamic internal table. The issue, is that I need to create a final internal table consisting of vkorg, erdat, material, posnr, menge, kunnr, without creating a user defined structure. How do I do it. please suggest. check the code once. 
REPORT zdynamicoops.
TABLES : vbak.
SELECT-OPTIONS : so_vkorg FOR vbak-vkorg,
                 so_erdat FOR vbak-erdat.
DATA : it_vbak TYPE TABLE OF vbak WITH HEADER LINE,
       it_vbap TYPE TABLE OF vbap WITH HEADER LINE.


DATA : gt_dyn_table TYPE REF TO data,
       gw_line TYPE REF TO data,
       gw_line1 TYPE REF TO data.


SELECT vbeln
       vkorg
       erdat
       kunnr
       FROM vbak
       INTO CORRESPONDING FIELDS OF TABLE it_vbak
       WHERE vkorg IN so_vkorg.

IF NOT it_vbak[] IS INITIAL.
SELECT vbeln
       posnr
       matnr
       zmeng
       FROM vbap
       INTO CORRESPONDING FIELDS OF TABLE it_vbap
       FOR ALL ENTRIES IN it_vbak
       WHERE vbeln EQ it_vbak-vbeln.
ENDIF.


<br>
4 REPLIES 4

joltdx
Active Contributor

Hi!

It might be just me, but I don't really understand what it is you want to do...

What do you mean in this case with 'dynamic internal table' and 'final internal table'? And if you know the fields for the 'final internal table', why would you not specify them in a structure? (Or were those fields just an example)

(Also, instead of selecting from VBAK and then FOR ALL ENTRIES in VBAP, a better approach is to JOIN the two tables)

former_member574106
Participant
0 Kudos

Hi Jorgen,

Thanks a lot. I have written the code. In the output a small issue is coming. the 2nd line in the internal table is not coming in the next row. Please check the output and the code.output.jpg
*&---------------------------------------------------------------------*
*& Report ZDYNAMICOOPS
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdynamicoops.
TABLES : vbak.
SELECT-OPTIONS : so_vkorg FOR vbak-vkorg,
                 so_erdat FOR vbak-erdat.
DATA : it_vbak TYPE TABLE OF vbak WITH HEADER LINE,
       wa_vbak TYPE vbak,
       it_vbap TYPE TABLE OF vbap WITH HEADER LINE,
       wa_vbap TYPE vbap.




DATA : gt_dyn_table TYPE REF TO data,
       gw_line TYPE REF TO data,
       gw_line1 TYPE REF TO data.


* Fieldcatalog declarations
DATA : gw_dyn_fcat TYPE  lvc_s_fcat,
       gt_dyn_fcat TYPE  lvc_t_fcat.
* Field Symbols
FIELD-SYMBOLS : <gfs_dyn_table>  TYPE STANDARD TABLE,
                 <gfs_line>,
                 <fs1> .
PERFORM fetch_data.
PERFORM  build_fieldcatalog.
PERFORM  create_table.
PERFORM populate_table.
PERFORM display_output.
*&---------------------------------------------------------------------*
*& Form fetch_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM fetch_data .


* Perform fetch data
SELECT vbeln
       vkorg
       erdat
       kunnr
       FROM vbak
       INTO CORRESPONDING FIELDS OF TABLE it_vbak
       WHERE vkorg IN so_vkorg.


IF NOT it_vbak[] IS INITIAL.
SELECT vbeln
       posnr
       matnr
       zmeng
       FROM vbap
       INTO CORRESPONDING FIELDS OF TABLE it_vbap
       FOR ALL ENTRIES IN it_vbak
       WHERE vbeln EQ it_vbak-vbeln.
 ENDIF.






ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_fieldcatalog
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_fieldcatalog .


gw_dyn_fcat-fieldname = 'VBELN'.
gw_dyn_fcat-outputlen = 10.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'SALES NO'.
gw_dyn_fcat-col_pos   = 1.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'VKORG'.
gw_dyn_fcat-outputlen = 10.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'SALES ORG'.
gw_dyn_fcat-col_pos   = 2.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'ERDAT'.
gw_dyn_fcat-outputlen = 10.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'DATE'.
gw_dyn_fcat-col_pos   = 3.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'MATNR'.
gw_dyn_fcat-outputlen = 20.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'MATERIAL'.
gw_dyn_fcat-col_pos   = 4.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'POSNR'.
gw_dyn_fcat-outputlen = 10.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'ITEM'.
gw_dyn_fcat-col_pos   = 5.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'ZMENG'.
gw_dyn_fcat-outputlen = 15.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'QUANTITY'.
gw_dyn_fcat-col_pos   = 6.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


gw_dyn_fcat-fieldname = 'KUNNR'.
gw_dyn_fcat-outputlen = 20.
*gw_dyn_fcat-tabname   = 'IT_FINAL'.
gw_dyn_fcat-coltext   = 'CUSTNO'.
gw_dyn_fcat-col_pos   = 7.
APPEND gw_dyn_fcat TO gt_dyn_fcat.
CLEAR  gw_dyn_fcat.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form create_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM create_table .
CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
*   i_style_table             = 'X'
    it_fieldcatalog           = gt_dyn_fcat
*    i_length_in_byte          =
  IMPORTING
    ep_table                  = gt_dyn_table
*    e_style_fname             =
  EXCEPTIONS
    generate_subpool_dir_full = 1
    OTHERS                    = 2
        .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.


* Assign this new table to the field symbol
ASSIGN gt_dyn_table->* TO <gfs_dyn_table>.
* Create dynamic area for the internal table
CREATE DATA gw_line LIKE LINE OF <gfs_dyn_table>.
ASSIGN gw_line->* TO <gfs_line>.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form populate_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM populate_table .
  LOOP AT it_vbak INTO wa_vbak.


ASSIGN COMPONENT 'VKORG' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbak-vkorg.
UNASSIGN <fs1>.
ASSIGN COMPONENT 'ERDAT' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbak-erdat.
UNASSIGN <fs1>.
ASSIGN COMPONENT 'KUNNR' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbak-kunnr.
UNASSIGN <fs1>.
READ TABLE it_vbap INTO wa_vbap WITH KEY vbeln = wa_vbak-vbeln.
IF sy-subrc = 0.
ASSIGN COMPONENT 'POSNR' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbap-posnr.
UNASSIGN <fs1>.


ASSIGN COMPONENT 'ZMENG' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbap-zmeng.
UNASSIGN <fs1>.


ASSIGN COMPONENT 'MATNR' OF STRUCTURE <gfs_line> TO <fs1>.
<fs1> = wa_vbap-matnr.
UNASSIGN <fs1>.
ENDIF.
*ENDIF.


APPEND <gfs_line> TO <gfs_dyn_table>.
*WRITE <fs1>.
*ENDIF.
CLEAR : wa_vbak, wa_vbap.
*UNASSIGN <fs1>.
ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_output
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM display_output .


LOOP AT gt_dyn_fcat INTO gw_dyn_fcat.
WRITE :(10) gw_dyn_fcat-coltext.
endloop.


LOOP AT <gfs_dyn_table> INTO <gfs_line>.
LOOP AT gt_dyn_fcat INTO gw_dyn_fcat.
ASSIGN COMPONENT  gw_dyn_fcat-fieldname OF STRUCTURE <gfs_line> TO <fs1>.
WRITE : <fs1>.
ENDLOOP.
WRITE : /.
ENDLOOP.




ENDFORM.

Sandra_Rossi
Active Contributor
0 Kudos

Better never use cl_alv_table_create=>create_dynamic_table, it has important drawbacks, instead use RTTS with CREATE DATA. If you're lazy, use RTTS alternative via Z wrapper method which has same interface as cl_alv_table_create=>create_dynamic_table https://blogs.sap.com/2019/11/16/alternative-to-cl_alv_table_createcreate_dynamic_table/.

zcl_alv_table_create_rttc=>create_dynamic_table( ... ).

matt
Active Contributor
0 Kudos

I really don't see why you're doing this in such a complicated way. You're also using a few obsolete ABAP statements (TABLES, HEADER LINE), and old techniques. Try this modern version.

You really don't need a dynamic table.

REPORT zdynamicoops.
" TABLES : vbak. OBSOLETE DO NOT USE
DATA g_vkorg type vbak-vkor.
DATA g_erdat type vbak-erdat.
SELECT-OPTIONS : so_vkorg FOR g_vkorg
                 so_erdat FOR g_erdat.
DATA : " HEADER LINE IS OBSOLETE. Don't use.
SELECT vbak~vbeln vbak~vkorg vbak~erdat vbak~kunnr
       vbap~posnr vbap~matnr vbap~zmeng
       FROM vbak
       INNER JOIN vbap
               ON vbak~vbeln EQ vbap~VBELN
       INTO TABLE @data(my_data)
       WHERE vbak~vkorg IN so_vkorg.
DATA salv TYPE REF TO cl_salv_table.
cl_salv_table=>factory( importing r_salv_table = salv
                         changing t_table = my_data.
salv->display( ).