Публикация

Загрузка актуального курса валют ЦБРФ

Здравствуйте, коллеги!

Так как курсы валют меняются каждый день, целесообразно написать свою функцию, которая будет "подтягивать" свежие курсы и записывать в справочник "Курсы валют".
Ниже приведен пример такой функции.

В параметр cur_code передается код валюты (840 - Доллар США, 978 - Евро и т.д.), после чего, в зависимости от указанного кода, в справочник "Курсы валют" записывается курс на текущую дату.

function GetExchangeRate(cur_code)
{  
        var CurDate = new Date();
        var year = CurDate.getFullYear().toString();
        var month = CurDate.getMonth().toString();
        if (month.length == 1)
        {
                month = "0" + month;
        }
        var day = CurDate.getDate().toString();
        if (day.length == 1)
        {
                day = "0" + day;
        }      
        var webAddress = "http://cbrates.rbc.ru/tsv/" + cur_code.toString() + "/" + year +"/" + month +"/" + day + ".tsv";
        var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
        //xmlHttpReq.open("GET", "http://cbr.ru/scripts/XML_daily.asp", false);
        xmlHttpReq.open("GET", webAddress, false);         
        xmlHttpReq.send();
        var RUB_USD_curs = xmlHttpReq.responseText.replace(/\s/g, "");
        //получаем текущий курс             
        RUB_USD_curs= parseFloat(RUB_USD_curs);        
        //записываем тукущий курс
        var Dataset = Services.GetNewItemByUSI('ds_CurrencyRate');
        var CurrencyID = '';
        var Currency = '';
        switch (cur_code)
        {
                //840 - код доллара США, для других валют другой код, соответсвенно другой CurrencyID
                 case 840:
                        CurrencyID = '{D18AAED6-14F9-435C-9606-0E90CAE816F7}';
                        Currency = 'Доллар США';
                 break;
        }      
        ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
        Dataset.Open();
        Dataset.Append();
        Dataset.Values('Rate') = RUB_USD_curs;
        Dataset.Values('InternalRate') = RUB_USD_curs; 
        Dataset.Values('StartDate') = GetLocalDate();
        Dataset.Values('CurrencyID') = CurrencyID;
        Dataset.Values('CurrencyName') = Currency;
        Dataset.Post();
        Dataset.Close();                       
}

Данную функцию можно запускать, к примеру, при старте Terrasoft, а также добавить кнопку "Получить последние курсы" для справочника "Валюты" и в обработчике OnClick для кнопки вызвать функцию приведенную выше.

Нравится

Поделиться

11 комментариев

Пример интересный. Но в качестве источника для курсов валют я бы советовал использовать веб сервис ЦБР, который находится здесь.

В приведенной функции выше, есть закоментированная строка:

//xmlHttpReq.open("GET", "http://cbr.ru/scripts/XML_daily.asp", false);

Здесь используется веб сервис ЦБР, который возвращает xml файл с курсами всех основных валют по отношению к российскому рублю на текущую дату:

var RUB_USD_curs = xmlHttpReq.responseText;

Можно также использовать этот сервис, "распарсив" xml.

Спасибо, Дмитрий! Напомню, что ранее функции по получению курсов валют уже публиковал Андрей Кихтенко: http://www.community.terrasoft.ua/blogs/2508

Баг #1
var month = CurDate.getMonth().toString();
возвращает например для марта значение '2', потом запрос к rbc идет с датой на месяц раньше:smile:
поэтому меняем на
var month = (CurDate.getMonth()+1).toString();

Баг #2
переменная получает например значение
RUB_USD_curs = 129.8923
что как бы еще не курс:smile: и записывать это в справочник курсов валют нельзя
поэтому например так
var RUB_USD_curs = xmlHttpReq.responseText.replace(/\s/g, "");
RUB_USD_curs = parseFloat(RUB_USD_curs.substr(1, RUB_USD_curs.length));
вот теперь будет 29.8923

Feature #3
строка при создании новой записи ближе к концу
Dataset.Values('CurrencyName') = Currency;
совсем ни к чему
аналогично совсем ни к чему
ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
Dataset.Open();

и Dataset.Close() в конце, вы же пользуетесь Append, зачем предварительно открывать да фильтровать датасет?

+ я бы полученный курс писал к валюте рубль (меняем CurrencyID)

Я просто оставлю это здесь: реализация на стороне сервера.

Добрый день!

Скажите, пожалуйста, можно ли загрузить курсы валют ЦБ Чехии и каким образом?
http://www.cnb.cz

Курсы нужны только для трех валют Рубль, Доллар и Евро

Марина, аналогично с примером приведенным Выше.
Только отправлять запрос к веб-серверу по ссылке http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/d… , и соответственно парсить его в соответствии с его форматом.

Добрый день!

Получилось в переменную записать данные с сайта.
Дмитрий, подскажите, пожалуйста, каким образом выбирать данные из переменной.

Здравствуйте Марина.

Не совсем понял суть вопроса. Можно поподробнее, желательно добавить код.

По сути Вам нужно отправить запрос:

var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", webAddress, false);         
xmlHttpReq.send();

Далее, получаем ответ от сервера:

var RUB_USD_curs = xmlHttpReq.responseText;

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

//получаем текущий курс              
RUB_USD_curs= parseFloat(RUB_USD_curs);         
//записываем тукущий курс
var Dataset = Services.GetNewItemByUSI('ds_CurrencyRate');
//....

Здравствуйте! Дмитрий, спасибо! Получилось записать курсы. Сделала следующим образом:

var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", URL, false);         
xmlHttpReq.send();
var Curs = xmlHttpReq.responseText.replace(/\s/g, "");
var ArrayCurr = Curs.split('|');

И уже из созданного массива выбирала нужные курсы.

Марина, не за что! Если буду дополнительные вопросы - обращайтесь.

Показать все комментарии