Запрос курсов валют с WEB-сервиса ЦБ.РФ
Пример запроса курсов ЦБ с WEB-сервиса сервера www.cbr.ru. Для работы макроса необходимо, чтобы
на рабочем месте или на сервере приложений был организован доступ к этому сайту,
а так же установлен xmlsdk.exe(скачать можно с http://msdn.microsoft.com/downloads/default.aspx
или отсюда).
А так же для ожидания окончания сеанса связи и пропихивания
очереди виндовых сообщений DLM-модуль
rssutils.d32.
Сам текст макроса:
import rcw,rssutils;
//private var ax = CreateObject ("rsax","TRsAxServer","RsAxServer",false);
//private var k=ax.CreateCOMObject ("Msxml.DOMDocument");
private var k=ActiveX ("Msxml.DOMDocument");
private var url_request;
private var NodeList,i=0,xmlNode,node_attr,datebeg=date(),dateend=date()+1,p=0;
private Array spisnameval,spiskodval;
/*Коректировка длины строки пробелами*/
private macro probadd(str,l,len)
private var i=0;
if(strlen(str)<len)
if(l==0)
while(i<len-strlen(str))
str=" "+str;
end;
else
while(i<len-strlen(str))
str=str+" ";
end;
end;
return str;
elif(strlen(str)==len)
return str;
else
return substr(str,1,len);
end;
end;
if(MsgBoxEx("Ежеджневные(Да) или ежемесячные(Нет)?",MB_YES + MB_NO, IND_NO )==IND_YES)
url_request =
"http://www.cbr.ru/scripts/XML_val.asp?d=0";
else
url_request =
"http://www.cbr.ru/scripts/XML_val.asp?d=1";
end;
if(k.Load(url_request))
ProcessMessages();
Sleep(5000);
ProcessMessages();
NodeList = k.selectNodes("*/Item");
while(i<(NodeList.length))
xmlNode = NodeList.Item(i).cloneNode(True);
node_attr = xmlNode.Attributes(0);
spisnameval[i]=substr(xmlNode.text,1,index(xmlNode.text," 1"));
spiskodval [i]=node_attr.value;//xmlNode.Attributes(3);
i=i+1;
end;
end;
p=menu(spisnameval,"Выберите валюту","Выберите валюту");
if(getdate(datebeg,"Введите
дату начала контировок"))
if(getdate(dateend,"Введите
дату окончания контировок"))
if(strlen(trim(string(datebeg)))==9)
datebeg="0"+trim(string(datebeg));
end;
if(strlen(trim(string(dateend)))==9)
dateend="0"+trim(string(dateend));
end;
url_request=
"http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1="+datebeg+"&date_req2="+dateend+"&VAL_NM_RQ="+trim(string(spiskodval[p]));
i=0;
if(k.Load(url_request))
ProcessMessages();
if((5000*(int((date(dateend)-date(datebeg))/365)))>1000)
Sleep(5000*(int((date(dateend)-date(datebeg))/365)));
else
Sleep(5000);
end;
ProcessMessages();
NodeList = k.selectNodes("*/Record");
println("
",spisnameval[p]);
[┌────────────┬──────────┬──────────┐];
[│ Дата │ Единиц │
Курс │];
[├────────────┼──────────┼──────────┤];
while(i<(NodeList.length))
xmlNode = NodeList.Item(i).cloneNode(True);
node_attr = xmlNode.Attributes(0);
println("│ ",probadd(node_attr.Value,1,10),"
│ ",probadd(xmlNode.childNodes(0).Text,0,8),"
│ ",probadd(xmlNode.childNodes(1).Text,0,8),"
│");
i=i+1;
end;
[└────────────┴──────────┴──────────┘];
else
MsgBox("Ошибка загрузки курсов");
end;
end;
end;