26

(4 replies, posted in Russian)

DriveSoft wrote:
Bullet3203 wrote:

Здравствуйте! Возможно ли реализовать передачу файлов конкретному пользователю? (работа в локальной сети)

Передать файл конкретному пользоватерю минуя базу данных к сожалению не получится.

Интересен такой вариант: например если выбрать пользователя из списка, открывалось окошко где можно написать сообщение и плюс прикрепить файл. При нажатии кнопки отправить, у получателя было уведомление что ему пришло сообщение и запрос на передачу файлов. Сам файл автоматом сохранялся в базе, но после получение его пользователем он бы с базы удалялся. Возможно ли такое?)

27

(4 replies, posted in Russian)

Здравствуйте! Возможно ли реализовать передачу файлов конкретному пользователю? (работа в локальной сети)

Bullet3203 wrote:

А как подключиться если в проекте используется отдельная форма авторизации, после которой уже  появляется главная форма?
Пробовал подключаться данным скриптом, но вылетает ошибка.

Пытался прописать этот скрипт в форме окна авторизации, но ругается на MySQLConnection, будто неизвестный параметр

29

(33 replies, posted in Russian)

Bullet3203 wrote:

Использую пример Slide Grid, но после перехода на MySQL ругается на VACUUM. Как его прописать?

О, если строчку SQLExecute('VACUUM') вообще удалить, то ошибка не появляется)

30

(33 replies, posted in Russian)

Использую пример Slide Grid, но после перехода на MySQL ругается на VACUUM. Как его прописать?

А как подключиться если в проекте используется отдельная форма авторизации, после которой уже  появляется главная форма?
Пробовал подключаться данным скриптом, но вылетает ошибка.

32

(34 replies, posted in Russian)

Разобрался

('SELECT message FROM reminder WHERE DATE_FORMAT(datetime, ''%Y-%m-%d %H:%i:%S'') = NOW()');

33

(34 replies, posted in Russian)

Хотелось бы проект Reminder для MySQL

Попробовал такой формат %Y-%m-%d %H:%i:%S но все равно ничего не отобразилось, но и ошибок никаких не вывалилось... буду еще разбираться.
И еще вопрос: как правильно перенести базу с одного компа на другой сохраняя информацию?
Я  делал так:
1) Через MySQL WorkBench сделал Data Export т.е. DUMP
2) Залил все на флешку (папку с базой и папку с DUMPом)
3) На другом компе запустил проект, подключил к MySQL. Создал базу с таким же именем и такими же таблицами
4) В MySQL WorkBench на другом компе подключился к базе и сделал восстановление из DUMРа. Процесс прошел успешно.
Но все равно таблицы остались пустые... Что я сделал не так?

DriveSoft wrote:

попробуйте такой формат даты

%Y-%m-%d %H:%i:%S

%M -  в MySQL обозначает месяц, подробней https://www.w3schools.com/sql/func_mysq … format.asp



В вашем случае таймер делает запрос в базу каждую секунду? Не могу сказать, что это хорошая идея, особенно когда будет много клиентов. Рекомендую избавиться от секунд в SQL запросе, а интервал таймера установить на 55 секунд

Спасибо, попробую.
Да, все пять таймеров каждую секунду.
Ведь на MySQL ошибки Data Base is locked быть теперь не должно, даже если каждую секунду тикают таймеры?
Секунды добавил так как если будут только часы и минуты, отображение сообщения будет в промежутке от 1 до 59 секунды.

DriveSoft wrote:

1-2-3-6. Приложите пожалуйста проект, протестирую.


4. http://myvisualdatabase.com/forum/viewt … 429#p23429


5.
Так как MySQL клиент серверная СУБД, в нее уже встроен механизм авторизации по имени пользователя и пароля, пользователи должны создаваться инструментом для администрирования БД, например MySQL Workbench, также пользователям могут быть назначены различные привелегии по доступам к различным таблицам.


Т.е. вы можете создать одного MySQL пользователя, который будет использоваться всеми клиентами. Далее авторизация будет осуществляться с помощью скрипта (как и в случае SQLite).


Чтобы избежать двойную авторизацию, подключение к MySQL можно осуществить с помощью скрипта
http://myvisualdatabase.com/forum/viewtopic.php?id=1804



Либо вы можете создавать для каждого клиента, отдельного пользователя на уровне MySQL, с различными привелегиями, но для этого вам необходимо изучить систему привелегий в MySQL.

Спасибо, вроде со всем что выше разобрался, но еще появилась проблема.
На SQLite был написан таймер

procedure OnTimer2;
var
    sMessage: string = '';
begin
              sMessage := SQLExecute('SELECT message FROM reminder WHERE strftime(''%d.%m.%Y %H:%M:%S'', datetime) = strftime(''%d.%m.%Y %H:%M:%S'', ''now'', ''localtime'') ');
              if sMessage<>'' then
              begin
              ShowMessage(sMessage);
              end;
end;

При переходе на MySQL прописал так

procedure OnTimer2;
var
    sMessage: string = '';
begin
              sMessage := SQLExecute('SELECT message FROM reminder WHERE DATE_FORMAT(datetime, ''%d.%m.%Y %H:%M:%S'') = DATE_FORMAT(''%d.%m.%Y %H:%M:%S'', NOW()) ');
              if sMessage<>'' then
              begin
              ShowMessage(sMessage);
              end;
end;

Но ничего не отображается при достижении времени

37

(4 replies, posted in Russian)

DriveSoft wrote:

Спасибо за найденную ошибку, исправил. Исправленную версию можете скачать по ссылке
https://www.dropbox.com/s/c804dzufyak6v … 2.zip?dl=0

Благодарю, теперь все отображается как надо

38

(4 replies, posted in Russian)

DriveSoft wrote:

Если используете кнопку с действием "SQL запрос"
правильно будет "$autoinc"

т.е.

SELECT "$autoinc", somefield FROM table;

Спасибо, я так и делал, но почему то в столбце отвечающим за номер прописывается не 1.2.3.4 и т.д а слово autoinc

39

(4 replies, posted in Russian)

Подскажите пожалуйста как сделать нумерацию строк в запросе MySQL? "#autoinc" не работает... в инете что то не нашел

DriveSoft wrote:
Bullet3203 wrote:

А как такое сделать для MySQL?

Для MySQL необходимо заменить SQL запрос, который используется в скрипте

AND datetime(dateandtime, ''+'+IntToStr(LOCK_TIMEOUT)+' seconds'') > datetime(''now'', ''localtime'')

на

AND DATE_ADD(dateandtime, INTERVAL '+IntToStr(LOCK_TIMEOUT)+' SECOND) > NOW()


Проект с примером для MySQL

Спасибо большое

Есть еще несколько вопросов:
1) при переходе на MySQL почему то теряются две таблицы (при пересоздании базы с sqlite в mysql) и одни и те же
2) с словами read и  write разобрался, взял в кавычки но все равно ругается на другие слова (datetime например)
3) при запуске проекта вылетает ошибка  List index out of bounds (0)
4) на sqlite была реализована блокировка активных актов, то есть когда один пользователь открывал его для редактирования, то для других он блокировался и окрашивался в красный цвет... после перехода на MySQL ругается на datetime и LOCK_TIME
5) Каков сам принцип работы MySQL сервера?  На Sqlite реализован вход по логину и паролю. После перехода на MySQL сначала появляется окно подключения к серверу, где один только пользователь, а потом уже появляется окно самой программы, где выбор пользователя и пароля....  нужно ли создавать пользователей именно на самом сервере или достаточно одного, который создается при установке самого сервера?
6) Не работают таймеры которые работали на старой версии
В общем очень много проблем появилось)

А как такое сделать для MySQL?

DriveSoft wrote:

1. Автоматического переноса данных между двумя различными базами данных пока не реализовано. Это можно сделать только путем экспорта в CSV файлы с последующим импортом.  Скрипт импорта/экпорта http://myvisualdatabase.com/forum/viewtopic.php?id=3619


2. В MySQL данные храняться сложней, используется много файлов. Для ее администрирования могу порекомендовать бесплатную программу MySQL Workbench

Спасибо за ответ

DriveSoft wrote:
Bullet3203 wrote:

появляется постоянно ошибка

В скрипте, в SQL запросе используется поле с названием read, для MySQL это зарезирвированное слово, просто возьмите это поле в кавычки  `read`

Спасибо, это помогло но есть другие ошибки(
и еще пару вопросов
1) как перевести базу без потери данных?
2) какой файл отвечает за базу после конвертации и как посмотреть его содержимое? например раньше это был файл sqlite.db и его можно было редактировать программой SqLite Studio

45

(6 replies, posted in Russian)

DriveSoft wrote:

К сожалению не могу рекомендовать использование SQLite в локальной сети при интенсивном ее использовании, получается каждый клиент каждую секунду обращается к базе данных, что может приводить к подобным ошибкам.


Откажитесь от таймеров либо переходите на использование клиент серверной базы данных MySQL.

Понятно, спасибо

46

(6 replies, posted in Russian)

DriveSoft wrote:

Пожалуйста прикладывайте проект. Тут например я не вижу какой интервал используется для таймера.

Интервал указан такой

begin
     Timer := TTimer.Create (nil);
     Timer.OnTimer := @OnTimer;
     Timer.Interval := 1000;
     Timer.Enabled := True;
     end;

Проект вышлю на почту

47

(6 replies, posted in Russian)

Вот имеется такой код таймера

procedure OnTimer;
var
    i: integer;
    w: integer;
    idNew: integer;
    idNew2: integer;
    sprinal, skomuvidano, sviddil, skto, skomu, spidroz: string;
    sMessage: string = '';
    sPopered: string = '';

    /////////////////////////////Отображение системного времени на формах///////////////////////////////////////
    begin
              Form1.Label48.Caption := FormatDateTime('c', Now);
              Aktirem.Label10.Caption := FormatDateTime('c', Now);
              aktrem_Andr.Label17.Caption := FormatDateTime('c', Now);
              aktrem_Kos.Label17.Caption := FormatDateTime('c', Now);
              aktrem_Gus.Label17.Caption := FormatDateTime('c', Now);
              aktrem_Vol.Label17.Caption := FormatDateTime('c', Now);
              Formzadanie.Label11.Caption := FormatDateTime('c', Now);
              ZapravkaKioc.Label10.Caption := FormatDateTime('c', Now);
              ZapravkaDSZN.Label10.Caption := FormatDateTime('c', Now);
              AktiExpertiza.Label4.Caption := FormatDateTime('c', Now);
              lampi.Label12.Caption := FormatDateTime('c', Now);
              rezim.Label20.Caption := FormatDateTime('c', Now);

    ///////////////////////////Вывод системного сообщения в указанное время///////////////////////////////////////
    begin
              sMessage := SQLExecute('SELECT message FROM reminder WHERE strftime(''%d.%m.%Y %H:%M:%S'', datetime) = strftime(''%d.%m.%Y %H:%M:%S'', ''now'', ''localtime'') ');
              if sMessage<>'' then
              begin
              ShowMessage(sMessage);
              end;
    end;

    //////////////////////////Вывод предупреждающего сообщения о закрытии программы///////////////////////////////
    begin
              sPopered := SQLExecute('SELECT w FROM popered');
              if sPopered <> '' then
              begin
              ShowMessage('УВАГА! Програма закриється для оновлення! Закрийте це повідомлення!');
              Glav.Close;
              end;
    end;

    /////////////////////////Проверка в таблице нового задания и оповещение пользователя о новом задании сообщением//////////////////////
    begin
              i := SQLExecute('SELECT count(*) FROM doshka');
              if ( i > prevCount) and (prevCount<>-1)  then
              begin
              idNew := SQLExecute('SELECT IFNULL(MAX(id),0) FROM doshka');
              if idNew<>0 then
              begin
              sprinal := SQLExecute('SELECT vidal FROM doshka WHERE id='+IntToStr(idNew));
              skomuvidano := SQLExecute('SELECT komuvidano FROM doshka WHERE id='+IntToStr(idNew));
              sviddil := SQLExecute ('SELECT skritkomuvidano FROM doshka WHERE id='+IntToStr(idNew));
              if (Glav.Label5.Caption = skomuvidano) and (Glav.Label10.Caption = sviddil) then
              begin
              ShowMessage('' + sprinal + ' видав(ла) Вам нове завдання! ');
              end;
              if (Glav.Label5.Caption <> skomuvidano) and (Glav.Label10.Caption = sviddil) then
              begin
              ShowMessage('' + sprinal + ' видав(ла) комусь або всім нове завдання! ');
              end;
    end;
              Formzadanie.TableGrid1.dbUpdate;
    end;
              prevCount := i;
end;

    ////////////////////////Проверка в таблице нового сообщения и оповещение пользователя о новом сообщении/////////////////////////////////
    begin
              w := SQLExecute('SELECT count(*) FROM chat');
              if ( w > prevCount2) and (prevCount2<>-1)  then
              begin
              idNew2 := SQLExecute('SELECT IFNULL(MAX(id),0) FROM chat');
              if idNew2<>0 then
              begin
              skto := SQLExecute('SELECT kto FROM chat WHERE id='+IntToStr(idNew2));
              skomu := SQLExecute('SELECT komu FROM chat WHERE id='+IntToStr(idNew2));
              spidroz := SQLExecute ('SELECT pidroz FROM chat WHERE id='+IntToStr(idNew2));
              if (Glav.Label5.Caption = skomu) and (Glav.Label10.Caption = spidroz) then
              begin
              ShowMessage('' + skto + ' написав(ла) Вам нове повідомлення! ');
              end;

    end;
              chat.TableGrid1.dbUpdate;
              modul.TableGrid1.dbUpdate;
    end;
              prevCount2 := w;
end;
end;

Вроде все работает, но периодически бывает вылетает ошибка database is locked! Когда нажимаешь на кнопку Debug в системном окошке ошибки, то программа показывает такие строчки:
1)

SQLExecute('SELECT message FROM reminder WHERE strftime(''%d.%m.%Y %H:%M:%S'', datetime) = strftime(''%d.%m.%Y %H:%M:%S'', ''now'', ''localtime'') ')

или
2)

 SQLExecute('SELECT w FROM popered')

или
3)

SQLExecute('SELECT count(*) FROM doshka')

или
4)

SQLExecute('SELECT count(*) FROM chat')

Получается что ругается только на то, что находится в процедуре OnTimer. Программа таким образом блочится на всех компьютерах, база сама лежит отдельно и к ней все подключаются по локальной сети.
Поэтому и возникло подозрение на то, что может из-за того, что все идет через один таймер и возникают такие ошибки...
Еще было замечено, что когда один компьютер, на котором запущена программа, уходит в спящий режим, то появляются те же ошибки и программа блочится либо у всех, либо только у того чей комп ушел в режим сна, или же только у нескольких пользователей...

48

(6 replies, posted in Russian)

Возможно реализовать в проекте более двух таймеров? один например отвечает за отображения системного времени на форме, другой за оповещении о добавлении новой записи, третий за добавление новой записи в другой таблице? а то получается ошибка database is locked, ругается именно на процедуру OnTimer в которой и системное время и оповещение о добавлении записей

потом такая

появляется постоянно ошибка