Страницы: 1
RSS
Функция ФИЛЬТР.XML+ВЕБСЛУЖБА преобразует десятичное число в дату
 
Всем добрый день!

Столкнулся с такой проблемой. Есть функция, которая тянет котировки из веб-сервиса MOEX:
Код
=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/history/engines/currency/markets/selt/boards/CETS/securities/CNY000000TOD.xml?from=2023-08-28&till=2023-08-28");"//data/rows/row/@CLOSE")

В целом работает нормально, но в некоторых случаях начинает чудить. Например, за указанную в формуле дату (28/08/2023) котировка должна быть 13.05 (возвращается именно с точкой) и эта котировка преобразуется в 13/05/2023 еще до того, как я могу что-то предпринять (т.е. замена точки на запятую в результате, возвращаемом функцией ФИЛЬТР.XML() ничего не дает, так как к этому времени там уже дата). Также пробовал конструкцию ПОДСТАВИТЬ(ВЕБСЛУЖБА();".";","), но тогда другая проблема - коверкается строка <?xml version="1.0" encoding="UTF-8"?> и дальше не работает ФИЛЬТР.XML.

Можно, конечно, заменить точку на запятую, потом version="1,0" на version="1.0" - но это как-то громоздко... Может кто-нибудь подскажет более изящное решение?

Спасибо
 
Вероятно, можно как-то так извернуться:
Код
=--ПСТР(ПОДСТАВИТЬ(ФИЛЬТР.XML(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/history/engines/currency/markets/selt/boards/CETS/securities/CNY000000TOD.xml?from=2023-08-28&till=2023-08-28");"CLOSE="&СИМВОЛ(34);"CLOSE="&СИМВОЛ(34)&"'");"//data/rows/row/@CLOSE");".";",");2;999)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
если системный разделитель стоит точка то все выводится как нужно
 
Дмитрий(The_Prist) Щербаков, спасибо! не первый раз выручаете
Тимофеев, тоже интересный вариант - на время выгрузки данных менять разделитель. Спасибо!
 
Красивое решение, но если в строке только значение, то ка быть? Выдает 45479, а нужно 6,7
Код
=ФИЛЬТР.XML(ВЕБСЛУЖБА("https://iss.moex.com/iss/statistics/engines/stock/markets/bonds/bondization/SU26237RMFS6/securities.xml?iss.meta=off&iss.only=coupons&coupons.columns=valueprc");"//document//data//rows//row[1]/@valueprc")
 
В общем-то выше решение уже подсказано - ситуация у Вас такая же, 6.7 преобразуется в дату 06.07.2024 и потом в её числовое представление согласно формату Общий.
Для получения корректного результата надо подменять результат функции ВЕБСЛУЖБА, чтобы там был явный текст(в понимании Excel):
Код
=ПОДСТАВИТЬ(ФИЛЬТР.XML(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/statistics/engines/stock/markets/bonds/bondization/SU26237RMFS6/securities.xml?iss.meta=off&iss.only=coupons&coupons.columns=valueprc");"<row valueprc="&СИМВОЛ(34);"<row valueprc="&СИМВОЛ(34)&"'");"//document//data//rows//row[1]/@valueprc");"'";"")
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Гениально!
Я понимал, что нужно вытащить именно текстом, но как это сделать не допер, думал что невозможно подменить результат.
 
Дмитрий(The_Prist) Щербаков, благодарю за ответы другим пользователям в этой ветке. Пытаюсь побороть преобразование числа в дату с последующим преобразованием число.
Сделал запрос по вашему образцу:
Код
=ПОДСТАВИТЬ(ФИЛЬТР.XML(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/securities/LQDT.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=OFFER");"<row OFFER="&СИМВОЛ(34);"<row OFFER="&СИМВОЛ(34)&"'");"//document//data//rows//row[@BOARDID='TQTF']/@OFFER");"'";"")
Однако на выходе получаю #ЗНАЧ!
ВЕБСЛУЖБА, после первой замены, выдает число с апострофом, что и требовалось для передачи в текстовом виде.

Буду вам благодарен за помощь в поиске решения.

Поборол таким образом:
Код
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(ФИЛЬТР.XML(ПОДСТАВИТЬ(ВЕБСЛУЖБА("https://iss.moex.com/iss/engines/stock/markets/shares/securities/LQDT.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=OFFER");"<row OFFER="&СИМВОЛ(34);"<row OFFER="&СИМВОЛ(34)&"'");"//document//data//rows//row[1]/@OFFER");"'";"");".";",")
Буду благодарен за альтернативные варианты.
Изменено: dengol - 29.11.2024 11:29:51
 
для получения чисел можно делать замену "." на "," возвращаемого вебслужбой и удалять "<?xml version="1,0" encoding="UTF-8"?>", чтобы фильтрXML заработал
в А1 ваша ссылка для службы:
Код
=ФИЛЬТР.XML(ЗАМЕНИТЬ(ПОДСТАВИТЬ(ВЕБСЛУЖБА(A1);".";",");1;38;"");"//@OFFER")
 
Тимофеев, круто! Спасибо!
Страницы: 1
Читают тему
Наверх