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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 20 2011, 08:25 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 07 2011, 08:29
Сообщения: 325
Подскажите, пожалуйста, с помощью каких функций можно выгрузить данные в файл xml?
Известна структура файла:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <ROWSET>
- <ROW>
<DOCTOR_ID>1</DOCTOR_ID>
<DOCTOR_DOC_ID>1</DOCTOR_DOC_ID>
<DOCTOR_LASTNAME>Бенедиктов</DOCTOR_LASTNAME>
<DOCTOR_FIRSTNAME>Лев</DOCTOR_FIRSTNAME>
<DOCTOR_PATRONIMIC>Яковлевич</DOCTOR_PATRONIMIC>
<DOCTOR_SHORT_NAME>БЕНЕДИКТО</DOCTOR_SHORT_NAME>
<DOCTOR_ROLE_FULL>3076 Врач-токсиколог</DOCTOR_ROLE_FULL>
<DOCTOR_ROLE_SHORT />
</ROW>
</ROWSET>
Данные будут выбираться из базы.
Буду очень признательно за примеры кода.
Заранне большое спасибо за помощь!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 20 2011, 08:58 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июл 15 2009, 05:55
Сообщения: 174
Откуда: Мегион - > СПб
Пол: Мужской
search.php?keywords=transform&terms=all&author=&sv=0&sc=1&sf=all&sk=t&sd=d&sr=topics&st=0&ch=300&t=0&submit=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA

_________________
Ничто так не заразительно, как смех начальника...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 20 2011, 09:38 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 07 2011, 08:29
Сообщения: 325
Спасибо, а не подскажете, где должен описываться параметр XSLT? или это файл?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 20 2011, 10:12 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Не совсем то что нужно, но может пригодится. В свое время делал программу для выгрузки таблиц в xml и последующей загрузки для переноса данных между системами
Code:
REPORT z_table_download.

PARAMETERS: ptab2xml TYPE c RADIOBUTTON GROUP radi,
            pxml2tab TYPE c RADIOBUTTON GROUP radi.

PARAMETERS: p_file_n TYPE localfile.
PARAMETERS: p_tab_nm TYPE tabname.

FIELD-SYMBOLS: <gt_data> TYPE table.

*----------------------------------------------------------------------*
END-OF-SELECTION.
* В версии > 4.6 вместо PERFORM create_dyn_table можно сделать проще -
* create data it_tab type table of (p_tab_nm).
  PERFORM create_dyn_table.

  IF ptab2xml = 'X'.
    PERFORM download_xml.
  ELSEIF  pxml2tab ='X'.
    PERFORM upload_xml.
  ENDIF.

*----------------------------------------------------------------------*
FORM create_dyn_table.
  DATA: lt_tab TYPE REF TO data,
        lt_source TYPE TABLE OF rssource-line WITH HEADER LINE,
        l_name(8) TYPE c.


  lt_source = 'program zlr.'.  APPEND lt_source.

  CONCATENATE 'data: it_tab type table of ' p_tab_nm '.'
         INTO lt_source SEPARATED BY space.
  APPEND lt_source.

  lt_source = 'form e_p changing c_tab.'.              APPEND lt_source.
  lt_source = '  GET REFERENCE OF it_tab INTO c_tab.'. APPEND lt_source.
  lt_source = 'ENDFORM.'.                              APPEND lt_source.

  GENERATE SUBROUTINE POOL lt_source NAME l_name.
  IF sy-subrc = 0.
    PERFORM e_p IN PROGRAM (l_name) CHANGING lt_tab.
  ENDIF.
  ASSIGN lt_tab->* TO <gt_data>.
ENDFORM.                      "create_dyn_table

*----------------------------------------------------------------------*
FORM download_xml.
  DATA: l_dom TYPE REF TO if_ixml_element,
        l_document TYPE REF TO if_ixml_document,
        l_ixml TYPE REF TO if_ixml,
        l_string TYPE xstring,
        l_size TYPE i,
        lt_xml  TYPE dcxmllines,
        l_rc LIKE sy-subrc,
        xml TYPE dcxmllines,
        table_name TYPE string,

  BEGIN OF xml_tab OCCURS 0,
                d TYPE LINE OF dcxmllines,
  END OF xml_tab.

    SELECT *
      FROM (p_tab_nm)
      INTO TABLE <gt_data>.

  CLASS cl_ixml DEFINITION LOAD.
  l_ixml = cl_ixml=>create( ).
  CHECK NOT l_ixml IS INITIAL.
  l_document = l_ixml->create_document( ).

  DATA encoding TYPE REF TO if_ixml_encoding.

  encoding = l_ixml->create_encoding( character_set = 'windows-1251'
                                      byte_order = 0 ).

  CHECK NOT l_document IS INITIAL.

  CALL METHOD l_document->set_encoding
    EXPORTING
      encoding = encoding.

  WRITE: / 'Converting DATA TO DOM 1:'.

  table_name = p_tab_nm.

  CALL FUNCTION 'SDIXML_DATA_TO_DOM'
       EXPORTING
            name         = table_name
            dataobject   = <gt_data>
       IMPORTING
            data_as_dom  = l_dom
       CHANGING
            document     = l_document
       EXCEPTIONS
            illegal_name = 1
            OTHERS       = 2.

  IF sy-subrc = 0.
    WRITE 'Ok'.
  ELSE.
    WRITE: 'Err =', sy-subrc.
  ENDIF.

  CHECK NOT l_dom IS INITIAL.
  l_rc = l_document->append_child( new_child = l_dom ).
  IF l_rc IS INITIAL.
    WRITE 'Ok'.
  ELSE.
    WRITE: 'Err =', l_rc.
  ENDIF.

  CALL FUNCTION 'SDIXML_DOM_TO_XML'
       EXPORTING
            document      = l_document
            pretty_print  = 'X'
       IMPORTING
            xml_as_string = l_string
            size          = l_size
       TABLES
            xml_as_table  = lt_xml
       EXCEPTIONS
            no_document   = 1
            OTHERS        = 2.
  IF sy-subrc = 0.
    WRITE 'Ok'.
  ELSE.
    WRITE: 'Err =', sy-subrc.
  ENDIF.

  LOOP AT lt_xml INTO xml_tab-d.
    APPEND xml_tab.
  ENDLOOP.

  CALL FUNCTION 'WS_DOWNLOAD'
       EXPORTING
            bin_filesize = l_size
            filename     = p_file_n
            filetype     = 'BIN'
       TABLES
            data_tab     = xml_tab
       EXCEPTIONS
            OTHERS       = 10.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.                    "download_xml

*&---------------------------------------------------------------------*
FORM upload_xml.
  TYPES: BEGIN OF xml_line,
          data(256) TYPE x,
        END OF xml_line.

  DATA: pixml          TYPE REF TO if_ixml,
        pdocument      TYPE REF TO if_ixml_document,
        pstreamfactory TYPE REF TO if_ixml_stream_factory,
        pistream       TYPE REF TO if_ixml_istream,
        pparser        TYPE REF TO if_ixml_parser,
        string         TYPE string,
        count          TYPE i,
        index          TYPE i,
        totalsize      TYPE i,
        xml_table      TYPE TABLE OF xml_line,
        l_dom          TYPE REF TO  if_ixml_element.

  IF p_tab_nm(1) NA 'ZY'.
    MESSAGE e002(sy) WITH 'Обновление стандартных таблиц не разрешено'.
  ENDIF.

  SELECT COUNT(*)
    FROM (p_tab_nm).

  IF sy-dbcnt > 0.
    MESSAGE e002(sy) WITH 'Таблица уже содержит данные'.
  ENDIF.


  CALL FUNCTION 'WS_UPLOAD'
       EXPORTING
            filename   = p_file_n
            filetype   = 'BIN'
       IMPORTING
            filelength = totalsize
       TABLES
            data_tab   = xml_table
       EXCEPTIONS
            OTHERS     = 11.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

  pixml = cl_ixml=>create( ).

*-- create the initial document
  pdocument = pixml->create_document( ).


*-- create the stream factory
  pstreamfactory = pixml->create_stream_factory( ).

*-- create an input stream for the table
  pistream = pstreamfactory->create_istream_itable( table = xml_table
                                                  size  = totalsize ).

*-- create the parser
  pparser = pixml->create_parser( stream_factory = pstreamfactory
                                  istream        = pistream
                                  document       = pdocument ).
*-- parse the stream
  IF pparser->parse( ) NE 0.
    IF pparser->num_errors( ) NE 0.
      count = pparser->num_errors( ).
      WRITE: count, ' parse errors have occured:'.
      DATA: pparseerror TYPE REF TO if_ixml_parse_error,
            i TYPE i.
      index = 0.
      WHILE index < count.
        pparseerror = pparser->get_error( index = index ).
        i = pparseerror->get_line( ).
        WRITE: 'line: ', i.
        i = pparseerror->get_column( ).
        WRITE: 'column: ', i.
        string = pparseerror->get_reason( ).
        WRITE: string.
        index = index + 1.
      ENDWHILE.
    ENDIF.
  ENDIF.

*-- we don't need the stream any more, so let's close it...
  CALL METHOD pistream->close( ).
  CLEAR pistream.

  CALL METHOD pdocument->get_root_element
    RECEIVING
      rval = l_dom.

  CALL FUNCTION 'SDIXML_DOM_TO_DATA'
       EXPORTING
            data_as_dom = l_dom
       IMPORTING
            dataobject  = <gt_data>.
  MODIFY (p_tab_nm) FROM TABLE <gt_data>.

  WRITE 'OK'.

ENDFORM.                    " upload_xml

в итоге получается xml такого вида
Code:
<?xml version="1.0" encoding="windows-1251"?>
<T000>
<item>
  <MANDT>000</MANDT>
  <MTEXT>SAP AG Konzern</MTEXT>
  <ORT01>Walldorf</ORT01>
  <MWAER>DEM</MWAER>
  <CCCATEGORY>E</CCCATEGORY>
  <CCCORACTIV>1</CCCORACTIV>
  <CCIMAILDIS>X</CCIMAILDIS>
  <CHANGEUSER>DEMUTH</CHANGEUSER>
  <CHANGEDATE>2000-08-11</CHANGEDATE>
</item>
</T000>


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Чт, дек 22 2011, 11:10 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 07 2011, 08:29
Сообщения: 325
Спасибо, всем большое за помощь, получлось сделать без xslt шаблона по этому примеру http://www.sapnet.ru/viewtopic.php?t=662


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 18 2012, 15:48 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пт, сен 17 2004, 14:40
Сообщения: 953
Откуда: город металлургов
Пол: Женский
Добрый день.
Спасибо большое, zsap, за такую подробную инфу! Все выгружается, все замечательно, но засада на первой строке: несмотря на код encoding = l_ixml->create_encoding( character_set = 'windows-1251' byte_order = 0 ). - в первой строке новенького файла упорно пишется <?xml version="1.0" encoding="utf-8" ?>
Где это окаянное utf-8 может быть "зашито"? :(
Подскажите, пожалуйста...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 18 2012, 15:53 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Наташа, а SET_ENCODING вы сделать точно не забыли?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 18 2012, 15:58 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пт, сен 17 2004, 14:40
Сообщения: 953
Откуда: город металлургов
Пол: Женский
Соррри, я в этих делах не волшебник, а только учусь... :(
Вот, собственно, начало проги, после Data и перед заполнением:
CLASS cl_ixml DEFINITION LOAD.
l_ixml = cl_ixml=>create( ).
CHECK NOT l_ixml IS INITIAL.
l_document = l_ixml->create_document( ).
* Creating a encoding object
encoding = l_ixml->create_encoding( character_set = 'windows-1251' byte_order = 0 ).

CHECK NOT l_document IS INITIAL.

CALL METHOD l_document->set_encoding
EXPORTING
encoding = encoding.
Или Вы что-то другое имели в виду?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Вт, дек 18 2012, 17:44 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Все верно. А экземпляр encoding вы получаете (после выполнения create_encoding)?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Ср, дек 19 2012, 09:03 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Наташа написала:
Добрый день.
Спасибо большое, zsap, за такую подробную инфу! Все выгружается, все замечательно, но засада на первой строке: несмотря на код encoding = l_ixml->create_encoding( character_set = 'windows-1251' byte_order = 0 ). - в первой строке новенького файла упорно пишется <?xml version="1.0" encoding="utf-8" ?>
Где это окаянное utf-8 может быть "зашито"? :(
Подскажите, пожалуйста...

Проверял код в 4.6С - в первой строке прописывается кодировка указанная в create_encoding. Помню была в этой проге другая проблема - реальная кодировка файла всегда получалась windows-1251 вне зависимости от create_encoding :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Ср, дек 19 2012, 09:17 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пт, сен 17 2004, 14:40
Сообщения: 953
Откуда: город металлургов
Пол: Женский
zsap, понятно... наверно, это не наш случай - у нас до того файлы все выгружались в utf-8, а тут пришла новая задача, а utf-8 сменить не могу :(
Артем, извините, в каком смысле экземпляр? :(
encoding сначала initial, после encoding = l_ixml->,,,
encoding = {O:11*\CLASS-POOL=CL_IXML\CLASS=CL_IXML_ENCODING}
после CALL METHOD l_document->set_encoding encoding = {O:11*\CLASS-POOL=CL_IXML\CLASS=CL_IXML_ENCODING} (то есть не изменяется...
УПС! Только что обнаружилось! Эта инфекция на экран выводит utf-8, а в файле-то пишет windows-1251


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Выгрузка данных в файл формата xml
СообщениеДобавлено: Пн, янв 07 2013, 10:27 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
плохо, что xslt и utf-8 не подошли, 1251 сейчас анахронизм ;-)


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

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


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

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


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

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