I have this program to generate data randomly, I need to display the data type of table columns in the output when I generate data, data type have to be next to the field name for example First_Name (CHAR)
, ID (CHAR)
. How can I make this please with some explanation because I am still beginner? Thank you.
Report Z_THIRD_REPORT.
PARAMETERS: p_table TYPE string OBLIGATORY,
p_num TYPE i DEFAULT 1.
DATA: ls_dd02l TYPE dd02l,
lv_message TYPE string.
START-OF-SELECTION.
*DATA(output) = REDUCE char40( INIT out type char40
** text = `Count up:`
* FOR n = 1 UNTIL n > 11
* NEXT out = |{ out }9|
** text = |{ n }|
* ).
SELECT SINGLE
tabname
FROM dd02l
WHERE
tabname = @p_table
INTO @DATA(lv_thrash).
IF sy-subrc NE 0.
MESSAGE 'Don`t have table!' TYPE 'E'.
ENDIF.
DATA(lt_component) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( p_table ) )->get_components( ).
"commit work"
DATA(tabletype) = cl_abap_tabledescr=>create(
p_line_type = cl_abap_structdescr=>create( p_components = lt_component )
).
DATA lot TYPE REF TO data.
CREATE DATA lot TYPE HANDLE tabletype .
FIELD-SYMBOLS: <ft> TYPE STANDARD TABLE.
ASSIGN lot->* TO <ft>.
DATA lv_max TYPE i.
DATA lv_ret TYPE string.
DO p_num TIMES.
APPEND INITIAL LINE TO <ft> ASSIGNING FIELD-SYMBOL(<ls>).
LOOP AT lt_component ASSIGNING FIELD-SYMBOL(<ls_comp>).
ASSIGN COMPONENT <ls_comp>-name OF STRUCTURE <ls> TO FIELD-SYMBOL(<fv>).
DATA(lv_type) = <ls_comp>-type->get_relative_name( ).
DATA(lv_length) = <ls_comp>-type->length / 2.
CASE <ls_comp>-type->type_kind.
WHEN 'C'.
CLEAR lv_ret.
CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
EXPORTING
number_chars = lv_length
IMPORTING
random_string = lv_ret.
<fv> = lv_ret.
WHEN 'D' .
"also don't want write"
WHEN 'T' OR 'N' OR 'I'.
CLEAR lv_max.
DO lv_length TIMES.
lv_max = |{ lv_max }9|.
ENDDO.
DATA(lo_rand) = cl_abap_random_int=>create( EXPORTING seed = conv #( sy-timlo ) min = 0 max = lv_max ).
WAIT UP TO '1' SECONDS.
<fv> = lo_rand->get_next( ).
free lo_rand.
WHEN 'P'.
"I just don't want write it also)
ENDCASE.
ENDLOOP.
ENDDO.
cl_demo_output=>write_data( <ft> ).
cl_demo_output=>display( ).
MODIFY (p_table) FROM TABLE <ft>.
COMMIT WORK AND WAIT.
I would use SALV table for the display and there you can edit the field names easily. Otherwise you can try other solutions, but this is the first one that came to my mind.
If you use this code instead of cl_demo_output=>display( ).
it should work. At least it worked fine for me.
DATA go_salv_table TYPE REF TO cl_salv_table.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = go_salv_table " Basisklasse einfache ALV Tabellen
CHANGING
t_table = <ft> ).
CATCH cx_salv_msg ##NO_HANDLER.
ENDTRY.
DATA(go_columns) = go_salv_table->get_columns( ).
SELECT fieldname, datatype
FROM dd03l
INTO TABLE @DATA(gt_dd03l)
WHERE dd03l~tabname = @lv_thrash
AND datatype <> ''.
IF sy-subrc = 0.
LOOP AT gt_dd03l ASSIGNING FIELD-SYMBOL(<ls_dd03l>).
DATA(lo_column) = go_columns->get_column( columnname = <ls_dd03l>-fieldname ).
lo_column->set_short_text( |{ lo_column->get_short_text( ) }({ <ls_dd03l>-datatype })| ).
lo_column->set_medium_text( |{ lo_column->get_medium_text( ) }({ <ls_dd03l>-datatype })| ).
lo_column->set_long_text( |{ lo_column->get_long_text( ) }({ <ls_dd03l>-datatype })| ).
ENDLOOP.
ENDIF.
go_salv_table->display( ).
The explanation is simply that you can use several approaches to display, but the best solutions for editing field names are SALV or ALV_GRID. SALV can be generated with the factory method and then a fieldcatalog is automatically created based on the fields in your table. To edit it, you have to query the columns. SELECT will look up all the fields in the table and their corresponding data type, which will be added to the column name in the LOOP section later. Then it is displayed at the end with a display method.
Here is a good description of SALV: https://blogs.sap.com/2021/06/28/salv-alv-quickstart-snippets-%F0%9F%9A%80/