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

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

ID только-что добавленой записи


Страницы:   1 2

Silver_ ©   (2003-04-21 09:47:00) 

Неужели для етого придется запрос писать типа

SELECT MAX(IDfld)+1 AS MaxID FROM Table1

другого более простого пути нету


AME   (2003-04-22 17:03:00) [1]

Может быть bookmarks помогут делу?


vuk   (2003-04-22 15:58:00) [2]

to Polevi:
>зависит от кривизны рук
Если бы. Сами нарвались на такое в MS SQL. Правда давно это было, но с тех пор доверия к Identity уже нет. Все идентификаторы генерятся вручную. Заодно и возможности на чужой идентификатор нарваться нет.


Silver_   (2003-04-22 15:16:00) [3]


> Можно пользоваться уникальностью атрибутов объектов

такие действительно есть, но можна нарваться на то что вдруг ошибутся (в один символ) в его написании, а тут окажится что такое есть (номер накладной), и произойдет привязка к другой накладной, потом отыскать где не сходятся концы думаю будет накладно, можно и временно вписывать Now;в какое-нить поле и... но думаю это примерно тоже что и AfterPost, да и поле специально тока для этого - накладно.


AVR   (2003-04-22 14:56:00) [4]

Можно при вставке в таблицу указывать идентификатор сессии (что угодно - IP или случайное число + дата-время - придумать можно).
Затем выбирать максимальное ID с идентификатором сессии.
По хорошему, потом нужно поле идентификатора сессии опустошить
(ID ты уже знаешь), что бы не увеличивался индекс по полю ид.сессии.

Можно пользоваться уникальностью атрибутов объектов, сохраняемых в таблице (например в складе - номер накладной + год).


Silver_   (2003-04-22 12:51:00) [5]

Спасобо за отзывы!

Проблему я решил, правда тупо выглядит
сделал через Before/AfterPost потому что в AfterPost уже известен ID, думаю в будущем переделать всю эту вставку через SQL потому что, притормаживает (стока .Post-ов пока..., а без них ID не известен :( ) ситуация типа:

1. Добавляю запись в Table1
1.1. Table1.Post
2. Добавляю запись в Table2
2.1. Table2.Post
3. Добавляю запись в Table3
3.1. Table3.Post

4. делаю связь Table3 и Table2
5. Добавляю запись в Table4
5.1. Делаю свази между Table1 и Table3 "свежих записей"
5.2. Table4.Post

P.S. может кто поймет че делаю :)
Структура БД может не идеальна но... такие вот связи.


Duce   (2003-04-22 11:36:00) [6]

В главную тему. CurrVal рулит, спасибо Ораклу, а с появлением ретурнинга - 5+. Но коль уж IB. На Оракле режим по умолчанию Read Commited,
данные для транзакции фиксируются на момент начала. Таким образом, чужих она в процессе не увидит. Так что прокатит вариант с выборкой max(id), но старт/коммит вручную. На IB режим не такой же? Тогда вроде должно отработать с max(ID). Иначе донт ноу... Но вообще конечно эффективнее до вставки хватать id. если уж только id не суррогат, а сложносоставной с образованием в триггере(бывает и такое!), и прочие занудства - то увы%)...


Карелин Артем   (2003-04-22 11:05:00) [7]

А у меня в FB есть хранимая процедура для вставки записи в базу и одновременно получения ее идентификатора в качестве выходного параметра.


Polevi   (2003-04-22 10:34:00) [8]

>vuk © (21.04.03 22:16)
зависит от кривизны рук


vuk   (2003-04-21 22:16:00) [9]

А вообще говоря, лучший способ - сгенерировать идентификатор вставляемой записи ещё довставки. А то все эти Identity имеют свойство иногда сбиваться.


sniknik   (2003-04-21 19:53:00) [10]

Anatoly Podgoretsky © (21.04.03 18:30)
> а может работать MSDE в качестве сервера? У меня просто нет информации.

в смысле, физически? может, на небольших обьемах (ограничение на базу 2гига как и у аксеса), по функционалу то же что MSSQL, если не сильно придираться, ограничения всетаки есть, ну к примеру "job-ы" можно только руками подымать, при старте системы SQL Server Agent не запускается (специально??) и еще чтото наверняка есть, сама база по структуре один в один от MSSQL делаеш DetachDB в MSDE и AttachDB к MSSQL (проходит на ура). В общем в любом случае лутше аксеса а в сети так вообще нет сравнения, до 5(обычно 3) клиентов работает без проблем (может и больше(пробовали) но тут уж политика "партии", ставим проги на нормальный)
(вся обсуждаемая "проблема" выльется в написание 1 пакета с транзакцией(если хочется) и т.д, выполняется одной командой, никаких колизий и т.п.).

а вот по лицензионности? (правовой возможности работать так) вот тут не знаю :о)) я не менеджер по продажам. но думаю можно, MSDE специально как конкурента бесплатным серверам запустили, лицензия то считай фиктивная (офис у всех есть, нет? :о)). привыкнеш там недалеко и до покупки, замануха ;о).


Anatoly Podgoretsky   (2003-04-21 18:30:00) [11]

Если правильный и правильно, то не выйдет, многопользовательская база!
Если неправильный, то тут один вопрос, а может работать MSDE в качестве сервера? У меня просто нет информации.

Но всегда можно сделать правильным, существует достаточно большое количество беспратных SQL серверов.


sniknik   (2003-04-21 17:10:00) [12]

Anatoly Podgoretsky © (21.04.03 16:57)
ну я почти это и написал примерно (точно что там и от чего смотреть влом).

можно считать его условнобесплатным (как почти все у нас ;о)) вот ведь Access используют? значит (если он "правильный") и MSDE имеют право. (если "неправильный" то и на это плевать)


Соловьев   (2003-04-21 17:08:00) [13]


> скорее всего должен все-таки быть, если его по смыслу нет,
> то возможно неправильно спроектирована таблица или БД.

Access - вот в чем трабл....


AlexAlex   (2003-04-21 17:04:00) [14]

Можно еще поискать значение во внутренних структурах данных сервера. У Informix такое значение можно найти в структуре данных по ошибкам, если запись прошла нормально, но это не совсем хороший подход. А настоящий уникальный ключ (по смыслу) скорее всего должен все-таки быть, если его по смыслу нет, то возможно неправильно спроектирована таблица или БД.


Anatoly Podgoretsky   (2003-04-21 16:57:00) [15]

sniknik © (21.04.03 16:45)
M SDE не бесплатный, стоимость его входит в стоитмость офиса и лицензия для использования только в качестве Desktop .


sniknik   (2003-04-21 16:45:00) [16]

> я в ту степь поехал???
примерно (SET в инсерте?)

@@IDENTITY - это последний автоинкремент (переменная Jet, MSSQL, может еще кого)

так сработает
1 команда
INSERT INTO Table2 (....) VALUES (.....)
2 команда
INSERT INTO Table1 (.....,fld_to_link_ID) VALUES (.....,@@IDENTITY)
(пакетом (в 2 запроса в 1 команде) как ты написал не пройдет, не MSSQL)

кстати бесплатных sql серверов действительно довольно много, чего изворачиватся? MSDE - (бесплатный MSSQL, не придется переделывать почти) вернее не бесплатный а с лицензией MSOffice (как и Access вроде).


Leran2002   (2003-04-21 16:42:00) [17]

Удалено модератором
Примечание: Прекрати матом крыть, здесь же дети малые


Соловьев   (2003-04-21 16:15:00) [18]


> платить не хочет вот и изварачиваться приходится

linux+fb - бесплатно


Silver_   (2003-04-21 16:11:00) [19]

SELECT @@IDENTITY AS MaxID

кто такой @@IDENTITY
в результате получу "свежеиспеченный" ID?
типа так
INSERT INTO Table2
set fld1=...;

SELECT @@IDENTITY AS MaxID FROM Table2;

INSERT INTO Table1
set fld1=...,
fld_to_link_ID= MaxID

или вобщетакой запрос

INSERT INTO Table2
set fld1=...;
INSERT INTO Table1
set fld1=...,
fld_to_link_ID= SELECT @@IDENTITY AS MaxID FROM Table2


я в ту степь поехал???


> (переходи на SQL server)

бос не хотять (платить не хочет вот и изварачиваться приходится)


sniknik   (2003-04-21 15:57:00) [20]

Silver_ © (21.04.03 15:36)
> хотел бы всю эту вставку через SQL
можно заменить
SELECT MAX(IDfld)+1 AS MaxID FROM Table1

на
INSERT INTO ....
и собственно замена
SELECT @@IDENTITY AS MaxID

(думаю ID у тебя автоинкремент, иначе ты бы знал его значение и не понадобилось бы такого селекта)
но и в этом случае есть риск получить не свое значение (хотя меньше чем в твоем, т.к. должно быстрее отрабатывать).
а риск будет в любомслучае т.к. Access не сетевая база. (переходи на SQL server)


Страницы:   1 2

Наверх

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