Главная страница
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.034 c
2-1179755457
xazan
2007-05-21 17:50
2007.06.10
Как определить количество строк кода в проекте делфи?


3-1174533472
merko$
2007-03-22 06:17
2007.06.10
Копирование записи в IBTable


2-1179749038
leonidus
2007-05-21 16:03
2007.06.10
Как переконвертировать Color в Hex ?


4-1166970048
vertal
2006-12-24 17:20
2007.06.10
Точность измерения временных интервалов для UART в windows


15-1179179108
PHPdeveloper
2007-05-15 01:45
2007.06.10
FF и js