Re: Оповещение о добавленных записях

Попробуйте так

SQLExecute('SELECT CONCAT_WS(char(13), `id`) FROM employees WHERE ' + 'datetime(created) > datetime("'+sDateLogout+'") AND datetime(created) < datetime("'+sDateLogin+'")');

SQLExecute('UPDATE users SET logindate=now() WHERE id='+IntToStr(idUser));
Dmitry.

Re: Оповещение о добавленных записях

Ошибка не пропала,к сожалению..

Post's attachments

Attachment icon 2017-01-24_17-47-35.png 7.3 kb, 222 downloads since 2017-01-24 

Re: Оповещение о добавленных записях

У вас неверный формат времени в переменной sDateLogout, должен быть такой

2007-12-31 23:59:59
Dmitry.

Re: Оповещение о добавленных записях

Ошибка пропала, но теперь подсвечиает только одну запись,как новую. Незаисимо от того,сколько их было добавлено.
Код прилагаю:

var
   sUser: string = '';
   idUser: integer = 0;
   slLastAddedID: TStringList;

procedure Form1_GridEmployees_OnChange (Sender: string);
var
    i,c, k, l: integer;
    sID: string;
begin
    c := Form1.GridEmployees.RowCount-1;
    l := Form1.GridEmployees.Columns.Count-1;

    Form1.GridEmployees.BeginUpdate;
    for i := 0 to c do
    begin
        sID := IntToStr(Form1.GridEmployees.dbIndexToID(i));

        if slLastAddedID.IndexOf(sID) > -1 then
            for k := 0 to l do
               Form1.GridEmployees.Cell[k, i].Color := clRed;

    end;
    Form1.GridEmployees.EndUpdate;

end;

procedure frmEmployee_OnShow (Sender: string; Action: string);
begin
    if Action = 'NewRecord' then frmEmployee.ComboBox1.dbItemID := idUser;
end;

procedure frmEmployee_bOK_OnClick (Sender: string; var Cancel: boolean);
begin
    // save date create of record
    if frmEmployee.dbAction='NewRecord' then
    begin
        frmEmployee.DateTimePicker1.DateTime := now;
        frmEmployee.DateTimePicker2.DateTime := now;
    end;
end;

procedure Form1_OnShow (Sender: string; Action: string);
var
    sDateLogin, sDateLogout: string;
begin
     // Initial check whether there is a database administrator user
     // if not, create an administrator with username admin and password admin
     if SQLExecute('SELECT count(id) FROM users;') = '0' then SQLExecute('INSERT INTO users (login, password) VALUES ("admin", "admin");');

     frmLogin.edPassword.PasswordChar := '*';
     frmLogin.ShowModal; // show windows for login

     // get ID of last added records to slLastAddedID
     if idUser<>0 then
     begin
         sDateLogin := SQLExecute('SELECT DATE_FORMAT(logindate,"%Y-%m-%d %H:%i:%S.%f") FROM users WHERE id='+IntToStr(idUser));
         sDateLogout := SQLExecute('SELECT DATE_FORMAT(logoutdate,"%Y-%m-%d %H:%i:%S.%f") FROM users WHERE id='+IntToStr(idUser));
         if (sDateLogin <> '') and (sDateLogout<>'') then
         begin
             slLastAddedID.Text := SQLExecute('SELECT CONCAT_WS(char(13),`id`) FROM employees WHERE ' + 'DATE_FORMAT(created,"%Y-%m-%d %H:%i:%S.%f") > "'+sDateLogout+'" AND DATE_FORMAT(created,"%Y-%m-%d %H:%i:%S.%f") < "'+sDateLogin+'"');
             Form1.GridEmployees.dbUpdate;
             if slLastAddedID.Count>0 then
             ShowMessage('Добалено '+IntToStr(slLastAddedID.Count)+' записи(ей)' );
         end;
     end;

end;

// save time of logout current user
procedure Form1_OnClose (Sender: string; Action: string);
begin
    SQLExecute('UPDATE users SET logoutdate=DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%S.%f") WHERE id='+IntToStr(idUser));

    slLastAddedID.Free;

end;

procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // SQL query for check user and password
     s := SQLExecute('SELECT count(id) FROM users WHERE (id = ' + frmLogin.cbLogin.sqlValue + ') AND (password = ' + frmLogin.edPassword.sqlValue + ');');

     // if SQL query found login and password
     if (s <> '0') and (s<>'') then
     begin
          idUser := frmLogin.cbLogin.dbItemID;
          SQLExecute('UPDATE users SET logindate=DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%S.%f") WHERE id='+IntToStr(idUser));

          sUser := frmLogin.cbLogin.Text; // remember username
          Form1.Caption := 'User: ' + sUser;
          frmLogin.Close; // close login form
     end else MessageDlg('password is incorrect', mtError, mbOk, 0); // message if the password is incorrect

end;

// window closing event for login
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     // if the user has not been defined, and the user closes the login window, then close the main form
     if sUser='' then Form1.Close;
end;

begin
     slLastAddedID := TStringList.Create;
     frmLogin.Button1.Default := True;
end.

Re: Оповещение о добавленных записях

memult
Я могу помочь только с конкретными вопросами.


Напомните, что вы делаете? Пример подстветки новых записей есть в этой теме.

Dmitry.

Re: Оповещение о добавленных записях

Пример не работает корректно на базе данных Mysql. Поэтому и прислал скрипт, который используется у меня сейчас, с доработками под mysql.

И повторюсь, проблема в том, что подсвечивается только одна запись, как новая. Хотя было добавлено, к примеру 3 записи. Должны светиться все 3 записи.

Re: Оповещение о добавленных записях

memult wrote:

Пример не работает корректно на базе данных Mysql. Поэтому и прислал скрипт, который используется у меня сейчас, с доработками под mysql.

И повторюсь, проблема в том, что подсвечивается только одна запись, как новая. Хотя было добавлено, к примеру 3 записи. Должны светиться все 3 записи.

Оказалось все чуть сложней для MySQL, проект с примером:

Post's attachments

Attachment icon Show last added records (highlight) MySQL.zip 43.47 kb, 395 downloads since 2017-01-27 

Dmitry.

Re: Оповещение о добавленных записях

Добрый день, Дмитрий.
А как быть в случае, если пользователь добавил новую запись юзеру, который уже был "онлайн " в это время? Т. е во время активной сессии этого пользователя?

Re: Оповещение о добавленных записях

memult wrote:

Добрый день, Дмитрий.
А как быть в случае, если пользователь добавил новую запись юзеру, который уже был "онлайн " в это время? Т. е во время активной сессии этого пользователя?

Здравствуйте.


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

Dmitry.

35 (edited by memult 2017-04-10 06:50:19)

Re: Оповещение о добавленных записях

Не могли бы еще раз проверить Ваш приложенный проект (Show last added records (highlight) MySQL.zip)
В целом это работает, но возникают случаи, когда пользователю всплывает оповещение при входе, что были добавлены записи, но по факту ему ничего не добавлялось.

Точнее,в процедуре Form1.onShow, для вывода текстового оповещения я добавил строчку:

if slLastAddedID.Count>0 then
             ShowMessage('Добавлено '+IntToStr(slLastAddedID.Count)+' записи(ей)' );

возможно данное условие некорректно?

Re: Оповещение о добавленных записях

memult wrote:

Не могли бы еще раз проверить Ваш приложенный проект (Show last added records (highlight) MySQL.zip)
В целом это работает, но возникают случаи, когда пользователю всплывает оповещение при входе, что были добавлены записи, но по факту ему ничего не добавлялось.

Точнее,в процедуре Form1.onShow, для вывода текстового оповещения я добавил строчку:

if slLastAddedID.Count>0 then
             ShowMessage('Добавлено '+IntToStr(slLastAddedID.Count)+' записи(ей)' );

возможно данное условие некорректно?

В моем приложенном проекте нет всплываюших оповещений.


Это условие составлено верно.


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

Dmitry.

Re: Оповещение о добавленных записях

Проект довольно объёмный, на Mysql.
При тестировании она работает как надо, но почему-то, как я уже сказал, иногда пользователю1 всплывает оповещение что была добавлена запись ,но ему ничего не добавлялось,а добавлялось другому пользователю2.
Подскажите, возможно нужно к коду :

if slLastAddedID.Count>0 then
             ShowMessage('Добавлено '+IntToStr(slLastAddedID.Count)+' 

Нужно привязать имя пользователя, которому это сообщение должно выводится?

Re: Оповещение о добавленных записях

К сожалению я не могу найти ошибку лишь по одной строчке кода.

Dmitry.