Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.057 c
2-1179601887
LoRd1
2007-05-19 23:11
2007.06.10
Отключение/включение клавиатуры


2-1179522833
Пун
2007-05-19 01:13
2007.06.10
Возможно ли в ДБГриде выделить всю строку, а не только ячейку???


2-1179798888
delphino
2007-05-22 05:54
2007.06.10
Копирование набора Query в Table


2-1179458410
delphino
2007-05-18 07:20
2007.06.10
Как подставить в ComboBox значения из таблицы БД?


2-1179571010
Nijaz
2007-05-19 14:36
2007.06.10
Как построить график





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский