Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значения ключевого поля, при добавлении в таблицу 
:(
    Опции темы
MarinaK
Дата 3.3.2006, 03:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 29.1.2005

Репутация: нет
Всего: нет



Добавляю записи в таблицу с помощью запроса. Значения ключевого поля (счетчика) присваиваются автоматически, а мне хотелось бы знать их. Кроме очень кривого способа (запоминать максимальное значение перед добавлением, т.к. у добавленных записей значения будут больше) ничего в голову не пришло...
PM MAIL   Вверх
Akina
Дата 3.3.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(MarinaK @ 3.3.2006, 04:04 Найти цитируемый пост)
мне хотелось бы знать их

Вопрос - зачем?

Реально (чтобы не залететь на диалекте) единственный разумный способ - это после выполнения insert тут же сделать select, который вернет ID по только что сохраненным значениям. т.е. типа

Код
' EXTREME DRAFT!!!
docmd.runsql "insert into [table] ([field1],[field2],[timestamp]) values (" & text1.text & "," & text2.text & ",#" & format(now(),vbShortDate) & "#)"
set rs=db.openrecordset "select top 1 * form [table] order by [timestamp] desc"
rs.movefirst
msgbox rs!ID



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
Дата 3.3.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Ничего кривого в этом способе не вижу. Даже если БД на SQL server'е, то узнать можно (@identity, @scope_identity) значение только последнего сгенерированного...
А так вполне нормально - запомнить максимальное значение перед вставкой, потом выбрать их после вставки. Врядли кто успеет впихнуть свои данные между вставкой и получением значений.
PM MAIL ICQ   Вверх
Akina
Дата 3.3.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Papirus @ 3.3.2006, 11:24 Найти цитируемый пост)
запомнить максимальное значение перед вставкой, потом выбрать их после вставки. Врядли кто успеет впихнуть свои данные между вставкой и получением значений

Вообще-то правильнее было написАть так:

Код

' EXTREME DRAFT!!!
strTmp=format(now(),vbShortDate)
docmd.runsql "insert into [table] ([field1],[field2],[timestamp]) values (" & text1.text & "," & text2.text & ",#" & strTmp & "#)"
set rs=db.openrecordset "select * form [table] where [field1]=" & text1.text  & " and [field2]=" & text2.text  & " and [timestamp]=#" & strTmp & "#"
rs.movefirst
msgbox rs!ID



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
z-END
Дата 3.3.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Цитата(Papirus @ 3.3.2006, 10:24 Найти цитируемый пост)
А так вполне нормально - запомнить максимальное значение перед вставкой, потом выбрать их после вставки. Врядли кто успеет впихнуть свои данные между вставкой и получением значений.

а если было 9 элементов с id 1,2,3..10 потом последние 5 удалили, то MAX(ID)=5, а при выполнении Inserta его ID будет 11... или я неправ?



--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Akina
Дата 3.3.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(z-END @ 3.3.2006, 14:55 Найти цитируемый пост)
если было 9 элементов с id 1,2,3..10 потом последние 5 удалили, то MAX(ID)=5, а при выполнении Inserta его ID будет 11... или я неправ?

Прав. Чтобы было следующее - нужно еще сделать CompressDatabase.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
z-END
Дата 3.3.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Akina, имхо всеже проще сразу после Insert делать Select MAX(ID)


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Akina
Дата 3.3.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(z-END @ 3.3.2006, 16:54 Найти цитируемый пост)
имхо всеже проще сразу после Insert делать Select MAX(ID)

Все то же - можно нарваться на случай, когда между занесением в БД и запросом Select MAX(ID) какая-нить сволочь закатит еще одну запись... и прощай целостность... тут либо таблицу лочить, либо оформлять эти запросы как транзакцию... хотя нет, транзакция может не помочь...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
Дата 3.3.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Цитата(Akina @ 3.3.2006, 15:33 Найти цитируемый пост)
Прав. Чтобы было следующее - нужно еще сделать CompressDatabase.

Эт вы об чем? Было 10 (1,2,3,...10) 5 последних удалили. Максимальное будет 5 ЕГО ТО И ЗАПОМНИЛИ перед вставкой, а после будет 11,12,13,14... тогда Select ID From Table Where ID > 5 вернет нам то, что нужно...
PM MAIL ICQ   Вверх
BugZZ
Дата 20.3.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.5.2008
Где: Germany

Репутация: нет
Всего: нет



День добрый! Есть таблица где АйДи = не АвтоЗначение. поэтому решил при инсерте использовать SELECT (MAX ID) +1 FROM TABLE но каждый раз получаю 
Цитата

Зарезервированая Ошибка (-3025). Для ошибки нет описания


пробовал следующее 

Код

INSERT INTO KURS (KURSID, KURSART, [MODULE], STUNDEN ) VALUES
((SELECT MAX(KURSID) FROM KURS)+1, 'Intensivkurs', 10, 100)


так же уже применял фйнцию NZ

Код

INSERT INTO KURS (KURSID, KURSART, [MODULE], STUNDEN ) VALUES
((SELECT NZ(MAX(KURSID), 0) FROM KURS)+1, 'Intensivkurs', 10, 100)


Так же пробовал давать таблице Alias ну т.д.
каждый раз одно и тоже.....

В чем проблема ? в 2003м аксессе - это не возможно или тут все-таки дело синтаксиса ?

Заранее спасибо
PM MAIL ICQ   Вверх
bopoha
Дата 20.3.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Вместо запроса воспользуйтесь функцией DMax("поле", "таблица", "условие")

На тему топика. id новой записи можно получить следующим образом (K_KLIENT - ключевое поле):
Код

Dim rst as DAO.Recordset
Dim lPk as Long
....

rst.AddNew
rst("T_KLIENT")="ОАО Рога и копыта"



1-й вариант
Код

lPk = rst("K_KLIENT")
rst.Update


2-й вариант
Код

rst.Update
rst.Bookmark = rst.LastModified
lPk = rst("K_KLIENT")


Добавлено через 1 минуту и 21 секунду
1-й вариант работает только с таблицами MS Access. На всех остальных нужно проверять.
PM MAIL WWW ICQ Skype GTalk   Вверх
BugZZ
Дата 20.3.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.5.2008
Где: Germany

Репутация: нет
Всего: нет



Цитата(bopoha @ 20.3.2009,  11:07)
Вместо запроса воспользуйтесь функцией DMax("поле", "таблица", "условие")

Спасибо, я на эту фунцию уже тоже вышел ))
Код

INSERT INTO KURS ( KURSID, KURSART, [MODULE], STUNDEN ) VALUES (DMax("KURSID", "KURS") + 1, 'Newkurs', 99, 999);

PM MAIL ICQ   Вверх
bopoha
Дата 20.3.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



BugZZ, значение функции DMax также стоит проверять на Null. Т.к. возможна ситуация когда данных в таблице нет.
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.