Текущее время: Вс, июл 20 2025, 12:15

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: CALL TRANSFORMATION - лыжи не едут :-(
СообщениеДобавлено: Вт, июн 17 2008, 10:29 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Здравствуйте.
Совершенно типовая задача - получение курсов валют с сайта ЦБ РФ (http://web.cbr.ru/GetCursOnDateXML).
Наверняка многие уже делали.
XML-ответ с курсами уже есть. Не получается пропарсить :-( .

Code:
  SEARCH l_response FOR '<ValuteCursOnDate>' .
  SHIFT l_response LEFT BY sy-fdpos PLACES .

  DATA: BEGIN OF lwa_courses,
           vname(20),
           vnom(5),
           vcurs(15),
           vcode(5),
           vchcode(20),
        END   OF lwa_courses,
        lt_courses LIKE STANDARD TABLE OF lwa_courses WITH HEADER LINE .

  CALL TRANSFORMATION zcbr_cur
  SOURCE XML l_response
  RESULT CURR_TAB = lt_courses .

К моменту вызова CALL TRANSFORMATION, l_response имеет вид
Цитата:
"<ValuteCursOnDate><Vname>Австралийский доллар </Vname><Vnom>1</Vnom><Vcurs>22.4091</Vcurs><Vcode>36</Vcode><VchCode>AUD</VchCode></ValuteCursOnDate> ..."


XML-преобразование ZCBR_CUR:
Code:
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">

  <tt:root name="CURR_TAB"/>
  <tt:template name="ZCBR_CUR">
    <ValuteCursOnDate>
      <tt:loop name="line" ref=".CURR_TAB">
        <Vname>
          <tt:value ref="$line.Vname"/>
        </Vname>

        <Vnom>
          <tt:value ref="$line.Vnom"/>
        </Vnom>

        <Vcurs>
          <tt:value ref="$line.Vcurs"/>
        </Vcurs>

        <Vcode>
          <tt:value ref="$line.Vcode"/>
        </Vcode>

        <Vchcode>
          <tt:value ref="$line.Vchcode"/>
        </Vchcode>
      </tt:loop>
    </ValuteCursOnDate>
  </tt:template>
</tt:transform>

Вроде все около дела, но - падает в дамп
Цитата:
" The reason for the exception is:
The goal was to access variable "CURR_TAB". However, this access was not possible."


В чем ошибка? :?

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 01 2008, 16:24 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
Up.
Откладывал задачку, сейчас опять скоро придется вернуться.

Неужели никто подобного не делал?!

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 01 2008, 16:36 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Можно обойтись без XLT-преобразования, если такой вариант устраивает, то вот код.

Code:
* Преобразование xml во внутреннюю таблицу
FORM convert_into_table TABLES pt_html TYPE STANDARD TABLE.

  DATA: ir_node      TYPE REF TO if_ixml_node,
        ir_node_root TYPE REF TO if_ixml_node,
        children TYPE REF TO if_ixml_node_list.

  DATA: iter TYPE REF TO if_ixml_node_iterator.
  DATA: retcode TYPE sy-subrc.

  FIELD-SYMBOLS <i> LIKE LINE OF gt_rates.

  CREATE OBJECT gr_xml_doc.
  CALL METHOD gr_xml_doc->create_with_table
    EXPORTING
      table   = pt_html[]
    RECEIVING
      retcode = retcode.

  IF retcode IS NOT INITIAL.
    MESSAGE e001(00) WITH 'Ошибка конвертации XML!'(101).
    LEAVE PROGRAM.
  ENDIF.
  CALL METHOD gr_xml_doc->find_node
    EXPORTING
      name = 'ValCurs'
    RECEIVING
      node = ir_node.
  DATA:       date     TYPE string,
              name     TYPE string.
  DATA: attr TYPE REF TO if_ixml_named_node_map.
  DATA: date_node TYPE REF TO if_ixml_node.
  DATA l_name TYPE string.                                  "#EC NEEDED
  CALL METHOD ir_node->get_attributes
    RECEIVING
      rval = attr.

  CALL METHOD attr->get_named_item
    EXPORTING
      name = 'Date'
    RECEIVING
      rval = date_node.

  l_name = date_node->get_value( ).
  CONCATENATE l_name+6(4) l_name+3(2) l_name+0(2) INTO g_datum.
*--}

  children = ir_node->get_children( ).

  iter = children->create_iterator( ).
  iter->reset( ).

  DO.
    ir_node_root = iter->get_next( ).
    IF NOT ir_node_root IS BOUND.
      EXIT.
    ENDIF.

    ir_node = gr_xml_doc->find_node( name = 'NumCode' root = ir_node_root ).

*   Возможен промежуточный пустой узел
    CHECK  ir_node IS BOUND.

    APPEND INITIAL LINE TO gt_rates ASSIGNING <i>.
    <i>-numcode = ir_node->get_value( ).

    PERFORM put_value USING ir_node_root 'NumCode'          "#EC NEEDED
                   CHANGING <i>-numcode.
    PERFORM put_value USING ir_node_root 'CharCode'         "#EC NEEDED
               CHANGING <i>-charcode.
    PERFORM put_value USING ir_node_root 'Nominal'          "#EC NEEDED
                   CHANGING <i>-nominal.
    PERFORM put_value USING ir_node_root 'Name'             "#EC NEEDED
                   CHANGING <i>-name.
    PERFORM put_value USING ir_node_root 'Value'            "#EC NEEDED
                   CHANGING <i>-value.

  ENDDO.
ENDFORM.                    " convert_into_table


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, июл 01 2008, 22:23 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 25 2005, 19:26
Сообщения: 67
Пол: Мужской
Может, таблицу при вызове CALL TRANSFORMATION указать так:
Code:
  CALL TRANSFORMATION zcbr_cur
  SOURCE XML l_response
  RESULT CURR_TAB = lt_courses[] .


Есть подозрение, что иначе передается хедерлайн, но проверить самому лень. :)

_________________
Come to Cookies! We Have Dark Sides!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 02 2008, 11:44 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
imp написал:
Может, таблицу при вызове CALL TRANSFORMATION указать так:
Code:
  CALL TRANSFORMATION zcbr_cur
  SOURCE XML l_response
  RESULT CURR_TAB = lt_courses[] .


Есть подозрение, что иначе передается хедерлайн, но проверить самому лень. :)


Вах, шайтан, правда! Самое смешное, что такая мысль приходила в голову, исправлял, но все равно падала в дамп - теперь уже по другой причине - а я видимо, из-за невнимательности решил, что просто это не решает проблему .
Заработала, правда парсит только первую валюту (итоговая таблица содержит одну строку, хотя в XML много валют), теперь бы еще понять, почему. ValuteCursOnDate и loop местами менял и так, и сяк - не помогает.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Последний раз редактировалось 111 Чт, июл 03 2008, 16:27, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 13:28 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 25 2005, 19:26
Сообщения: 67
Пол: Мужской
111 написал(а):
imp написал:
Может, таблицу при вызове CALL TRANSFORMATION указать так:
Code:
  CALL TRANSFORMATION zcbr_cur
  SOURCE XML l_response
  RESULT CURR_TAB = lt_courses[] .


Есть подозрение, что иначе передается хедерлайн, но проверить самому лень. :)


Вах, шайтан, правда! Самое смешное, что такая мысль приходила в голову, исправлял, но все равно падала в дамп - видимо, из-за невнимательности упустил, что дамп был по другой причине .
Заработала, правда парсит только первую валюту (итоговая таблица содержит одну строку, хотя в XML много валют), теперь бы еще понять, почему. ValuteCursOnDate и loop местами менял и так, и сяк - не помогает.


Насколько мне не изменяет склероз, в XML-документе должен быть один корневой элемент, а в твоем файле его не видно.

По твоей ссылке на сайт ЦБ РФ возвращается ошибка.
Беглый поиск вернул вот это:
http://www.cbr.ru/scripts/XML_daily.asp

Дык там:

Code:
<?xml version="1.0" encoding="windows-1251" ?>
<ValCurs Date="04.07.2008" name="Foreign Currency Market">
<Valute ID="R01010">
   <NumCode>036</NumCode>
   <CharCode>AUD</CharCode>
   <Nominal>1</Nominal>
   <Name>Австралийский доллар</Name>
   <Value>22,5016</Value>
</Valute>
<Valute ID="R01035">
   <NumCode>826</NumCode>
   <CharCode>GBP</CharCode>
   <Nominal>1</Nominal>
   <Name>Фунт стерлингов Соединенного Королевства</Name>
   <Value>46,5508</Value>
</Valute>
......
</ValCurs>


Дальше, думаю, объяснять не надо :)

_________________
Come to Cookies! We Have Dark Sides!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 16:15 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Выложенный мной ранее кусок кода как раз разбирает данные с сайта http://www.cbr.ru/scripts/XML_daily.asp


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 16:23 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
__Gennady написал(а):
Выложенный мной ранее кусок кода как раз разбирает данные с сайта http://www.cbr.ru/scripts/XML_daily.asp


Большое спасибо, __Gennady, скорее всего я ваш кусок в конце концов и возьму за образец - если не удастся разобраться.
Просто вначале все же хочу попробовать разобраться, как с помощью CALL TRANSFORMATION сделать.

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 17:52 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, сен 23 2004, 18:43
Сообщения: 1556
Откуда: Москва
imp написал:
Насколько мне не изменяет склероз, в XML-документе должен быть один корневой элемент, а в твоем файле его не видно.


Почему же тогда вот такое преобразование работает отлично в обе стороны:
Code:
REPORT  z_xml_transform_test.

DATA: l_response  TYPE string .

DATA: BEGIN OF lwa_courses,
         vname(1000),
         vnom(5),
         vcurs(15),
         vcode(5),
         vchcode(20),
      END   OF lwa_courses,
      lt_courses LIKE STANDARD TABLE OF lwa_courses WITH HEADER LINE .

lwa_courses-vname = 'TEST1'.
lwa_courses-vnom  = '01'.
lwa_courses-vcurs = '1'.
lwa_courses-vcode = '12345'.
lwa_courses-vchcode = '1234567890' .
APPEND lwa_courses TO lt_courses .

lwa_courses-vname = 'TEST2'.
lwa_courses-vnom  = '02'.
lwa_courses-vcurs = '2'.
lwa_courses-vcode = '12345'.
lwa_courses-vchcode = '1234567890' .
APPEND lwa_courses TO lt_courses .

CALL TRANSFORMATION zcbr_cur
SOURCE curr_tab = lt_courses[]
RESULT XML l_response .

refresh lt_courses .

CALL TRANSFORMATION zcbr_cur
SOURCE XML l_response
RESULT curr_tab = lt_courses[] .


Подгоняю l_response под такой же вид в проге получения курсов валют - падает в дамп.

imp написал:
По твоей ссылке на сайт ЦБ РФ возвращается ошибка.


Эксплорером туда ломиться бесполезно - будет ошибка. А так - все отлично работает:

Code:
  DATA: lr_client    TYPE REF   TO if_http_client,
        lr_response  TYPE REF   TO if_http_response,
        lr_request   TYPE REF   TO if_http_request,
        l_request    TYPE string,
        l_response   TYPE string,
        lp_xresponse TYPE xstring .
  DATA: ltb_report TYPE TABLE OF string WITH HEADER LINE .

  CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
      destination              = 'CBR_CURRENCY'
    IMPORTING
      client                   = lr_client
    EXCEPTIONS
      destination_not_found    = 1
      internal_error           = 2
      argument_not_found       = 3
      destination_no_authority = 4
      plugin_not_active        = 5
      OTHERS                   = 6.

  CHECK sy-subrc = 0.


  lr_request = lr_client->request .

* Настройка запроса

  CALL METHOD lr_request->if_http_entity~set_content_type
    EXPORTING
      content_type = 'text/xml'.

  CALL METHOD lr_request->set_header_field
    EXPORTING
      name  = 'SOAPAction'
      value = 'http://web.cbr.ru/GetCursOnDateXML'.

  READ REPORT 'ZBE_CBR_XMLREQUEST' INTO ltb_report .

  IF sy-subrc > 0 .
    MESSAGE e089 .
  ENDIF.

  DATA: lb_report(2), l_len TYPE i, lc_len(4) .
  LOOP AT ltb_report .
    lb_report = ltb_report .
    IF lb_report EQ '*-' .
      SHIFT ltb_report LEFT BY 2 PLACES .
      CONCATENATE l_request ltb_report cl_abap_char_utilities=>cr_lf INTO l_request SEPARATED BY space .
      MODIFY ltb_report .
    ELSE.
      DELETE ltb_report .
    ENDIF.
  ENDLOOP .

  DATA: lb_request2(1000) .
  SEARCH l_request FOR '<?xml version="1.0" encoding="utf-8"?>' .
  MOVE l_request+sy-fdpos TO lb_request2 .

  l_len = STRLEN( lb_request2 ) ."l_request ).
  WRITE l_len TO lc_len .
  REPLACE: 'P_DATE' IN l_request WITH '2008-06-11T00:00:00Z' . "06-11T10:00:00+03:00'. "'11.06.2008',

  lr_request->set_cdata( l_request ) . "ltp_request ) .
  l_request = lr_request->get_cdata( ).

* Отправка запроса
  CALL METHOD lr_client->send
*  exporting  timeout = timeout
    EXCEPTIONS http_communication_failure  = 1
               http_invalid_state          = 2
               http_processing_failed      = 3
               OTHERS                      = 4.

  CHECK sy-subrc = 0.

* Получение ответа сервера
  CALL METHOD lr_client->receive
    EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3
      OTHERS                     = 4.

  CHECK sy-subrc = 0.
  lr_response = lr_client->response .
  l_response = lr_response->get_cdata( ).

* Закрытие соединения

  CALL METHOD lr_client->close
    EXCEPTIONS
      http_invalid_state = 1
      OTHERS             = 2.
  CHECK NOT l_response IS INITIAL .


Отчет 'ZBE_CBR_XMLREQUEST' (текст запроса, содран с сайта ЦБ РФ - там есть инструкция):
Code:
**POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.1
**Host: www.cbr.ru
**Content-Type: text/xml; charset=utf-8
**Content-Length: length
**SOAPAction: "http://web.cbr.ru/GetCursOnDateXML"
**
**<?xml version="1.0" encoding="utf-8"?>
*-<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
*-  <soap:Body>
*-    <GetCursOnDateXML xmlns="http://web.cbr.ru/">
*-      <On_date>P_DATE</On_date>
*-    </GetCursOnDateXML>
*-  </soap:Body>
*-</soap:Envelope>

_________________
Hе иди по течению, не иди против течения - иди поперек него, если хочешь достичь берега.
Слова Ванталы. Дела Ванталы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CALL TRANSFORMATION - лыжи не едут :-(
СообщениеДобавлено: Вт, апр 14 2009, 13:30 
Начинающий
Начинающий

Зарегистрирован:
Пн, мар 16 2009, 14:34
Сообщения: 8
а можно вопрос в догонку - про call trasformation. Создал преобразование, пока пустое в strans Z_XSLT_PLAV_KART_TEST1.
Пишу:
Code:
сall trasformation Z_XSLT_PLAV_KART_TEST1
SOURCE XML xml_string
      RESULT ROOT = result.

SAP ругается - ""." or "ID ... FIELD ..." expected after "TRASFORMATION"."
В чем косяк?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CALL TRANSFORMATION - лыжи не едут :-(
СообщениеДобавлено: Вт, апр 14 2009, 13:45 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 25 2005, 19:26
Сообщения: 67
Пол: Мужской
vs2009 написал(а):
а можно вопрос в догонку - про call trasformation. Создал преобразование, пока пустое в strans Z_XSLT_PLAV_KART_TEST1.
Пишу:
Code:
сall trasformation Z_XSLT_PLAV_KART_TEST1
SOURCE XML xml_string
      RESULT ROOT = result.

SAP ругается - ""." or "ID ... FIELD ..." expected after "TRASFORMATION"."
В чем косяк?


traNsformation :)

_________________
Come to Cookies! We Have Dark Sides!


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

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


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

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


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

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