Форум: "Начинающим";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
ВнизЗапрет на редактирование/удаление записи по значению Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.054 c