Обсуждение:Запрос курсов валют с веб-сервиса ЦБ

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
                      >> Ответить
                    • Развернуть или вот так ( 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)
      Спасибо Александр.
      Готов подтвердить,что макрос абсолютно рабочий .Мы его уже опробовали, все работает отлично.
      >> Ответить