03-14-2021 7:02 AM
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>
03-14-2021 8:28 AM
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)
03-22-2021 5:21 AM
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.
03-22-2021 6:14 AM
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( ... ).
03-22-2021 9:50 AM
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( ).