Загрузить строку заголовка в TXT с помощью GUI_DOWNLOAD - PullRequest
2 голосов
/ 07 мая 2020

Возникла небольшая проблема при использовании функции 'GUI_DOWNLOAD'. Пытался добавить строку заголовка вверху созданного мной файла .txt. Мое решение:

 CALL FUNCTION 'GUI_DOWNLOAD'
   EXPORTING
     filename              = lv_file
     filetype              = 'ASC'
     write_field_separator = 'X'
   TABLES
     data_tab              = it_outh. "internal table just with the header line

 CALL FUNCTION 'GUI_DOWNLOAD'
   EXPORTING
     filename              = lv_file
     filetype              = 'ASC'
     append                = 'X'
     write_field_separator = 'X'
   TABLES
     data_tab              = it_output. "internal table with selected data

Код работает. Но форматирование - дерьмо из-за разной длины (строка заголовка и данные)

formatting of my file

Это единственный способ решить эту проблему, используя более короткие описания в it_outh? Или у кого-нибудь из вас есть для меня идея получше?

Хорошего дня.

С уважением, Деннис

1 Ответ

1 голос
/ 10 мая 2020

Вот быстрый и грязный обходной путь, как преобразовать вывод 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>.

Хотя это не так просто, но определенно работает

enter image description here

Уловка, которая используется в приведенном выше фрагменте: целевая внутренняя таблица создается динамически , делая все поля символьными, в отличие от реальной таблицы БД, то в верхнюю часть таблицы добавляется фиктивная строка и туда помещаются все заголовки.

Этот подход требует дополнительной предварительной работы (например, явное приведение всех полей БД), но я не вижу другого способа сделать форматированный вывод TXT.

...