Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2014, 16:38   #1
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию Dbgrid запрет на редактирование строки через определённое время

Уважаемые, подскажите можно ли сделать так:

есть база Microsoft sql server 2008r, база 8, таблица1, поля id,name,date,
есть dbgrid, через него изменяю добавляю значения в бд, как можно по истечению например 15 мин от текущей даты сервера, поставить запрет на редактирование полей текущей строки, т.е:

id name date
1 petrov дата добавления строки 20:00 - те эту строку нужно запретить редактировать
2 ivanov 20:15

как это реализовать, или же это делать средствами Microsoft sql?
spotip вне форума Ответить с цитированием
Старый 24.04.2014, 08:51   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
через него изменяю добавляю значения в бд,
добавить в таблицу поле последней редакции (или отдельная таблица с таким же полем + ID_ref записи к которой данное время относится.
Запись в это поле производить"автоматически" (тригггер, программа без вмешательства пользователя, ...).
при попытке изменения записи проверять данное поле и разрешать (или не разрешать).
проверка на MS SQL =>для записи нужно будет использовать хранимые процедуры.
проверка в программе перед записью (OnBeforePost) выполнить проверочный код и разрешить изменения/отказаться от изменения
проверка до начала редакции выполнить проверочный код и разрешить редакцию/отказаться от редакции

проверочный код
Код:
1.  if not <прошло время> then  Post else Cancel;
2.  if not <прошло время> then ShowEditor else showmessage('запись устарела!!!');
Цитата:
как можно по истечению например 15 мин от текущей даты сервера,
о времени сервера никто кроме сервера не знает (без использования доп. средств типа синхронизации времени) => запись через хранимую процедуру в которой сравнивать текущее с контрольным (то самое поле последней редакции) и выполнять изменения(или нет) в той же ХП можно и менять контрольное время (если редакция будет разрешена).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 24.04.2014 в 08:58.
evg_m вне форума Ответить с цитированием
Старый 24.04.2014, 13:42   #3
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

запретил редактирование данных с помощью триггера
Код:
use [8]
go
create trigger Grafik_trigerdel on [grafik] after update as
if exists(
  select 1 
  from inserted i
  join deleted d on d.id_grafik=i.id_grafik
  where datediff(MINUTE,i.getdate,getdate())>30 
    and i.Nbl != isnull(d.Nbl,0) 
  )
rollback tran;
  GO
при редактировании данных в DBGrid выводит сообщение "Транзакция завершилась в триггере выполнение пакета прервано" и возвращает данные в прошлое значение, т.е так как я хотел, но не подскажете как вместо этого сообщения вывести своё типа "Редактирование запрещено, прошло 30 мин" ?
spotip вне форума Ответить с цитированием
Старый 24.04.2014, 15:37   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В триггере добавить raiserror
Код:
  raiserror 13001 'Редактирование запрещено, прошло 30 мин'
  rollback transaction
В проге примерно так
Код:
  try
    ADOQuery1.ExecSQL;
  except
  on E: Exception do ShowMessage(E.Message);
  end;
ADD

Не обратил внимания, что тут грид. Тогда, например, так в проге:
Код:
procedure TForm1.ADOQuery1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
  ADOQuery1.CancelUpdates;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.04.2014 в 16:11.
Аватар вне форума Ответить с цитированием
Старый 24.04.2014, 16:29   #5
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Спасибо Большое всё получилось !
spotip вне форума Ответить с цитированием
Старый 29.04.2014, 10:42   #6
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В триггере добавить raiserror
Код:
  raiserror 13001 'Редактирование запрещено, прошло 30 мин'
  rollback transaction
В проге примерно так
Код:
  try
    ADOQuery1.ExecSQL;
  except
  on E: Exception do ShowMessage(E.Message);
  end;
ADD

Не обратил внимания, что тут грид. Тогда, например, так в проге:
Код:
procedure TForm1.ADOQuery1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
  ADOQuery1.CancelUpdates;
end;
я хотел уточнить а можно как-то вывести сообщение без добавление в триггер
Код:
raiserror 13001 'Редактирование запрещено, прошло 30 мин'
, т.к. после добавления raiserror не совсем корректно работает мой триггер, сделал так:
Код:
procedure TDataModule2.Graf_Query1PostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
Graf_Query1.CancelUpdates;
ShowMessage('Редактирование запрещено, прошло 30 мин');
end;
выводится первое моё сообщение а потом сообщение "Транзакция завершилась в триггере выполнение пакета прервано"
можно ли как-то убрать отображение второго сообщения?
spotip вне форума Ответить с цитированием
Старый 29.04.2014, 10:54   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
можно ли как-то убрать отображение второго сообщения?
Цитата:
Код:
procedure TDataModule2.Graf_Query1PostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
узнать в справке зачем здесь var Action.
Цитата:
TDataAction indicates how an application should respond to a database error condition.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.04.2014, 11:22   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
хотел уточнить а можно как-то вывести сообщение без добавление в триггер
Не правильное решение. Теоретически и практически на Post-е может вывалится ошибка не только связанная с rollback в триггере. А у вас на все случаи жизни будет одно и тоже сообщение, которое может не соответствовать действительности
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.04.2014, 11:58   #9
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Код:
use [8]
go
create trigger Grafik_trigerdel on [grafik] after update as
if exists(
  select 1 
  from inserted i
  join deleted d on d.id_grafik=i.id_grafik
  where datediff(MINUTE,i.getdate,getdate())>30 
    and i.Nbl != isnull(d.Nbl,0) 
  )
 raiserror 13001 'Редактирование запрещено, прошло 30 мин'
 rollback tran;
  GO
ну а с raiserror 13001 он почему то запрещает редактировать мне все ячейки, где тут связь я так и не понял.
spotip вне форума Ответить с цитированием
Старый 29.04.2014, 12:09   #10
spotip
Пользователь
 
Регистрация: 09.06.2010
Сообщений: 68
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
узнать в справке зачем здесь var Action.
спасибо за подсказку так получилось:
Код:
procedure TDataModule2.Graf_Query1PostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
Action := daAbort;
ShowMessage('Редактирование запрещено, прошло 30 мин');
end;
spotip вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование через DBGrid представления. Rin БД в Delphi 19 16.03.2014 21:40
Время + dbgrid подкрашивание строки Kuraj БД в Delphi 3 01.04.2010 10:00
цикл на определённое время Nitrino Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 12.01.2010 13:57
Запрет на редактирование Aleksandr Microsoft Office Excel 3 02.09.2009 10:50
Как создать событие(которое выполняется в определённое время) micaell Общие вопросы Delphi 5 13.12.2006 18:35