Главная страница
    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.041 c
2-1179705309
dreamse
2007-05-21 03:55
2007.06.10
Подскажите ключ реестра


4-1168027163
Tack
2007-01-05 22:59
2007.06.10
Как отловить момент смены цветового оформления Windows?


2-1179416636
Kostafey
2007-05-17 19:43
2007.06.10
Запрет на редактирование/удаление записи по значению


15-1179283947
Канадец
2007-05-16 06:52
2007.06.10
Литература для начинающих


10-1133359168
AndDem
2005-11-30 16:59
2007.06.10
Печать многих документов в Word





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