Вот быстрый и грязный обходной путь, как преобразовать вывод itab с заголовком в текст:
FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE.
DATA: lref_struct TYPE REF TO cl_abap_structdescr,
o_table TYPE REF TO data.
lref_struct ?= cl_abap_structdescr=>describe_by_name( 'CRCO' ).
DATA(components) = lref_struct->get_components( ).
DATA(fields) = VALUE ddfields( FOR line IN lref_struct->get_ddic_field_list( ) ( line ) ).
" making all types as char by replacing with existing PRZ char field
MODIFY components FROM VALUE abap_componentdescr( type = components[ name = 'PRZ' ]-type ) TRANSPORTING type WHERE name <> ''.
lref_struct = cl_abap_structdescr=>create( components ).
DATA(o_ref_table) = cl_abap_tabledescr=>create( p_line_type = lref_struct p_table_kind = cl_abap_tabledescr=>tablekind_std ).
CHECK o_ref_table IS BOUND.
CREATE DATA o_table TYPE HANDLE o_ref_table.
ASSIGN o_table->* TO <fs_table>.
APPEND INITIAL LINE TO <fs_table>. " reserving line for headers
SELECT
CAST( mandt AS CHAR( 12 ) ) AS mandt,
CAST( objty AS CHAR( 2 ) ) AS objty,
CAST( objid AS CHAR( 8 ) ) AS objid,
CAST( laset AS CHAR( 6 ) ) AS laset,
CAST( endda AS CHAR( 8 ) ) AS endda,
CAST( lanum AS CHAR( 4 ) ) AS lanum,
CAST( begda AS CHAR( 8 ) ) AS begda,
CAST( aedat_kost AS CHAR( 8 ) ) AS aedat_kost,
CAST( aenam_kost AS CHAR( 12 ) ) AS aenam_kost,
CAST( kokrs AS CHAR( 10 ) ) AS kokrs,
CAST( kostl AS CHAR( 6 ) ) AS kostl,
CAST( lstar AS CHAR( 12 ) ) AS lstar,
CAST( lstar_ref AS CHAR( 12 ) ) AS lstar_ref,
CAST( forml AS CHAR( 12 ) ) AS forml,
CAST( prz AS CHAR( 12 ) ) AS prz,
CAST( actxy AS CHAR( 12 ) ) AS actxy,
CAST( actxk AS CHAR( 12 ) ) AS actxk,
CAST( leinh AS CHAR( 12 ) ) AS leinh,
CAST( bde AS CHAR( 12 ) ) AS bde,
CAST( sakl AS CHAR( 1 ) ) AS sakl
UP TO 10 ROWS
FROM crco
APPENDING CORRESPONDING FIELDS OF TABLE @<fs_table>.
" writing headers
ASSIGN <fs_table>[ 1 ] TO FIELD-SYMBOL(<empty>).
LOOP AT fields ASSIGNING FIELD-SYMBOL(<field>).
ASSIGN COMPONENT <field>-fieldname OF STRUCTURE <empty> TO FIELD-SYMBOL(<heading>).
CHECK sy-subrc = 0.
<heading> = <field>-scrtext_m.
ENDLOOP.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = 'C:\tab.txt'
filetype = 'ASC'
write_field_separator = 'X'
TABLES
data_tab = <fs_table>.
Хотя это не так просто, но определенно работает
Уловка, которая используется в приведенном выше фрагменте: целевая внутренняя таблица создается динамически , делая все поля символьными, в отличие от реальной таблицы БД, то в верхнюю часть таблицы добавляется фиктивная строка и туда помещаются все заголовки.
Этот подход требует дополнительной предварительной работы (например, явное приведение всех полей БД), но я не вижу другого способа сделать форматированный вывод TXT.