Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Упредить


Страницы:   1 2

IGray ©   (2003-11-20 23:31:00) 

Допустим, в таблице Table1 есть некое уникальное
поле которое после редактирования пользователем
должно остаться уникальным. Как ДО выполнения Post
проверить нет ли уже такого значения в Table1?
(чтоб при необходимости попросить пользователя ввести
другое значение). Брать Postв try..exceptне хочется,
так как таких уникальных полей в записи несколько,
а способа понять какое именно из полей вызвало
"Key Violation" (для подсказки пользователю) я не знаю...


Nikolay M.   (2003-11-21 12:53:00) [1]


> Поскольку поступают они к нам извне, а не генерируются системой,
> а операторам свойственно ошибаться.

Ну, это совсем другое дело. Думаю, понятно, что я имел в виду другую ситуацию.
Теперь осталось узнать, как с этим обстоит дело у автора вопроса. Btw, а где автор?!


Юрий   (2003-11-21 11:23:00) [2]

>Johnmen

>Да. Так можно делать. Если однопользовательская система, мало данных и тормоза по-барабану...:)

Так мы ведь про условия задачи ничего больше не знаем, как только "как избавиться от ошибки"

НУ а мало даных это понятие относительное.
Например при 100000 записей этот алгоритм работает нормально , при
большем не проверял

Да и с многопользовательским режимом не проблема - нужно только
запретить одновременное обновление данных двуми и более юзерами,,
что сделать не такая уж большая проблема


Johnmen   (2003-11-21 10:31:00) [3]

>Юрий (21.11.03 10:27)

Да. Так можно делать. Если однопользовательская система, мало данных и тормоза по-барабану...:)


Johnmen   (2003-11-21 10:29:00) [4]

>Рамиль © (21.11.03 09:55)
>Так, по моему, вполне нормально, что значения в поле должны быть уникальными

И по-моему нормально. А в чем проблема ?


Юрий   (2003-11-21 10:27:00) [5]

По моему все решается тривиально просто (по крайней мере я так делал)
В таблице создается ОДНО поле с уникальным индексом
(обычно автоинкрементное)
Затем при редактирование/добавлении новой записи, перед командой
POST, выполняешь проверку table.locate(....), при помощи которой
проверяешь отсутствие/наличие значения в твоих проверяемых
уникальных полях.
Если locate дает TRUE - сообщение юзеру,мол ты не прав браток.
если FALSE - поехали модифицировать запись.
Конечно все твои "псевдо" уникальные поля должны быть индексированы.
При помощи этого способа можешь держать в своей базе хоть сто
уникальных полей
Вот собственно и все решение проблемы


Zacho   (2003-11-21 10:26:00) [6]


> Nikolay M. © (21.11.03 09:53) [16]

Меня бы пристрелили, если бы инвентарные номера нельзя было редактировать. Поскольку поступают они к нам извне, а не генерируются системой, а операторам свойственно ошибаться.
А генерировать их в системе для моей конкретной задачи - нельзя.

Еще пример, который приводил Danilka © - реквизиты физ.лица. Неужели и их нельзя редактировать ? И номер паспорта, например, у тебя генерирует программа ?
Вобщем, уникальные поля - они разные бывают, не только сгенерированные программой, и если оно вводяться вручную - то соответственно и редактировать их можно.


Рамиль   (2003-11-21 09:55:00) [7]

>Johnmen
Вот я сейчас сижу программку делаю, таблица со списком дисциплин в школе. Поля ПК и Наименование. Так, по моему, вполне нормально, что значения в поле должны быть уникальными


Johnmen   (2003-11-21 09:55:00) [8]

>Zacho © (21.11.03 09:48) [13]
>...по жизни так сложилось :-)

Вот я и думаю, может разобраться в жизни, упорядочить её ?
:-))


Nikolay M.   (2003-11-21 09:53:00) [9]


> Zacho © (21.11.03 09:48) [13]

Да, серьезно.
Я за всю жизнь не издевался настолько над юзерами, чтобы заставлять их вводить такую информацию. Генерацию номера счета в банке тоже предложишь руками делать? Да тебя сразу пристрелят.
А зачем нужно редактироватьинвентарные номера? Насколько я в курсе проблемы, за каждым стулом закреплен свой ИН - с какой стати разрешать его вводить руками или редактировать?


Johnmen   (2003-11-21 09:52:00) [10]

>Danilka © (21.11.03 09:50)

Ну три поля... А больше ? :)


Danilka   (2003-11-21 09:50:00) [11]

[1] Johnmen © (20.11.03 23:41)
>С трудом можно представить такую таблицу, в которой несколько уникальных полей...:)

например, реквизиты физлица - уникальными будут и паспортные данные и ИНН и номер полиса ПФР.


Zacho   (2003-11-21 09:48:00) [12]


> Johnmen © (21.11.03 09:39) [12]

Да не на что не намекаю :) Просто странный вопрос "зачем ?" Ну есть несколько ключей, и все тут, по жизни так сложилось :-)

> И, по-моему, ты слишком "в лоб" понял мой пост.

Может быть.

> Nikolay M. © (21.11.03 09:29) [10]
>
> + Еще вопрос - зачем юзеру разрешать редактировать такие
> поля?

Неужели ты это серьезно ? Тогда объясни нашему бухгалтеру, что отныне запрещается редактировать инвентарные и табельные номера и т.д. и т.п. :-)


Johnmen   (2003-11-21 09:39:00) [13]

>Zacho © (21.11.03 09:34)

Я не улавливаю, к чему ты клонишь или на что намекаешь...
:)
И, по-моему, ты слишком "в лоб" понял мой пост.


Zacho   (2003-11-21 09:34:00) [14]


> Johnmen © (21.11.03 09:12) [9]
> Вот. Рассуждаем дальше. Допускаем, что потенциальный вдруг
> стал реальным.

Что значит реальным ? Есть потенциальные ключи, из них выбирается первичный ключ. И что здесь реальное, а что не реальное ? :-)

> Вопрос - зачем в одной таблице несколько ключей ?

А зачем Солнце восходит на Востоке ? :-)))


Nikolay M.   (2003-11-21 09:29:00) [15]


> Johnmen © (21.11.03 09:12) [9]

+ Еще вопрос - зачем юзеру разрешать редактировать такие поля?
Станет в таблице 1 000 000 записей и юзер будет давить на кнопки, пытаясь ввести неуникальное значение среди существующих? Это уже садизм, имхо...

ПС
"Верх упорства - вводить неправильный пароль до тех пор, пока компьютер не согласится".


Johnmen   (2003-11-21 09:12:00) [16]

>Zacho © (21.11.03 00:02) [5]
>Просто я придерживаюсь мнения, что любое unique constraint == потенциальный ключ.

Вот. Рассуждаем дальше. Допускаем, что потенциальный вдруг стал реальным. Вопрос - зачем в одной таблице несколько ключей ?
:))

>...таблицы с несколькими уникальными полями: таблица Менделеева ;)

Ну пара полей, ну три, ещё можно объяснить по жизни. Но большее количество...Лично я не могу...


Zacho   (2003-11-21 00:57:00) [17]


> Zacho © (21.11.03 00:39) [7]

P.S. Пример конечно корявый и топорный, но иллюстрирует то, что информацию о происхождении ошибки (кстати, в этом примере нет, но можно и искомое автором вопроса имя поля) можно взять из текста сообщения об ошибке.


Zacho   (2003-11-21 00:39:00) [18]


> mfender © (21.11.03 00:32) [6]

OnPostError не менее действенно и гораздо проще :)

Вот пример:

procedure TfmNorm.ibdsNormPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if pos("FK_NORMA",E.Message)>0 then
begin
ShowMessage("Не выбран контрагент !");
Action:=daAbort;
exit;
end;
if pos("PK_NORMA",E.Message)>0 then
begin
ShowMessage("Такая норма уже существует !");
Action:=daAbort;
exit;
end;
Action:=daFail;
end;


mfender   (2003-11-21 00:32:00) [19]

Я, обычно пишу что-то вроде того:

function TfrmMain.UnID(Tab: TQuery; TabName: String; IdFld: TField): string;
var cod: Integer;
begin
with Temp do
begin
Close;
SQL.Clear;
SQL.Add("SELECT * FROM "+TabName);
Open;
end;
Cod:=1;
while (ValueCompare(Tab,IdFld,IntToStr(Cod))=True) do begin
Inc(Cod);
if Length(IntToStr(Cod))>IdFld.Size then MessageDlg("


Zacho   (2003-11-21 00:02:00) [20]


> Johnmen © (20.11.03 23:46) [4]

Просто я придерживаюсь мнения, что любое unique constraint==потенциальный ключ. Может, я и не прав.
Кстати, пример таблицы с несколькими уникальными полями: таблица Менделеева ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо