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

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

Значения AutoInc поля только что введенной записи [D7, Paradox]


Barsky ©   (2005-12-22 17:20:00) 

Есть табличка на 2 поля
F1 (AutoInc)
F2 (A255)

Делаем:

query.sql.text:='INSERT INTO моя_табличка (F2) VALUES ("123")';
query.execsql


В F1 автоматически записывается значение. Как его узнать?


sniknik   (2005-12-23 11:33:00) [1]

> Поле F2 не уникальное, и есть вариант что запостят 2 записи с одинаковым значением этого поля. Тогда облом.
используй уникальное, и только для идентификации записи, после меняеш на рабочее значение.

var
 Guid: TGUID
 stGuid: string;
begin
 CreateGUID(Guid);
 stGuid:= GUIDToString(Guid)

 query.sql.text:='INSERT INTO моя_табличка (F2) VALUES ("'+stGuid+'")';
 query.execsql;

 query.sql.text:=SELECT F1 FROM моя_табличка WHERE F2="'+stGuid+'"';
 query.Open;

 //получили однозначный, теперь апдейт и вся работа с записью через ключевое поле

 ....

тормозно зато с гарантией. тормоза тоже немного можно "остимизировать" (убрать), например считывать перед инсертом максимальный инкремент и в выборке на получение (второй запрос) использовать двойное условие > сохраненного и = stGuid (чтобы не было полного перебора по скорей всего неиндексируемому полю)


Sergey13   (2005-12-23 11:23:00) [2]

2[14] Barsky ©   (23.12.05 11:19)
>И как он поможет?
Да как всегда.

query.sql.text:=SELECT MAX(F1) FROM моя_табличка WHERE F2="123"';


Barsky   (2005-12-23 11:19:00) [3]


> Sergey13 ©   (23.12.05 10:52) [13]


И как он поможет?

2All: Кароче задача без выкрутасов не решается =)


Sergey13   (2005-12-23 10:52:00) [4]

2 [12] Barsky ©   (23.12.05 10:45)
Против этого "облома" существует MAX.


Barsky   (2005-12-23 10:45:00) [5]


> ЮЮ ©   (23.12.05 09:50) [10]


Поле F2 не уникальное, и есть вариант что запостят 2 записи с одинаковым значением этого поля. Тогда облом.
Вероятность минимальная, но всякое может случиться. Так что не катит =)


ANB   (2005-12-23 10:42:00) [6]


> Barsky ©   (22.12.05 17:53) [2]
> А если между этими запросами кто-то еще добавил запись?
> Тогда так не получится.

На время этих двух запросов блокировать таблицу. Будет медленнее, но надежнее.


ЮЮ   (2005-12-23 09:50:00) [7]

Ну и ещё как вариант, не требующий никаких переделок :

query.sql.text:='INSERT INTO моя_табличка (F2) VALUES ("123")';
query.execsql;

query.sql.text:=SELECT F1 FROM моя_табличка WHERE F2="123"';
query.Open;

Даже если при этом прихватишь не "свою" запись, какая разница, она же идентична той, что ввел ты :)


Barsky   (2005-12-23 09:37:00) [8]


> Slym ©   (23.12.05 07:22) [5]
> Открывать курсор


Что это?


ЮЮ ©   (23.12.05 08:08) [6]
> З.Ы. Ну что это за имена полей F1, F2 ?

Это не фрагмент, а пример кода =)


Sergey13   (2005-12-23 09:35:00) [9]

[6] ЮЮ ©   (23.12.05 08:08)
>отказаться от автоинкремента
ИМХО, лучше сразу от Парадокса. Тем более много народу работает (много - это >1 8-).


Виталий Панасенко   (2005-12-23 09:24:00) [10]

Использовать TTable


ЮЮ   (2005-12-23 08:08:00) [11]

отказаться от автоинкремента, генерировать его на клиенте (тот же MAX), обернув вставку в try ... exept таким, чтобы увернуться от попытки вставить запись с существующим значением F1.

З.Ы. Ну что это за имена полей F1, F2 ?


Slym   (2005-12-23 07:22:00) [12]

Открывать курсор


Barsky   (2005-12-22 18:00:00) [13]


> sniknik ©   (22.12.05 17:56) [3]


=))))))

Тоесть в данном случае без хитрых вывертов с ведением логов активности юзеров не выкрутиться? =)


sniknik   (2005-12-22 17:56:00) [14]

Barsky ©   (22.12.05 17:53) [2]
парадокс! ;)


Barsky   (2005-12-22 17:53:00) [15]

А если между этими запросами кто-то еще добавил запись?
Тогда так не получится.


msguns   (2005-12-22 17:43:00) [16]

Select max(F1) from моя_табличка


Наверх

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