Главная страница
    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.054 c
2-1179592485
Rafik
2007-05-19 20:34
2007.06.10
Как сменить приоритет у процесса


2-1179482555
Ol4ik
2007-05-18 14:02
2007.06.10
Нужна помощь!


11-1161750263
Lari
2006-10-25 08:24
2007.06.10
Ошибка чтения файла при использовании PStream


2-1179488279
RokyB
2007-05-18 15:37
2007.06.10
Привязка компонентов к размере формы


3-1174741372
Kley
2007-03-24 16:02
2007.06.10
фильтр по 2 полям





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский