Ещё раз добрый день, уважаемые коллеги! Помогите, пожалуйста, разобраться с текстовым файлом формата UTF-8. В файл выгружается таблица с данными, первой строкой которой идёт строка с названиями полей этой таблицы. Файл бинарный, необходимо было, чтобы он выгружал не всё одной строкой, а красиво, со столбцами. Поэтому был написан следующий код:
* For file DATA: l_fpath TYPE string, lv_flag TYPE flag, lv_xbuffer TYPE xstring. DATA: lo_converter TYPE REF TO cl_abap_conv_out_ce. CONSTANTS: lc_ctab_line_size TYPE i VALUE 500. TYPES: ty_xtab_line(lc_ctab_line_size) TYPE x. DATA: lv_tab_lines TYPE i. DATA: lv_file_size TYPE i. DATA: lv_buf_size TYPE i. DATA: lt_xtab TYPE STANDARD TABLE OF ty_xtab_line WITH DEFAULT KEY. DATA: lv_xline TYPE ty_xtab_line. FIELD-SYMBOLS: <lv_cline> TYPE c. DATA: lv_offset TYPE i, lv_size TYPE i. DATA: lv_temp_size TYPE i. DATA: lv_stop TYPE flag.
PERFORM fill_first_line CHANGING ls_data. *Fill the header line for interface(only for ImportStore) IF sy-tabix = 1. PERFORM convert_to_bin USING ls_data lv_flag CHANGING lo_converter. lv_flag = 'X'. ENDIF.
LOOP AT lt_knvv ASSIGNING <fs_knvv>. CLEAR: ls_data.
AT NEW spart. IF <fs_knvv>-hkunnr IS NOT INITIAL. DELETE lt_knvv WHERE kunnr = <fs_knvv>-kunnr AND vkorg = <fs_knvv>-vkorg AND vtweg = <fs_knvv>-vtweg AND spart <> <fs_knvv>-spart. PERFORM fill_store USING <fs_knvv> CHANGING ls_data. PERFORM fill_store_hier TABLES lt_mask lt_class2 lt_class1 USING <fs_knvv> CHANGING ls_data.
PERFORM convert_to_bin USING ls_data lv_flag CHANGING lo_converter. ELSE. CLEAR ls_knvv_2. LOOP AT lt_knvv INTO ls_knvv_2 WHERE kunnr = <fs_knvv>-kunnr AND vkorg = <fs_knvv>-vkorg AND vtweg = <fs_knvv>-vtweg AND hkunnr IS NOT INITIAL.
DELETE lt_knvv WHERE kunnr = ls_knvv_2-kunnr AND vkorg = ls_knvv_2-vkorg AND vtweg = ls_knvv_2-vtweg.
PERFORM fill_store USING ls_knvv_2 CHANGING ls_data.
PERFORM fill_store_hier TABLES lt_mask lt_class2 lt_class1 USING ls_knvv_2 CHANGING ls_data. PERFORM convert_to_bin USING ls_data lv_flag CHANGING lo_converter. EXIT. ENDLOOP. IF sy-subrc <> 0.
DELETE lt_knvv WHERE kunnr = <fs_knvv>-kunnr AND vkorg = <fs_knvv>-vkorg AND vtweg = <fs_knvv>-vtweg AND spart <> <fs_knvv>-spart.
PERFORM fill_store USING <fs_knvv> CHANGING ls_data. PERFORM fill_store_hier TABLES lt_mask lt_class2 lt_class1 USING <fs_knvv> CHANGING ls_data. PERFORM convert_to_bin USING ls_data lv_flag CHANGING lo_converter. ENDIF. ENDIF. ENDAT. ENDLOOP.
l_path = path. l_fname = fname.
* CALL METHOD go_files_tools->file_download * EXPORTING * im_catalog = l_path * im_fname = l_fname * im_filetype = 'DAT' * im_data = lt_data * im_codepage = g_codepage_utf * EXCEPTIONS * error = 1 * OTHERS = 2.
lv_xbuffer = lo_converter->get_buffer( ). lv_buf_size = XSTRLEN( lv_xbuffer ). lv_file_size = lv_buf_size. CLEAR lv_stop. CLEAR lv_offset. DO. lv_temp_size = lv_offset + lc_ctab_line_size. IF lv_temp_size < lv_buf_size. lv_size = lc_ctab_line_size. ELSE. lv_size = lv_buf_size - lv_offset. lv_stop = 'X'. ENDIF. lv_xline = lv_xbuffer+lv_offset(lv_size). APPEND lv_xline TO lt_xtab. ADD lv_size TO lv_offset. IF lv_stop = 'X'. EXIT. ENDIF. ENDDO.
* Download a file with encoding UTF-8 * Get File Path CALL METHOD go_files_tools->get_file_path EXPORTING im_catalog = l_path im_fname = l_fname RECEIVING re_path = l_fpath.
CHECK NOT l_fpath IS INITIAL. DATA: l_tab TYPE char01.
CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = lv_file_size filename = l_fpath filetype = 'BIN' append = space write_field_separator = space trunc_trailing_blanks = '' write_lf = '' trunc_trailing_blanks_eol = '' CHANGING data_tab = lt_xtab EXCEPTIONS OTHERS = 1.
*&---------------------------------------------------------------------* *& Macro *&---------------------------------------------------------------------* * Define macro for binary fale *----------------------------------------------------------------------* * Remove row separators - CR LF if any. DEFINE row_separator_remove. replace all occurrences of gv_row_separator(1) in &1 with space. replace all occurrences of gv_row_separator+1(1) in &1 with space. END-OF-DEFINITION.
*&---------------------------------------------------------------------* *& Form CONVERT_TO_BIN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LS_DATA text * -->P_LV_FLAG text * <--P_LV_XBUFFER text *----------------------------------------------------------------------* FORM convert_to_bin USING p_ls_data TYPE any p_lv_flag TYPE flag CHANGING p_lo_conv TYPE REF TO cl_abap_conv_out_ce. DATA: lv_out_str TYPE string, lv_bin_data TYPE xstring, lo_converter TYPE REF TO cl_abap_conv_out_ce.
**********************
DATA: lv_xbuffer TYPE xstring. FIELD-SYMBOLS: <lv_cline> TYPE c. UNASSIGN <lv_cline>. ASSIGN p_ls_data TO <lv_cline> CASTING. row_separator_remove <lv_cline>. p_lo_conv->convert( EXPORTING data = <lv_cline> IMPORTING buffer = lv_xbuffer ). IF p_lv_flag IS INITIAL . CONCATENATE cl_abap_char_utilities=>byte_order_mark_utf8 lv_xbuffer INTO lv_xbuffer IN BYTE MODE. ENDIF. CALL METHOD p_lo_conv->write( lv_xbuffer ).
p_lo_conv->convert( EXPORTING data = gv_row_separator IMPORTING buffer = lv_xbuffer ). CALL METHOD p_lo_conv->write( lv_xbuffer ).
ENDFORM. " CONVERT_TO_BIN
FORM fill_first_line CHANGING p_ls_data TYPE zmseries_store.
p_ls_data-cdstore = text-046. p_ls_data-cdstatus = text-047. p_ls_data-idinstitutiontype = text-048. p_ls_data-cdstorebrand = text-049. p_ls_data-dsname = text-050. p_ls_data-dscorporatename = text-051. p_ls_data-dsshortname = text-079. p_ls_data-cdlegalcode1 = text-052. p_ls_data-cdbranch = text-053. p_ls_data-cdlegalcode2 = text-054. p_ls_data-nrddd1 = text-055. p_ls_data-nrphone1 = text-056. p_ls_data-nrextphone1 = text-057. p_ls_data-nrddd2 = text-058. p_ls_data-nrphone2 = text-059. p_ls_data-nrextphone2 = text-060. p_ls_data-nrdddfax = text-061. p_ls_data-nrfax = text-062. p_ls_data-nrextfax = text-063. p_ls_data-dsemail = text-064. p_ls_data-cdclass1 = text-065. p_ls_data-cdclass2 = text-066. p_ls_data-cdclass3 = text-067. p_ls_data-dsnotes = text-068. p_ls_data-flexi1 = text-069. p_ls_data-flexi2 = text-070. p_ls_data-cdfiscaljurisdiction = text-071. p_ls_data-cdfiscaljurisdictionsupplier = text-072. p_ls_data-cdstorefiscalclass = text-073. p_ls_data-vlcreditlimit = text-074. p_ls_data-dtcreditlimitlastupdate = text-075. p_ls_data-cddefaultpaymentterm = text-076. p_ls_data-cdpricegroup = text-077. p_ls_data-cdpaymenttermgroup = text-078. ENDFORM. " FILL_FIRST_LINE *INFDEVELOP 01.04.2013 end of insertion
Итак, в чём заключается проблема: непосредственно в строке с заголовком. Дело в том, что она не выгражается в одну строку, а перескакивает на другую. Хотя, как я думала, символ перевода каретки не позволит этого. CONSTANTS: lc_ctab_line_size TYPE i VALUE 500 и прочее разбиение было введено с надеждой, что несколько строк в таблице lt_xtab изменят положение дел - но это ничего не изменило. Сами данные выгружаются корректно, строка таблицы - строка в файле. Меняла и значение 500 на 3000(хотя для строки загловка было 1286). Ничего не помогает! Что делать? Кто-нибудь сталкивался с такой проблемой?
|
|