Справочник регионального регистра необходимо обновлять каждый день и каждый месяц. Именно с такой регулярностью выходят новые справочники и мне как всегда лень их обновлять в ручную. Ведь на обновление одного справочника уходит от 5 до 15 минут. Попробую описать все действия которые необходимо повторять каждый день, чтобы обновиться до свежей версии.
- Узнаем версию справочника
- Определяем что необходимо загрузить
- Загружаем.
- Распаковываем.
- Записываем справочники в БД.
- Если есть желание можно отправить сообщение о работе скрипта
Похожая задача решалась в прошлом посте. Отличие в том как определять какую версию скачивать. Существует полная версия справочника, которую необходимо скачивать в начале месяца и версия с данными на день.
Для определения месяца и дня можно использовать макросы, такие как @YEAR, @MON и @MDAY.
Для получения информации о текущей версии справочника используется библиотека <_sql.au3>
Загрузить библиотеку можно тут__sql.au3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <_sql.au3> #include <array.au3> $Vita_Server = '127.0.0.1' $Vita_DB = 'TESTDB' $Vita_Login = 'login' $Vita_Pass = 'pass' $sHttpLink = 'http://11.0.0.1/REG_RG/' $sPathRloader = 'C:\RLoader\RLoader.exe' $sPathRegRloader = 'C:\RLoader\rrl\arc\' $sRarPath = 'C:\Program Files (x86)\WinRAR\WinRAR.exe' ;------------------------; ; Подключаемся к Серверу ; ;------------------------; $oADODB = _SQL_Startup() If $oADODB = $SQL_ERROR then Msgbox(0 + 16 +262144,"Error",_SQL_GetErrMsg()) If _sql_Connect(-1,$Vita_Server,$Vita_DB,$Vita_Login,$Vita_Pass) = $SQL_ERROR then Msgbox(0 + 16 +262144,"Error",_SQL_GetErrMsg()) _SQL_Close() Exit EndIf ;-------------------------------; ; Ищем справочник рег. на месяц ; ;-------------------------------; $sMSSqlStatement = "SELECT [Version]"& _ ",[UpdateDate]"& _ ",[RrLoadID]"& _ ",[FileName]"& _ ",[LoadType]"& _ "FROM [AKUZDB].[AKUZ].[T_RR_LOAD]"& _ "WHERE [LoadType] = 1" Local $aData,$iRows,$iColumns $iRval = _SQL_GetTable2D(-1,$sMSSqlStatement,$aData,$iRows,$iColumns) If $iRval = $SQL_OK Then ;Сохраняем месяц текущего справочника $MonDB = StringRegExpReplace($aData[1][1], "^(\d{4})(\d{2})(\d{2}).*", "\2") ConsoleWrite($MonDB&@LF) EndIf ;-----------------------; ; Откючаемся от сервера ; ;-----------------------; _SQL_Close() |
Теперь сравниваем месяц текущий и месяц в справочнике. Если справочники отличаются загружаем новый справочник на месяц, а если нет, то на день. Весь процесс загрузки, распаковки и установки справочника в БД описан в функции _LoadReg()
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Local $sYear=StringTrimLeft( @YEAR, 2 ) If @MON <> $MonDB Then ConsoleWrite('Месяц в справочнике отличается от текущего'&@LF) $sFile = "rr_"&$sYear&@MON&"f.arj" _LoadReg($sFile) Exit Else ConsoleWrite('Месяц в справочнике совпадает с текущим месяцем'&@LF) $sFile = "rr_"&$sYear&@MON&"t.arj" _LoadReg($sFile) EndIf |
Функция _LoadReg()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Func _LoadReg($sFileName) ;--------------------------; ; Удаляем старые файлы ; ;--------------------------; ConsoleWrite('Удаляем старые файлы'&@LF) FileDelete($sPathRegRloader&"*.arj") FileDelete($sPathRegRloader&"*.zip") FileDelete($sPathRegRloader&"*.doc") ;-----------------------; ; Загружаем справочник ; ;-----------------------; Local $sHadres = $sHttpLink&$sFileName Local $sFilePath = $sPathRegRloader&$sFileName Local $lTotalSize = InetGetSize($sHadres, $INET_FORCERELOAD) ConsoleWrite('Идет загрузка справочника:'&$sFileName&@LF) ConsoleWrite('Размер файла:'&StringFormat("%.2f", $lTotalSize/1024/1024)&"MB"&@LF) $hDownload = InetGet($sHadres,$sFilePath, 1,1) Do Sleep(2000) ConsoleWrite('*') Until InetGetInfo($hDownload, 2) ConsoleWrite('Ok'&@LF) InetClose($hDownload) Local $iBytesSize = InetGetInfo($hDownload, 0) Local $iFileSize = FileGetSize($sFilePath) ConsoleWrite("The total download size: " & StringFormat("%.2f", $iBytesSize/1024/1024) & @CRLF & "The total filesize: " & StringFormat("%.2f", $iFileSize/1024/1024)&@LF) ;--------------------; ; Распаковка архива ; ;--------------------; ConsoleWrite('Распаковка архива'&@LF) $sFilePacth = $sPathRegRloader&'*.arj' Run($sRarPath & ' e "' & $sFilePacth & '" -aoa -y"' & $sPathRegRloader & '"',$sPathRegRloader, @SW_HIDE) Sleep(3000) ;------------------------------; ; Загрузка данных в Витакарту ; ;------------------------------; ConsoleWrite('Загрузка данных в Витакарту'&@LF) $First_Search = FileFindFirstFile($sPathRegRloader&'*.zip') $Next_Search = FileFindNextFile($First_Search) Run($sPathRloader) Do sleep(2000) Until WinExists('Загрузчик регистров') WinActivate('Загрузчик регистров') WinWaitActive('Загрузчик регистров') Send ("{DOWN}") Send ("{NUMPADADD}") Send ("{DOWN 2}") Send ("{NUMPADADD}") Send ("{DOWN 2}") Send ("{TAB 2}") Send ("{UP 3}") Send($Next_Search) Sleep(1000) Send ("{TAB}") ;Send ("{ENTER}") Sleep(2000) While WinClose("Загрузчик регистров") Sleep(1000) WinExists("Загрузчик регистров","Старт") WEnd ConsoleWrite('Льгота успешно загружена'&@LF) EndFunc |
Скрипт готов. Данный скрипт упростил рутинный процесс сократив время на загрузку. Теперь на эту работу я трачу от 15 до 60 секунд в день.