Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.10;
Скачать: CL | DM;

Вниз

Запрет на редактирование/удаление записи по значению   Найти похожие ветки 

 
Kostafey ©   (2007-05-17 19:43) [0]

Уважаемые Мастера !
Озадачился я, казалось бы, простой проблеммой.
Необходимо запретить редактирование/удаление записи у которой
значение такого-то поля равно таким-то значениям.
Сделал я такой запрет и прослезился (ADO, Access):


// IsInStringArray - функция, возвращающая true, если искомое значение найдено в массиве

//Запрет редакирования
procedure TFormTipDogovoraEdit.DBGridEh1KeyPress(Sender: TObject;
 var Key: Char);
begin
 if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName("Tip").AsString , TemplTipArray)) then
   Key := #0;
end;

//Запрет удаления
procedure TFormTipDogovoraEdit.ToolButtonDeleteClick(Sender: TObject);
begin
 if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName("Tip").AsString , TemplTipArray)) then
 begin
   ShowMessage("Данный тип договора зарегистрирован в списке шаблонов");
   exit;
 end;
 DataModule1.ADODataSetTipDogovora.Delete;
end;

Работать-то работает.
Вроде (пока ошибок не возникало).
Но так глупо выглядит.
Интернет прошерстил - тоже ничего.


 
palva ©   (2007-05-17 19:52) [1]

Если перейти на нормальный SQL-сервер, то можно написать триггер, который будет запрещать удаление на уровне SQL-сервера. А в Access ненадежно - запись можно будет удалить какой-нибудь другой программой.


 
Kostafey ©   (2007-05-17 20:02) [2]

> Если перейти на нормальный SQL-сервер

Я бы с удовольствием, но для этой задачи СУБД уже не изменить.


> А в Access ненадежно - запись можно будет удалить какой-
> нибудь другой программой.

А это не важно. У них на рабочих местах Access не стоит, да если они
все-таки умудряться удалить то что не следует - сами будут виноваты.

А кстати как еще можно mdb-файл редактировать не через Access
(я имею в виду стандартные клиенты)?


 
Sergey13 ©   (2007-05-18 08:55) [3]

> [0] Kostafey ©   (17.05.07 19:43)

Это элементарно сделать, если понять что в гриде нет данных, они в датасете, у которого, в свою очередь, есть события например BeforeEdit, BeforeInsert и т.п.


 
Desdechado ©   (2007-05-18 11:04) [4]

Sergey13 ©   (18.05.07 08:55) [3]
Я бы сделал еще проще: в AfterScroll изменял бы возможность редактирования (ReadOnly) датасета или конкретного поля, если, конечно, не нужно разделять отдельные операции по удалению/изменению строк.


 
Kostafey ©   (2007-05-18 11:06) [5]

> Это элементарно сделать, если понять что в гриде нет данных,
> они в датасете, у которого, в свою очередь, есть события
> например BeforeEdit, BeforeInsert и т.п.

Это-то то ясно, я сначала так и пытаслся сделать, но что в обработчике писать?
Пробую так

procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
 if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName("Tip").AsString  , TemplTipArray)) then
   ADODataSetTipDogovora.Cancel;
end;

и бестолку


 
Sergey13 ©   (2007-05-18 11:07) [6]

> [4] Desdechado ©   (18.05.07 11:04)

ИМХО, это не проще, а наоборот - и сложнее и затратнее. Код будет выполняться на каждый чих, даже никак не связанный с редактированием/удалением.


 
ЮЮ ©   (2007-05-18 11:14) [7]

Пробую так

procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName("Tip").AsString   , TemplTipArray)) then
  ADODataSetTipDogovora.Cancel;
end;

и бестолку


Естественно бестолку, т.к. это Before Edit. Такое бы могло прокатить в After Edit.
Здесь же, кажется, следует делать Abort, тогда и сам Edit тихонько накроется


 
Kostafey ©   (2007-05-18 15:15) [8]

> Здесь же, кажется, следует делать Abort

Abort у ADODataSet нет

Делать Cancel в After Edit тоже бесполезно.


> [6] Sergey13 ©   (18.05.07 11:07)

А как же тогда сделать?


 
Sergey13 ©   (2007-05-18 15:29) [9]

> [8] Kostafey ©   (18.05.07 15:15)

procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
if DataSet.Fields.FieldByName("Tip").AsString="запретное для редактирования значение" then Abort;
end;


 
Desdechado ©   (2007-05-18 15:30) [10]

> Abort у ADODataSet нет
Abort - это тихое исключение. Это не метод, это процедура.



Страницы: 1 вся ветка

Текущий архив: 2007.06.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
15-1179301601
Knight
2007-05-16 11:46
2007.06.10
Плагины в dll...


2-1179734365
Dr.M@$
2007-05-21 11:59
2007.06.10
Fbook


9-1153207029
Lam3r
2006-07-18 11:17
2007.06.10
DirectX обучение


15-1179065236
>>DEATH<<
2007-05-13 18:07
2007.06.10
compilers.jino-net.ru


15-1179127923
Эва
2007-05-14 11:32
2007.06.10
License is invalid