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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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