aht написал(а):
:) хе, в общем, думал так будет понятнее, а на самом деле нужны form'ы, т.е. у меня создаются динамические внут.таблички для вывода в ALV и мне нужны для каждого ALV_BOX'а свои TOP_OF_PAGE, которые, как я представляю, также будут создаваться динамически...
Если получить структуру таблицы(или ее заголовочной записи), то зачем динамически создавать процедуры?
Одна процедура, и все
Например, так:
Code:
REPORT z_print_struct_header .
TYPE-POOLS: abap.
TABLES: makt.
DATA: BEGIN OF gs_data,
bukrs TYPE bsid-bukrs,
gjahr TYPE bsid-gjahr,
belnr TYPE bsid-belnr,
kunnr TYPE bsid-kunnr,
shkzg TYPE bsid-shkzg,
dmbtr TYPE bsid-dmbtr,
END OF gs_data,
gt_data LIKE STANDARD TABLE OF gs_data.
END-OF-SELECTION.
WRITE: / 'Internal strucrure'.
PERFORM print_header USING gs_data.
WRITE: / 'MAKT'.
PERFORM print_header USING makt.
*&---------------------------------------------------------------------*
*& Form print_header
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DATA - structure for output header
*----------------------------------------------------------------------*
FORM print_header USING p_data.
DATA: g_struct TYPE REF TO cl_abap_structdescr,
g_type TYPE REF TO cl_abap_typedescr,
lt_fields TYPE ddfields,
ls_fields TYPE dfies,
len TYPE i,
tmp_len TYPE i,
ls_comp TYPE abap_compdescr.
FIELD-SYMBOLS: <fs>.
g_type = cl_abap_typedescr=>describe_by_data( p_data ).
g_struct ?= g_type.
CHECK NOT g_struct IS INITIAL.
NEW-LINE.
CALL METHOD g_struct->get_ddic_field_list
RECEIVING
p_field_list = lt_fields
EXCEPTIONS
not_found = 1
no_ddic_type = 2
OTHERS = 3
.
IF sy-subrc = 0.
LOOP AT lt_fields INTO ls_fields.
IF ls_fields-outputlen < ls_fields-scrlen2.
WRITE: AT (ls_fields-outputlen) ls_fields-scrtext_s, '|'.
ELSEIF ls_fields-outputlen < ls_fields-scrlen3.
WRITE: AT (ls_fields-outputlen) ls_fields-scrtext_m, '|'.
ELSE.
WRITE: AT (ls_fields-outputlen) ls_fields-scrtext_l, '|'.
ENDIF.
ENDLOOP.
ELSE.
* Если на вход идет не структура из словаря данных, печатаем названия полей
LOOP AT g_struct->components INTO ls_comp.
ASSIGN COMPONENT sy-tabix OF STRUCTURE p_data TO <fs>.
DESCRIBE FIELD <fs> OUTPUT-LENGTH tmp_len.
len = STRLEN( ls_comp-name ).
IF len < tmp_len.
len = tmp_len.
ENDIF.
WRITE: AT (len) ls_comp-name, '|'.
ENDLOOP.
ENDIF.
SKIP.
ENDFORM. "print_header