Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики) / 25 сообщений из 176, страница 1 из 8
31.07.2003, 13:12
    #32223663
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Q: Как создать свой счетчик (чтобы поле было не типа счетчик)?

A1: Nz(DMax(...),0)+1

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

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

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 = ws( 0 )
 1 
    ws.BeginTrans
 2 
    Set rsCounter = db.OpenRecordset( "select * from dbcCounter" )
 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


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

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

A2: Сжать базу, в которой сидит таблица со счетчиком. Счетчик будет выдавать значения начиная с наибольшего из существующих +1.
...
Рейтинг: 0 / 0
31.07.2003, 13:33
    #32223714
Хам трамвайный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Правда, надо отдельно позаботиться о ситуации, когда два юзера обратятся к этому "генератору счетчиков" одновременно

а чего забоиться?
событие "до обновления" формы
с условием, что эта запись newrecord
и конфликтов не будет
...
Рейтинг: 0 / 0
31.07.2003, 13:35
    #32223723
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Дык два юзера получат одинаковый DMax и один из них упадет на нарушение ключа.
...
Рейтинг: 0 / 0
31.07.2003, 13:37
    #32223727
Хам трамвайный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
не понял как "два юзера получат одинаковый DMax"
я же тебе сказал как
...
Рейтинг: 0 / 0
31.07.2003, 13:40
    #32223731
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Ну так двое одновременно же!

1. Первый посчитал DMax, получил 10.
2. Второй посчитал DMax, получил 10.
3. Первый добавил запись.
4. Второй попытался добавить запись и упал.
...
Рейтинг: 0 / 0
31.07.2003, 13:42
    #32223734
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Не будет, Саныч, конфликтов.
Но а если перестраховаться - можно (нужно?) обработку ошибки в форму вставить.
...
Рейтинг: 0 / 0
31.07.2003, 13:42
    #32223737
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Где я ошибаюсь в 13:40?
...
Рейтинг: 0 / 0
31.07.2003, 13:46
    #32223744
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
2 Хам Трамвайный и Виктор Сенин
Видимо считается, что от момента До_Обновления (при условии что новая запись) до собственно обновления промежуток времени маленький и никто не успеет помешать. Поставьте точки останова и убедитесь в обратном.
...
Рейтинг: 0 / 0
31.07.2003, 14:30
    #32223841
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
A2: Заводим отдельную таблицу с одним полем типа счетчик и без данных. Приводимая ниже процедура обращается к такой таблице и возвращает очередное значение для "нашего" счетчика.
Код: plaintext
1.
2.
3.
    rsCounter.AddNew
    Cou = rsCounter!nCounter
    'Close without update!'
    rsCounter.Close

Внимание - файл, в котором сидит эта таблица, запрещено сжимать.

А если изначально в табличке сделать одну запись, а потом делать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
    rsCounter.AddNew
    Cou = rsCounter!nCounter
    rsCounter.Update
    rsCounter.MoveFirst
    rsCounter.Delete
    rsCounter.Close

Тогда файл можно спокойно жать.

Q: Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины?
Мажно еще где-нибудь хранить смещение, которое и прибавлять/отнимать от новых значений счетчика.
...
Рейтинг: 0 / 0
31.07.2003, 14:36
    #32223855
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Только учти, что между MoveFirst и Delete запись уже может быть удалена другим пользователем
...
Рейтинг: 0 / 0
31.07.2003, 14:38
    #32223860
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Ну и что? Пусть удалена (при этом другой пользователь создал новую запись с очередным значением). После этого все равно в таблице остается одна запись с максимальным значением счетчика.
...
Рейтинг: 0 / 0
31.07.2003, 14:45
    #32223872
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Ну и что? Пусть удалена (при этом другой пользователь создал новую запись с очередным значением)
Которая в таблице и останется
Может, вообще не удалять? Подумаешь - база чуть-чуть расти будет. Не страшо.
...
Рейтинг: 0 / 0
31.07.2003, 14:50
    #32223881
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Которая в таблице и останется
Ну да. Зато после этого файл можно сжимать/восстанавливать.
Может, вообще не удалять? Подумаешь - база чуть-чуть расти будет. Не страшо.
Но счетчик нужен для создания записи в другой таблице. А то что там создаем записи - тоже страшно? 4 байта в таблице-счетчике против N байт в таблице с данными. По-моему, действительно не страшно.

Кроме того, лично для меня еще вопрос: если в таблице постоянно живет одна запись (удаляемая и создаваемая заново), то будет ли эта таблица постоянно заставлять пухнуть весь файл.
...
Рейтинг: 0 / 0
31.07.2003, 14:53
    #32223890
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
> ...то будет ли эта таблица постоянно заставлять пухнуть весь файл.

Будет. Стирание ведь не освобождает места.

Короче, из альтернативных вариантов остается только вариант без стирания. :^)
...
Рейтинг: 0 / 0
31.07.2003, 14:57
    #32223897
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Короче, из альтернативных вариантов остается только вариант без стирания. :^)
Нет, со стиранием лучше, имхо. Веть база нет-нет а и поломаться может. Тогда восстановление можно делать без головной боли. Да еще и поменьше на величину до 4x(rsCounter!nCounter-1) байт может стать.
...
Рейтинг: 0 / 0
31.07.2003, 15:03
    #32223907
TRoUbLEs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Ребята, а можно вас попросить приме DMax'а, а еще лучше описать немного эту функцию. А то я ее что-то не совсем понял. Что она делает?
В аксесе выдается такой код: DMax («expr»; «domain»; «criteria»)
Че там надо подставлять?
Допустим «expr» - это поле по которому ищем максимум, а вот остальное что???
Что за критерий??? Или это должен быть критерий в котором ищем максимум? Т.е., допустим, максимальное кол-во расхода по 2-й кассе???
Ну и что такое домен вообще не всосал?
P.S. Сорри за глупый вопрос.
...
Рейтинг: 0 / 0
31.07.2003, 15:06
    #32223912
Senin Viktor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
2ЛП и Санычу
>Поставьте точки останова и убедитесь в обратном.

М.б. возможно, никто не спорит. Поэтому я и написал про перестраховку и обработку ошибок. Я как-тона форуме описывал свою ситуацию: у меня в случае ошибки прибавлется 1 к значению и снова пытаемся сохраниться и так 5 раз - потом выдаю сообщение (юзеров в базе не более 5 - поэтому цифра "5", и вообще надо же когда-нибудь остановиться :) )

А если нужно что-то дргоу: у того же Гетца описан очень хорошо данный вопрос. Ну очень хорошо. Предлагаю взять его пример и юзать далее. А силы сберечь для вопроса почему у меня не работает Left
...
Рейтинг: 0 / 0
31.07.2003, 15:08
    #32223919
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Действительно, по варианту ВС база не растет.
Если создавать и удалять запись, 50 000 итераций - выросла на 700 кб.
...
Рейтинг: 0 / 0
31.07.2003, 15:20
    #32223949
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
> Нет, со стиранием лучше, имхо.

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

> Веть база нет-нет а и поломаться может. Тогда восстановление можно делать без головной боли.

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

Да в том то и дело, что не надо ничего обставлять - само будет работать.
...
Рейтинг: 0 / 0
31.07.2003, 15:22
    #32223957
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
То было 2 Geo. А теперь 2 Senin Viktor:

> Поэтому я и написал про перестраховку и обработку ошибок.

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

О чем мы спорим? :^)
...
Рейтинг: 0 / 0
31.07.2003, 15:22
    #32223958
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
то для восстановления надо только создать ее заново и задать счетчику то значение, на котором он остановился.
Тогда надо делать прибамбасы, каждый раз запоминающие это самое значение счетчика.
...
Рейтинг: 0 / 0
31.07.2003, 15:23
    #32223959
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
2 Geo:

Когда два юзера стирают одну запись, то конфликтов не будет?
...
Рейтинг: 0 / 0
31.07.2003, 15:24
    #32223961
Владимир Саныч
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
> Тогда надо делать прибамбасы, каждый раз запоминающие это самое значение счетчика.

ЗАЧЕМ???
...
Рейтинг: 0 / 0
31.07.2003, 15:24
    #32223962
Geo
Geo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FAQ. Что мы знаем про каунтеры (aka счетчики)
Ой. :(
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики) / 25 сообщений из 176, страница 1 из 8
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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