![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрет на редактирование/удаление записи по значению
Kostafey © (2007-05-17 19:43:00)Уважаемые Мастера !
Озадачился я, казалось бы, простой проблеммой.
Необходимо запретить редактирование/удаление записи у которой
значение такого-то поля равно таким-то значениям.
Сделал я такой запрет и прослезился ( 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;
Работать-то работает.
Вроде (пока ошибок не возникало).
Но так глупо выглядит.
Интернет прошерстил - тоже ничего.
Desdechado (2007-05-18 15:30:00) [1]> Abort у ADODataSet нет
Abort - это тихое исключение. Это не метод, это процедура.
Sergey13 (2007-05-18 15:29:00) [2]> [8] Kostafey © (18.05.07 15:15)
procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
if DataSet.Fields.FieldByName('Tip').AsString='запретное для редактирования значение' then Abort;
end;
Kostafey (2007-05-18 15:15:00) [3]> Здесь же, кажется, следует делать Abort
Abort у ADODataSet нет
Делать Cancel в After Edit тоже бесполезно.
> [6] Sergey13 © (18.05.07 11:07)
А как же тогда сделать?
ЮЮ (2007-05-18 11:14:00) [4]Пробую так
procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName('Tip').AsString , TemplTipArray)) then
ADODataSetTipDogovora.Cancel;
end;
и бестолку
Естественно бестолку, т.к. это BeforeEdit. Такое бы могло прокатить в After Edit.
Здесь же, кажется, следует делать Abort, тогда и сам Edit тихонько накроется
Sergey13 (2007-05-18 11:07:00) [5]> [4] Desdechado © (18.05.07 11:04)
ИМХО, это не проще, а наоборот - и сложнее и затратнее. Код будет выполняться на каждый чих, даже никак не связанный с редактированием/удалением.
Kostafey (2007-05-18 11:06:00) [6]> Это элементарно сделать, если понять что в гриде нет данных,
> они в датасете, у которого, в свою очередь, есть события
> например BeforeEdit, BeforeInsert и т.п.
Это-то то ясно, я сначала так и пытаслся сделать, но что в обработчике писать?
Пробую так
procedure TDataModule1.ADODataSetTipDogovoraBeforeEdit(DataSet: TDataSet);
begin
if (IsInStringArray(DBGridEh1.DataSource.DataSet.Fields.FieldByName('Tip').AsString , TemplTipArray)) then
ADODataSetTipDogovora.Cancel;
end;
и бестолку
Desdechado (2007-05-18 11:04:00) [7]Sergey13 © (18.05.07 08:55) [3]
Я бы сделал еще проще: в AfterScroll изменял бы возможность редактирования (ReadOnly) датасета или конкретного поля, если, конечно, не нужно разделять отдельные операции по удалению/изменению строк.
Sergey13 (2007-05-18 08:55:00) [8]> [0] Kostafey © (17.05.07 19:43)
Это элементарно сделать, если понять что в гриде нет данных, они в датасете, у которого, в свою очередь, есть события например BeforeEdit, BeforeInsert и т.п.
Kostafey (2007-05-17 20:02:00) [9]> Если перейти на нормальный SQL-сервер
Я бы с удовольствием, но для этой задачи СУБД уже не изменить.
> А в Access ненадежно - запись можно будет удалить какой-
> нибудь другой программой.
А это не важно. У них на рабочих местах Access не стоит, да если они
все-таки умудряться удалить то что не следует - сами будут виноваты.
А кстати как еще можно mdb-файл редактировать не через Access
(я имею в виду стандартные клиенты)?
palva (2007-05-17 19:52:00) [10]Если перейти на нормальный SQL-сервер, то можно написать триггер, который будет запрещать удаление на уровне SQL-сервера. А в Access ненадежно - запись можно будет удалить какой-нибудь другой программой.