:: Visual Foxpro, Foxpro for DOS
Как получить ключевую ставку ЦБ РФ?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Вчера очередной раз поменяли ключевую ставку Центробанка. Новая действует с понедельника. Как бы автоматизировать процесс её получения?
На www.cbr.ru есть какие-то web-сервисы, но именно для ключевой ставки там не нашёл.
Может, кто-нибудь сталкивался?
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Брать вот здесь можно, там файлы экселевские с процентными ставками, в том числе и ключевой ставкой которая тебе нужна.

www.cbr.ru

Банк России пересматривает ключевую ставку каждые полтора месяца грубо и не всегда ее меняет. Но после каждого раза он публикует пресс-релиз. Обычно дата следующего рассмотрения заранее известна. Вот в следующий раз это будет 23.03.2018 г. Я отслеживаю пресс-релизы -www.cbr.ru


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 12.02.18 09:42
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну очевидно же что это не удобно для автоматизации... Проще, полагаю, написать разработчикам тех самых сервисов, чтобы сделали и для этого показателя сервис... Хотя, посмотрев эти жуткие эксели, возникает больше вопросов чем ответов - какая из ставок нужна автору темы - что он возьмёт за "ключевую ставку Центробанка" - раз уж ставку рефинансирования с 16-го года отменили как самостоятельную величину


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Ясень пень, что экселевские файлы неудобны для автоматизации.

Igor Korolyov
Проще, полагаю, написать разработчикам тех самых сервисов, чтобы сделали и для этого показателя сервис...
Пущай пишет Мне то проще мне ключевая ставка не для автоматизации нужна, а совсем для других целей. Просто ТС вообще не знал откуда её брать на сайте ЦБ, я лишь показала то, что у них там есть

Цитата:
Хотя, посмотрев эти жуткие эксели, возникает больше вопросов чем ответов - какая из ставок нужна автору темы - что он возьмёт за "ключевую ставку Центробанка"
Я так полагаю ему нужна та которая сейчас 7,50% Её в пятницу в очередной раз снизили, и в этот раз на 0,25%. До этого она была 7,75%.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 12.02.18 12:40
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Ну вот порылась в инете -

infostart.ru

Функция ПолучитьСтавкуРефинансифрования()
Определения = Новый WSОпределения("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
Прокси = Новый WSПрокси(Определения, "http://web.cbr.ru/", "DailyInfo", "DailyInfoSoap");
ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://web.cbr.ru/").Получить("AllDataInfoXML");
WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра);
РезультатXDTO = Прокси.AllDataInfoXML(WSПараметр);
КлючеваяСтавка = Число(РезультатXDTO.AllDataInfoXMLResult.AllData.KEY_RATE.val);
Возврат КлючеваяСтавка;
КонецФункции

И ответ -

Цитата:
Владимир Гричук (vgrichuk) 10.11.16 17:23
ЦБ перестал отдавать этот вебсервис по http, только по https. Для исправления надо сделать в коде небольшие изменения:
ssl1 = Новый ЗащищенноеСоединениеOpenSSL();
Определения = Новый WSОпределения("https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL",,,,,ssl1);
Прокси = Новый WSПрокси(Определения,"http://web.cbr.ru/","DailyInfo","DailyInfoSoap",,,ssl1);

далее всё по-старому

Пусть ТС пробует...Говорят вместо старой ставки рефинансирования должна вернуться ключевая ставка...Я честно говоря этот веб-сервис не юзала. Пусть ТС проэксперементирует.
Для меня важна не сама ставка, а пресс-релиз на сайте.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 12.02.18 13:03
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Божья_коровка
Пусть ТС пробует...Говорят вместо старой ставки рефинансирования должна вернуться ключевая ставка...Я честно говоря этот веб-сервис не юзала. Пусть ТС проэксперементирует.
Ну вот совсем же другое дело


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Божья_коровка
Банк России пересматривает ключевую ставку каждые полтора месяца грубо и не всегда ее меняет. Но после каждого раза он публикует пресс-релиз. Обычно дата следующего рассмотрения заранее известна. Вот в следующий раз это будет 23.03.2018 г.
Дак вот и я там отслеживаю, ставлю напоминалку на телефон... Хорошо хоть они уже с полгода заседания по пятницам проводят. А то раньше вообще жесть – сегодня изменили, опубликовали в 13:30 МСК, это по моему времени полшестого вечера, а с утра действует новая. Для меня сложность в том, что от ключевой ставки зависит расчёт пени в ЖКХ, соответственно к следующему утру (до начала приёма платежей) все клиенты должны обновиться. Кто забудет, кто не понимает важность. Вот мне это и надоело, хочу как-то автоматом замутить.

Igor Korolyov
возникает больше вопросов чем ответов - какая из ставок нужна автору темы - что он возьмёт за "ключевую ставку Центробанка" - раз уж ставку рефинансирования с 16-го года отменили как самостоятельную величину
Да не, всё просто. В Жилищном кодексе фигурирует именно «ставка рефинансирования». С сентября 2012 года она не менялась (вероятно, ЦБ РФ забил на неё, переходя на ключевую). Потом чухнули и с 01.01.2016 её арифметически приравняли к ключевой ставке, которая уже год как регулярно меняется – раз в полтора месяца. Таким образом, формально, мне нужна именно ставка рефинансирования, но инфу по ней отдельно не публикуют, поэтому, чтобы вам не забивать голову этими подробностями, я и написал сразу про ключевую ставку)))

Igor Korolyov
Ну очевидно же что это не удобно для автоматизации...
Именно.

Божья_коровка
Просто ТС вообще не знал откуда её брать на сайте ЦБ, я лишь показала то, что у них там есть
Да знал, конечно. Вопрос именно в автоматизации процесса получения. Особо не надеялся, но вдруг, думаю, кто-нибудь делал, ну и чтоб не изобретать велосипед...

Божья_коровка
Ну вот порылась в инете
Я перед тем как здесь спрашивать тоже искал. Из чего-либо «автоматического» натыкался только на этот код. Но с 1с несколько лет дела вообще не имел, поэтому здесь нифига не понял что за WSОпределения и ФабрикаXDTO(((

В любом случае, спасибо за участие!
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Ну а вот это не пробовал из твоей же ссылки подраздел www.cbr.ru -

Цитата:
Веб-сервис: DailyInfoWebServ/ DailyInfo.asmx
Его же товарищи применяли в своём коде который выше был скинут. Почитать про описание веб-сервиса. В самом низу страницы по ссылке www.cbr.ru есть архивы с примерами работы с веб-сервисом, они конечно не на фоксе, но думаю качнуть и посмотреть можно.

Цитата:
Данные методы возвращают только 'простые' XML документы, без использования схем:
MainInfoXML() Получение основной информации - Ставка рефинансирования, золотовалютные резервы, денежная база, денежная масса


Цитата:
Вопрос именно в автоматизации процесса получения. Особо не надеялся, но вдруг, думаю, кто-нибудь делал, ну и чтоб не изобретать велосипед...
Придется видимо стать первопроходцем ;)


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 10 раз(а). Последнее : Божья_коровка, 13.02.18 11:35
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Вот описалово метода MainInfoXML()
ссылка www.cbr.ru




А вот описалово того метода который использовали товарищи 1Сники в своём примере AllDataInfoXML() - www.cbr.ru


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 2 раз(а). Последнее : Божья_коровка, 13.02.18 09:50
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
andrewk
с 1с несколько лет дела вообще не имел, поэтому здесь нифига не понял что за WSОпределения и ФабрикаXDTO
Полагаю что для начала написания фоксового кода достаточно просто адреса где лежит wsdl файл. Т.к. там https и собственно ответ в "чистом" xml-виде, то лучше будет использовать напрямую MSXML2.XMLHTTP (примеры на форуме есть - конкретно к пользованию этой компоненты для работы с WebService-ми - т.е. как соорудить Envelope запроса и как разобрать ответ). Т.е. не пытаться даже старьё MSSOAP колупать.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
как-то так.
local loHTTP, lcRequest, lcResponse
TEXT TO lcRequest TEXTMERGE NOSHOW
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<MainInfoXML xmlns="http://web.cbr.ru/" />
</soap12:Body>
</soap12:Envelope>
ENDTEXT
loHTTP = CREATEOBJECT("Msxml2.XMLHTTP")
With loHTTP
.Open("POST", 'http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx', .F.)
.setRequestHeader("Content-Type", "application/soap+xml; charset=utf-8")
.setRequestHeader("Content-length", LTRIM(STR(LEN(lcRequest))))
.Send(lcRequest)
Do While .readyState # 4
doevents force
Enddo
lcResponse = .responseText
Endwith
*strtofile(lcResponse, [MainInfo.XML])
local loXDOM, loNode
loXDOM = CREATEOBJECT('MSXML2.DOMDocument')
loXDOM.loadXML(lcResponse)
loNode = loXDOM.selectSingleNode("//stavka_ref")
with loNode
?.getAttribute("Title")
?.getAttribute("Date")
?.Text
endwith
Ratings: 0 negative/3 positive
Re: Как получить ключевую ставку ЦБ РФ?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
vk65
как-то так
Уважаемый, куда пиво везти?:bodr:

Получив пинок в верном направлении, пошарился по другим методам. На интересующую тему там ещё есть AllDataInfoXML. Он возвращает ответ в 6 раз длиннее, зато в нём есть вот что:
<KEY_RATE Title="Действующая ключевая ставка" val="7.5" date="12.02.2018" />
<KEY_RATE_FUTURE Title="Новое значение ключевой ставки (справочно)" val="7.5" newdate="12.02.2018" />
<REF_RATE Title="Ставка рефинансирования (Значение соответствует значению ключевой ставки Банка России)" val="7.5" />
Теперь бы не забыть посмотреть что оно выдаст вечером 24 марта. Думаю, можно надеяться, что там будет [новая] ставка и дата 26.03.2018.

Для полного счастья бы придумать ещё как раскопать дату следующего заседания, но это уже, наверное, сказки))
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
andrewk
Для полного счастья бы придумать ещё как раскопать дату следующего заседания, но это уже, наверное, сказки))
А тупо мониторить с какой-то периодичностью не вариант?
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
spinz
А тупо мониторить с какой-то периодичностью не вариант?
Да на самом деле подумать надо. Какие-нибудь правила для "расписания". Например, обязательно после каждой пятницы, ещё там чего-нибудь. Это в любом случае лучше чем сейчас.

Вообще-то, я уже собирался хотя бы тупо у себя на сервере держать ini-файл, что-нибудь типа:
Rate=7.75
NewRate=7.50
NewRateStart=12.02.2018
NextCheck=24.03.2018
ну и чтобы ко мне долбились. Но раз удалось с cbr.ru получить, то... Короче, надо ещё подумать.
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
После каждой пятницы ненадежно, вдруг правила изменятся. Чаще чем в сутки точно ставка не будет меняться, поэтому раз в сутки должно хватить
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
andrewk
На интересующую тему там ещё есть AllDataInfoXML. Он возвращает ответ в 6 раз длиннее, зато в нём есть вот что:
...
Теперь бы не забыть посмотреть что оно выдаст вечером 24 марта. Думаю, можно надеяться, что там будет [новая] ставка и дата 26.03.2018.
Да, я тоже посмотрел этот XML. Нужно за ним понаблюдать, скорее всего, если 23 марта ставка изменится, новое значение 23 марта появится в KEY_RATE_FUTURE, а 26 марта - в KEY_RATE.
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
Божья_коровка
Автор

Сообщений: 25731
Дата регистрации: 23.08.2001
Ну вот и здорово!

По поводу даты последующего рассмотрения. За 2 года мониторинга я заметила, что не всегда интервал между рассмотрениями 1,5 месяца, если праздники то срок сдвигался (ну наверно это естественно). Но всегда это была пятница, после обеда по времени Мск, всегда появлялся пресс-релиз. Вот в пресс-релизе и указывается дата последующего рассмотрения.
На сайте ЦБ нигде не находила каких то правил по заседанию совета директоров. :al: Ну скорее всего должен быть какой то внутренний регламент.

Может посмотреть Календарь основных событий на 2018 год?
www.cbr.ru

В нем по идее указаны все даты заседаний совета директоров.И именно на этих заседаниях решается судьба ключевой ставки и кредитно-денежной политики.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 3 раз(а). Последнее : Божья_коровка, 14.02.18 09:18
Ratings: 0 negative/0 positive
Re: Как получить ключевую ставку ЦБ РФ?
andrewk

Сообщений: 174
Откуда: Красноярск
Дата регистрации: 15.05.2005
Ну чо, хэпиенд!
Дождался этой пятницы. В ночь с пятницы на субботу 24.03.2018 (после заседания 23.03.2018) ответ пришёл такой:
<KEY_RATE Title="Действующая ключевая ставка" val="7.5" date="12.02.2018" />
<KEY_RATE_FUTURE Title="Новое значение ключевой ставки (справочно)" val="7.25" newdate="26.03.2018" />

Божья_коровка
Но всегда это была пятница
Не всегда. Исключения: 02.05.2017, 14.06.2016. До 01.01.2016 я за ключевой не следил.
И, кстати. Нынче Набиуллина рассказала о планах. В течение 2018 года постепенно будет ещё снижаться, потом остановится плюс-минус: www.cbr.ru

spinz
После каждой пятницы ненадежно, вдруг правила изменятся.
В общем случае - конечно. Но конкретно у меня иная ситуация - прогу и обновляю регулярно, и сам в ней работаю, поэтому обнаружу сразу. Поэтому у себя пока настроил на субботы.

На этой почве сваял функцию для работы с этим. Кода многовато, но там половина - "обвязка". Всё это нужно, конечно, для хранения и использования, но можно просто вывести сообщение. Можно запускать интерактивно, можно по-тихому. Регулируется первым параметром. Проверка того, нужно ли запускать проверку прямо сейчас, вынесена в дополнительную функцию. Константа вверху определяет режим "расписания" - ежедневно или по субботам. Если бы научиться получать html-код прессрелиза, можно было бы настроить на следующее заседание, но сходу у меня не получилось.

Upd: пока домой ехал, понял, что маленько с расписанием перехитрил. Сейчас подправил.
Upd: надо бы ещё дождаться такого заседания, когда ставку не изменят. Тогда, интересно, что будет в date - дата этого заседания или предыдущего?

Оно:
**** / "стандартные" константы \
#DEFINE CR Chr(13)
#DEFINE CR2 CR+CR
#DEFINE TAB Chr(9)
#DEFINE FAIL -1 && возврат функций при неуспехе, неопределённое значение
**** \ "стандартные" константы /
* Крайний прессрелиз. Адрес и структура текста постоянная, надо попробовать распарсить дату следующего заседания
* www.cbr.ru
* Описание сервиса: www.cbr.ru
* AllDataInfoXML - текущая и будущая ключевая ставка, ставка рефинансирования, много другого (ответ 6 kB)
* MainInfoXML - только текущая ставка рефинансирования, ещё что-то (ответ 1 kB)
Function GetKeyRate && ([cOps [,oKeyRate|dLastCheck]]) - Ключевая ставка ЦБ
LParameters cOps,oKeyRate
* cOps:
* M показать результат (умолчание)
* s silent-режим, не выводить никаких сообщений
* O создать/использовать объект oKeyRate
* o ТОЛЬКО создать пустой объект и вернуть его, например: GetKeyRate('o',@var) | var = GetKeyRate('o')
* h использовать "расписание" - смотри GetKeyRate_Schedule()
* oKeyRate объект со свойствами (при O|o)
* .nRate текущая ставка
* .dStart когда она начала действовать
* .nRate_Future если прошло заседание - новая (будущая) ставка
* .dStart_Future когда начнёт действовать
* .dLastCheck дата последней успешной проверки
* .dNextCheck дата следующей проверки (для расписания)
* объект можно создать выше [загрузить из БД] либо передать любую @переменную по ссылке
* он будет изменён только при успехе
* dLastCheck (при h) дата предыдущей успешной проверки - для расписания
* Возврат (при разных cOps):
* o создаст пустой объект и вернёт его
* h если проверка сейчас не нужна - вернёт 0
* иначе выполнит проверку
* если облом - вернёт FAIL
* заполнит объект (при O)
* вернёт текущую ставку
#DEFINE cnURL "http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx"
#DEFINE cnMethod "AllDataInfoXML"
#DEFINE cnByFriday .T. && заседания по пятница, проверяем в субботу. Иначе - раз в сутки
#DEFINE cnMsgTitle "Ключевая ставка ЦБ РФ"
* Разбор параметров
Local ldLastCheck && могли передать параметром
ldLastCheck = Iif(VarType(m.oKeyRate)="D", m.oKeyRate, {})
Do Case
Case VarType(m.cOps)<>"C"
cOps = 'M'
Case 'O' $ m.cOps or m.cOps='o'
Do Case
Case VarType(m.oKeyRate)<>"O" && GetKeyRate('O*',@var) | GetKeyRate('o',@var) | var = GetKeyRate('o')
oKeyRate = CreateObject("Empty")
AddProperty(m.oKeyRate, "dLastCheck", {})
Case VarType(m.oKeyRate.dLastCheck)="D" && GetKeyRate('O',@oKeyRate)
ldLastCheck = m.oKeyRate.dLastCheck
Otherwise
AddProperty(m.oKeyRate, "dLastCheck", {})
EndCase
* могли передать объект без нужных свойств - добавим их здесь
= VarType(m.oKeyRate.nRate)="N" or AddProperty(m.oKeyRate, "nRate", 0.00)
= VarType(m.oKeyRate.dStart)="D" or AddProperty(m.oKeyRate, "dStart", {})
= VarType(m.oKeyRate.nRate_Future)="N" or AddProperty(m.oKeyRate, "nRate_Future", 0.00)
= VarType(m.oKeyRate.dStart_Future)="D" or AddProperty(m.oKeyRate, "dStart_Future",{})
= VarType(m.oKeyRate.dNextCheck)="D" or AddProperty(m.oKeyRate, "dNextCheck", Date())
If m.cOps='o' && только создать
RETURN m.oKeyRate
EndIf
EndCase
* Расписание?
If 'h' $ m.cOps
Local ldNextCheck
ldNextCheck = GetKeyRate_NextCheck(m.ldLastCheck)
If m.ldNextCheck > Date()
If 'O' $ m.cOps
oKeyRate.dLastCheck = m.ldLastCheck
oKeyRate.dNextCheck = m.ldNextCheck
EndIf
If 'M' $ m.cOps
lcMsg = "Предыдущая проверка:" +TAB+ Transform(m.ldLastCheck) +CR;
+ "Сейчас проверка не выполнялась." +CR;
+ "Надо запланировать на:" +TAB+ Transform(m.ldNextCheck)
MessageBox(m.lcMsg, 64, cnMsgTitle)
EndIf
Return 0 && запрос не выполняли, новых данных нет
EndIf
EndIf
* Отправляем запрос
Local lcMsg, lcXML, loHTTP
lcMsg = ""
Text to lcXML TextMerge NoShow
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<<"<"+cnMethod>> xmlns="http://web.cbr.ru/" />
</soap12:Body>
</soap12:Envelope>
EndText
loHTTP = CreateObject("MSXML2.XmlHttp")
loHTTP.Open("POST", cnURL, .F.)
loHTTP.SetRequestHeader("Content-Type", "application/soap+xml; charset=utf-8")
loHTTP.SetRequestHeader("Content-length", Transform(Len(m.lcXML)))
Try
loHTTP.Send(m.lcXML)
Catch to lcMsg
lcMsg = "приводит к ошибке" +CR+ Transform(m.lcMsg.ErrorNo)+": "+m.lcMsg.Message
EndTry
If Empty(m.lcMsg)
Do while m.loHTTP.ReadyState<>4
Doevents force
EndDo
If m.loHTTP.Status<>200
lcMsg = "возвращает статус" +CR+ Transform(m.loHTTP.status)+": "+m.loHTTP.StatusText
Else
lcXML = m.loHTTP.ResponseText
EndIf
EndIf
Release loHTTP
If !Empty(m.lcMsg)
= 's' $ m.cOps or MessageBox("Попытка выполнить запрос к" +CR+ cnURL +CR2+ m.lcMsg, 16, cnMsgTitle)=0
Return FAIL
EndIf
* Разбираем ответ
Local loXDOM
loXDOM = CreateObject("MSXML2.DOMDocument")
loXDOM.SetProperty("SelectionLanguage", "XPath")
loXDOM.LoadXML(m.lcXML)
If m.loXDOM.ParseError.ErrorCode<>0
lcMsg = "Ошибка при разборе XML-ответа."
Else
Local nRate, dStart, nRate_Future, dStart_Future
* <KEY_RATE Title="Действующая ключевая ставка" val="7.5" date="12.02.2018" />
With m.loXDOM.SelectSingleNode("//KEY_RATE")
nRate = Val(.GetAttribute("val")) && ValX()
dStart = CtoD(.GetAttribute("date")) && VtoD()
EndWith
* <KEY_RATE_FUTURE Title="Новое значение ключевой ставки (справочно)" val="7.25" newdate="26.03.2018" />
With m.loXDOM.SelectSingleNode("//KEY_RATE_FUTURE")
nRate_Future = Val(.GetAttribute("val"))
dStart_Future = CtoD(.GetAttribute("newdate"))
EndWith
If VarType(m.nRate)<>"N" or VarType(m.dStart)<>"D" or VarType(m.nRate_Future)<>"N" or VarType(m.dStart_Future)<>"D"
lcMsg = "В XML-ответе нет нужных данных."
EndIf
EndIf
If !Empty(m.lcMsg)
If !'s' $ m.cOps
StrToFile(m.lcXML, cnMethod+".xml")
MessageBox(m.lcMsg +CR+ "Его текст сохранён:"+CR2+ FullPathX(cnMethod+".xml"), 16, cnMsgTitle)
EndIf
Return FAIL
EndIf
* Возвращаем результат
If 'O' $ m.cOps
oKeyRate.nRate = m.nRate
oKeyRate.dStart = m.dStart
oKeyRate.nRate_Future = m.nRate_Future
oKeyRate.dStart_Future = m.dStart_Future
oKeyRate.dLastCheck = Date()
oKeyRate.dNextCheck = GetKeyRate_NextCheck(Date())
EndIf
If 'M' $ m.cOps
lcMsg = "Текущая ставка:" +TAB+ Transform(m.nRate) +CR;
+ "начало действия:" +TAB+ Transform(m.dStart)
If m.dStart_Future>m.dStart
lcMsg = m.lcMsg +CR2;
+ "Новая ставка:" +TAB+ Transform(m.nRate_Future) +Iif(m.nRate_Future=m.nRate,TAB+"(не меняется)","") +CR;
+ "начало действия:" +TAB+ Transform(m.dStart_Future)
Else
lcMsg = m.lcMsg +CR2+ "О следующем изменении информация отсутствует."
EndIf
lcMsg = m.lcMsg +CR2;
+ "Надо проверить:" +TAB+ Transform(Iif('O' $ m.cOps, m.oKeyRate.dNextCheck, GetKeyRate_NextCheck(Date())))
MessageBox(m.lcMsg, 64, cnMsgTitle)
EndIf
Return m.nRate
*---------------------------------------------------------------------------
Function GetKeyRate_NextCheck && (dLastCheck) - дата следующей проверки
LParameters dLastCheck
#IF !cnByFriday && ежедневная проверка: если сегодня проверяли, планируем на завтра
Return Iif(VarType(m.dLastCheck)="D" and m.dLastCheck=Date(), Date()+1, Date())
#ELSE && проверка по субботам
* Здесь предполагается, что ЦБ гуляет по пятницам (13:30 МСК). Проверяем в субботу и дальше
* Хорошо бы знать дату следующего заседания - тогда проверять можно раз в месяц-полтора
If VarType(m.dLastCheck)<>"D" or m.dLastCheck={} or m.dLastCheck>Date()
Return Date()
EndIf
Local lnDays && прошло дней с предыдущей проверки
lnDays = Date() - m.dLastCheck
Do Case
Case m.lnDays=0 && сегодня уже проверяли
Case m.lnDays>6 && прошла неделя или больше
Return Date()
Case m.lnDays<0 && чушь
Return Date()
Case Week(m.dLastCheck) = Week(Date()) && проверяли на этой неделе
If DoW(m.dLastCheck,2)<6 and DoW(Date(),2)>=6
Return Date() && проверяли до субботы, а уже суббота - надо проверить, вдруг вчера изменилась
EndIf
Case DoW(m.dLastCheck,2)<6 && на предыдущей неделе, до субботы
Return Date()
EndCase
* планируем на субботу на этой неделе
Local ldThisSabbath
ldThisSabbath = Date() - DoW(Date(),2) + 6
If Date()>=m.ldThisSabbath
* суббота уже наступила, но раз сюда попали, значит, после пятницы уже проверяли
* поэтому проверим в следующую субботу
Return m.ldThisSabbath + 7
EndIf
Return m.ldThisSabbath
#ENDIF
#UNDEFINE cnURL
#UNDEFINE cnMethod
#UNDEFINE cnByFriday
#UNDEFINE cnMsgTitle

Тесты:
* вариант вызова: 1-5
i = 1
FAIL = -1
fn = AddBS(JustPath(sys(16))) + "CBRF.prg"
Set Procedure to (m.fn) additive
t = Seconds()
? "---- "
Local loKeyRate
Do Case
Case m.i=1 && получить, показать результат
GetKeyRate()
Return
Case m.i=2 && расписание, показать результат
GetKeyRate('Mh', Date()-1)
Return
Case m.i=3 && записать результат в объект
If GetKeyRate('O', @m.loKeyRate) = FAIL
i = FAIL
EndIf
Case m.i=4 or m.i=5 && сначала создать пустой объект
If m.i=3
loKeyRate = GetKeyRate('o')
Else && то же самое
GetKeyRate('o', @m.loKeyRate)
EndIf
loKeyRate.dLastCheck = Date()-10
? "создали пустой объект, записали в него значения предыдущей проверки"
If GetKeyRate('Oh', @m.loKeyRate) = FAIL
i = FAIL
EndIf
Otherwise
i = FAIL
EndCase
t = Seconds() - m.t
If m.i=FAIL
? "косяк"
Else
With m.loKeyRate
? .dStart, .nRate
? .dStart_Future, .nRate_Future
? .dLastCheck, TAB, "последняя успешная"
? .dNextCheck, TAB, "когда планировать"
EndWith
EndIf
Release m.loKeyRate
? "----", Int(m.t*1000), " мс"
Release Procedure (m.fn)
RETURN



Исправлено 3 раз(а). Последнее : andrewk, 24.03.18 20:32
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 (Гостей: 30)

© 2000-2024 Fox Club 
Яндекс.Метрика