Topic: Журнал учета работы (т.н. логи)

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

2 (edited by kunar80 2014-11-16 17:40:40)

Re: Журнал учета работы (т.н. логи)

Я делал так:
- на форме записи спрятан Едитбокс (он больше ни для чего мне не нужен), в который копируется логин  с формы входа.
- в главной таблице колонка user
- в таблице данных журнала колонка user
Фрагмент кода:

procedure frmDocProcessingShort_bOK3_OnClick (Sender: string; var Cancel: boolean);
var
   sCurrentDate: string;
   sDocNameNAF: string;
   sOperation: string;
   sUser: string;
   sForm: string;
begin
     sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';
     sDocNameNAF  := '"'+frmDocProcessingShort.MemoDocName3.Text+'"';
     sUser  := '"'+frmDocProcessingShort.user.Text+'"';
     sForm  := '"'+frmDocProcessingShort.form.Text+'"';

     if sLastActionForm = 'NewRecord' then sOperation := '"Додано"';
     if sLastActionForm = 'ShowRecord' then sOperation := '"Змінено"';

     SQLExecute ('INSERT INTO logNAF (date, user, form, operation, docNameNAF)' +
     'VALUES ('+sCurrentDate+', '+sUser+', '+sForm+','+sOperation+','+sDocNameNAF+')');
     frmActions1.tgActions1.dbUpdate;
end; 

В итоге у меня в журнале пишется логин. Кроме того, таким же образом через sForm у меня учитываются таблицы ( а их три , на форме заполнения каждой - едитбокс, в нём некое значение по умолчанию), по которым была работа:

procedure frmDocProcessingNAF_OnShow (Sender: string; Action: string);
begin
     frmDocProcessingNAF.user.Text:=sUser; // запись логина в EditBox на frmDocProcessingNAF
     frmDocProcessingNAF.form.Text := 'НАФ';
     sLastActionForm := Action;
Не боги горшки лепят!

Re: Журнал учета работы (т.н. логи)

Спасибо за ответ!
У меня удаление работает по штатной sUser переменной объявленной глобально, но вот манипуляции с новой записью и редактированием почему то не хочет записывать. выдает ошибку.

Re: Журнал учета работы (т.н. логи)

Надо еще добавить что с базой работают по сети и как будет реагировать программа на сохранение Логина в журнал я пока не знаю но по первым прикидкам вроде работает по крайней мере с удалением проверял

Re: Журнал учета работы (т.н. логи)

взял в три ковычки в запросе переменную при редактировании и добавлении '''+sUser+''' так что если один раз задали глобальную переменную sUser можно обойтись без всяких editов

Re: Журнал учета работы (т.н. логи)

delphinsl
Т.е. все ок? или вопрос еще открыт?

Dmitry.

Re: Журнал учета работы (т.н. логи)

Все ок. сегодня проверил работает по сети.

8 (edited by Игоревич 2016-11-16 08:04:49)

Re: Журнал учета работы (т.н. логи)

В таблице БД создал поле username-текст, добавил переменную

 var
sUserName: string;

procedure FormGlavn_OnClose (Sender: string; Action: string);
begin
 SQLExecute('INSERT INTO logs (username,user, action, datetime) VALUES ("''+ sUserName +''", "'+sUser+'", "Выход", "'+ FormatDateTime('yyyy-MM-DD hh:mm:ss.000', now) +'"); ');
end;

procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);  
SQLExecute('INSERT INTO logs (username,user, action, datetime) VALUES ("''+ sUserName +''","'+sUser+'", "Вход", "'+ FormatDateTime('yyyy-MM-DD hh:mm:ss.000', now) +'"); ');
         FrmLogs.TableGrid1.dbUpdate;end;

Выдает синтаксическую ошибку. Хочу сделать чтобы в логах писалось с какого компьтера заходил пользователь. Посмотрите пож где ошибка в коде, а то я уже замучался. Заранее спс.

Re: Журнал учета работы (т.н. логи)

Игоревич
Помоему здесь лишняя кавычка

"''+ sUserName +''"

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

"'+ sUserName +'"

но лучше приложить проект

Dmitry.

Re: Журнал учета работы (т.н. логи)

Перед носом было не увидел. Спс

11 (edited by Игоревич 2016-11-18 07:06:43)

Re: Журнал учета работы (т.н. логи)

Почти все получилось остался один момент. Посмотрите пож скрипт что в нем не так. Дату, с какого компа зашли, пользователь и действие (удалил пишет) а что удалил нет.

 procedure FormGlavn_bDelete_OnAfterClick (Sender: string);
var
   sCurrentDate: string;
begin
      sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';


     SQLExecute ('INSERT INTO logs (username,user,datetime, action, id_emp, Obekt, Sistema, Usel, dateofbirth)' +
     'VALUES ('+ sUserName +',"'+sUser+'",'+sCurrentDate+',"Удалил",'+'NULL'+',"'+sDeletedObekt+'","'+sDeletedSistema+'","'+sDeletedUsel+'",NULL)');
     FrmLogs.TableGrid1.dbUpdate;
end;

И ошибок не выдает. После "Удалил", не вносит в таблицу данные Заранее спс.

Re: Журнал учета работы (т.н. логи)

Игоревич
По данном отрывку кода я не могу определить ошибку, видимо в скрипте используются глобальные переменные, которые не описаны в этом событии (такие как sDeletedObekt, sDeletedSistema) и формируются где то в  других частях скрипта.

Dmitry.

13 (edited by Игоревич 2016-11-18 15:15:12)

Re: Журнал учета работы (т.н. логи)

Весь код.

var
   sUser: string = '';
   idUser: integer = -1;
   isAdmin: boolean = False;
   isCheckBox: boolean = False;
   sHello: string;
   Timer: TTimer;
   /////////Переменные логов///////
   sUserName: string;
   sLastActionForm: string;
   sEmpID: string;
   sDeletedObekt: string;
   sDeletedSistema : string;
   sDeletedUsel : string;
   sDeletedID: string;
   sDeletedBirthDate: string;
{== Логи ===========================================================================================}
   // Окрашивание строк в лога

procedure FrmLogs_TableGrid1_OnChange (Sender: string);
  var
    i,c,f,r: integer;
begin
    c := FrmLogs.TableGrid1.RowCount - 1;
    f := FrmLogs.TableGrid1.Columns.Count - 1;
  for i := 0 to c do
    begin
      if FrmLogs.TableGrid1.Cells[3,i]='Вход'
          THEN
            for r := 0 to f do
               FrmLogs.TableGrid1.Cell[r,i].Color := $0080FFFF; // закрашивание всей строки
                ///закрашивание ячеек
               if FrmLogs.TableGrid1.Cells[3,i] = 'Добавил' then FrmLogs.TableGrid1.Cell[3,i].Color := $0080FF80;
               if FrmLogs.TableGrid1.Cells[3,i] = 'Удалил' then FrmLogs.TableGrid1.Cell[3,i].Color := $008080FF;
               if FrmLogs.TableGrid1.Cells[3,i] = 'Редактировал' then FrmLogs.TableGrid1.Cell[3,i].Color := clSilver;
     end;
end;


  ////////////Логи входа////////////////////////////


procedure FrmLogs_Button1_OnClick (Sender: string; var Cancel: boolean); ///////Очистить лог входа////
  var
   i,c: integer;
begin
    // запрашивает пароль, пароль: 123, если ввели не верно, действие кнопки отменяется (Cancel := True)
    if InputBox ('Запрос', 'Введите пароль', '') = '123' then
    begin

        c := FrmLogs.TableGrid1.RowCount - 1; // count of records in TableGrid
        for i :=0 to c do
            SQLExecute('DELETE FROM logs WHERE id = ' + IntToStr(FrmLogs.TableGrid1.dbIndexToID(i)) );

        FrmLogs.TableGrid1.dbUpdate;

    end;

end;

procedure FormGlavn_OnClose (Sender: string; Action: string);
begin
 SQLExecute('INSERT INTO logs (username, user, action, datetime) VALUES ('+ sUserName +',"'+sUser+'", "Выход", "'+ FormatDateTime('yyyy-MM-DD hh:mm:ss.000', now) +'"); ');
    FrmLogs.TableGrid1.dbUpdate;

  /// проверка на двойное открытие программы
  if idUser <> -1 then SQLExecute('UPDATE users SET isOnline=0 WHERE id='+IntToStr(idUser) );

    /// Создание резервной копии БД при закрытии
   CopyFile('sqlite.db', 'Backup/backup '+ FormatDateTime('dd-mm-yyyy', now)+'.db');  // запись резервного файла БД при выходе
        Timer.Free;
        frmLogin.Close;
        Exit;

end;

////////Логи редактирования БД/////////////////

 procedure formIzm_bOK_OnAfterClick (Sender: string);
 var
   sCurrentDate: string;
   sID: string;
   sObekt: string;
   sSistema: string;
   sUsel: string;
   sBirthDate: string;
   sOperation: string;
begin
     sEmpID := IntToStr(formIzm.bOK.dbGeneralTableID);
     sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';
     sObekt   := '"'+formIzm.ComboBox1.Text+'"';
     sSistema  := '"'+formIzm.ComboBox3.Text+'"';
     sUsel  := '"'+formIzm.ComboBox7.Text+'"';

     if formIzm.DateIZM.Checked then
          sBirthDate  := '"' + FormatDateTime('yyyy-MM-DD 00:00:00.000', formIzm.DateIZM.Date) + '"'
          else sBirthDate := 'NULL';


     if sLastActionForm = 'NewRecord' then sOperation := '"Добавил"';
     if sLastActionForm = 'ShowRecord' then sOperation := '"Редактировал"';

     SQLExecute ('INSERT INTO logs (username,user, datetime, action, id_emp, Obekt, Sistema, Usel, dateofbirth)' +
     'VALUES ('+ sUserName +',"'+sUser+'",' +sCurrentDate+','+sOperation+','+sEmpID+','+sObekt+','+sSistema+','+sUsel+','+sBirthDate+')');
     FrmLogs.TableGrid1.dbUpdate;
end;

 procedure FormGlavn_bDelete_OnAfterClick (Sender: string);
var
   sCurrentDate: string;
begin
      sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';


     SQLExecute ('INSERT INTO logs (username,user,datetime, action, id_emp, Obekt, Sistema, Usel, dateofbirth)' +
     'VALUES ('+ sUserName +',"'+sUser+'",'+sCurrentDate+',"Удалил",'+'NULL'+',"'+sDeletedObekt+'","'+sDeletedSistema+'","'+sDeletedUsel+'",NULL)');
     FrmLogs.TableGrid1.dbUpdate;
end;
                                          
{=============================================================================================}


   ////Изменение пароля пользователем


 procedure frmChangePassword_OnShow (Sender: string; Action: string);
begin
    frmChangePassword.edPassword.Clear;
    frmChangePassword.edNewPassword.Clear;
    frmChangePassword.edNewPassword2.Clear;
end;

procedure frmChangePassword_Button1_OnClick (Sender: string; var Cancel: boolean);
var
    s: string;
begin
    // SQL-запрос для проверки пользователя и пароля
    s := VarToStr( SQLExecute('SELECT count(id) FROM users WHERE (login = ''' + sUser + ''') AND (password = ' + frmChangePassword.edPassword.sqlValue + ');') );

    // если SQL-запрос найден логин и пароль
    if (s <> '0') and (s<>'') then
    begin
        if frmChangePassword.edNewPassword.Text = frmChangePassword.edNewPassword2.Text then
        begin

            // изменить пароль
            SQLExecute('UPDATE users SET password='+frmChangePassword.edNewPassword.sqlValue + ' WHERE login = ''' + sUser + '''');
            ShowMessage('Пароль был изменен.');
            frmChangePassword.Close;

        end else ShowMessage('Разные пароли в текстовых полях "новый пароль" и "повторите новый пароль".');
    end else ShowMessage('Неправильный пароль.');
end;

 ////////////////////////////////////////////////////////

 // дубликат таблицы

procedure FormGlavn_TableGrid2_OnClick (Sender: string; var Cancel: boolean);
begin
    if FormGlavn.TableGrid2.dbItemID <> -1 then
    begin
        FormGlavn.TableGrid1.dbFilter := 'id_TabOtkaz  ='+FormGlavn.TableGrid2.sqlValue;
        FormGlavn.TableGrid1.dbUpdate;
    end else
    begin
        FormGlavn.TableGrid1.dbFilter := '';
        FormGlavn.TableGrid1.dbUpdate;
    end;
    // отключенная кнопка пошаговые действия при не выделенной строке в таблице
    ///begin
    ////if FormGlavn.TableGrid2.SelectedRow = -1 then Cancel := True;
//////end;
end;


procedure formIzm_CheckBox1_OnKeyUp (Sender: string; var Key: Word; Shift, Alt, Ctrl: boolean);
begin
     if (isCheckBox) and (formIzm.bOK.dbGeneralTableId>0) then
         SQLExecute('UPDATE TabOtkaz SET StatusOtkaza = ' + formIzm.CheckBox1.sqlValue + ' WHERE id = '+IntToStr(formIzm.bOK.dbGeneralTableId));
end;

procedure formIzm_CheckBox1_OnMouseUp (Sender: string; MouseLeft, MouseRight, MouseMiddle: boolean; Shift, Alt, Ctrl: boolean; X, Y: Integer);
begin
     if (isCheckBox) and (formIzm.bOK.dbGeneralTableId>0) then
         SQLExecute('UPDATE TabOtkaz SET StatusOtkaza = ' + formIzm.CheckBox1.sqlValue + ' WHERE id = '+IntToStr(formIzm.bOK.dbGeneralTableId));
end;


procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // SQL-запрос на регистрацию пользователя и пароль
     s := SQLExecute('SELECT count(id) FROM users WHERE (id = ''' + IntToStr(frmLogin.cbLogin.dbItemID) + ''') AND (password = ''' + frmLogin.edPassword.Text + ''');');

     // SQL-запрос найден логин и пароль
     if (s <> '0') and (s<>'') then
     begin
          sUser := frmLogin.cbLogin.Text; // запомнить имя пользователя
          idUser := frmLogin.cbLogin.dbItemID; // запомнить идентификатор пользователя в базе

      /////Регистрация двойного входа
          if SQLExecute( 'SELECT isOnline FROM users WHERE id='+IntToStr(frmLogin.cbLogin.dbItemID) ) = '1' then
              if mrNo = MessageDlg(('Пользователь уже в сети. Вы действительно хотите войти?'), mtInformation, mbYes+mbNo, 0) then FormGlavn.Close;

        /////Логи входа/////

         SQLExecute('INSERT INTO logs (username, user, action, datetime) VALUES ('+ sUserName +',"'+sUser+'", "Вход", "'+ FormatDateTime('yyyy-MM-DD hh:mm:ss.000', now) +'"); ');
         FrmLogs.TableGrid1.dbUpdate;
           ///////////////////

          // Administrator?    Видно только для админа
 if SQLExecute ('SELECT admin FROM users WHERE id = '+IntToStr(idUser)) = '1' then isAdmin := True;
        FormGlavn.bUsers.Visible:=isAdmin;
        FormGlavn.Button5.Visible:=isAdmin;
        ///FormGlavn.bDelete.Visible:=isAdmin;
        FormGlavn.mniOptions.Visible := isAdmin;
        formIzm.Button6.Visible:=isAdmin;
        formIzm.Button5.Visible:=isAdmin;
        formIzm.Button7.Visible:=isAdmin;
        FormGlavn.Button1.Visible:=isAdmin;
        FormGlavn.GroupBox6.Visible:=isAdmin;
           // Can change CheckBox?
          if SQLExecute ('SELECT CheckBox FROM users WHERE id = '+IntToStr(idUser)) = '1' then isCheckBox := True;

          FormGlavn.Caption := 'User: ' + sUser;
          frmLogin.Close; // Закрыть главную форму
          SQLExecute('UPDATE users SET isOnline=1 WHERE id='+IntToStr(idUser) );
     end else MessageDlg('Некорректный пароль', mtError, mbOk, 0); // сообщение если неверный пароль

end;


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

// мероприятия закрытия окна для входа
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     // если пользователь не определен, и Пользователь закрывает окно входа в систему, закройте главную форму
     if sUser='' then FormGlavn.Close;
end;


procedure formIzm_OnShow (Sender: string; Action: string);
begin
begin
    if Action = 'NewRecord' then formIzm.cbUser.dbItemID := idUser ;
        /////////логи редактирования бд////
     sLastActionForm := Action;
     sEmpID := IntToStr(formIzm.bOK.dbGeneralTableId);
end;

   /////////Неактивная не своя запись//////////////////////////

 begin
    formIzm.DateIZM.Enabled := true;
    formIzm.ComboBox1.Enabled := true;
    formIzm.ComboBox3.Enabled := true;
    formIzm.Edit1.Enabled := true;
    formIzm.DBImage1.Enabled := true;
    formIzm.bOK.Enabled := true;
    formIzm.Memo1.Enabled := true;
    formIzm.ComboBox4.Enabled := true;
    formIzm.ComboBox5.Enabled := true;
    formIzm.ComboBox7.Enabled := true;
    formIzm.ComboBox2.Enabled := true;
    formIzm.ComboBox6.Enabled := true;
    formIzm.USTRsave.Enabled := true;
   
    if (Action = 'ShowRecord') and (not isAdmin) then
    begin
        if formIzm.cbUser.dbItemID <> idUser then
        begin
            formIzm.DateIZM.Enabled := false;
            formIzm.ComboBox1.Enabled := false;
            formIzm.ComboBox3.Enabled := false;
            formIzm.Edit1.Enabled := false;
            formIzm.DBImage1.Enabled := false;
            formIzm.bOK.Enabled := false;
            formIzm.Memo1.Enabled := false;
            formIzm.ComboBox4.Enabled := false;
            formIzm.ComboBox5.Enabled := false;
            formIzm.ComboBox7.Enabled := false;
            formIzm.ComboBox2.Enabled := false;
            formIzm.ComboBox6.Enabled := false;
            formIzm.USTRsave.Enabled := false;

        end;
    end;

end;


end;

// защитить от удаления
procedure FormGlavn_bDelete_OnClick (Sender: string; var Cancel: boolean);
var
    sIdUser: string;
begin
    if isAdmin then Exit;

    sIdUser:=SQLExecute('SELECT id_users FROM TabOtkaz WHERE id='+IntToStr(FormGlavn.TableGrid2.dbItemID));
    if sIdUser<>IntToStr(idUser) then
    begin
        Cancel := True;
        ShowMessage('У вас нет разрешения удалять записи, которые не принадлежат вам.');
    end;
    ///////Логи изменения БД////

begin
     sDeletedObekt := FormGlavn.TableGrid2.Cells[3, FormGlavn.TableGrid2.SelectedRow];
     sDeletedSistema:= FormGlavn.TableGrid2.Cells[4, FormGlavn.TableGrid2.SelectedRow];
     sDeletedUsel:= FormGlavn.TableGrid2.Cells[5, FormGlavn.TableGrid2.SelectedRow];
     sDeletedID := IntToStr(FormGlavn.TableGrid2.dbItemID);
     sDeletedBirthDate := SQLExecute ('SELECT dateofbirth FROM logs WHERE id = ' + IntToStr(FormGlavn.TableGrid2.dbItemID) );
end;
end;

// защитить от редактирования
procedure formIzm_bOK_OnClick (Sender: string; var Cancel: boolean);
begin
    if isAdmin then Exit;

    if idUser<>formIzm.cbUser.dbItemID then
    begin
        Cancel := True;
        ShowMessage('У вас нет разрешения редактировать записи, которые не принадлежат вам.');
    end;

    // нажатие скрытой кнопки  formIzm.Button12.Click;  

   

end;

procedure FormGlavn_OnShow (Sender: string; Action: string);
begin
     frmLogin.edPassword.PasswordChar := '*';
     frmLogin.ShowModal; // Форма для входа
     FormGlavn.mniAbout.OnClick := @MenuClickAbout;
     ///Дата в эдит на главной форме
     begin
        FormGlavn.Edit4.Text := FormatDateTime('DD-MM-yyyy', now);
end;

end;

procedure MenuClickAbout (Sender: string); // click in About menu item
begin
     frmAbout.ShowModal;
end;

  /////вывод фото на главную форму
procedure FormGlavn_TableGrid2_OnCellClick (Sender: string; ACol, ARow: Integer);
begin
  zapolnenie();
  begin
     FormGlavn.DBImage1.Clear;
     FormGlavn.DBImage1.LoadFromDatabase('TabOtkaz', 'ZapasFoto', FormGlavn.TableGrid2.dbItemID);
end;
end;

procedure FormGlavn_TableGrid2_OnKeyUp (Sender: string; var Key: Word; Shift, Alt, Ctrl: boolean);
begin
   zapolnenie();
end;

procedure   zapolnenie ();
var
 idS : string;
begin
 idS := inttostr(FormGlavn.TableGrid2.dbItemID) ;

 FormGlavn.VneshProyavlOtkaza.Text := SQLExecute('SELECT Proyav_name FROM TabProyavlen WHERE id =(SELECT id_TabProyavlen FROM tabotkaz WHERE id = '+idS+')' ) ;
 FormGlavn.LitsoObnaruj.Text := SQLExecute('SELECT Obnarug_name FROM TabObnarug WHERE id =(SELECT id_TabObnarug FROM tabotkaz WHERE id = '+idS+')' ) ;
 FormGlavn.MetodUstraneniya.Text := SQLExecute('SELECT Metod_name FROM TabMetod WHERE id =(SELECT id_TabMetod FROM tabotkaz WHERE id = '+idS+')' ) ;
 FormGlavn.UsloviyaObnaruj.Text :=  SQLExecute('SELECT Usl_name FROM TabUslovia WHERE id =(SELECT id_TabUslovia FROM tabotkaz WHERE id = '+idS+')' ) ;
 FormGlavn.Komentarii.Text := SQLExecute('SELECT Primechanie FROM tabotkaz WHERE id = '+idS ) ;
 FormGlavn.Edit3.Text := SQLExecute('SELECT OtcLico FROM tabotkaz WHERE id = '+idS ) ;
 FormGlavn.Edit2.Text := SQLExecute('SELECT login FROM users WHERE id =(SELECT id_users FROM tabotkaz WHERE id = '+idS+')' ) ;

  ////FormGlavn.Edit2.Text :=  SQLExecute('SELECT city FROM City WHERE id =(SELECT id_City FROM tabotkaz WHERE id = '+idS+')' ) ;
 ///FormGlavn.DefektNomer.Text := SQLExecute('SELECT DEF№ FROM tabotkaz WHERE id = '+idS ) ;
 ////FormGlavn.Obekt.Text :=  SQLExecute('SELECT country FROM Country WHERE id =(SELECT id_Country FROM Region WHERE id = '+idS+')' ) ;
 /////FormGlavn.Edit4.Text :=  SQLExecute('SELECT region FROM Region WHERE id =(SELECT id_Region FROM City WHERE id = '+idS+')' ) ;


end;

   // открытие файла руководство пользователя

procedure FormGlavn_Button3_OnClick (Sender: string; var Cancel: boolean);

begin

    OpenFile(ExtractFilePath(Application.ExeName) +'HelpR.chm');

end;

  // Окрашивание строк в главной таблицы
  
procedure FormGlavn_TableGrid2_OnChange (Sender: string);
var
    i,c,f,r: integer;
begin
    c := FormGlavn.TableGrid2.RowCount - 1;
    f := FormGlavn.TableGrid2.Columns.Count - 1;
  for i := 0 to c do
    begin
      if FormGlavn.TableGrid2.Cells[0,i]='Нет'
          THEN
            for r := 0 to f do
               FormGlavn.TableGrid2.Cell[r,i].Color := $008080FF; // закрашивание всей строки
    end;

end;


procedure FormGlavn_TableGrid1_OnChange (Sender: string);
  var
    i,c,f,r: integer;
begin
    c := FormGlavn.TableGrid1.RowCount - 1;
    f := FormGlavn.TableGrid1.Columns.Count - 1;
  for i := 0 to c do
    begin
      if FormGlavn.TableGrid1.Cells[4,i]='Отказ'
          THEN
            for r := 0 to f do
               FormGlavn.TableGrid1.Cell[r,i].Color := $008080FF; // закрашивание всей строки
    end;
end;

  // Окрашивание строк в подчиненной таблицы

  procedure formIzm_TableGrid1_OnChange (Sender: string);

  var
    i,c,f,r: integer;
begin
    c := formIzm.TableGrid1.RowCount - 1;
    f := formIzm.TableGrid1.Columns.Count - 1;
  for i := 0 to c do
    begin
      if formIzm.TableGrid1.Cells[4,i]='Отказ'
          THEN
            for r := 0 to f do
               formIzm.TableGrid1.Cell[r,i].Color := $008080FF; // закрашивание всей строки
    end;
end;

       // администрирование подчиненной таблицы
      // защитить от редактирования подчиненной таблицы


procedure formIzm_Button2_OnClick (Sender: string; var Cancel: boolean);
var
    sIdUser: string;
begin
    if isAdmin then Exit;

    sIdUser:=SQLExecute('SELECT id_users FROM TabDeystvPerson WHERE id='+IntToStr(formIzm.TableGrid1.dbItemID));
    if sIdUser<>IntToStr(idUser) then
    begin
        Cancel := True;
        ShowMessage('У вас нет разрешения редактировать записи, которые не принадлежат вам.');
    end;
end;

     // защитить от удаления подчиненной таблицы
procedure formIzm_Button3_OnClick (Sender: string; var Cancel: boolean);
var
    sIdUser: string;
begin
    if isAdmin then Exit;

    sIdUser:=SQLExecute('SELECT id_users FROM TabDeystvPerson WHERE id='+IntToStr(formIzm.TableGrid1.dbItemID));
    if sIdUser<>IntToStr(idUser) then
    begin
        Cancel := True;
        ShowMessage('У вас нет разрешения удалять записи, которые не принадлежат вам.');
    end;
end;


begin
  //  Начала проверьте, есть ли пользователь, администратор базы данных
  // если нет, создать учетную запись администратора с именем пользователя admin и паролем admin
     if SQLExecute('SELECT count(id) FROM users;') = '0' then
     begin
         SQLExecute('INSERT INTO users (login, password, admin) VALUES ("admin", "admin", 1);');
         frmLogin.cbLogin.dbItemID:=1;
         frmLogin.edPassword.Text := 'admin';
     end;
     frmLogin.Button1.Default := True;
     formIzm.cbUser.Enabled:=false;
     ///лог входа
      sUserName := '"'+GetUserName+'"';
     ////Ограничение ввыода в ГРИД
     FormGlavn.TableGrid2.dbLimit := 1000;

end.








                                                           

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

Re: Журнал учета работы (т.н. логи)

Игоревич
Пожалуйста прикладывайте проект целиком, я не смогу запустить скрипт в голове, чтобы протестировать его )

Dmitry.

15 (edited by Игоревич 2016-11-21 17:22:14)

Re: Журнал учета работы (т.н. логи)

Ссылка на проект. https://cloud.mail.ru/public/9Mbm/1Pcpwg68U
В данном случае он берет имя с учетной записи операционной системы, Как сделать чтобы брал имя компьютера.

Re: Журнал учета работы (т.н. логи)

Игоревич wrote:

Ссылка на проект. https://cloud.mail.ru/public/9Mbm/1Pcpwg68U
В данном случае он берет имя с учетной записи операционной системы, Как сделать чтобы брал имя компьютера.

в данном скрипте

// защитить от удаления
procedure FormGlavn_bDelete_OnClick (Sender: string; var Cancel: boolean);
var
    sIdUser: string;
begin
    if isAdmin then Exit;

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

     sDeletedObekt := FormGlavn.TableGrid2.Cells[3, FormGlavn.TableGrid2.SelectedRow];
     ShowMessage(sDeletedObekt);
     sDeletedSistema:= FormGlavn.TableGrid2.Cells[4, FormGlavn.TableGrid2.SelectedRow];
     sDeletedUsel:= FormGlavn.TableGrid2.Cells[5, FormGlavn.TableGrid2.SelectedRow];
     sDeletedID := IntToStr(FormGlavn.TableGrid2.dbItemID);
     sDeletedBirthDate := SQLExecute ('SELECT dateofbirth FROM logs WHERE id = ' + IntToStr(FormGlavn.TableGrid2.dbItemID) );

поэтому в логи ничего не попадает.



к сожалению проверить по сети проект пока нет возможности.

Dmitry.

Re: Журнал учета работы (т.н. логи)

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

Re: Журнал учета работы (т.н. логи)

Игоревич wrote:

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

Добавил функцию GetComputerName, которая возвращает имя компьютера в последнюю альфа версию.
Скачайте пожалуйста:
http://myvisualdatabase.com/forum/viewtopic.php?id=2887

Dmitry.

Re: Журнал учета работы (т.н. логи)

Не могли бы вы посмотреть скрипт. В логах дату создания записи не ставит при удалении. А то я уже скоро глаза сломаю об экран.Заранее спс. При редактировании и добавлении ставит.

Re: Журнал учета работы (т.н. логи)

Игоревич wrote:

Не могли бы вы посмотреть скрипт. В логах дату создания записи не ставит при удалении. А то я уже скоро глаза сломаю об экран.Заранее спс. При редактировании и добавлении ставит.

описывайте подробней, о каком поле БД идет речь, dateofbirth?


также я вижу что при удалении записи вы записываете NULL в поле datebirth

     SQLExecute ('INSERT INTO logs (username,user,datetime, action, id_emp, Obekt, Sistema, Usel, dateofbirth)' +
     'VALUES ('+ sUserName +',"'+sUser+'",'+sCurrentDate+',"Удалил",'+'NULL'+',"'+sDeletedObekt+'","'+sDeletedSistema+'","'+sDeletedUsel+'",NULL)');
Dmitry.

Re: Журнал учета работы (т.н. логи)

DriveSoft wrote:
Игоревич wrote:

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

Добавил функцию GetComputerName, которая возвращает имя компьютера в последнюю альфа версию.
Скачайте пожалуйста:
http://myvisualdatabase.com/forum/viewtopic.php?id=2887

Не могли бы вы сделать пример проекта с функцией GetComputerName для всего форума. Я сделал из ваших двух проектов один. Вам нужно только подправить и в проекте одна ошибка выпадает. Я думаю это нужно не только мне. Заранее спс.

Post's attachments

Attachment icon LoginEx and logs_GetComputerName.zip 375.06 kb, 452 downloads since 2016-11-24 

Re: Журнал учета работы (т.н. логи)

Igor.Stepanov
Готово.

Post's attachments

Attachment icon LoginEx and logs_GetComputerName_fixed.zip 45.17 kb, 535 downloads since 2016-11-24 

Dmitry.

Re: Журнал учета работы (т.н. логи)

Огрооооооооооооооомное спс.

Re: Журнал учета работы (т.н. логи)

DriveSoft wrote:
Игоревич wrote:

Не могли бы вы посмотреть скрипт. В логах дату создания записи не ставит при удалении. А то я уже скоро глаза сломаю об экран.Заранее спс. При редактировании и добавлении ставит.

описывайте подробней, о каком поле БД идет речь, dateofbirth?


также я вижу что при удалении записи вы записываете NULL в поле datebirth

     SQLExecute ('INSERT INTO logs (username,user,datetime, action, id_emp, Obekt, Sistema, Usel, dateofbirth)' +
     'VALUES ('+ sUserName +',"'+sUser+'",'+sCurrentDate+',"Удалил",'+'NULL'+',"'+sDeletedObekt+'","'+sDeletedSistema+'","'+sDeletedUsel+'",NULL)');

Да речь идет о поле dateofbirth при удалении. Скрипт брал по одному из ваших премеров. Переделывал по другому примеру где не стоит нуль но почемуто в базу при удалении записи он не пишет дату создания. Уже перепробывал много вариантов и не получается. Все остальное получилось. И имя компьютера выводит. Ссылка на проект выше в сообщениях. Заранее спс.

Re: Журнал учета работы (т.н. логи)

Игоревич
Скачал проект снова и я честно говоря запутался, дату удаления пишет в базу, судя по скрипту поле dateofbirth не является датой удаления.

Dmitry.