Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Спасибо за помощь, добавление новой записи получилось (правда, сначала пришлось отдать компьютер в ремонт). Возникла еще одна проблема. В основной таблице ключевым является поле типа Счетчик (оно же одновременно и индексированное). Мне нужно программным способом сначала добавить в эту таблицу пустую строку, а потом считать новое значение поля Счетчик. Фрагмент кода таков:

Dim AnkNom As Long
Set rst4 = CurrentDb.OpenRecordset("tblКЛИЕНТЫ", dbOpenDynaset)
With rst4
.AddNew
.MoveFirst
.MoveLast
AnkNom = ![АнкетныйНомер]
.Update
End With
rst4.Close
И выдается ошибка: Изменения не были успешно завершены из-за повторяющихся значений в индексе, ключевых полях или связях. (Ошибка 3022)
Попытка ввести повторяющееся значение в поле, которое является ключом или уникальным индексом, не допускающим наличия повторяющихся значений.
Сообщение содержит следующую инструкцию. Измените данные в поле или полях, которые содержат повторяющиеся значения, удалите индекс или переопределите его, чтобы он допускал наличие повторяющихся значений, и повторите операцию.
Что я делаю неправильно?
30 апр 07, 13:16    [4086991]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
.AddNew
.MoveFirst

Вы создаете запись, а затем покидаете ее без сохранения. Зачем?
30 апр 07, 13:51    [4087033]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Владимир Саныч, просмотрела Ваш обзор в ответ на подобный же вопрос. Q8: Как получить значение счетчика только что добавленной записи. Что-то я не догоняю. Разве при закрытии Recordset новая запись не сохраняется?
30 апр 07, 14:35    [4087081]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
Разве при закрытии Recordset новая запись не сохраняется?

Не факт.

И ошибку-то все-таки исправьте. Меня переубеждать бесполезно, от этого программа не заработает.
30 апр 07, 14:38    [4087086]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Я Вас не переубеждаю - вопрос задаю.... А ошибку - ну, не вижу!!!!!! И между прочим, в Ваших ответах про индекс - ни гу-гу! Не мучайте, Владимир Саныч, помогите, все разумные сроки для сдачи программы уже прошли...
30 апр 07, 14:48    [4087098]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Все! Получилось!!!
With rst4
.AddNew
.Update
.Bookmark = .LastModified
AnkNom = ![АнкетныйНомер]
End With
rst4.Close

Вы умница, Владимир Саныч !!!
30 апр 07, 15:05    [4087110]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
.Update

Эту строчку я бы перенес в конец, как было в первом варианте программы. Потому что после этой команды не гарантируется, что Аксесс останется на той же записи. Соответственно, АнкетныйНомер может быть взят не из этой записи, а из какой-то другой.
30 апр 07, 15:39    [4087155]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
тогда теряется смысл lastmodif
30 апр 07, 15:41    [4087160]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
ILL HEAD
тогда теряется смысл lastmodif

Да, тогда и это надо убрать.
30 апр 07, 15:43    [4087161]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
автор топика будет в шоке
30 апр 07, 15:46    [4087167]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
30 апр 07, 15:47    [4087170]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
ILL HEAD
Member [заблокирован]

Откуда:
Сообщений: 8498
хотя lastmodified после update (по опыту) имеет смысл
соскакивиает букмарк (от типа чтоли рекордсета зависит)
30 апр 07, 16:02    [4087194]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Пьяный Лох
Member

Откуда:
Сообщений: 3652
Владимир Саныч
Galina_t
.Update

Эту строчку я бы перенес в конец, как было в первом варианте программы. Потому что после этой команды не гарантируется, что Аксесс останется на той же записи. Соответственно, АнкетныйНомер может быть взят не из этой записи, а из какой-то другой.

Неправильный совет.
Во-первых - LastModified таки гарантирует, что "аксес останется на той же записи"
Во-вторых - перенос Update в конец идеологически неверен. Задача сформулирована как "получить ID после добавления", а ты предлагаешь получать его до. Вот уж тут точно никто не гарантирует, что это значение не изменится в момент апдейта. Не говоря уже об экзотике, когда значение автоинкрементного поля вообще невозможно прочитать до апдейта.
30 апр 07, 16:09    [4087202]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Спасибо! От шока воздержусь (хоть я не такая умная гуру как вы). Сейчас работает такой вариант:
Set rst4 = CurrentDb.OpenRecordset("tblКЛИЕНТЫ, dbOpenTable)
With rst4
.AddNew
AnkNom = ![АнкетныйНомер]
.Update
End With
rst4.Close
Но все же – как насчет индексов?
В описании метода AddNew говорится: «положение новой записи в наборе зависит от типа объекта Recordset. В объектах rs динамического типа новая запись будет добавлена в конец набора вне зависимости от любых правил сортировки или упорядочивания, которые действовали в момент открытия объекта.
В объектах rs типа таблицы, имеющих заданное значение свойства Index, записи будут помещены в соответст-вующее положение, определяемое порядком сортировки. Если значение свойства Index не задано, то записи до-бавляются в конец набора.»
Вопрос – если ключевое поле типа Счетчик автоматически индексируется, то – при обычном добавлении новой записи – свойство Index нам надо?
30 апр 07, 16:19    [4087210]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
ILL HEAD
хотя lastmodified после update (по опыту) имеет смысл
соскакивиает букмарк (от типа чтоли рекордсета зависит)

Если после, то да.

Пьяный Лох
Неправильный совет.

Glad to see you. I am all ear.

Пьяный Лох
Во-первых - LastModified таки гарантирует, что "аксес останется на той же записи"

Согласен.

Пьяный Лох
Во-вторых - перенос Update в конец идеологически неверен. Задача сформулирована как "получить ID после добавления", а ты предлагаешь получать его до. Вот уж тут точно никто не гарантирует, что это значение не изменится в момент апдейта.

А разве он может измениться? С какой стати? Есть свидетели, у которых это происходило? Или это где-то написано в документации? Насколько я понимаю, значение счетчика генерируется до добавления с учетом всех нюансов, а если оно сгенерируется неудачно, то все равно не изменится, а просто возникнет ошибка. Разве не так?

Пьяный Лох
Не говоря уже об экзотике, когда значение автоинкрементного поля вообще невозможно прочитать до апдейта.

Это если таблица не в Аксессе? Но вроде у нас не тот случай.
30 апр 07, 16:21    [4087212]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
В описании метода AddNew говорится: «положение новой записи в наборе зависит от типа объекта Recordset. В объектах rs динамического типа новая запись будет добавлена в конец набора вне зависимости от любых правил сортировки или упорядочивания, которые действовали в момент открытия объекта.
В объектах rs типа таблицы, имеющих заданное значение свойства Index, записи будут помещены в соответст-вующее положение, определяемое порядком сортировки. Если значение свойства Index не задано, то записи до-бавляются в конец набора.»
Вопрос – если ключевое поле типа Счетчик автоматически индексируется, то – при обычном добавлении новой записи – свойство Index нам надо?

Это касается положения записи только в рекордсете, но не в таблице. В таблице все равно понятие порядка записей не определено.
30 апр 07, 16:22    [4087215]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Пьяный Лох
Member

Откуда:
Сообщений: 3652
2 Galina_t
Спасибо! От шока воздержусь (хоть я не такая умная гуру как вы). Сейчас работает такой вариант:

У Вас был абсолютно корректный и всегда работающий код.
Зачем Вы изменили его на совершенно некорректный, но тем не менее иногда работающий?

Вопрос – если ключевое поле типа Счетчик автоматически индексируется, то – при обычном добавлении новой записи – свойство Index нам надо?

Смешались в кучу кони, люди...
Св-во Index нужно для быстрой навигации (с помощью метода Seek) по объекту Recordset, открытому с опцией dbOpenTable. Надо оно или не надо - Вам решать. Какое отношение это имеет к вопросу получения ID-шника добаленной записи?
30 апр 07, 16:24    [4087217]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Пьяный Лох
Member

Откуда:
Сообщений: 3652
2 Владимир Саныч
А разве он может измениться? С какой стати? Есть свидетели, у которых это происходило? Или это где-то написано в документации?

Встречные аналогичные вопросы: а разве ему (счетчику в еще недобавленной записи) кто-то мешает измениться? С какой стати? Это где-то написано в документации?
Насчет свидетелей - хз. Я, напримр, такого не видел. Да я вообще много чего не видел. Что ж теперь, этого не может быть?

Насколько я понимаю, значение счетчика генерируется до добавления с учетом всех нюансов, а если оно сгенерируется неудачно, то все равно не изменится, а просто возникнет ошибка. Разве не так?

Насколько ты понимаешь - оно так. А насколько это понимают разработчики аксеса - загадка.
Я так вообще не понимаю, что такое "неудачно сгенерируется" применительно к счетчику.

Это если таблица не в Аксессе?

Кто сказал, что не в аксесе? В самом что ни на есть аксесе.
Единственный раз я видел в аксесе блокировку на чтение (а не на запись), и именно при попытке прочитать значение счетчика из еще не добавленной записи. Там правда слишком уж много всего рядом наворочено было, воспроизвести пример не получится при всем желании, но было оно именно в аксесе.
30 апр 07, 16:31    [4087227]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Пьяный Лох
Встречные аналогичные вопросы: а разве ему (счетчику в еще недобавленной записи) кто-то мешает измениться? С какой стати? Это где-то написано в документации?

Если у записи до ее сохранения есть какие-то значения полей, то в момент сохранения они разве могут самопроизвольно измениться? Или у счетчиков есть какая-то особенность на этот счет? И если да, то у кого еще - например, у тех полей, которые получили значение по умолчанию?

Пьяный Лох
Я так вообще не понимаю, что такое "неудачно сгенерируется" применительно к счетчику.

Допустим, одинаково у двух юзеров. Или что может, по-твоему, привести к перевычислению?

Я знаю, что вычисление значения счетчика в Аксессе происходит в момент AddNew, а не после.
30 апр 07, 16:40    [4087237]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Пьяный Лох
Member

Откуда:
Сообщений: 3652
Владимир Саныч
Если у записи до ее сохранения есть какие-то значения полей, то в момент сохранения они разве могут самопроизвольно измениться? Или у счетчиков есть какая-то особенность на этот счет? И если да, то у кого еще - например, у тех полей, которые получили значение по умолчанию?

Да кто ж его знает, могут ли меняться поля вообще и счетчики в частности.
Для меня достаточно того, что само значение счетчика не всегда доступно :). Одного этого хватает для того, чтобы не пытаться задачу "узнать значение поля после добавления" свести к возможно более простой "узнать значение поля до добавления"

Пьяный Лох
Я так вообще не понимаю, что такое "неудачно сгенерируется" применительно к счетчику.

Допустим, одинаково у двух юзеров. Или что может, по-твоему, привести к перевычислению?

Допустим одинаково. А кто сказал, что это "неудачно"?
Например, если на поле типа счетчик не наложено ограничение уникальности (нет уникального индекса) - то значения в поле типа счетчик вполне могут генериться совпадающими. И прекрасно будут вставляться в таблицу. Вот этому я уж точно был свидетелем. И никаких "просто возникает ошибка" при этом не происходит.
С другой стороны, если на поле есть уникальный индекс, то значения таки уникальны. Только вот ошибок тоже не возникает (я не наблюдал). Вот собственно вопрос - то ли оно генерит значения по другому (как?), то ли оно отлавливает ошибку нарушения уникальности, и делает перепопытку номер два (соответственно изменяя первоначальное значение счетчика, уже по факту кем-то занятое).

А как аксес будет вести себя, если счетчик входит в уникальный индекс, но индекс составной (т.е. выглядит как "счетчик + еще какое-нибудь поле") - я даже не возьмусь строить предположения.

Я знаю, что вычисление значения счетчика в Аксессе происходит в момент AddNew, а не после.

А я знаю, что это высказывание - не всегда верно :).

Сообщение было отредактировано: 30 апр 07, 16:56
30 апр 07, 16:55    [4087279]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Пьяный Лох
Да кто ж его знает, могут ли меняться поля вообще и счетчики в частности.

Кто ж его знает, познаваем ли мир, работаю ли я в этой фирме и получаю ли зарплату. Но ведь надо из чего-то исходить...

Пьяный Лох
Для меня достаточно того, что само значение счетчика не всегда доступно :).

А когда оно недоступно?

Пьяный Лох
Допустим одинаково. А кто сказал, что это "неудачно"?
Например, если...

Дык, согласен я. Но ведь это ты сказал, что значение счетчика может измениться. Вот я и пытаюсь понять, какую ситуацию ты имел в виду.
30 апр 07, 17:13    [4087327]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
Смешались в кучу кони, люди...
Св-во Index нужно для быстрой навигации (с помощью метода Seek) по объекту Recordset, открытому с опцией dbOpenTable. Надо оно или не надо - Вам решать. Какое отношение это имеет к вопросу получения ID-шника добав-ленной записи?

Создала большое приложение в Access, но одна ветка работает очень неустойчиво – то дает новую запись, то не дает («Изменения не были успешно завершены из-за повторяющихся значений в индексе, ключевых полях или связях. (Ошибка 3022»). Начала разбираться кропотливо и, наверно, паниковать.
Получив анкетный номер из добавленной записи, я дальше открываю другую таблицу и форму, в которой отображается запись именно с этим номером. На самом деле таких таблиц больше десятка, и какая из них должна открыться – зави-сит от того, какую экранную кнопку нажмет пользователь. Вообщем-то, элементарная вещь, но при закрытии одной из пар форма-таблица (только одной!) выдается сообщение «Слишком мало параметров. Требуется 2.». На форумах мно-гократно задаются вопросы по поводу этого сообщения, которое выскакивает в самых разных ситуациях. Может быть, дадите совет? Все мои таблицы открываются по одной схеме:
NomerAnk = АнкетныйНомер
DoCmd.OpenForm "frmИССЛЕДОВАНИЕ", , , "tblИССЛЕДОВАНИЕ.Номер = " & NomerAnk
И только одна таблица капризничает, хотя все данные вводятся и сохраняются. О каких двух параметрах идет речь?
А насчет Update – спасибо за советы, попробую.
30 апр 07, 17:18    [4087335]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
«Слишком мало параметров. Требуется 2.»

https://www.sql.ru/faq/faq_topic.aspx?fid=410
- там смотрите после слов "Узнать, какие параметры от Вас хочет Аксесс, можно с помощью следующего кода".
30 апр 07, 17:21    [4087341]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Galina_t
Member

Откуда: Обнинск
Сообщений: 28
И кстати, как это "узнать значение поля до добавления"?
У меня в таблице в поле Счетчик новые значения задаются последовательно. При удалении некоторых записей эти номера, по теории, не должны больше появляться. А они появляются при добавлении новой записи! Как же можно узнать значение поля до добавления?
30 апр 07, 17:28    [4087352]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать новое значение поля Счетчик в программе  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Galina_t
И кстати, как это "узнать значение поля до добавления"?

Имеется в виду до команды Update, т.е. как у Вас. Потому что именно команда Update физически записывает новую запись в таблицу.
30 апр 07, 17:31    [4087355]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить