powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики)
25 сообщений из 176, страница 3 из 8
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286515
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А чего это в Москве 3 выходных? В Израиле был Йом Кипур, это я знаю, а в Москве что?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286662
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч:
ЛЕНЬ и бактерии не полностью выздоровевшего Л.П.
Да плюс тяжелый физический труд в течение 2 дней и последующий за ним отходняк в виде вышеуказанных причин.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32287083
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч писал:> То туда Null запишется (хотя поле обязательное), то значения задублируются (хотя есть уникальный индекс).

Похоже, что база накрылась.
Ясен пень накрылась. Не вся база, а один индекс. Восстановление/сжатие/импорт в новую не проходит, спотыкается на этих кривых значениях. Приходится убивать связи, убивать индекс, лечить съехавшие значения, лечить значения в связанных таблицах, восстанавливать индекс, восстанавливать связи, и только тогда восстанавливать/сжимать.
Непонятно другое - почему у меня все это счастье происходит только с индексами по полю типа счетчик?
Т.е. бывает, что и по обычному (числовому) полю индекс рушится, в итоге выборка с использованием этого индекса глючит. Но ни уникальность, ни обязательность, ни целостность данных никуда не пропадают в случае индекса по числовому полю.
А вообще мне это уже так надоело, что из-за одного этого глюка уже неделю хожу с мыслю "Пора сваливать с этого Jet'а"

Темный писал:ЛЕНЬ и бактерии не полностью выздоровевшего Л.П.
Что, я уже своей ленью начал людей заражать? Придется перед монитором в марлевой повязке сидеть
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291011
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а про дыры в нумерации - по моему самый часто задаваемый вопрос про щетчики...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291281
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Понял.

Q: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было?

A: Никаких средств для этого нет. Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291290
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гут. надо еще пару ламерских частых вопросов припомнить.......
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291328
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели и я смогу внести свою лепту!
Q: А как все-таки избавиться от дырок в счетчике? (ну если очень нада!!!)
A: Пользоваться данным советом сугубо осторожно!!! Возможны большие проблемы с сортировкой данных!!!
1. Удалить поле счетчик.
2. Сохранить таблицу.
3. Создать поле счетчик (естественно, с тем же именем)
4. Сохранить таблицу.

Я таким пользуюсь только в тех случаях, когда подготавливаю базу к запуску после тестов. (Бывают умные люди, которые спрашивают "А почему это я первый в форуме зарегистрировался, а у меня номер 118". Не отвечать же, что я 117 раз регистрировался во время отладки :)

Ответственности за использование этого текста нести не хочу, и не буду. :)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291341
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор писал:Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений.

Мне кажется, что данное утверждение слишком категорично. Думаю, нет ни чего страшного в том, что пользователю будет выводиться (только для чтения) номер счетчика. В небольших базах где, количество номенклатуры не очень большое, и не требуется вводить сложную кодировку номенклатуры, счетчик в полнее может служить именно кодом товара (элемента справочника).
А вот что касается "провалов" или "пробелов" в счетчике, то они могут образоваться при удалении элемента справочника, что будет вполне нормальным и для бухгалтерского (управленческого) учета, т.к. в данном случае в коде элемента справочника не зашифровываются индивидуальные характеристики элемента, группы элементов. А повторять код хоть и удаленного элемента справочника, в данном случае может привести к ошибкам.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291358
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 funddd:

Проблемы будут также в других таблицах, в которых данные привязаны к нашей таблице через уничтоженное поле.

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

2 АлексейЕ:

Да, я уже подумал, что был слишком категоричен. Предлагаю новую формулироку: ...юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291381
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч

А может так?

… Пользователю в большинстве случаев не зачем знать (видеть) о существовании счетчика. Если же счетчик в базе используется как элемент учетной политики предприятия (организации), то заказчик вынужден будет согласиться с теми ограничениями, которые вносит Тип данных (DataType) "Счетчик"…

или что-то типа этого.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291382
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то метод предложенный funddd, мне не нравиться.
Удалять таблицу - это значит удалить и индексы и связи. Заново их создовать? Зачем? Когда ХамТрамвайный предложил (да и по сей день предлагает :) более приятный способ : через Alter (есно после удаления данных хотя можно и до). Правда только для 2000/2002/2003. Для 97 - прокатит простое Сжатие
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291388
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
По-моему, у меня сказано то же самое, только короче. Кроме того, не хотелось бы затрагивать частные случаи типа учетной политики предприятия.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291389
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка:
Я имел виду "не удалить таблицу", а удалить счетчик (что в принципе роли не играет)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291391
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Виктор, я с тобой.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291404
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну кто на нас с Санычем?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291438
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, переиндексировать индекс - это бред! Ну и что, что пробелы в значениях. А если это значение является внешним ключом???


--------------------
Best wishes, Dmitriy
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291445
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч

Согласен. Короче, и то же самое.
Просто я занудный бухгалтер, и описал со своей точки зрения.
Что касается "… частные случаи типа учетной политики предприятия …" (это опять бухгалтерское занудство. Уж простите :)), то, на мой взгляд, это единственный случай при котором требуется счетчик вывести "на глаза" пользователя. Т.е. дополнительная идентификация элемента справочника в учете предприятия.
Хотя, может, теперь я слишком категоричен.
И может действительно не стоит смешивать FAQ по программирования и FAQ по учету. Просто мне показалось, что для начинающего программиста будет полезно понять, когда и в каких случаях требуется отображать Счетчик.

Одним словом ИМХО.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291471
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оффтопик: А что "занудный бухгалтер" делает на форуме sql.ru? Или не такой уж он и занудный?


--------------------
Best wishes, Dmitriy
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291522
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Темный писал:А что "занудный бухгалтер" делает на форуме sql.ru?
Это просто "занудный бухгалтер широкого профиля" :)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291604
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Просто мне показалось, что для начинающего программиста будет полезно понять, когда и в каких случаях требуется отображать Счетчик.

Пусть лучше программист знает, что это не требуется никогда. А если это потребуется, то пусть он узнает об этом от заказчика. И напишет программу, в которой все равно счетчик не отображается, а отображается специально сделанное поле, в котором предусмотрена защита от дырок.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291612
АлексейЕ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч

Убедил.
Раз защита от дырок, так защита от дырок.

P.S. И бублики все заштопаем. :)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291626
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
:^) Гусары, молчать...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291733
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не могу я промолчать!!!! Единственное, могу заменить все смайликами!
--------------------
Best wishes, Dmitriy
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32291890
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оправлять бы пора, в фак уже, многостаночник Владимир Саныч!
--------------------
Best wishes, Dmitriy
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32296969
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Итак, выдаю новую версию. Тут оказалось, что в течение 2,5 месяцев стояла версия с багом. В моем посте от 3 авг добавка про rsCounter.Update добавлена к ответу на совсем другой вопрос. :^)

Q: Как создать свой счетчик (чтобы поле было не типа счетчик)?

A1: Занести в DefaultValue поля:

Код: plaintext
Nz(DMax(...), 0 )+ 1 

Так можно нумеровать записи даже внутри группы, а не только насквозь через всю таблицу. Для этого надо правильно задать параметры DMax.

Правда, надо отдельно позаботиться о ситуации, когда два юзера обратятся к этому "генератору счетчиков" одновременно. На этот случай надо написать обработчик ошибок. Пример обработчика можно взять из приведенного ниже A3.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Function Cou() As Long

Dim ws As Workspace, db As Database
Dim rsCounter As Recordset

On Error GoTo errCou
Set ws = DBEngine( 0 )
Set db = CurrentDb
 1 
ws.BeginTrans
 2 
Set rsCounter = db.OpenRecordset( "select * from tabCounter" )
 3 
rsCounter.AddNew
Cou = rsCounter!nCounter
'Close without update!'
rsCounter.Close
 4 
ws.CommitTrans
 5 
Exit Function

errCou:
Select Case Erl
    Case  3 
        rsCounter.Close
        Set rsCounter = Nothing
        ws.Rollback
        DBEngine.Idle DB_FREELOCKS
        Resume  1 
    Case  2 ,  4 
        ws.Rollback
        DBEngine.Idle DB_FREELOCKS
        Resume  1 
    Case Else
        Resume Next
End Select

End Function 

Вариант: все-таки делать rsCounter.Update, тогда по виду этой таблицы будет сразу ясно, какое значение было выдано последним. Правда, в этом случае файл станет расти.

A3: Держим в отдельной таблице очередное значение счетчика и каждый раз увеличиваем его на 1. Таблица блокируется на момент чтения и увеличения счетчика, а все, кто в нее будут в это время стучаться, спокойно ждут (см. обработчик ошибок adhGetNextAutoNumber_Err) освобождения таблицы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Function adhGetNextAutoNumber(ByVal strTableName As String) As Long

    On Error GoTo adhGetNextAutoNumber_Err

    Dim wrk As dao.Workspace
    Dim db As dao.Database
    Dim rstAutoNum As dao.Recordset
    Dim lngW As Long
    Dim lngX As Long
    Dim intRetryCount As Integer
    
    Randomize
    DoCmd.Hourglass True
    intRetryCount =  0 

    Set wrk = dao.DBEngine.Workspaces( 0 )
    Set db = wrk.OpenDatabase(adhCurrentDBPath() & adhcAutoNumDb, False)
    Set rstAutoNum = db.OpenRecordset(strTableName &  "_ID" , dbOpenTable, dbDenyRead)

    rstAutoNum.MoveFirst
    rstAutoNum.Edit
    rstAutoNum!NextAutoNumber = rstAutoNum!NextAutoNumber +  1 
    rstAutoNum.Update
 
    adhGetNextAutoNumber = lngNextAutoNum

adhGetNextAutoNumber_Exit:
    DoCmd.Hourglass False
    On Error Resume Next
    rstAutoNum.Close
    Set rstAutoNum = Nothing
    db.Close
    Set db = Nothing
    wrk.Close
    Set wrk = Nothing
    Exit Function

adhGetNextAutoNumber_Err:
    Select Case Err.Number
        Case adhcErrRI, adhcLockErrCantUpdate2, adhcLockErrTableInUse
            intRetryCount = intRetryCount +  1 
            If intRetryCount > adhcLockRetries Then
                adhGetNextAutoNumber = - 1 
                Resume adhGetNextAutoNumber_Exit
            Else
                dao.DBEngine.Idle
                lngW = intRetryCount ^  2  * _
                  Int((adhcLockUBound - adhcLockLBound +  1 ) * Rnd() + adhcLockLBound)
                For lngW =  1  To lngW
                    DoEvents
                Next lngW
                Resume
            End If
        Case Else
            MsgBox  "Error "  & Err.Number &  ": "  & Err.Description, _
             vbOKOnly + vbCritical,  "adhGetNextAutoNumber" 
            adhGetNextAutoNumber = - 1 
            Resume adhGetNextAutoNumber_Exit
    End Select

End Function

Q: Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины?

A1: Добавить в таблицу со счетчиком при помощи инсерта запись, в которой полю счетчика дается значение на 1 меньше, чем надо. Потом удалить эту запись. Способ работает только при условии, что этот счетчик этого или большего значения еще не выдавал. (Если таким образом дать счетчику отрицательное значение, то он начнет выдавать отрицательные значения, несмотря на то что уже выдавал значения, большие их. Играя на этом, можно добиться, чтобы счетчик выдавал любые значения, в т.ч. и те, которые уже были.)

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

A3: Начиная с Аксесса 2000, можно запустить запрос наподобие такого:

Код: plaintext
alter table Таблица1 alter column ПолеСчетчик counter( 1 , 1 )

Q: Может ли поле счетчика содержать повторяющиеся значения?

A: В принципе да. Этого несложно достичь, меняя состояние счетчика описанными способами. Однако если при этом возникнут нарушения ключа (вообще говоря, поле счетчика можно и не делать ключевым, но обычно все-таки принято делать), то записи просто не смогут добавляться. Каждая неудачная попытка добавить запись будет увеличивать значение счетчика на 1. Когда зона существующих значений будет пройдена, то записи опять смогут добавляться.

Q: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было?

A: Никаких средств для этого нет. Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть.
...
Рейтинг: 0 / 0
25 сообщений из 176, страница 3 из 8
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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