powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать id (тип счётчик) только что вставленной строки?
23 сообщений из 48, страница 2 из 2
Как узнать id (тип счётчик) только что вставленной строки?
    #32268317
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
периодически наблюдал дублирующиеся счетчики
Есть такая плохость.
Возможно, она иногда возникает, если в таблицу запросом "доливать" записи со значениями поля-счетчика, меньшими текущего максимального, но с несуществующими.

Т.е. у меня был случай, когда я по какой-то причине разбил таблицу на две, а потом слил все записи обратно. Сначала более позднюю часть, потом раннюю.
И Акс стал считать счетчик с последнего значения ранней половины. И создавать дубли. Я, когда увидел, несколько растерян был.

Т.е. это возможно по такой причине. А может и еще из-за чего...
Но факт, что бывает. И поэтому счетчик д.б. уникальным индексом. Тогда все будет ок.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268334
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Сенин Виктор
Там где нет уникального первичного ключа? Дык у меня таких счетчиков и нет (и не было, да и не будет)
У меня такое тоже случайно возникло. Ну недоглядел чуток .
А так действительно - счетчик без уникальности просто нафиг не нужен.

Чуть раньше
Так что можно не париться, надо лишь отследить Error в случае ошибки сохранения и сбросить нафиг полученное значение.
Так можно и вообще тогда от счетчиков отказаться. Что я с успехом и практикую.

2 Саныч
Это значит, что счетчики могут дублироваться. Но это не значит, что в процессе добавления записи значение счетчика может меняться.
Но и не значит что не может. Как только делаешь уникальный индекс - все работает как надо. Значит, счетчик либо подругому получается (новое значение), либо запись по другому вставляется (с проверкой и переполучением счетчика).
Что именно происходит - мне неизвестно, ибо специально воспроизвести такую ситуацию не получается, никакие брекпоинты не помогают. Так что я и гадать даже не берусь.

2 Geo
И такое тоже есть. Добавление записи запросом с явным указанием значения счетчика - единственный известный мне способ управления этим значением. И все следующие записи будут получать значения счетчика начиная от добавленного значения.
Кстати, решил проверить последнее предложение - хрен там. В ХР-шном аксесе ID-шники продолжают вставляться с нормальными значениями, наплевав на добавленную запросом запись. Хотя в 97-м описанный эффект имеет место быть (сам видел). Так что какие-то отличия уже всплывают.

2 All
Не фиг. Или присваивать идентификаторы вручную, или, если уж мы отдаем это на откуп аксесу, то брать результаты его работы по ее завершению.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268338
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И хотя я еще совсем молодой программерр..., на эти грабельки уже успел наступить
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268344
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Лох, мне нечего возразить. Как в том старом еврейском анекдоте: "И ты прав, и ты прав" (если надо, приведу анекдот полностью). Я сердцем чувствую, что я прав, но головой знаю, что аргументов у меня нет.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268358
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЛП
Но то, что акцес иногда создает дубли (сбрасывает значение "текущего максимума" в таблице) совсем не означает, что он может менять этот максимум "на ходу". Как раз наоборот. Подобная ситуация возникает при "нештатносях".

Чтобы он менял счетчик с момента .AddNew и до момента после .Update - такого я еще не видел. Возможно, так просто не бывает. Или бывает у баз, бьющихся в конвульсиях :)
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268376
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Geo
А я ни разу не смог специально увидеть, чтобы ему удалось два одинаковых счетчика получить. Вот как не бился и куда только точки останова не ставил - всегда он разные получает. А на живой базе - да пожалуйста. Причем база в конвульсиях не билась.
Так что если мы чего-то не можем сделать - не значит что аксес этого не может.

Более того. Только что вспомнил.
В процессе добавления текущее значение счетчика в добавляемой записи не всегда доступно .

Имел счастье это наблюдать при какой-то хитрой схеме данных. Т.е. несколько таблиц, уникальные индексы по счетчикам, связи с обеспечением целостности по полям типа счетчик, формочки, висящие на этих таблицах. Точнее уже не вспомню сходу. При добавлении записей через форму - на BeforeUpdate брал текущее значение счетчика (из контрола на форме) и добавлял нужные записи в другую таблицу. Такой вот триггер для бедных .
Так вот. Если добавлялось сразу несколько записей (через буфер обмена) - при обращении к ID-шнику выдавалось сообщение о невозможности чтения ввиду установленной блокировки на чтение (!). У меня тогда глаза на лоб вылезли.
Пока с этим экспериментировал - выяснил, что если убить связь с обеспечением целостности данных, то все становится ок. Если добавлять записи по одной - тож все ок. А вместе - не живут, моя же формочка сама себе выставляет блокировку на чтение.
Это, конечно, экстремальные условия, но все же.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268402
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Саныч
>Как в том старом еврейском анекдоте: "И ты прав, и ты прав" (если надо, приведу анекдот полностью)

Мне этот анекдот известен как китайская народная мудрость.
Или китайцы тоже евреи ?
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268468
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Мне этот анекдот известен как китайская народная мудрость.

На всякий случай сверим анекдоты.

Код: plaintext
1.
2.
3.
4.
Два человека приходят к раввину, чтобы он разрешил их спор.
Один рассказывает, раввин говорит ему: Ты прав.
Второй рассказывает, раввин и ему говорит: Ты прав.
Выходит из другой комнаты жена раввина: Но как они оба могут быть правы?
Раввин поворачивается к жене: И ты права.


> Или китайцы тоже евреи?

Код: plaintext
1.
2.
3.
4.
5.
6.
Еврей и китаец стоят в очереди за пивом.
Еврей смотрит на китайца - что-то черты лица необычные - и спрашивает:
- Ты кто?
- Я китаец.
- И сколько вас на земле?
- Да вот, уже полтора миллиарда.
- Ого! И чего же вас нигде не видно и не слышно?
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268474
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...Попытался запостить через новую версию форума, а оно не запостилось. Дублирую.

2 Лох:

То, что счетчик иногда оказывается недоступен, - это совершенно отдельная майса. Видимо, Аксесс так и поступает: в тех случаях, когда возникают проблемы со значением счетчика в новой записи, счетчик делается недоступным. И это как раз значит, что можно не бояться той ситуации, которой мы собирались бояться: счетчик не изменит значения в момент сохранения записи, а просто программа выдаст ошибку при попытке прочитать значение счетчика. Но даже и этого, похоже, можно не бояться, потому что AddNew никогда не добавляет несколько записей сразу.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268475
iddqd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Set rst = dbs.OpenRecordset("SELECT @@Identity FROM tblFoo")
Debug.Print rst.Fields(0).Value
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268503
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Саныч
UpdateBatch?
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268514
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я к тому, что
AddNew никогда не добавляет несколько записей сразу.

Господа, хрен знает как этот долбаный счетчик работает. Я, например, единственный раз в жизни увидел блокировку на чтение.
Стараюсь по возможности счетчиков избегать, но иногда лень берет верх :(
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268516
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дополз до лестницы

Мааароооссс маааарроооооосс
Ннниии мааарроззьь мииняяаааа
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32268640
http://support.microsoft.com/?kbid=221931
Ссылка по теме...
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32269490
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> UpdateBatch?

А чего UpdateBatch? Я-то говорю, что значение счетчкика образуется в момент AddNew...
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32269496
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Ссылка по теме...

Да. Там сказано, что в ADO счетчик вообще будет выдавать 0. Это неявно подразумевает, что в DAO, к которому люди привыкли, все в порядке.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32269616
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Видимо, Аксесс так и поступает: в тех случаях, когда возникают проблемы со значением счетчика в новой записи, счетчик делается недоступным.

Думается: есть объект "счетчик". Есть _обращение_, вызывающее _возврат_ текущего значениия "счетчик"-а _и_ его _приращение_. //По умолчанию это выглядит как aF.default = Fcounter().// Есть процедура (_отдельно_!!!), наваривающая значение (повторяющая обращение к счетчику) в случае _ошибки_ сохранения (.update). Т.ч. не "счетчик" _делается_ недоступным, а: 1)(минимум) _сохранение записи_ недоступно из-за нарушения целостности, 2)(Максимум) при ошибке сохранение производится /автоматом/ повтор запроса _значения счетчика_ (с его инкрементированием), результат сохраняется, 3)(разрушенные индексы, или отсутствие требования целостности) сохраняется "дублированная по счетчику" запись.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32269648
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
меня одно время парило что в одном случае значение счетчика в поле рекордсета появлялось - после addnew но до update а во втором после update

разница была ADO или DAO или тип набора и блокировки другой - уже не помню
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32269722
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думается: есть объект "счетчик". Есть _обращение_, вызывающее _возврат_ текущего значениия "счетчик"-а _и_ его _приращение_.

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

1) Создал чистую базу, сделал в ней таблицу со счетчиком и десятком полей, запустил в ней функцию, в цикле делающую .AddNew без упдате.
База не выросла не на йоту.
2) Такая схема реализуется проще с точки зрения микрософта. Блокируем таблицу. Увеличиваем в ней четырех байтовое значение. Разблокируем таблицу. Блокируем запись. Работаем.

У строки нет объекта "длина" не потому, что его невозможно сделать, а потому, что он не нужен.

По поводу ошибок при дублирование. Предположим, нам удалось сбросить свойство таблицы "текущий счетчик 0". И при создании новой записи создается дубль счетчика. Так бывает. В большинстве случаев, когда счетчик - ключевое поле, сообщение о повторяющемся индексе выдается именно при попытке сохранить запись. А не при .AddNew

Но это так, досужие домыслы...
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32270052
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Geo
Я сказал, что есть "объект". (Т.е. нечто). А ты сказал, что он (объект) не бомж, а прописан при таблице. И чЬто? Он перестал быть?
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32270388
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объек, по-моему, отличается наличием св-в, событий и прочей мишуры.
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32270398
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я говорил об "объекте" в смысле ООП? Я не помню, чтобы объекты СУБД и объекты ООП были "одним и тем же". :0)

ООП проявляется как набор интерфейсов доступа к объектам ("сущностям") СУБД. И только тогда (т.е. в DAO, ADO) можно говорить о свойствах и методах в смысле ООП. До того - упоминание объекта не отягощено ООП-шным контекстом :0)
...
Рейтинг: 0 / 0
Как узнать id (тип счётчик) только что вставленной строки?
    #32270403
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, ты меня с толку не сбивай,я и сам собьюсь, если надо :)
У объектов субд тоже свойства-методы есть.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать id (тип счётчик) только что вставленной строки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]