![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ID только-что добавленой записи
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)