Система программирования (скрипты) системы СИМП Лайт позволяет произвести выгрузку информации из БД в файлы и сторонние базы данных SQL.
Выгрузка в текстовый файлВыгрузка в текстовый файл |
Скрипт выгрузки в текстовый файл информации одного канала за прошедшие сутки.
{Pascal Script} Var res, f: Integer = 0; beginData, endData: TDate; dtDate: TDateTime; dValue: Double; nameChannel, nameFile, s: String = ''; stream: TMemoryStream; Begin nameChannel := 'Температура 1'; beginData := now()-1; endData := now(); nameFile:= 'C:\' + dateToStr(beginData) + '_' + dateToStr(endData) + '.txt'; if FileExists(nameFile) then begin AddToDebugLog('Файл с именем ' + nameFile + ' уже существует. Скрипт остановлен'); exit; end; stream := TMemoryStream.Create; try res := StreamReadFromDatabase(beginData, endData, nameChannel, stream); if res = 0 then begin while GetValueFromStream(stream, dtDate, dValue) do begin s := s + dateTimeToStr(dtDate) + ' = ' + FormatFloat('#0.#0', dValue) + #10; f := f + 1; if f mod 500 = 0 then //записываем порциями по 500 записей begin SaveToTxtFile(nameFile, s); s := ''; end; end; AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.'); end else AddToDebugLog('Ошибка считывания: ' + IntToStr(res)); finally stream.Free; end; SaveToTxtFile(nameFile, s); // записываем остаток записей end. |
Выгрузка в excel-файл |
Скрипт выгрузки в exel-файл информации двух каналов за прошедшие сутки.
{Pascal Script} Var res, per, f: Integer = 0; beginData, endData: TDate; dtDate: TDateTime; dValue: Double; name1, name2, nameFile, s: String = ''; stream: TMemoryStream; Begin name1 := 'Температура 1'; name2 := 'Температура 2'; beginData := now()-1; endData := now(); nameFile := 'c:\' + dateToStr(beginData) + '_' + dateToStr(endData) + '.xls'; if FileExists(nameFile) then begin AddToDebugLog('Файл с именем ' + nameFile + ' уже существует. Скрипт остановлен'); exit; end; per := Excel.CreateTemplate; if per > 0 then begin AddToDebugLog('Ошибка создания excel-файла. Код ошибки = ' + IntToStr(per)); Excel.Close; exit; end; Excel.Save(nameFile); Excel.Close; per := Excel.OpenTemplate(nameFile); if per > 0 then begin AddToDebugLog('Ошибка открытия excel-файла. Код ошибки = ' + IntToStr(per)); Excel.Close; exit; end; AddToDebugLog('Начали работать с excel-файлом.'); Excel.Cell['B1'] := 'Дата/Время'; Excel.Cell['C1'] := name1; stream := TMemoryStream.Create; try res := StreamReadFromDatabase(beginData, endData, name1, stream); if res = 0 then begin while GetValueFromStream(stream, dtDate, dValue) do begin Excel.Cell['B'+ intToStr(f + 2)] := dateTimeToStr(dtDate); Excel.Cell['C'+ intToStr(f + 2)] := dValue; f := f + 1; end; AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.'); end else AddToDebugLog('Ошибка считывания канала "' + name1 + '" =' + IntToStr(res)); finally stream.Free; end; Excel.Save(nameFile); f := 0; Excel.Cell['D1'] := 'Дата/Время'; Excel.Cell['E1'] := name2; stream := TMemoryStream.Create; try res := StreamReadFromDatabase(beginData, endData, name2, stream); if res = 0 then begin while GetValueFromStream(stream, dtDate, dValue) do begin Excel.Cell['D'+ intToStr(f + 2)] := dateTimeToStr(dtDate); Excel.Cell['E'+ intToStr(f + 2)] := dValue; f := f + 1; end; AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.'); end else AddToDebugLog('Ошибка считывания канала "' + name2 + '" =' + IntToStr(res)); finally stream.Free; end; Excel.Save(nameFile); Excel.Close; end. |
Выгрузка в базу данных SQL |
Скрипт выгрузки информации из БД СИМП Лайт в БД MySQL посредством использования механизма ODBC, выгружается информация одного канала с временной отметкой.
Если на компьютере установлен сервер MySQL и установлен Mysql Connector ODBC, то возможно взаимодействовать с MySQL из системы СИМП Лайт. Рассмотрим несколько простых шагов, которые приведут к гарантированному результату. Первым делом создадим учебную базу данных в MySQL, и будет работать в скрипте с этой базой данных.
В консольном клиенте MySQL получим список имеющихся баз данных, используем для этого команду show databases. Создадим базу данных с именем testDB. И убедимся, с помощью всё той же команды show databases, что наша база данных появилась в списке баз данных MySQL.
Следующим шагом будет настройка механизма ODBC для доступа к нашей учебной базе данных (testDB). Для открытия окна "Администратор источника данных ODBC (32-разрядная версия)" следует в окне поиска Windows набрать "ODBC" и операционная система поможет отыскать вышеназванное приложение. Создадим свой источник данных в панели "Пользовательский DSN". Для этого необходимо нажать кнопку "Добавить", и в открывшемся диалоговом окне введем имя источника данных, пусть это будет - "databases_MySQL". Заполняем поля как представлено на картинке.
После того, как в поле "Database" выбрали базу данных "testDB", следует нажать кнопку "Test" и получить окно "Test Result" с сообщением "Connection successful". Это свидетельствует о том, что путь доступа к нашей учебной базе "" настроен, и можно переходить к следующему этапу. Это обязательное условие! Не стоит двигаться дальше, пока не будет получено сообщение "Connection successful".
После закрытия диалогового окна по созданию (настройке) источника данных получаем имя нашего источника в списке источников данных механизма ODBC.
Возвращаемся в консольный клиент MySQL. Выбираем учебную базу данных (testDB) и создаем в ней таблицу test, с тремя полями: автоинкрементный ключ (id), отметку даты/времени (data_time) и вещественное поле для значения (val).
Теперь можно приступать к созданию скрипта по работе с MySQL. В модуле "Редактор каналов" создаем виртуальный канал и создаем скрип с нижеследующим содержанием.
// в примере используется таблица - test : // id (int) - автоинкремент, первичный ключ; data_time (TIMESTAMP), val (float) // В консольном клиенте MySQL создаем базу данных и таблицу: // create database testDB; // use testDB // create table test (id integer auto_increment primary key, data_time TIMESTAMP, val float); var res, f: Integer = 0; beginData, endData: TDate; dtDate: TDateTime; dValue: Double; nameChannel, s, s_dValue, s_dtDate: String = ''; stream: TMemoryStream; ADOConnection: TADOConnection; ADOQuery: TADOQuery; ConnectionString: string; procedure OnStartScript; begin CoInitialize(nil); ADOConnection := TADOConnection.Create(nil); ADOQuery := TADOQuery.Create(nil); end; procedure OnStopScript; begin CoUninitialize; ADOConnection.free; ADOQuery.free; end; begin nameChannel := 'Температура 1'; beginData := now() - 1/24; // берем данные из БД за последний час endData := now(); stream := TMemoryStream.Create; try ADOConnection.Connected := false; ADOConnection.ConnectionString := 'databases_MySQL'; // таблица "test" базы данных SQL "testDB" ADOQuery.Connection := ADOConnection; res := StreamReadFromDatabase(beginData, endData, nameChannel, stream); if res = 0 then begin while GetValueFromStream(stream, dtDate, dValue) do begin s := floatToStr(dValue); s_dValue := copy(s, 1, pos(',', s)-1) + '.' + copy(s, pos(',', s)+1, 2); // меняем "," на "." s_dtDate := FormatDateTime('yyyy-mm-dd hh:nn:ss', dtDate); // меняем формат даты s := Format('insert into test(data_time, val) values (''%s'', %s)', [s_dtDate, s_dValue]); ADOQuery.SQL.Clear; ADOQuery.SQL.Text := s; ADOQuery.ExecSQL; f := f + 1; end; AddToDebugLog('Обработка ' + IntToStr(f) + ' записей завершена.'); end else AddToDebugLog('Ошибка считывания канала "' + nameChannel + '" =' + IntToStr(res)); AddToDebugLog('Экспорт строк в таблицу test завершилось удачно!'); Except AddToDebugLog('Увы, что-то пошло не так'); end; stream.Free; end. |
Возвращаемся в консольный клиент MySQL. Командой select просматриваем информацию таблицы test учебной базы testDB.