Напоминалка — это небольшая утилита которая должна облегчить жизнь системным администраторам и операторам которые регулярно обновляют справочники. В моем случае это делается каждый день и тратится по 15 — 20 минут на загрузку.
Задача:
- Программа должна подключаться к базе данных и получать информацию о версии текущих справочников.
- Проверять информацию о этих справочниках на сайте.
- При необходимости загрузить новый справочник.
Решение:
Для решения этой задачи я использовал:
- AutoIt версия: 3.3.12.0;
- AutoIt Studio v 1.07;
- _sql.au3 — UDF для подключения к БД MSSQL;
- GUICtrlCreateListViewItem — функция для для добавления информации в ListView;
- GUICtrlSetData — функция для для добавления информации в поле edit;
Создание GUI
Для удобства интерфейс для программы я создал в редакторе форм AutoIt Studio. В дереве проекта необходимо нажать правой клавишей на папку Forms и в появившемся контекстном меню выбрать Создать -> Создать новый файл -> AutoIt GUI(.isf). Указываем название формы, в моем случае я назвал её Mainform, и нажимаем OK. Появится графический редактор форм, где без труда можно добавлять и редактировать элементы графического интерфейса. В моей проекте использовано 3 элемента:
Тип | Дескриптор | Описание |
Listview | $idMyList | Таблица где будет отображаться информация о справочниках |
button | $idMyButton | Кнопка для запуска процесса сбора сведений о справочниках |
edit | $idMyEdit | Поле для логов программы |
Для элемента Listview я создал текст «Справочник|Версия|Дата|Сайт». В результате в таблице будет 4 столбца, но ширина у всех столбцов будет одинаковая. Эту проблему можно решить нажав кнопку «Экстракод» и прописать для каждого столбца ширину.
1 2 3 4 |
GUICtrlSendMsg(-1, 0x101E, 0, 135) GUICtrlSendMsg(-1, 0x101E, 1, 85) GUICtrlSendMsg(-1, 0x101E, 2, 85) GUICtrlSendMsg(-1, 0x101E, 3, 89) |
Подключение формы в основной проект
После сохранения формы необходимо подключить форму в основном файле программы. Добавим следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include "Forms\Mainform.isf" ;покажем GUI на экране GUISetState(@SW_SHOW, $Mainform) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $idMyButton _Button_Click() EndSwitch WEnd |
Теперь можно провести первое тестирование программы нажав F5. Если все хорошо мы должны получить следующий результат:
Добавление функционала в программу
Ранее я указал, что при нажатии на кнопку «Проверить» будет выполняться функция _Button_Click(). Задачи функции:
- GUICtrlSendMsg($idmylist, $LVM_DELETEALLITEMS, 0, 0) — Отчищаем Listview от записей;
- Подключение к серверу MSSQL;
- Поиск информации о справочниках;
- Закрываем соединение.
Для подключения к MSSQL понадобятся следующие переменные:
1 2 3 4 |
Local $Vita_Server = '127.0.0.1' Local $Vita_DB = 'NameDB' Local $Vita_Login = 'login' Local $Vita_Pass = 'password' |
Примерный код функции показан ниже:
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 |
Func _Button_Click() GUICtrlSendMsg($idmylist, $LVM_DELETEALLITEMS, 0, 0) GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/СТАРТ проверки" & @CRLF) ;------------------------; ; Подключаемся к Серверу ; ;------------------------; GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/Создаем ADODB" & @CRLF, 1) $oADODB = _SQL_Startup() GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/ADODB создан" & @CRLF, 1) If $oADODB = $SQL_ERROR then Msgbox(0 + 16 + 262144, "Error", _SQL_GetErrMsg()) GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/Подключемся к SQL" & @CRLF, 1) 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 GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/Мы подключены к SQL!" & @CRLF, 1) ;-------------------------------; ; Ищем справочник рег. на месяц ; ;-------------------------------; $sMSSqlStatement = "SELECT [Version]" & _ ",[UpdateDate]" & _ ",[RrLoadID]" & _ ",[FileName]" & _ ",[LoadType]" & _ "FROM [AKUZDB].[AKUZ].[T_RR_LOAD]" & _ "WHERE [LoadType] = 1" Local $aData, $iRows, $iColumns ;Variables to store the array data in to and the row count and the column count $iRval = _SQL_GetTable2D(-1, $sMSSqlStatement, $aData, $iRows, $iColumns) If $iRval = $SQL_OK Then GUICtrlCreateListViewItem('РР полный |' & ' ' & $aData[1][3] & '|' & ' ' & _DateRemake($aData[1][1], 1) & '|' & "__НД__", $idmylist) EndIf ;-------------------------------; ; Ищем справочник рег. на день ; ;-------------------------------; $sMSSqlStatement = "SELECT [Version]" & _ ",[UpdateDate]" & _ ",[RrLoadID]" & _ ",[FileName]" & _ ",[LoadType]" & _ "FROM [AKUZDB].[AKUZ].[T_RR_LOAD]" & _ "WHERE [LoadType] = 3" Local $aData, $iRows, $iColumns ;Variables to store the array data in to and the row count and the column count $iRval = _SQL_GetTable2D(-1, $sMSSqlStatement, $aData, $iRows, $iColumns) If $iRval = $SQL_OK Then GUICtrlCreateListViewItem('РР на день |' & ' ' & $aData[1][3] & '|' & ' ' & _DateRemake($aData[1][1], 1) & '|' & "__НД__", $idmylist) EndIf ;-------------------------------; ; Ищем справочник федеральный ; ;-------------------------------; $sMSSqlStatement = "SELECT TOP 1 [FederalRegisterLoadID]" & _ " ,[Users]" & _ ",[Version]" & _ ",[UpdateDate]" & _ " FROM [AKUZDB].[AKUZ].[T_FEDERAL_REGISTER_LOAD]" & _ " ORDER BY [Version] DESC;" Local $aData, $iRows, $iColumns ;Variables to store the array data in to and the row count and the column count $iRval = _SQL_GetTable2D(-1, $sMSSqlStatement, $aData, $iRows, $iColumns) If $iRval = $SQL_OK Then GUICtrlCreateListViewItem('ФР |' & ' ' & $aData[1][2] & '|' & ' ' & _DateRemake($aData[1][3], 1) & '|' & "__НД__", $idmylist) EndIf _SQL_Close() GUICtrlSetData($idmyedit, @HOUR & ':' & @MIN & ':' & @SEC & "/Проверка завершена" & @CRLF, 1) EndFunc ;==>_Button_Click |
Для преобразования даты в читаемый формат я использовал функцию _DateRemake($iDate, $iDateFormat = 0).
1 2 3 4 5 6 7 8 9 10 11 12 |
Func _DateRemake($iDate, $iDateFormat = 0) If Not $iDate Then Return 0 $NewDotDate = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\3.\2.\1") $NewSlashDate = StringRegExpReplace($iDate, "^(\d{4})(\d{2})(\d{2}).*", "\1/\2/\3") Dim $aDate[3] = [2, $NewDotDate, $NewSlashDate] If $iDateFormat = 0 Then Return $aDate If $iDateFormat = 1 Then Return $aDate[1] If $iDateFormat = 2 Then Return $aDate[2] EndFunc ;==>_DateRemake |
Результат
Готовая «Напоминалка» может пока, что только просматривать версии справочников. В следующий раз к этой программе можно добавить поиск информации о этих справочниках на сайте, где хранится обновления.