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

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


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

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


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

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