In the post Dynamic Internal Table Creation and Dynamic Internal Table with Deep structure, we have seen how we can use the RTTS – Run Time Type Services to create dynamic internal table.
Today we will eloborate another way of creating the dynamic internal table. We will see how we can use the class CL_ALV_TABLE_CREATE to create a dynamic internal table for ALV.
Basic pricipal would be, we need to fill the field catalog table and pass it to static method CREATE_DYNAMIC_TABLE from class CL_ALV_TABLE_CREATE.
We will use the same example as the reference in the post Dynamic Internal Table Creation.
Here is the code snippet:
*&---------------------------------------------------------------------*
*& Report ZTEST_NP_DYN
*& This Code snippet shows how to
*& Create Dynamic Internal Table using the fieldcatalog and
*& class CL_ALV_TABLE_CREATE
*& Dynamic Selection of data
*& Accessing Dynamic data selection
*& Displaying Dynamic internal table in ALV
*&---------------------------------------------------------------------*
*
REPORT ztest_np_dyn.
*
DATA: lt_fieldcat TYPE lvc_t_fcat,
la_fieldcat TYPE lvc_s_fcat,
lo_table TYPE REF TO data.
*
DATA: lf_months TYPE monat,
lf_run_mon TYPE monat.
*
* Dynamic Selection fields
TYPES: BEGIN OF ty_fields,
field TYPE char30,
END OF ty_fields.
*
DATA: lt_fields TYPE STANDARD TABLE OF ty_fields,
la_fields TYPE ty_fields.
*
* field symbols to access the dynamic table
FIELD-SYMBOLS: <f_tab> TYPE ANY TABLE,
<f_line> TYPE ANY,
<f_field> TYPE ANY.
*
* Selection Screen
PARAMETERS: p_mon_fr TYPE monat,
p_mon_to TYPE monat.
*
*
START-OF-SELECTION.
* 1. Adding fields in the field catalog
la_fieldcat-fieldname = 'KSTAR'.
la_fieldcat-datatype = 'CHAR'.
la_fieldcat-outputlen = 10.
APPEND la_fieldcat TO lt_fieldcat.
CLEAR la_fieldcat.
*
* 2. Adding required fields based on the selection months
* Determining Number of fields
lf_months = ( p_mon_to - p_mon_fr ) + 1.
lf_run_mon = p_mon_fr.
*
DO lf_months TIMES.
* Field name
CONCATENATE 'WTG0' lf_run_mon INTO la_fieldcat-fieldname.
la_fieldcat-datatype = 'CURR'.
la_fieldcat-outputlen = 17.
*
* Filling the fieldcatalog
APPEND la_fieldcat TO lt_fieldcat.
CLEAR la_fieldcat.
*
lf_run_mon = lf_run_mon + 1.
ENDDO.
*
* Calling method to generate the dynamic internal table based on
* ALV field catalog
cl_alv_table_create=>create_dynamic_table(
EXPORTING
it_fieldcatalog = lt_fieldcat
IMPORTING
ep_table = lo_table ).
*
ASSIGN lo_table->* TO <f_tab>.
*
*$*$*...............Dynamic Selection.............................*$*$*
* Filling up the table for the Selection fields of Select Query
LOOP AT lt_fieldcat INTO la_fieldcat.
la_fields-field = la_fieldcat-fieldname.
APPEND la_fields TO lt_fields.
CLEAR: la_fieldcat, la_fields.
ENDLOOP.
*
* Selecting data
SELECT (lt_fields)
INTO TABLE <f_tab>
FROM cosp
UP TO 10 ROWS.
*
*$*$*...............Accessing dynamic table.......................*$*$*
LOOP AT <f_tab> ASSIGNING <f_line>.
ASSIGN COMPONENT 'WTG004' OF STRUCTURE <f_line> TO <f_field>.
<f_field> = '100.00'.
ENDLOOP.
*
*$*$*...............Displaying using SALV model...................*$*$*
DATA: lo_alv TYPE REF TO cl_salv_table.
*
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = abap_false
IMPORTING
r_salv_table = lo_alv
CHANGING
t_table = <f_tab> ).
CATCH cx_salv_msg .
ENDTRY.
*
lo_alv->display( ).
I would suggest to use the RTTS to create dynamic internal table as depicted in posts:
hi
i have a requirement..where i have data in dynamic internal table .i need to display it in the function module(may be copying in static internal table)
Regards
SAM
Hi Sam,
I am not following your requirement completely but, if you want to generate the Table outside the FM and access in within the FM, you can use either TYPE REF TO DATA or declare the table parameter without any type casting.
Regards,
Naimesh Patel
Hi,
(Internal Purpose)
I have requirement like, In selection screen i have passed parameter value in the name of Standard Table dynamically. For example in parameter i have passed EKKO, EKPO,EKET,EKES…at one by one….In that select query i given up-to 20 records.I got records an Internal table.
Now i want to display the records…
if you know kindly suggest me….
Advance Thanks,
Jayapranikash.N
First of all, thank you Naimesh Patel for this wonderful tutorial on creating dynamic internal table using the class CL_ALV_TABLE_CREATE. I followed up your tutorial flawlessly and i was able to create a dynamic internal table and its respective ALV using the aforementioned class. However, the ALV does not show me the header of the table (the line with the names of the columns of the table). I filled my Field Catalog as follows:
I think that there is not anything wrong with that but i may be mistaken. I have also checked using the R_COLUMS’s method SET_HEADERS_VISIBLE that the header should have been displayed. Any suggestions on how to get the header to be shown in my ALV?
Thanks beforehand,
Ricardo Pires
Hi,
I have now successfully applied this method to create a dynamic internal table with the fields my user specifies in a dialog. One part of my troubles is solved.
The other one remaining is: It is crucial that these fields – all names are the technical names of existing DB fields – have the same datatype as in the DB table(s): Specifically, I have a field ERDAT (the field is just an example for any of the type) which, in the DB tables, has datatype D – so when my SELECT pulls it from the DB tables and tries to put it into an internal table, the corresp. field in that internal table needs to be of datatype D, otherwise I’ll be in trouble.
Is there a way to modify the method so that the fields just automatically assume the attributes (datatype) of the DB fields if I specify a table name to go with it?
I hope this is understandable: If my user enters the tabname KNA1 in the dialog and the field ERDAT, I can specify those variables and feed them into i_fcat and they will be in the table generated by this method – but I need the field to have the same datatype as KNA1-ERDAT, that is, datatype D.
Anybody know how to do this?
Regards,
Friedrich