Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.12;
Скачать: CL | DM;

Вниз

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

 
Silver_ ©   (2003-04-21 09:47) [0]

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

SELECT MAX(IDfld)+1 AS MaxID FROM Table1

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


 
Zacho ©   (2003-04-21 09:57) [1]

CУБД какая ?
И использовать SELECT MAX(IDfld)+1 AS MaxID FROM Table1 - верный способ получения конфликтов при многопользовательской работе.


 
Silver_ ©   (2003-04-21 10:09) [2]

извеняюсь что сразу не указал Access


 
Silver_ ©   (2003-04-21 11:04) [3]

Здесь кто-нить бывает Ауууууууууууууу!!!!!


 
Mike Kouzmine ©   (2003-04-21 11:07) [4]

Все в потрепаться сидят - пиписьками мерятся.


 
Соловьев ©   (2003-04-21 11:07) [5]


> SELECT MAX(IDfld)+1 AS MaxID FROM Table1
>
> другого более простого пути нету

для Access наверное нет...
Локально используется или как? Если многопользовательски, то

> Zacho © (21.04.03 09:57)



 
Sergey13 ©   (2003-04-21 11:19) [6]

Если только что добавленой то
SELECT MAX(IDfld) AS MaxID FROM Table1


 
Anatoly Podgoretsky ©   (2003-04-21 13:47) [7]

И получите чужой номер.


 
AlexAlex   (2003-04-21 14:32) [8]

Произвести выборку по уникальному ключу этой таблицы для данной записи.


 
DarkGreen ©   (2003-04-21 14:40) [9]

ID - судя по всему и есть уникальный (точнее первичный) ключ для данной таблицы.

2 Silver_ © (21.04.03 09:47)
БД какая?


 
Соловьев ©   (2003-04-21 14:49) [10]


> Silver_ © (21.04.03 10:09)



 
Alexandr ©   (2003-04-21 14:56) [11]

эта, компоненты доступа какие?


 
Silver_ ©   (2003-04-21 15:10) [12]


> Соловьев © (21.04.03 11:07)

в том то и дело многопользовательски
причем Zacho © (21.04.03 09:57) верно заметил

а как тогда быть???


> 2 Mike Kouzmine © (21.04.03 11:07)

с чего ты решил что тут потрепаться решили вопрос довольно-таки серьезный тебующий решения (причем не тока я один интересуюсь но пока ответа не нашел)


 
Mike Kouzmine ©   (2003-04-21 15:17) [13]

Я не решил, что вы тут треплетесь. Даже наоборот - с вниманием читаю этот пост. Просто не совсем понял проблему.
Как писал AlexAlex(21.04.03 14:32) без дополнительного уникального ключа задачу не решить.


 
Silver_ ©   (2003-04-21 15:36) [14]


> Alexandr © (21.04.03 14:56)
> эта, компоненты доступа какие?


ADODataSet, DBGrid
хотел бы всю эту вставку через SQL да теперь хоть через Before/AfterPost тока странные ID выдает всегда один и тот-же

Table1.Post;
ShowMessage(Table1ID.AsInteger);

не пойму в чем трабл - то


P.S.

> Mike Kouzmine © (21.04.03 11:07)

не правельно понял :( извени, потому суда не заходят что в потрепаться сидать имелось введу, а я -то... :(


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

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)


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

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)

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


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


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

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


 
Leran2002 ©   (2003-04-21 16:42) [18]

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


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

> я в ту степь поехал???
примерно (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 вроде).


 
Anatoly Podgoretsky ©   (2003-04-21 16:57) [20]

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


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

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


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


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

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


 
sniknik ©   (2003-04-21 17:10) [23]

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

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


 
Anatoly Podgoretsky ©   (2003-04-21 18:30) [24]

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

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


 
sniknik ©   (2003-04-21 19:53) [25]

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

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

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


 
vuk ©   (2003-04-21 22:16) [26]

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


 
Polevi ©   (2003-04-22 10:34) [27]

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


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

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


 
Duce ©   (2003-04-22 11:36) [29]

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


 
Silver_ ©   (2003-04-22 12:51) [30]

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

Проблему я решил, правда тупо выглядит
сделал через 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. может кто поймет че делаю :)
Структура БД может не идеальна но... такие вот связи.


 
AVR ©   (2003-04-22 14:56) [31]

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

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


 
Silver_ ©   (2003-04-22 15:16) [32]


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

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


 
vuk ©   (2003-04-22 15:58) [33]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.05.12;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
4-34641
NAlexey
2003-03-11 14:06
2003.05.12
BorderStyle


14-34582
Nick-From
2003-04-23 18:38
2003.05.12
Нужен курсовик по СЦОС


14-34610
Ренат
2003-04-24 15:50
2003.05.12
Кнопка power на клавиатуре


1-34387
SSK
2003-04-28 11:55
2003.05.12
выбор в TreeView


1-34462
Snuk
2003-04-29 11:09
2003.05.12
Как передать параметр в DLL