Текущее время: Пн, июл 28 2025, 22:20

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Не работает символ перехода строки в текстовом файле
СообщениеДобавлено: Ср, май 29 2013, 18:56 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, ноя 07 2011, 11:46
Сообщения: 83
Ещё раз добрый день, уважаемые коллеги!
Помогите, пожалуйста, разобраться с текстовым файлом формата 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). Ничего не помогает! Что делать? Кто-нибудь сталкивался с такой проблемой?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Не работает символ перехода строки в текстовом файле
СообщениеДобавлено: Чт, май 30 2013, 05:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
макрос remove_row_separator попробуйте закомментировать и его вызов в convert_to_bin


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB