21 октября, воскресенье 04:14
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

Загрузка курсов с CBR.RU в DBF

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Загрузка курсов с CBR.RU в DBF

    Чтобы не ждать DBF-файла с курсами написал батник+VBA(EXCELL) для считывания курса с "http://www.cbr.ru/currency_base/D_print.asp?date_req=ДАТА>" и загрузки в DBF. Далее DBF грузится в АБС. Ессно, д.б. интернет. VBA-макрос в исходнике. Д.б. разрешен запуск макросов в МС-офис.
    Могу выслать или выложить.

  • #2
    Было бы полезно.
    Может выложить ?

    Комментарий


    • #3
      мож кому нужно - на перле.
      давно делал..

      PHP код:
      #
      # скачиваем курсы валют с сайта cbr.ru
      #
      use LWP::UserAgent;
      use 
      XBase;
      use 
      Config::IniFiles;

      # прочиатем что в ini-ях
       
      my %ini;
      tie %ini'Config::IniFiles', ( -file => "getrate.ini" );


      # задается адрес откуда скачивать
      #http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=28.11.2003&date_req2=28.11.2003&VAL_NM_RQ=R01239
      $URRL='http://www.cbr.ru/scripts/XML_dynamic.asp?'.
            
      'date_req1=@DD.@MM.@YY&date_req2=@DD.@MM.@YY&VAL_NM_RQ=@I';

      # R-коды на сайте ЦБ.
      undef %iso_dig,       %iso_lat,             %curname;

      $iso_dig{R01010}=036$iso_lat{R01010}=AUD$curname{R01010}='АВСТРАЛИЙСКИЙ ДОЛЛАР';
      $iso_dig{R01350}=124$iso_lat{R01350}=CAD$curname{R01350}='КАНАДСКИЙ ДОЛЛАР';
      $iso_dig{R01215}=208$iso_lat{R01215}=DKK$curname{R01215}='ДАТСКАЯ КРОНА';
      $iso_dig{R01310}=352$iso_lat{R01310}=ISK$curname{R01310}='ИСЛАНДСКАЯ КРОНА';
      $iso_dig{R01820}=392$iso_lat{R01820}=JPY$curname{R01820}='ЙЕНА';
      $iso_dig{R01335}=398$iso_lat{R01335}=KZT$curname{R01335}='ТЕНГЕ';
      $iso_dig{R01535}=578$iso_lat{R01535}=NOK$curname{R01535}='НОРВЕЖСКАЯ КРОНА';
      $iso_dig{R01625}=702$iso_lat{R01625}=SGD$curname{R01625}='СИНГАПУРСКИЙ ДОЛЛАР';
      $iso_dig{R01770}=752$iso_lat{R01770}=SEK$curname{R01770}='ШВЕДСКАЯ КРОНА';
      $iso_dig{R01775}=756$iso_lat{R01775}=CHF$curname{R01775}='ШВЕЙЦАРСКИЙ ФРАНК';
      $iso_dig{R01700}=792$iso_lat{R01700}=TRL$curname{R01700}='ТУРЕЦКАЯ ЛИРА';
      $iso_dig{R01035}=826$iso_lat{R01035}=GBP$curname{R01035}='ФУНТ СТЕРЛИНГОВ';
      $iso_dig{R01235}=840$iso_lat{R01235}=USD$curname{R01235}='ДОЛЛАР США';
      $iso_dig{R01589}=960$iso_lat{R01589}=XDR$curname{R01589}='СДР (СПЕЦИАЛЬНЫЕ ПРАВА ЗАИМСТВОВАНИЯ)';
      $iso_dig{R01090}=974$iso_lat{R01090}=BYR$curname{R01090}='БЕЛОРУССКИЙ РУБЛЬ';
      $iso_dig{R01239}=978$iso_lat{R01239}=EUR$curname{R01239}='ЕВРО';
      $iso_dig{R01720}=980$iso_lat{R01720}=UAH$curname{R01720}='ГРИВНА';

      #сделаем dbf-ник пустой
      unlink('CURCOURS.DBF');
      $tblRESULT XBase->create(
                                 
      name           =>   CURCOURS,
                                 
      field_names    => [ ISO_DIGISO_LAT3DATSCALECURSENAME_RUSHPR_ECU],
                                 
      field_types    => [       C,        C,   D,     N,     N,         C,      C],
                                 
      field_lengths  => [       3,        3,   8,    11,    20,       100,      1],
                                 
      field_decimals => [   undef,    undefundef,  undef 5,     undef,  undef
                                ) or die(
      "** Не могу создать dbf-файл\n".XBase->errstr);



      #подставляем текущую дату
      ($DD,$MM,$YY)=(localtime)[3,4,5];
      $MM++;
      #$DD-=2;
      $DD=sprintf("%02d",$DD);
      $MM=sprintf("%02d",$MM);
      $YY $YY 1900;
      #$YY =~ s/\d\d(\d\d)/$1/;
      #$DD='17'; $MM='01'; $YY='2004';#раскомментировать
      $URRL =~ s/\@DD/$DD/g;
      $URRL =~ s/\@MM/$MM/g;
      $URRL =~ s/\@YY/$YY/g;

      #print $URRL."\n";

      $ua = new LWP::UserAgent;
      $ua->env_proxy;
      $ua->agent('Mozilla/5.0');
      $ua->proxy(['http','ftp'], "http://$ini{proxy}{ip}:$ini{proxy}{port}");

      #
      # цикл
      #
      $i=0;
      for 
      $RCODE(keys %iso_dig)
        {
         
      $isOK=TRUE;
         
      # Create a request
         
      $url_i  $URRL;
         
      $url_i  =~ s/\@I/$RCODE/;
         
      my $req = new HTTP::Request GET => $url_i;
         
      my $res $ua->request($req);

         
      #вот он заголовок
         #print $res->headers_as_string();

         
      if($res->is_success)
           {
            
      #print &Win2Dos("Заголовок::".&Koi2Win($res->title))."\n";
            #print $url_i."\n";
            
      $cont=$res->content;
            if(
      $cont =~ /Nominal/)
              {
               
      #проверим RCODE
               
      unless($cont =~ /Id=\"$RCODE/)
                 {
                  
      $isOK=FALSE;
                 }

               #дату
               if(
      $cont =~ /Date=\"(\d\d)\.(\d\d)\.(\d\d\d\d)/)
                 {
                  
      $dateme="$3$2$1";
                 }
               else
                 {
                  
      $isOK=FALSE;
                 }

               #scale
               if(
      $cont =~ /\Nominal\>(\d*)\/)
                 {
                  
      $scale=$1;
                 }
               else
                 {
                  
      $isOK=FALSE;
                 }
                 
               #value
               if(
      $cont =~ /\Value\>([\d.,]*)/)
                 {
                  
      $value=$1;
                  
      $value=~s/\,/\./;
                 }
               else
                 {
                  
      $isOK=FALSE;
                 }
               #запишем xml файл
               open  FTXT,"
      >$RCODE.XML";
               print FTXT 
      $cont;
               close FTXT;
              }
            else
              {
               
      $isOK=FALSE;
               open  FTXT,"
      >$RCODE.ERR";
               print FTXT "
      отсутствуют данныевидимо за эту дату нет курсов.";
               print FTXT 
      $cont;
               close FTXT;
              }
            #
      $cont=&Koi2Win($cont) if($res->header('Content-Type')=~/koi8/i);
            #
      $cont=&Koi2Win($cont) if($res->header('Content-Type')=~/dos/i);
           }                                                          
         else                                                         
           {
            
      $isOK=FALSE;
            print "
      Error::$url_i";
            print "
      Error::".$res->status_line."\n";
            #exit 1;
           }                                                          
         if(
      $isOK eq FALSE)
           {
            print "
      произошла ошибка.\n";
           }
         else
           {
            # Вставка записи
            
      $tblRESULT->set_record_hash(
                                        
      $i,
                                        ISO_DIG   => 
      $iso_dig{$RCODE},
                                        ISO_LAT3  => 
      $iso_lat{$RCODE},
                                        DAT       => 
      $dateme,
                                        SCALE     => 
      $scale,
                                        CURSE     => 
      $value,
                                        NAME_RUSH => 
      $curname{$RCODE},
                                        PR_ECU    => 0
                                       );
            
      $i++;
            print "
      $iso_lat{$RCODE$value $dateme $scale\n";
           }
        } 

      Комментарий


      • #4
        Сорри, цейтнот. Надо откомментировать, потом выложу.

        Комментарий


        • #5
          Этот текст помещаете в окно "View code" VBA книги Excel. В папке с этим XLS-файлом надо выложить Curcours.dbf от любого числа(с него считается структура) и создать пустую папку CURRENT.
          Делал на 2000-м офисе.
          При запуске не должен б.открыт эксель с другими файлами.
          Код:
          Sub Open_Copy_Save()
           Dim i As Integer
           Dim j As Integer
           Dim c1 As String
           Dim c2 As String
           Dim k As Currency
           Dim sname As String
           Dim sdat As Date
           Dim Flag As Byte
           Dim pass As String
           
           pass = ActiveWorkbook.Path 'путь запуска
           Flag = 0 'индикатор
           sdat = Date + 1
           sdat = InputBox("ВНИМАТЕЛЬНО ПРОВЕРЬТЕ И ЗАДАЙТЕ ДАТУ КУРСА", "Курс за дату", sdat)
          
           sname = "http://www.cbr.ru/currency_base/D_print.asp?date_req=" & FormatDateTime(sdat, vbGeneralDate)
           Workbooks.Open Filename:=sname
           ChDir pass
           Workbooks.Open Filename:=pass & "\CURCOURS.dbf"
           
           For i = 8 To 24   'по xls-dprint (2-я книга)
            c2 = Right(Trim(Workbooks(2).Worksheets(1).Cells(i, 2).Value), 3)
            For j = 2 To 14  'по dbf (3-я книга)
             c1 = Trim(Workbooks(3).Worksheets(1).Cells(j, 2).Value)
             If c1 = c2 Then 'обновляем курсы
              k = FormatCurrency(Workbooks(2).Worksheets(1).Cells(i, 5).Value, 4)
              'CDbl ghbikjcm вставить для ХР
              Workbooks(3).Worksheets(1).Cells(j, 5).Value = CDbl(FormatNumber(k, 4, vbFalse))
              Flag = 1 'флаг выставили
              Exit For
             End If
            Next j
           Next i
           
           For i = 2 To 14
            Workbooks(3).Worksheets(1).Cells(i, 3).Value = sdat
           Next i
           
           'сохраняем Dprint
           Workbooks(2).Worksheets(1).Activate
           ActiveWorkbook.SaveAs Filename:=pass & "\Current\dprint.xls", FileFormat:= _
                  xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
                  , CreateBackup:=False
           If sdat = Mid(Workbooks(2).Worksheets(1).Cells(3, 1).Value, 51, 10) Then
           'сохраняем DBF
           Workbooks(3).Worksheets(1).Activate
           ActiveWorkbook.SaveAs Filename:=pass & "\Current\CURCOURS.dbf", FileFormat:= _
                  xlDBF4, CreateBackup:=False
           Else
            MsgBox "КУРСА НА ЗАДАННУЮ ДАТУ НЕТ !!!"
           End If
           'ThisWorkbook.Close SaveChanges:=False
          End Sub
          
          Private Sub Workbook_Open()
           Call Open_Copy_Save
           Application.DisplayAlerts = False
           Application.Quit
          End Sub

          Комментарий


          • #6
            Сообщение от mns_h
            Этот текст помещаете в окно "View code" ...
            Проверено под Office2003.

            Из 126 валют загрузились в dbf только 13 (за 27.06.2006)
            При этом в dprint показывает курсы для 18 валют, включая

            392 ··JPY 100 ··Японских йен 23,2656

            но в dbf при этом значение не поменялось по йенам (осталось прежнее значение из "эталонного dbf" за 23.06.2006):

            392 JPY 23.06.2006 100 23,46570 ЙЕНА

            В связи с этим 2 вопроса:
            1. Можно ли таким образом загружать с cbr.ru курсы валют для всех стран мира или иметь возможность настройки какие именно валюты нужно загружать (например, кому-то может быть достаточно только USD и EUR).
            2. Почему данные в dbf файле и в dprint не совпадают? С чем это связано?
            (c) Заработай оперативно!

            Комментарий


            • #7
              4VGromov
              Загляните в Ваш dbf-файл, сколько там строк и какие?
              Макрос считывает в одну книгу (Workbooks(2).Worksheets(1)) страницу с сайта CBR.RU, а в другую (Workbooks(3).Worksheets(1)) весь дэбээфник. Далее читает в цикле из книги 2 из строк 8-24 коды валют и ищет такие же в книге 3 в строках 2-14, при совпадении заносит курс в 3-ю книгу. По завершении 3-я книга сохраняется в дэбээфник.
              Для загрузки любого числа валют надо:
              1. Любой прогой модифицировать dbf-файл из корневой папки, заполнив его строками с нужными валютами.
              2. Модифицировать макрос, добавив подсчет числа строк с данными в книге 3 в переменную, и эту переменную использовать как счетчик цикла для обновления курса.
              3. Если изменяется кол-во и набор валют, то dbf-файл надо соотв. модифицировать добавив/удалив строки с валютами.
              Если пришлете dbf, заполненный всеми нужными валютами и ссылку на страницу со всеми курсами, то могу модифицировать макрос и выложить здесь. Быстро не обещаю, но постараюсь не тянуть.

              Комментарий


              • #8
                Сообщение от mns_h
                Чтобы не ждать DBF-файла с курсами написал батник+VBA(EXCELL) для считывания курса с "http://www.cbr.ru/currency_base/D_print.asp?date_req=ДАТА>" и загрузки в DBF. Далее DBF грузится в АБС. Ессно, д.б. интернет. VBA-макрос в исходнике. Д.б. разрешен запуск макросов в МС-офис.
                Могу выслать или выложить.
                Все это хорошо при условии что, заранее известно что курсы за требуемую дату на момент запуска макроса уже установлены и доступны на сайте, а для проверки этого надо заходить на сайт ЦБ. Т.к. таблица с курсами на сайте ЦБ не содержит поля с датой действия установленного курса и при импорте в Excel таблицы проверить эту дату невозможно, то можем получить ситуацию когда запрашиваем курсы за текущую дату, а в реальности получаем курсы за предыдущую. :-(

                Комментарий


                • #9
                  а что мешает забирать через xml?
                  http://www.cbr.ru/scripts/XML_dynami...eq1=28.11.2003

                  тут то дата имеется

                  Комментарий


                  • #10
                    Сообщение от mns_h
                    4VGromov
                    Загляните в Ваш dbf-файл, сколько там строк и какие? ...
                    Если пришлете dbf, заполненный всеми нужными валютами и ссылку на страницу со всеми курсами, то могу модифицировать макрос и выложить здесь. Быстро не обещаю, но постараюсь не тянуть.
                    прикладываю "эталонный" dbf-файл, который использовался для загрузки курсов через макрос.
                    (c) Заработай оперативно!

                    Комментарий


                    • #11
                      Сообщение от KaMPiLeR
                      а что мешает забирать через xml?
                      http://www.cbr.ru/scripts/XML_dynami...eq1=28.11.2003

                      тут то дата имеется
                      а есть здесь возможность задать нужный для загрузки список валют?
                      (c) Заработай оперативно!

                      Комментарий


                      • #12
                        Сообщение от nexus
                        Все это хорошо при условии что, заранее известно что курсы за требуемую дату на момент запуска макроса уже установлены и доступны на сайте, а для проверки этого надо заходить на сайт ЦБ. Т.к. таблица с курсами на сайте ЦБ не содержит поля с датой действия установленного курса и при импорте в Excel таблицы проверить эту дату невозможно, то можем получить ситуацию когда запрашиваем курсы за текущую дату, а в реальности получаем курсы за предыдущую. :-(
                        Ничего не надо, если запрошенная дата не совпадет с датой на страничке с курсами - появится сообщение.
                        На странице, читаемой макросом, дата действия курса есть, она и анализируется.

                        Комментарий


                        • #13
                          Zip взял, но цейтнот жуткий, да еще УФЭБС. Ну почему всякую гадость летом начинают?
                          PS. В файле 126 записей, а по адресу :
                          "http://www.cbr.ru/currency_base/D_print.asp?date_req=дата>" всего 18 валют. Где брать остальные? Ссылочку дайте, плз.

                          Комментарий


                          • #14
                            VGromov
                            VAL_NM_RQ - возможные значения можно увидеть в скрипте..

                            mns_h
                            Где брать остальные? Ссылочку дайте, плз
                            остальные раз в месяц устанавливаются
                            http://www.cbr.ru/currency_base/M_pr...=2006&month=06

                            Комментарий


                            • #15
                              да, кстати, читаем тут еще:
                              http://www.cbr.ru/scripts/Root.asp?Prtid=SXML

                              Комментарий


                              • #16
                                4 KaMPiLeR:
                                Здесь пример с Вашим dbf-файлом, считываем курсы по адресу:
                                "http://www.cbr.ru/currency_base/M_print.asp?year=2006&month="+две цифры месяца.
                                Если курса нет, то новые курсы не пишутся в новые файлы dbf и xls во вложенную папку current. Рекомендую написать батник-запускалку и в нем удалять предварительно все из вложенной папки current. Но! В dbf-файле валют больше, чем на указанной странице, обновятся только те, к-рые есть на странице - у них изменится дата курса. Можно перед запуском войти, отказавшись от выполнения макроса и закомментировать строку:
                                Private Sub Workbook_Open()
                                Call Open_Copy_Save
                                Application.DisplayAlerts = False
                                'Application.Quit '-вот эту
                                End Sub
                                Тогда по завершении загрузки приложение (эксель) останется открытым и можно посмотреть страничку с курсами и с дебеэфником.
                                Архив - папку со всеми файлами прилагаю.
                                Последний раз редактировалось mns_h; 25.07.2006, 17:53. Причина: не написал для кого...

                                Комментарий


                                • #17
                                  ЦБ жжот с курсами:
                                  http://cbr.ru/currency_base/D_print....22center%22%3E

                                  Комментарий


                                  • #18
                                    а есть какая нить утилитка, которая лезет на cbr.ru, берет ежедневные курсы 18-ти валют, пишет их в txt файл, и запускает батник ?

                                    Комментарий


                                    • #19
                                      была программка и оч давно, не помню кем написанная.
                                      на дельфях - сама забирала курсы с ЦБ и на основе их делала или txt файл или INSERT INTO.
                                      у меня свое - на пхп.
                                      легко на дельфи можно переделать чтоб не заморачиваться с php

                                      Комментарий


                                      • #20
                                        У нас тоже свое на VBS. Лезет на сайт, парсит XML и пихает в базу.

                                        Комментарий


                                        • #21
                                          Что-то cbr.bankir.ru совсем помер... Задумался о том чтобы забирать DBF c курсами с более официального источника.
                                          Вот, наваял скрипт который скачивает свежий CURCOURS.DBF c АСЭВ МГТУ. Решил поделиться с коллегами, может быть кому-нибудь пригодится.
                                          Запускать при установленном соединении (должен быть доступен узел АСЭВ 192.168.21.25)

                                          Язык: VBScript
                                          Код:
                                          ' curcours.vbs v1.0
                                          P.S. в последний момент в скрипт закралась ошибочка. пока потестирую в бою и выложу позднее окончательный вариант
                                          Последний раз редактировалось kryptonite; 24.12.2010, 16:40.

                                          Комментарий

                                          Пользователи, просматривающие эту тему

                                          Свернуть

                                          Присутствует 1. Участников: 0, гостей: 1.

                                          Обработка...
                                          X