Обсуждение:Запрос курсов валют с веб-сервиса ЦБ
5 (1)
Обсуждение:Запрос курсов валют с веб-сервиса ЦБ ( Обсуждение примера 08.08.2006 23:46 )
0(0)Может кому-нибудь пригодиться.
Пример запроса курсов ЦБ с веб-сервиса сервера www.cbr.ru.
Для работы макроса необходимо, чтобы на рабочем месте или на сервере приложений был организован доступ в интеренет до этого сайта, а так же установлен xmlsdk.exe(скачать можно с http://msdn.microsoft.com/downloads/default.aspx)
а так же для ожидания окончания сеанса связи и пропихивания очереди виндовых сообщений длм-модуль rssutils.d32.
Посмотреть пример
>> ОтветитьОшибка, однако! ( Andy 07.06.2007 14:13 )
0(0)Не работает. Валится на строке
Import rssutils;
с визгом - Nonshared DATA segment required.
Вопрос - что я не так делаю?
>> ОтветитьА не в двухзвенке запускается? ( Ltybc 07.06.2007 14:23 )
2(1)Not specified
>> ОтветитьСмотрите пример внимательнее ( gemyak 07.06.2007 14:32 )
0(0)А вот это для кого написано?
//При установке на локальной машине
//private var ax = CreateObject ("rsax","TRsAxServer","RsAxServer",false);
//private var k=ax.CreateCOMObject ("Msxml.DOMDocument");
//При установке на сервере приложений
private var k=ActiveX ("Msxml.DOMDocument");
>> ОтветитьВалится! ( Andy 08.06.2007 12:29 )
0(0)Смотрим внимательно: двухзвенка. Pervasive V.8
до строк
//private var ax = CreateObject ("rsax","TRsAxServer","RsAxServer",false);
//private var k=ax.CreateCOMObject ("Msxml.DOMDocument");
НЕДОХОДИТ!
Валится на второй строке макроса - import rssutils.
>> Ответитьдополнение ( gemyak 08.06.2007 12:34 )
0(0)Ну так надо подложить dlm-модуль - rssutils
>> Ответитьrssutils лежит! ( Andy 08.06.2007 13:49 )
3(1)Not specified
>> ОтветитьПродолжение ( Selivan 16.04.2008 18:25 )
0(0)У кого нибудь удалось запустить сей макрос, у меня тоже валится точто также как и у Andy
>> ОтветитьВот наш код (+) ( Александр 17.04.2008 02:27 )
0(0)Уже несколько лет успешно работает на RS-Bank 5.0 (сейчас на 5.0.092.32).
У нас в трехзвенке. На компьютере надо обеспечить только доступ в Инет, ничего дополнительно устанавливать не надо.
Курсы сразу пишутся в базу RS-Bank.
Import rslx, lgxs; file rates(crncdate) write; file cr(currency) write; ValDate = {curdate}; macro GetCoursesDate(DOMDoc, ValDate:@date) ValDate = Date(DOMDoc.selectSingleNode("//ValCurs/@Date").text); return getTrue(true,"Загрузить курсы на "+ValDate+" ?"); end; macro GetCourse(ValName,DOMDoc,savetodb,ValDate) courseNode = DOMDoc.selectSingleNode("//ValCurs/Valute[CharCode='"+ValName+"']"); if( valType(courseNode) == V_UNDEF ) return 0; end; CourseCode = trim(courseNode.selectSingleNode("NumCode").text); CourseNominal = trim(courseNode.selectSingleNode("Nominal").text); CourseName = trim(courseNode.selectSingleNode("Name").text); CourseValue = trim(courseNode.selectSingleNode("Value").text); [ ### | ### | ####### | ################################## | ##########](ValName,CourseCode, CourseNominal, CourseName:c, CourseValue); if (savetodb) Code = CourseCode; Date_Rate = ValDate; Point = Int(StrLen(CourseValue)-index(CourseValue,",")); step = 1; i = 1; while(i <= point) step = step * 10; i = i + 1; end; Rate = Double(StrSubst(CourseValue,",",".")) * step; Scale = CourseNominal; rates.Code_Currency = Code; rates.Date_Rate = ValDate; if(GetEQ(rates)) msgbox("Курс на дату "+ValDate+" уже записан и составляет "+rates.Rate/100); else cr.Prev_Rate = cr.Cur_Rate; cr.Cur_Rate = Rate; cr.ScaleOfc = scale; cr.Date_Rate = Date_Rate; update(cr); end; end; end; macro Head(ValDate); [КУРСЫ ВАЛЮТ НА ##########](ValDate); [ ------------------------------------------------------------------------ Симв | Код | Номинал | Наименование валюты | Курс ------------------------------------------------------------------------]; end; macro Footer [------------------------------------------------------------------------]; end; if(IsStandAlone()) DOMDoc = ActiveX("MSXML.DOMDocument"); else DOMDoc = TlgActiveX("MSXML2.DOMDocument",true); end; DOMDoc.async = false; ret = DOMDoc.Load("http://www.cbr.ru/scripts/xml_daily.asp"); if (ret) strXML = DOMDoc.xml; getc = GetCoursesDate(DOMDoc, @ValDate); if (getc) sdb = GetTrue(true,"Сохранять курсы в справочнике курсов?"); Head(ValDate); While(next(cr)) GetCourse(cr.Short_Name,DOMDoc,sdb,ValDate); end; Footer; end; else msgbox("Не удалось получить данные! "+DOMDoc.ParseError.srcText+"(Line:"+DOMDoc.ParseError.Line+")"); end;
>> ОтветитьА где Insert в crncdate?? ведь без него истории курсов не будет... ( Babenko_DS 17.04.2008 15:13 )
0(0)Not specified
>> Ответить100 % все работает и история формируется (+) ( Александр 18.04.2008 02:04 )
0(0)макрос абсолютно рабочий. Историю курсов сама система формирует на самом деле, никаких Insert не нужно(иначе все будет задваиваться).
>> ОтветитьВ оригинальном макросе был Insert (+) ( Александр 18.04.2008 02:08 )
0(0)поэтому crncdate осталось write :)
Мы его подправили и теперь пользуемся уже несколько лет.
>> ОтветитьПонял, текущий курс пишется в историю при закрытии дня.. ( Babenko_DS 18.04.2008 10:32 )
0(0)Есть один момент - если запустить макрос 2 раза, то курс на предыдующую дату перезаписывается текущим курсом. Но, как я понимаю, это значение нигде не используется.
Александр, спасибо!
>> Ответить
или вот так ( sems 17.04.2008 16:50 )
0(0)if ( ( ValType ( dRate ) == V_UNDEF ) or ( dRate == date(0,0,0) ) )
dRate = {curdate};
end;
startAX = CreateObject("rsax", "TRsAxServer", "RsAxServer", isStandalone());
SOAPClient = startAX.CreateComObject("MSSOAP.SOAPClient30");
DOMDoc = startAX.CreateComObject("MSXML2.DOMDocument.4.0");
SOAPClient.ClientProperty("ServerHTTPRequest") = true;
SOAPClient.mssoapinit("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
DomDoc.async = false;
DomDoc = SOAPClient.GetCursOnDate(dRate);
if ( this.rec.Code_Currency == 0 )
return 1;
else
objNodeList =DomDoc.item(1).selectNodes("//*[Vcode="+ String(this.rec.Code_Currency) +"]");
end;
singleNode = objNodeList.item(0);
sNode = singleNode.selectNodes("Vcurs");
return sNode.item(0).text;
OnError(e)
return -1;
>> Ответитьдаже вернее вот так: ( sems 17.04.2008 16:53 )
0(0)CLASS (TRecHandler) _TCurrency( codeCurrency : variant )
MACRO getCbRate ( dRate : date )
Var
startAX : object,
SOAPClient : object,
DOMDoc : object,
objNodeList : object,
singleNode : object,
sNode : object;
Private var {curdate};
if ( ( ValType ( dRate ) == V_UNDEF ) or ( dRate == date(0,0,0) ) )
dRate = {curdate};
end;
startAX = CreateObject("rsax", "TRsAxServer", "RsAxServer", isStandalone());
SOAPClient = startAX.CreateComObject("MSSOAP.SOAPClient30");
DOMDoc = startAX.CreateComObject("MSXML2.DOMDocument.4.0");
SOAPClient.ClientProperty("ServerHTTPRequest") = true;
SOAPClient.mssoapinit("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL");
DomDoc.async = false;
DomDoc = SOAPClient.GetCursOnDate(dRate);
if ( this.rec.Code_Currency == 0 )
return 1;
else
objNodeList =DomDoc.item(1).selectNodes("//*[Vcode="+ String(this.rec.Code_Currency) +"]");
end;
singleNode = objNodeList.item(0);
sNode = singleNode.selectNodes("Vcurs");
return sNode.item(0).text;
OnError(e)
return -1;
END;
MACRO getRate( dRate : date ) : double;
return currRate ( this.rec.Code_Currency , dRate);
END;
PRIVATE MACRO Find( codeCurrency : variant );
Var
tmpDB : object = TBFile("currency","R", 0, "currency.dbt", "bank.def");
While ( tmpDB.Next() )
if ( ( ( ValType ( codeCurrency ) == V_INTEGER ) and ( tmpDB.rec.Code_Currency == codeCurrency ) )
or ( ( ValType ( codeCurrency ) == V_STRING ) and ( tmpDB.rec.Short_Name == codeCurrency ) ) )
Copy ( this, tmpDB );
end;
End;
END;
initTRecHandler("currency");
Find( codeCurrency );
END;
>> Ответить
Работает! ( Selivan 18.04.2008 09:11 )
0(0)Спасибо Александр.
Готов подтвердить,что макрос абсолютно рабочий .Мы его уже опробовали, все работает отлично.
>> Ответить