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

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

Можно ли узнать значение ключевого поля до добавления записи в та [D6, Paradox]


Mishenka ©   (2006-02-20 16:10:00) 

Можно ли узнать значение ключевого поля до добавления записи в таблицу?
Хочу добавить запись, которая бы ссылалась сама на себя, но так как значение ключевого поля присваивается автоматически после добавления записи, то незнаю какое значение указать в поле ссылке. Как быть?


ЮЮ   (2006-02-21 02:53:00) [1]

Я в парадоксе делал иначе, без доп.таблиц:
1) на клиенте получал эмпирическое значение следующего знвчения ключа (не инкремента, естественно:  Select Max(id)+1 from table
2) пытался вставить запись. При исключении снова получал ожидаемое значение ключа. Если оно отличалось от того, что пытался встановить в первый раз, брал его и опять пытался вставить. Если же при исключении новое и первоначальное значения совпадали, значит ошибка была из-за других причин.

З.Ы. Естественно, про запросы типа
 INSET INTO table SELECT ... FROM
придется забыть.


Жуков Олег   (2006-02-21 02:41:00) [2]

Нельзя, если оно автоматически формируется. Но если очень хочется, то можно. Надо отказаться от автоматического инкремента и реализовать похожий механизм самому.

Технология такая - на сервере базы данных делается счётчик (генератор уникальных значений) (Сразу оговорюсь, функции сервера базы данных, в случае с парадоксом могут быть реализованы и в клиентской программаме, важно чтобы эта одинаковая серверная функциональность была встроена во все клиенты.). Особенность счётчика должна быть такая - однажды полученное из него значение никогда не должно быть выдано снова (это необходимое условие для корректной работы нескольких пользователей).
Перед сохранением добавляемой записи программа-клиент должна получить это новое значение счётчика, сама же вставить его в запрос Insert, и, затем использовать его для других своих целей, например можно создать привязанные записи в подчиненных таблицах. При этом на trigger on insert (в случае с SQL сервером) можно выполнять проверку - если ключевое поле пустое, то заполнять его из этого же счётчика. Счётчик можно сделать добавив ещё одну таблицу в базу, для хранения последнего значения, написав процедуру из двух-трёх SQL, и установив соглашение, что любое добавление  в таблицу должно проходить только используя значения ключа, полученное этой процедурой. Алгоритм процедуры может быть например таким:

Блокируем таблицу Counter и на запись и на чтение
Читаем значение из Таблицы Counter
Прибавляем к нему 1 и записываем снова в таблицу (это и есть новое значение ключа)
Вернуть новое значение для ключа
Разблокировать таблицу


Anatoly Podgoretsky   (2006-02-20 23:41:00) [3]

Нельзя, до добавления это еще не существует.


Виталий Панасенко   (2006-02-20 18:03:00) [4]


> msguns ©   (20.02.06 17:46) [3]
> >Mishenka   (20.02.06 16:10)  
> >Можно ли узнать значение ключевого поля до добавления записи
> в таблицу?
>
> В общем случае для парадокса - нет.
> Для локального "варианта" есть шанс "угадать" с помощью
> запроса
> Select Max(id)+1 from table

Для Paradox - не катит.  Добавил запись, удалил. Уже ID будет равно Max(ID)+2


Ega23   (2006-02-20 17:49:00) [5]


> Select Max(id)+1 from table
>


Это только если там что-то есть...   :о)


msguns   (2006-02-20 17:46:00) [6]

>Mishenka   (20.02.06 16:10)  
>Можно ли узнать значение ключевого поля до добавления записи в таблицу?

В общем случае для парадокса - нет.
Для локального "варианта" есть шанс "угадать" с помощью запроса
Select Max(id)+1 from table


Виталий Панасенко   (2006-02-20 17:29:00) [7]

Да, как получит то, чего еще нет (в данном варианте. Не берем генераторы в рассчет)? Оригинальный вопрос...


Ega23   (2006-02-20 16:11:00) [8]


> Хочу добавить запись, которая бы ссылалась сама на себя


Нереально.

Определяй поле как null, вставляй запись, получай id, потом - update


Наверх

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