DOMDocument
Валюты

Получение курсов валют из интернета

В примере показано, как выгрузить курсы валют (и сами валюты) на дату.

Я использовал сайт http://cbr.ru (Центральный банк Российской Федерации)

Для использования необходимо:

1. Добавить системный параметр:
CurrencyRatesDictionaryURL
http://www.cbr.ru/scripts/XML_daily_eng.asp?date_req=#DateMacro# - для англоязычной версии
http://www.cbr.ru/scripts/XML_daily.asp?date_req=#DateMacro# - для русскоязной версии

2. В сервис sq_Currency добавить фильтр и парметр ShortName

3. В скрипт scr_CurrencyUtils добавить функцию

        function GetBasicCurrencyCode() {
        if (IsEmptyGUID(CurrencyUtils.BasicCurrencyCode)) {
                CurrencyUtils.BasicCurrencyCode =
                GetDatasetFieldValueFromDatasetByUSI(
                        'ds_Currency', 'IsBase', true, 'ShortName');
        }
        return CurrencyUtils.BasicCurrencyCode;
}

4. Загрузить сервисы из архива и запусть Terrasoft с ключем -wnd=wnd_UploadCurrencyRates

П.С. Курсы валют - с российского сайта, на котором я не нашел кросс-курсов, поэтому, если базовая валюта отличается от рубля - курс получается обычным разделением на курс базовой валюты...

Вроде ничего не забыл...

Нравится

Поделиться

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

Добрый день! А для украинского есть что-то подобное?

Не встречал... возможно есть.... платные услуги точно должны быть...

Non noceo.

Вот, нашёл и для нашей страны, т.е. Украины :)
сайт http://ufs.kiev.ua/xml/

+ надо немного модифицировать код функции wnd_UploadCurrencyRatesScript
Просьба к админам приатачить этот код в виде архива как вариант для Украины.
[javascript]
//-----------------------------------------------------------------------------
// wnd_UploadCurrencyRatesScript
//-----------------------------------------------------------------------------

var UploadCurrencyRatesObject = new Object();

function UploadCurrencyRates(URL) {
System.BeginProcessing();
try {
var XmlDoc = System.CreateObject('Msxml.DOMDocument');
XmlDoc.async = false;
if (XmlDoc.load(URL) != true) {
ShowWarningDialog("The currency rates can't be uploaded from the specified URL");
return;
}
pbUpload.Position = 20;
System.ProcessMessages();
var NodeList = XmlDoc.selectSingleNode('r00t');
var XmlNode = NodeList.cloneNode(true);
var RateDate = GetTodayDate().getVarDate();
NodeList = XmlDoc.selectNodes('*/item');
var Length = NodeList.length;
if (Length == 0) {
return;
}
var BasicCurrencyCode = GetBasicCurrencyCode();
var BasicRate;
for(var i = 0; i < Length; i++) {
var Node = NodeList.item(i).cloneNode(true);
var CurrencyCode = Node.selectSingleNode('title').text;
if (CurrencyCode == BasicCurrencyCode) {
BasicRate = parseFloat(Node.selectSingleNode('rate').text);
if (BasicRate == 0) {
BasicRate = 1;
}
break;
}
}
pbUpload.Position = 25;
System.ProcessMessages();
if (IsEmptyValue(BasicRate)) {
BasicRate = 1;
}
for(var i = 0; i < Length; i++) {
var Node = NodeList.item(i).cloneNode(true);
var CurrencyCode = Node.selectSingleNode('title').text;
var CurrencyName = Node.selectSingleNode('description').text;
var Nominal = parseInt(Node.selectSingleNode('qty').text);
var Value = parseFloat(Node.selectSingleNode('rate').text);
if (CurrencyCode != BasicCurrencyCode) {
UploadCurrencyRate(CurrencyCode, CurrencyName, Nominal,
Value / BasicRate, RateDate);
}
pbUpload.Position = 25 + (i / Length * 75);
System.ProcessMessages();
}
} finally {
System.EndProcessing();
}
}

function UploadCurrencyRate(CurrencyCode, CurrencyName, Nominal, Value, RateDate) {
if (!Assigned(UploadCurrencyRatesObject.CurrencyDataset)) {
UploadCurrencyRatesObject.CurrencyDataset =
Services.GetNewItemByUSI('ds_Currency');
}

var Dataset = UploadCurrencyRatesObject.CurrencyDataset;
ApplyDatasetFilter(Dataset, 'ShortName', CurrencyCode, true);
var CurrencyID;
Dataset.Open();
try {
CurrencyID = Dataset.Values('ID');
if (IsEmptyValue(CurrencyID)) {
if (edtUploadCurrencies.IsChecked) {
Dataset.Append();
CurrencyID = Connector.GenGUID();
Dataset.Values('ID') = CurrencyID;
Dataset.Values('Currency') = CurrencyName;
Dataset.Values('Description') = CurrencyName;
Dataset.Values('ShortName') = CurrencyCode;
Dataset.Values('IsBase') = false;
Dataset.Post();
} else {
return;
}
}
} finally {
Dataset.Close();
}
if (!Assigned(UploadCurrencyRatesObject.RatesDataset)) {
UploadCurrencyRatesObject.RatesDataset =
Services.GetNewItemByUSI('ds_CurrencyRate');
}
Dataset = UploadCurrencyRatesObject.RatesDataset;
ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
ApplyDatasetFilter(Dataset, 'RateDate', RateDate, true);
Dataset.Open();
try {
if (Dataset.IsEmptyPage) {
Dataset.Append();
} else {
Dataset.Edit();
}
Dataset.Values('StartDate') = RateDate;
Dataset.Values('DueDate') = RateDate;
Dataset.Values('Rate') = Value;
Dataset.Values('For') = Nominal;
Dataset.Values('CurrencyID') = CurrencyID;
Dataset.Post();
} finally {
Dataset.Close();
}
}

function GetDateInStr(DateValue) {
var DateObject = new Date(DateValue);
var Result = '/' + DateObject.getFullYear();
var Month = DateObject.getMonth();
Month++;
if (Month < 10) {
Month = '0' + Month;
}
var Day = DateObject.getDate();
if (Day < 10) {
Day = '0' + Day;
}
Result = Day + '/' + Month + Result;
return Result;
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function wnd_UploadCurrencyRatesOnPrepare(Window) {
pbUpload.Position = 0;
edtRatesDate.Value = GetLocalDate();
}

function btnOKOnClick(Control) {
var URL;
var Message = "Please, specify the 'CurrencyRatesDictionaryURL' system parameter";
try {
URL = 'http://ufs.kiev.ua/xml/nbu_fx.php';
if (IsEmptyValue(URL)) {
ShowWarningDialog(Message);
}
} catch(e) {
ShowWarningDialog(Message);
return;
}
var DateValue = edtRatesDate.Value;
if (IsEmptyValue(DateValue)) {
DateValue = GetLocalDate();
}
if (ShowConfirmationDialog("Do you want to upload currencies from the \n " +
URL + '?') != wmrYes) {
return;
}
UploadCurrencyRates(URL);
Self.Close();
SendNotify(Self, MSG_REFRESHDATA, 0);
}

function btnCancelOnClick(Control) {
Self.Close();
}
[/javascript]

Английский вариант для доллара:
ссылка - http://data.newyorkfed.org/markets/fxrates/FXtoXML.cfm?FEXdate=#DateMac…

Контрол edtUploadCurrencies нужно удалить...

[javascript]
//-----------------------------------------------------------------------------
// wnd_UploadCurrencyRatesScript
//-----------------------------------------------------------------------------

var UploadCurrencyRatesObject = new Object();

function UploadCurrencyRates(URL) {
System.BeginProcessing();
try {
var XmlDoc = System.CreateObject('Msxml.DOMDocument');
XmlDoc.async = false;
if (XmlDoc.load(URL) != true) {
ShowWarningDialog("The currency rates can't be uploaded from the specified URL");
return;
}
pbUpload.Position = 20;
System.ProcessMessages();
var NodeList = XmlDoc.selectSingleNode('UtilityData').selectSingleNode('frbny:DataSet').childNodes;
var Length = NodeList.length;
for(var i = 0; i < Length; i++) {
var Node = NodeList.item(i).cloneNode(true);
var Unit1 = Node.getAttribute('UNIT');
var KeyNode = Node.selectSingleNode('frbny:Key');
var ObsNode = Node.selectSingleNode('frbny:Obs');
var Unit2 = KeyNode.selectSingleNode('frbny:CURR').text;
var CurrencyCode = '';
var Value = parseFloat(ObsNode.selectSingleNode('frbny:OBS_VALUE').text);
var RateDate = ObsNode.selectSingleNode('frbny:TIME_PERIOD').text;
var Year = parseInt(RateDate.substr(0, 4));
var Month = parseInt(RateDate.substr(5, 2));
var Day = parseInt(RateDate.substr(8, 2));
RateDate = (new Date(Year, Month, Day)).getVarDate();
if (Unit1 == 'USD') {
CurrencyCode = Unit2;
Value = 1 / Value;
} else {
CurrencyCode = Unit1;
}
var CurrencyName = '';
var Nominal = 1;
UploadCurrencyRate(CurrencyCode, CurrencyName, Nominal,
Value, RateDate);
pbUpload.Position = 20 + (i / Length * 70);
System.ProcessMessages();
}
} finally {
System.EndProcessing();
}
}

function UploadCurrencyRate(CurrencyCode, CurrencyName, Nominal, Value, RateDate) {
if (!Assigned(UploadCurrencyRatesObject.CurrencyDataset)) {
UploadCurrencyRatesObject.CurrencyDataset =
Services.GetNewItemByUSI('ds_Currency');
}
var Dataset = UploadCurrencyRatesObject.CurrencyDataset;
ApplyDatasetFilter(Dataset, 'ShortName', CurrencyCode, true);
var CurrencyID;
Dataset.Open();
try {
CurrencyID = Dataset.Values('ID');
if (IsEmptyValue(CurrencyID)) {
return;
}
} finally {
Dataset.Close();
}
if (!Assigned(UploadCurrencyRatesObject.RatesDataset)) {
UploadCurrencyRatesObject.RatesDataset =
Services.GetNewItemByUSI('ds_CurrencyRate');
}
Dataset = UploadCurrencyRatesObject.RatesDataset;
ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
ApplyDatasetFilter(Dataset, 'RateDate', RateDate, true);
Dataset.Open();
try {
if (Dataset.IsEmptyPage) {
Dataset.Append();
} else {
Dataset.Edit();
}
Dataset.Values('StartDate') = RateDate;
Dataset.Values('DueDate') = RateDate;
Dataset.Values('Rate') = Value;
Dataset.Values('For') = Nominal;
Dataset.Values('CurrencyID') = CurrencyID;
Dataset.Post();
} finally {
Dataset.Close();
}
}

function GetDateInStr(DateValue) {
var DateObject = new Date(DateValue);
var Result = '' + DateObject.getFullYear();
var Month = DateObject.getMonth();
Month++;
if (Month < 10) {
Month = '0' + Month;
}
var Day = DateObject.getDate();
if (Day < 10) {
Day = '0' + Day;
}
Result = Result + '%2D' + Month + '%2D' + Day;
return Result;
}

// ----------------------------------------------------------------------------
// Event handlers
// ----------------------------------------------------------------------------

function wnd_UploadCurrencyRatesOnPrepare(Window) {
pbUpload.Position = 0;
edtRatesDate.Value = GetLocalDate();
}

function btnOKOnClick(Control) {
var URL;
var Message = "Please, specify the 'CurrencyRatesDictionaryURL' system parameter";
try {
URL = GetSystemParameterValueEx('CurrencyRatesDictionaryURL', true);
if (IsEmptyValue(URL)) {
ShowWarningDialog(Message);
}
} catch(e) {
ShowWarningDialog(Message);
return;
}
var DateValue = edtRatesDate.Value;
if (IsEmptyValue(DateValue)) {
DateValue = GetLocalDate();
}
URL = ReplaceString(URL, '#DateMacro#', GetDateInStr(DateValue));
if (ShowConfirmationDialog("Do you want to upload currencies from the \n " +
URL + '?') != wmrYes) {
return;
}
UploadCurrencyRates(URL);
Self.Close();
SendNotify(Self, MSG_REFRESHDATA, 0);
}

function btnCancelOnClick(Control) {
Self.Close();
}
[/javascript]

Non noceo.

может финальный вариант в "примеры решений"?

Это 3 финальных варианта - для рубля, гривны и доллара...

Non noceo.

Здравствуйте!

Загрузила сервисы. В wnd_UploadCurrencyRatesScript используется скрипт scr_SystemSettings, который не нахожу в базе. Как быть?

Подскажите, пожалуйста, еще по следующему пункту
[xml]
1. Добавить системный параметр:
CurrencyRatesDictionaryURL
[/xml]

Куда его добавлять?

"Шальнева Марина" написал:
В wnd_UploadCurrencyRatesScript используется скрипт scr_SystemSettings, который не нахожу в базе. Как быть?

Видимо, в конфигурации образца 2008 года была, сейчас нет.
Функция GetSystemParameterValueEx сейчас находится в скрипте scr_Utils.


1. Добавить системный параметр:

Речь, похоже, о системных настройках, "Файл"->"Настройки"->"Системные настройки".

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

данный скрипт существовал в старых версиях,начиная с 3.3.1 полностью перенесен в базу данных - tbl_SystemSetting

Это - строковая переменная, которая должна содержать адрес, с которого мы загружаем курс.

"Кихтенко Андрей" написал:1. Добавить системный параметр:
CurrencyRatesDictionaryURL
http://www.cbr.ru/scripts/XML_daily_eng.asp?date_req=#DateMacro# - для англоязычной версии
http://www.cbr.ru/scripts/XML_daily.asp?date_req=#DateMacro# - для русскоязной версии

Для нормальной работы скрипта достаточно добавить такой параметр Системные настройки:

systemsetting

Добрый день!

Все подключила, системный параметр указала, при загрузке вываливается ошибка:

[code]
'Object 'DataField DueDate' is not assigned'
[/code]

Марина, данная реализация опубликована для старых версий Terrasoft, поэтому требуется доработка скрипта в связи с изменением структуры БД.

В данном конкретном случае для диагностики сбоя рекомендуем Вам активировать отладчик и выяснить, на какой строке возникает сбой.

Вероятная проблема - в датасете, к которому Вы обращаетесь в скрипте нет поля DueDate, либо датасет пуст.

Также рекомендуем ознакомиться с реализацией получения курсов валют в следующей теме:
http://www.community.terrasoft.ru/blogs/7673

Добрый день!

Получилось выгрузить курсы валют. В датасете действительно не было поля DueDate.

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