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

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


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

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


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

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