powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики)
176 сообщений из 176, показаны все 8 страниц
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223663
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223714
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правда, надо отдельно позаботиться о ситуации, когда два юзера обратятся к этому "генератору счетчиков" одновременно

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

1. Первый посчитал DMax, получил 10.
2. Второй посчитал DMax, получил 10.
3. Первый добавил запись.
4. Второй попытался добавить запись и упал.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223734
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не будет, Саныч, конфликтов.
Но а если перестраховаться - можно (нужно?) обработку ошибки в форму вставить.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223737
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Где я ошибаюсь в 13:40?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223744
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Хам Трамвайный и Виктор Сенин
Видимо считается, что от момента До_Обновления (при условии что новая запись) до собственно обновления промежуток времени маленький и никто не успеет помешать. Поставьте точки останова и убедитесь в обратном.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223841
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223855
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только учти, что между MoveFirst и Delete запись уже может быть удалена другим пользователем
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223860
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и что? Пусть удалена (при этом другой пользователь создал новую запись с очередным значением). После этого все равно в таблице остается одна запись с максимальным значением счетчика.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223872
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и что? Пусть удалена (при этом другой пользователь создал новую запись с очередным значением)
Которая в таблице и останется
Может, вообще не удалять? Подумаешь - база чуть-чуть расти будет. Не страшо.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223881
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Которая в таблице и останется
Ну да. Зато после этого файл можно сжимать/восстанавливать.
Может, вообще не удалять? Подумаешь - база чуть-чуть расти будет. Не страшо.
Но счетчик нужен для создания записи в другой таблице. А то что там создаем записи - тоже страшно? 4 байта в таблице-счетчике против N байт в таблице с данными. По-моему, действительно не страшно.

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

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

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

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

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

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

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

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

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

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

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

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

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

ЗАЧЕМ???
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223962
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой. :(
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223967
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...между MoveFirst и Delete ...
Не понял сразу, прошу прощения.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32223975
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у кого Гетц под рукой - скинте сюда его пример работы с собственным счетчиком.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32224020
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.2 стр.87
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32225818
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Новая версия. Изменения выделены болдом.

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

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

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

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

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

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 tab Counter")
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 меньше, чем надо. Потом удалить эту запись. Способ работает только при условии, что этот счетчик этого или большего значения еще не выдавал. Вариант: все-таки делать rsCounter.Update, тогда по виду этой таблицы будет сразу ясно, какое значение было выдано последним. Правда, в этом случае файл станет расти.

A2: Сжать базу, в которой сидит таблица со счетчиком. Счетчик будет выдавать значения начиная с наибольшего из существующих +1.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227450
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если у кого есть т.2 стр.87, шепните, плз, о чем там...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227466
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шепчу:)
Правда без Гетцевых комментариев

Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
Option Compare Database
Option Explicit

' From Access 2000 Developer's Handbook, Volume II
' by Litwin, Getz, and Gilbert. (Sybex)
' Copyright  1999 . All rights reserved.

' Database storing autonumber values
Const adhcAutoNumDb = "Ch02Auto.Mdb"

' Number of lock retry attempts
Const adhcLockRetries =  5 
' Lower bound of range of retry wait
Const adhcLockLBound = 2
' Upper bound of range of retry wait
Const adhcLockUBound =  10 

'Error constants
Const adhcErrRI = 3000
Const adhcLockErrCantUpdate2 = 3260
Const adhcLockErrTableInUse = 3262

Private Function adhCurrentDBPath() As String
    
    ' Return just the path of the current database,
    ' including the trailing backslash.
    
    ' From Access  2000  Developer's Handbook, Volume II
    ' by Litwin, Getz, and Gilbert (Sybex)
    ' Copyright 1999.  All rights reserved.
    
    ' NOTE: This is only useful if you're using DAO.
    ' If you're using ADO, use the CurrentProject.Path
    ' property instead.
    
    On Error GoTo HandleErrors
    
    Dim intPos As Integer
    Dim strFullPath As String
    
    strFullPath = CurrentDb.Name
    ' Find the last "\" in the file name.
    intPos = InStrRev(strFullPath, "\")
    
    ' Given the position of the final  "\" ,
    ' pull of the path portion.
    If intPos > 0 Then
        adhCurrentDBPath = Left$(strFullPath, intPos)
    Else
        adhCurrentDBPath = strFullPath
    End If
    
ExitHere:
    Exit Function
    
HandleErrors:
    Select Case Err.Number
        Case Else
            Err.Raise Err.Number, Err.Source, _
             Err.Description, _
             Err.HelpFile, Err.HelpContext
    End Select
    Resume ExitHere
End Function

Function adhAssignID(frm As Form, ByVal _
 strTableName As String, _
 ByVal strAutoNumField As String) As Variant

    ' Called from BeforeInsert event of a form to assign
    ' a new custom autonumber value for a field.
    ' Removes any record that cannot be saved.
    '
    ' From Access  2000  Developer's Handbook, Volume II
    ' by Litwin, Getz, and Gilbert. (Sybex)
    ' Copyright 1999. All rights reserved.
    '
    ' In:
    '    frm: form object variable that points to the
    '     currently opened form.
    '    strTableName: the name of the table for which
    '     the autonumber is to be retrieved.
    '    strAutoNumField: the name of the Long Integer
    '     field in strTableName that requires the new
    '     autonumber value.
    ' Out:
    '     Return value: None
    ' Example:
    '     varReturn = adhAssignID(Me,  "tblMenu" ,  "ID" )

    On Error GoTo adhAssignID_Err

    Dim lngNewID As Long

    lngNewID = adhGetNextAutoNumber(strTableName)
    Debug.Print lngNewID
    If lngNewID <> - 1  Then
        frm(strAutoNumField) = lngNewID
    Else
        MsgBox  "Can't Add Record; autonumber " & _
        "Not Available", vbOKOnly + vbCritical, _
        "Error Saving Record"
        frm.Undo
    End If

adhAssignID_Exit:
    Exit Function

adhAssignID_Err:
    frm.Undo
    MsgBox "Error " & Err.Number & ": " & Err.Description, _
     vbOKOnly + vbCritical, "adhAssignID"
    Resume adhAssignID_Exit

End Function

Function adhGetNextAutoNumber(ByVal strTableName _
 As String) As Long
    
    ' Returns the next custom autonumber value for a
    ' particular table. Autonumbers are stored in the
    ' database adhcAutoNumDb in tables with _ID appended
    ' for which they supply autonumbers.
    ' Returns -1  if a valid autonumber value cannot be
    ' retrieved due to locking problems.
    '
    ' From Access 2000 Developer's Handbook, Volume II
    ' by Litwin, Getz, and Gilbert. (Sybex)
    ' Copyright  1999 . All rights reserved.
    '
    ' In:
    '    strTableName: the name of the table for which the
    '     autonumber is to be retrieved.
    ' Out:
    '     Return value: A Long containing the new
    '      autonumber value, or -1 if the routine couldn't
    '      provide a autonumber value.
    ' Example:
    '     lngNewID = adhGetNextAutoNumber("tblMenu")

    On Error GoTo adhGetNextAutoNumber_Err

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

    ' Open a recordset on the appropriate table in the
    ' autonumbers database denying all reads to others
    ' while it is open
    Set wrk = dao.DBEngine.Workspaces( 0 )
    Set db = wrk.OpenDatabase(adhCurrentDBPath() & _
     adhcAutoNumDb, False)
    Set rstAutoNum = db.OpenRecordset(strTableName _
     & "_ID ", dbOpenTable, dbDenyRead)

    ' Increment and return the autonumber value
    rstAutoNum.MoveFirst
    rstAutoNum.Edit
        lngNextAutoNum = rstAutoNum![NextAutoNumber]
        rstAutoNum![NextAutoNumber] = lngNextAutoNum + 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
        ' Table locked by another user
        intRetryCount = intRetryCount + 1 
        ' Tried too many times, give up
        If intRetryCount > adhcLockRetries Then
            adhGetNextAutoNumber = -1
            Resume adhGetNextAutoNumber_Exit
        Else
            ' Let Windows and the Jet Engine catch up
            dao.DBEngine.Idle
            ' Space out the retries based on a number
            ' that increases by the number of retries
            ' and a random number
            lngW = intRetryCount ^ 2 * _
             Int((adhcLockUBound - adhcLockLBound + 1) _
              * Rnd() + adhcLockLBound)
            ' Waste time, but let Windows
            ' multitask during this dead time.
            For lngW = 1 To lngW
                DoEvents
            Next lngW
            Resume
        End If
        Case Else
            ' Unexpected error
            MsgBox "Error  " & Err.Number & " :  " _
             & Err.Description, _
             vbOKOnly + vbCritical, " adhGetNextAutoNumber"
            adhGetNextAutoNumber = - 1 
            Resume adhGetNextAutoNumber_Exit
    End Select

End Function


...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227519
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Виктору много енотов!

Я так понимаю, что главное здесь вот что:

Код: plaintext
1.
2.
3.
    rstAutoNum.Edit
        lngNextAutoNum = rstAutoNum![NextAutoNumber]
        rstAutoNum![NextAutoNumber] = lngNextAutoNum +  1 
    rstAutoNum.Update


И словами это описывается так: держим в отдельной таблице очередное значение счетчика и каждый раз увеличиваем его на 1.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227523
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главное: что таблица блокируется на момент чтения и увеличения счетчика, а все кто в нее будут в это время стучаться спокойно ждут (см. обработчик ошибок adhGetNextAutoNumber_Err) освобождения таблицы.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227528
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ОК, да, таблица открывается с dbDenyRead.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32227545
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кстати, похоже, что там баг. Вот две строки, которые идут подряд:

Код: plaintext
1.
        lngNextAutoNum = rstAutoNum![NextAutoNumber]
        rstAutoNum![NextAutoNumber] = lngNextAutoNum +  1 


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

А если бы автор этого кода не выпендривался и написал как человек

Код: plaintext
        rstAutoNum![NextAutoNumber] = rstAutoNum![NextAutoNumber] +  1 


то этого эффекта бы не было.

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

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

Geo, тебе спасибо за подсказку.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32284359
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
К тому же вопросу, ответу A1 еще одно примечание:

Если таким образом дать счетчику отрицательное значение, то он начнет выдавать отрицательные значения, несмотря на то что уже выдавал значения, большие их.

И кроме того:

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

A: В принципе да. Этого несложно достичь, меняя состояние счетчика описанными способами. Однако если при этом возникнут нарушения ключа (вообще говоря, поле счетчика можно и не делать ключевым, но обычно все-таки принято делать), то записи просто не смогут добавляться. Каждая неудачная попытка добавить запись будет увеличивать значение счетчика на 1. Когда зона существующих значений будет пройдена, то записи опять смогут добавляться.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32284509
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если таким образом дать счетчику отрицательное значение
Саныч, а почему именно отрицательное? Задаешь любое, и счетчик начинает плясать именно от него. Несмотря на то, что уже были значения большие их.
Кстати, по моему это справедливо только для 97-го. В 2002-м у меня выдавалось как раз Max+1. Очередная загадка от MS.

Может ли поле счетчика содержать повторяющиеся значения?
Если нет уникального индекса - то очень даже может. Причем как в случае шаманства (ручная установка значения), так и в ходе нормальной многопользовательской работы.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32284567
Фотография fedd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что такое faq - часто задаваемые вопросы.\r
\r
нужно дать ответ на вопрос - "что такое счетыик, зачем он" и "почему счетчик не заполняет дырки в последовательности значений" и сделать небольшой экскурс в теорию о "суррогатных ключах" типа этого
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32284904
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что мы НЕ знаем про каунтеры (aka счетчики)

Регулярно, с периодичностью примерно раз в две недели, натыкаюсь на проглючивший первичный ключ в виде счетчика. То туда Null запишется (хотя поле обязательное), то значения задублируются (хотя есть уникальный индекс). Появляется в совершенное разных таблицах, единственное чем они похожи - наличием счетчика. Взглючившие записи - старые, уже существовавшие достаточно долго.
Ни одна таблица с первичным ключом в виде "рукотворного счетчика" (длинное целое) ни каких подобных безобразиях замечена не была.
У кого-нибудь есть мысли по этому поводу?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32285627
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Саныч, а почему именно отрицательное? Задаешь любое, и счетчик начинает плясать именно от него. Несмотря на то, что уже были значения большие их.

Ровно вчера я собственными глазами видел, что это не так. Аксесс 97. Скажем, у счетчика значения до 10. Добавляешь запись с 20, он сам начинает выдавать значения от 21. Потом добавляешь запись с 15, а он нифига.

> То туда Null запишется (хотя поле обязательное), то значения задублируются (хотя есть уникальный индекс).

Похоже, что база накрылась.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286411
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Поправка от 4 окт 03, 15:10 вроде бы отменяется. :^)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286453
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка поправки!!!!
Если удалить все записи и сжать БД, то тогда счетчик сбрасывается. Если удалить только несколько последних и сжать , то тогда облом
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286477
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то Темный ты темнишь

Если сжимать именно базу, а не хранилище линков на таблицу, то счетчик сброситься
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286484
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все вышесказанное относиться к Access XP SP2.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286488
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Senin Viktor:
А как же это сжать хранилище линков на таблицу
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286490
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я проверил в 2000. Действительно облом. :^(
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286501
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Итак, добавляю способ сбрасывания счетчика (спасибо Хаму):

alter table Таблица1 alter column ПолеСчетчик counter(1,1)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286502
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А как же это сжать хранилище линков на таблицу

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

==
А что тут смешного было?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32286510
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я таки знал!
Смешного - ничего. Настроение у меня сегодня хорошее. 3 дня выходных пошли на пользу.

Просто проверку я производил все-таки в базе с таблицами.
...
Рейтинг: 0 / 0
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
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32297065
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эй, факописатели!
Кто нить проверял Q1 A1?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32297263
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Видимо, нет, потому что про обработчик ошибок там сказано, что "можно сделать". Если можно - значит не пробовали.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32297309
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Надо дать примечание. Возможности DefaultValue в поле таблицы ограничены. Поэтому все эти хитрые функции приходится использовать либо в DefaultValue поля на форме, либо в программе, которая добавляет запись через рекордсет, либо в запросе на добавление.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32297316
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо дать примечание.
Список функций, разрешенных для использования в дефаултвалуе, ограничен.

перенесите меня на лестницу плиз
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312564
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Очередная версия. Надеюсь, что последняя.

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

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

Вариант 1:

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

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

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

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

Код: 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, тогда по виду этой таблицы будет сразу ясно, какое значение было выдано последним. Правда, в этом случае файл станет расти.

Вариант 3 (от Гетца): Держим в отдельной таблице очередное значение счетчика и каждый раз увеличиваем его на 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: Никаких средств для этого нет. Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть.

Q: Как сымитировать счетчик в отчете?

A: Заводим текстбокс и задаем ему свойства:

Код: plaintext
1.
ControlSource =  "=1 "
RunningSum = True

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

A: Пишем функцию примерно такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function MyFun(Optional iStartValue As Variant) As Long
Static n As Long
If IsMissing(iStartValue) Then
    MyFun = n
    n = n +  1 
Else
    n = iStartValue
    MyFun = True
End If
End Function

В запросе обращаемся к ней дважды:

в части WHERE - с параметром N, где N равно нужному начальному значению счетчика;

в части SELECT - без параметра.

И еще есть парочка вопросов, которые будут добавлены.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312669
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: plaintext
Отмодерировано автором. Узнать, что тут было, можно в ответе Лоха.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312700
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, что это было? В смысле какая бешеная лошадь тебе последний вопрос-ответ сказала?

Известно, что при редактировании записи блокируется (от редактирования другими пользователями) не только эта запись, но и вся "страница"
А у меня другая информация :). Умные книги утверждают, что прогресс таки победил и в аксесе уже несколько лет как сделали блокировку отдельных записей.

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

Соответственно, если одну из них кто-то начнет редактировать, то меньше вероятность, что заблокированными будут другие.
С чего это вдруг? Как были заблокированы записи в количестве одной страницы, так и остались заблокированы записи в количестве одной страницы. И вероятность не меньше и не больше, а ровно 100%.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312730
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Драсте...
Саныч, ЛП как обычно категоричен (хотя, блин, "морозы" исчезли:), но я тоже смутно припоминаю, что счетчики со случайными значениями используются в реплицируемых БД. Типа, меньше шансов, что в разных БД появятся записи с одинаковым ключом и, соответственно, объединение этих БД пройдет более "мягко".
Хотя, с другой стороны, в реплицируемых БД вроде GUIDы используются... Вообщем, я это... просто поздороваться зашел
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312738
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ОК, уберу этот кусок нафиг. :^)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32312745
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Нуф-Нуф
Морозы не исчезли, просто зима наступила в реале. И так холодно, а от песен совсем труба. Буду вспоминать теплую летнюю песню, как вспомню - буду петь.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32318151
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Q: Как получить значение счетчика только что добавленной записи?

A1: Если запись добавляется через рекордсет, то так:

Код: plaintext
1.
2.
3.
rs.AddNew
переменная = rs!полесчетчика
...
rs.Update

A2: Более широкий круг применимости у такого способа:

Код: plaintext
1.
2.
3.
4.
Dim rs As New ADODB.Recordset
CurrentProject.Connection.Execute  "INSERT ..." 
rs.Open  "SELECT @@identity as cou" , CurrentProject.Connection
переменная = rs!cou
rs.Close

Однако и этот способ имеет ограничения, а именно:
работает только через ADO и только в Jet 4 и позже;

возвращает значение только из записи, добавленной программно, но не через юзер-интерфейс.

Thanx 2 Хам, Лох, Виг!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32320454
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В свете последних веяний вношу поправку. Оказывается, если описать нечто As New, то потом нельзя превратить его в Nothing. Поэтому превращаю

Dim rs As New ADODB.Recordset

в

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32323583
Fagrant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут пытался играть с аттрибутами поля (.Attributes), по идее комбинируя их можно получить нечто вроде автоинкрементированного поля, но с возможностью редактирования. И наоборот :) Но мне не удалось достичь нужного результата, возможно что-то упустил, башка не в ту сторону думает ;(
Что скажут мэтры? Такое невозможно в принципе? Тогда нафига эти аттрибуты созданы?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32323588
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
По-моему, есть стандартный набор типов полей, из которого вылезть нельзя. Атрибуты сделаны для того, чтобы либо создать поле разрешенного типа, либо узнать тип существующего поля.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32323921
VikingTor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно... все замммммечательно с этими каунтерами...
Тока вот вопрос - а как все это будет работать если к таблице с таким каунтером применить INSERT INTO...SELECT... - добавление нескольких записей одним запросом?
Не будет ли так, что все добавляемые записи будут пытаться брать одновременно одно и то же значение доморощенного каунтера? А?
Спрашиваю, потому что лень проверить
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32323949
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, уже начал кипятком писать по поводу "лень проверить", но вовремя поглядел на приведенный кусок кода.

Саныч, если в функцию ничего не передавать - она будет вызываться только один раз . Поэтому надо туда передавать хоть что-то, например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function MyFun(varDummy As Variant, Optional iStartValue As Variant) As Long
Static n As Long
If IsMissing(iStartValue) Then
    MyFun = n
    n = n +  1 
Else
    n = iStartValue
    MyFun = True
End If
End Function

В запросе обращаемся к ней дважды:
в части WHERE - с параметрами (чтоугодно,N), где N равно нужному начальному значению счетчика;

в части SELECT - в качестве первого параметра передавать любое поле из таблицы, второй параметр не указывать.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32324731
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 VikingTor:

Немножко не понял вопрос. Таблица с обычным каунтером, а инсерт с обычными данными? Или кто-то из них с каким-то из приемов, описанных выше?

2 Лох:

А тебя зато понял. :^) Да, надо будет дать твой вариант кода вместо моего и дать к нему пояснение, почему его нельзя упрощать.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32325161
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч писал:В свете последних веяний вношу поправку. Оказывается, если описать нечто As New, то потом нельзя превратить его в Nothing.
А вот с этого места пожалуйста поподробнее .
Что за новые веяния?Почему не знаю?И почему у меня превращает?Что я делаю неправильно?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32325163
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VIG, не нервничай, можно
Set чтототам = Nothing превратит что-то там в Nothing
Но при первом же действии с чтототам (даже при таком элементарном как чтототам Is Nothing) оно создается заново. Так что лучше так не писать.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32325171
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но при первом же действии с чтототам (даже при таком элементарном как чтототам Is Nothing) оно создается заново.
Ну,ПРО ЭТО я знаю...
Я ,то грешным делом подумал,что вышел новый указ кнессета/Гос.думы/модераторов ,запрещающий использование dim чтототам as new .
"Теперь я спокоен,чего мне бояться ..." (В.Высоцкий)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32327817
Данил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго вам, сограждане!
Никто, кстати, не сталкивался с таким траблом?
Если у вас ленточная форма / Access97, то самопальный счетчик выдает max, если поле видно на экране, и max+1 (что и требуется), если записей много и оно уже ушло из "зоны видимости"
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32327822
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Это смотря что понимается под самопальным счетчиком. Их только в этим топике несколько разных.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32333921
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Q: Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей M, где M<N. Почему счетчик не правильно считает количество записей в таблице? Что это - баг или фича?

А: Счетчик не должен подсчитывать количество актуальных записей в Вашей таблице. Его назначение совсем другое. Прочитай этот фак целиком и тебе все будет понятно.

ЗЫ Ясно, что вопрос перекликается с вопросом про дырки, но мне кажется, что надо жирно выделенное как-то пометить.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32333938
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я бы выделил жирным примечание в конце. :^)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366152
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не стал заводить отдельный топик, т.к. мой вопрос вроде бы пересекается с этим. Сорри, если что.

Есть задача: сделать автоматическу нумерацию документов в пределах, скажем, месяца, без "закрытия периода" и без "архивных табличек". Конечно, нормальный счетчик, обслуживаемый акцессом, в таблице есть, для связей и т.п. Но нужна нумерация документов - та, что видна пользователю и печатается в выходных формах. Причем в пределах месяца разные пользователи не должны одновременно получить (то, что они сами могут поставить, вопрос другой) два одинаковых номера. Где-то в начале этого топика я предлагал довольно идиотский способ. Теперь я его же попробовал сделать. Вот что получилось:

В "серверной" базе держим запись с последним номером. Очередной пользователь увеличивает ее содержимое и пользуется полученным значением.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  Dim rs As DAO.Recordset
  Dim rsLocal As DAO.Recordset
  Dim t As Long
  
  Set rs = CurrentDb.OpenRecordset( "mycounters" , dbOpenDynaset)
  Set rsLocal = CurrentDb.OpenRecordset( "testcounters" , dbOpenDynaset)
  
  Do While True
    On Error Resume Next
    Do
      Err.Clear
      rs.Edit
      t = rs!mycounter
      t = t +  1 
      rs!mycounter = t
      rs.Update
    Loop While Err.Number
    On Error GoTo  0 
    rsLocal.AddNew
    rsLocal!testcounter = t
    rsLocal.Update
    Me.Поле1 = t
    Me.Repaint
  Loop


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

Плюсы - можно генерить уникальные значения в пределах периода без пересоздавания таблицы.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366159
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GeoПопробовал двумя параллельными сеансами. Насоздавалась куча записей. Повторов нету.
А пробовал запускать параллельно с точностью до 0,000001 секунды? :^)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366175
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А смысл? Я же в цикле записи создаю, пока не остановлю программу. Две программы непрерывно одновременно стучались в "сетевую" таблицу с попытками исправить одну из ее записей.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366182
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Гео
То что у тебя повторов не случилось - еще ни о чем не говорит. Попробуй сотню клиентов, да через 10-мегабитную сеть к загруженному серваку.
И непонятно, зачем тебе дополнительная таблица. Выкидываешь ее и делаешь то же самое - в основной таблице ищешь максимальный номер (пусть будет N), и добавляешь новую запись с номером N+1. Кажется мне что это то же самое что и с двумя таблицами. Ну или почти тоже самое - все таки редактирование таблицы с одной записью (твой вариант со вспомогательной таблицей) происходит быстрее, чем добавление записи в большую таблицу (мой вариант без вспомогательной таблицы). Стало быть критическое время уменьшается. Но все равно взглючить может.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366197
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И непонятно, зачем тебе дополнительная таблица. Выкидываешь ее и делаешь то же самое - в основной таблице ищешь максимальный номер (пусть будет N), и добавляешь новую запись с номером N+1.

Не то же самое. Я получаю очередной номер только в том случае, если мне удалось его записать - т.е. исправить существующую запись. По варианту "ищем максимальный - создаем его же +1" так не получиться.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366208
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По варианту "ищем максимальный - создаем его же +1" так не получиться.
Именно так и получится. Запихни все это в такой же цикл (с проверкой Err.Number)
И получишь то же самое. Если запись добавил - значит победил, если нет - значит снова макс+1 и попытка добавить, пока добавлялка не устанет.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366211
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, разумеется, я исхожу из предположения, что есть уникальный индекс.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366221
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я же сказал, что говорю о случае, когда индекса нет и быть не может :)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32366226
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
явным образом не сказал
но в твоем случае действительно индекса нет и быть не может :)
беру свои слова обратно.

DBEngine(0).Rollback
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372104
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю здесь: Владимир Саныч
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Q: Как получить значение счетчика только что добавленной записи? 


A2: Более широкий круг применимости у такого способа: 

Dim rs As New ADODB.Recordset
CurrentProject.Connection.Execute  "INSERT ..." 
rs.Open  "SELECT @@identity as cou" , CurrentProject.Connection
переменная = rs!cou
rs.Close

Однако и этот способ имеет ограничения, а именно:

работает только через ADO и только в Jet 4 и позже;

возвращает значение только из записи, добавленной программно, но не через юзер-интерфейс.


чуть-чуть уточнить: если обращаться, пусть даже через Jet 4, к базе раннего формата, то метод не работает.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372154
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно уточнить? Этот ФАК только для mdb или adp тоже подпадает?
А то с @@identity в SQL2000 можно обломаться...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372167
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Наверно, надо дать примечание и про SQL тоже.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372226
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда надо написать, что для SQL Server 2000 вместо @@identity используется SCOPE_IDENTITY(). Первое при наличии триггера на вставку в другую таблицу с полем IDENTITY вернет id, вставленный триггером, а не вставленный исходной инструкцией.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372243
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про SQL - в ГФ.
А то еще и реализацию на Oracle кто-нибудь попросит :)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372249
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 Темный:
Но ведь это касается и adp. А это уже Аксесс.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372252
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А через ODBC можно много чего подключить.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372255
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да, но это не ODBC.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32372263
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут уже был недавно топик про то, что можно подключить как CurrentProject.Connection, а что НИЗЯ \r
\r
/topic/67168
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32401841
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Добавляю способ имитации каунтера для обычного запроса либо ленточной формы. Источник: http://am.rusimport.ru/MsAccess/topic.aspx?ID=87

Способ 1.
SELECT (Select Sum(1) From t AS p Where p.f<=p1.f), p1.f
FROM t AS p1
ORDER BY p1.f;

Способ 2.
SELECT DCount("f", "t","f<=" & CStr(f)), f
FROM t
ORDER BY f;

Примечание 1. Поле f обязано быть уникальным.

Примечание 2. Способ 1 быстрее работает, но является необновляемым.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32402006
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Geo, пройди и ты по этой ссылке. Я там к твоему посту примечание сделал...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32402525
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВС, вечером посмотрю - на работе тырнета нет сейчас, а обед кончился :(
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32403317
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ВС
Посмотрел.
У меня и при сортировке порядок сохраняется. Вернее, визуально перепутывается. Т.е. если запись с ид=2 имела порядковый номер 5, то после сортировки по ид он у нее и останется 5, а не станет 2, что было бы логично. В принципе, можно пытаться ловить момент сортировки и т.п., или запрещать ее. Да и вообще не знаю, чем этот вариант лучше. :) Просто он есть.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32403961
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня при первом показе экрана было так, как ты описываешь. А потом я стал переходить к другому окну и возвращаться, и значения счетчика за минуту дошли до 1000 (в таблице из 20 записей).
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32406397
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Гы?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32406403
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А што "гы"?

Собственно, мне нечего добавить.

Возможно, это одного поля ягода с явлением повторного выполнения onprint при предварительном просмотре отчета, которое мы сейчас обсуждаем.

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

create table xx (id counter)

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

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

Спасибо Темному!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32484494
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вах! Прыятно, да!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487058
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маленькое уточнение
SELECT @блабла = SCOPE_IDENTITY
в ХП вернет null
пользоваться параметром вывода
RETURN SCOPE_IDENTITY
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487060
Odess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, у меня "SELECT SCOPE_IDENTITY() as maxID" возвращает не NULL - а реальное значение счетчика. A2002, SQL 2000.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487061
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня null
ado.net + msde
щас в bol залезу
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487063
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Мужики, вы говорите о разных командах.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487064
Odess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня выдавал NULL когда я добавлял запись через .ADDNEW, пришлось переделать через "insert into ..." - тогда все заработало. Почему не работает в первом случае - лень было разбираться...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487065
Odess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ВС
Мы говорим об SCOPE_IDENTITY() - а как ее возвращать дело второе ИМХО.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487067
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вы говорите о том, что через
SELECT SCOPE_IDENTITY() as maxID
и
RETURN SCOPE_IDENTITY
оно работает, а через
SELECT @блабла = SCOPE_IDENTITY
нет. Вы тут спорите о чем-то, а спорить не о чем.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487071
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BOL дома нету,\r
прошолся гуглом и нашел тока на клиппере кто то столкнулся тынц \r
и Павла 2001 года тынц но у меня не то, я через command, завтра на ado.net форуме задам\r
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ALTER PROCEDURE dbo.spNewSD2\r
\r
....\r
\r
AS\r
        INSERT INTO tSdelka ( dogovor, ddogovor,  ....)\r
        VALUES (@ndogovor, @ddogovor,  ...)\r
\r
SELECT @idsd = SCOPE_IDENTITY()\r
...\r
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487073
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тьфу, прошу прошения...
подмахнуф вместо @@identity незаметил :)
все ухожу спать, спасибо!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487074
Odess
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Артист
Кларион и Клиппер абсолютно разные вещи ;-)
Я аж прыгул по ссылке - думаю неуж то Клиппер с эскюлем стыковали? ;-)))
Я на Клиппере много задач решил в свое времяю Он даже лицензионный был у меня...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487075
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернулся из кровати
позвольте а кроме как в параметре я тогда несмог бы использовать SCOPE_IDENTITY ?

Кларион и Клиппер абсолютно разные вещи ;-)
ну да кларион магнитолы есть такие
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32487081
Фотография Артист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам же и отвечаю, после INSERT писать SCOPE_IDENTITY в переменную\r
и юзать - иначе SCOPE_IDENTITY будет null\r
/topic/87320\r
опять с вашими идентитями не выспалюсь ...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504869
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Самый-самый последний вариант.

Вопросы.

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

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

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

Q4: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это - баг или фича?)

Q5: Как сымитировать счетчик в отчете?

Q6: Как сымитировать счетчик в запросе на добавление?

Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме?

Q8: Как получить значение счетчика только что добавленной записи?

Q9: Как создать одним запросом таблицу со счетчиком?

Вопросы с ответами.

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

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

Вариант 1:

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

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

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

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

Код: 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, тогда по виду этой таблицы будет сразу ясно, какое значение было выдано последним. Правда, в этом случае файл станет расти.

Еще подвариант: держать в этой таблице одну запись, в которой находится очередное значение счетчика, и вместо AddNew делать Edit и rsCounter!nCounter=rsCounter!nCounter+1, а потом соответственно Update.

Вариант 3 (от Гетца): Держим в отдельной таблице очередное значение счетчика и каждый раз увеличиваем его на 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

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

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

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

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

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

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

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

Q4: В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это - баг или фича?)

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

Q5: Как сымитировать счетчик в отчете?

A: Заводим текстбокс и задаем ему свойства:

Код: plaintext
1.
ControlSource = "= 1 "
RunningSum = True

Q6: Как сымитировать счетчик в запросе на добавление?

A: Пишем функцию примерно такого вида:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Function MyFun(varDummy As Variant, Optional iStartValue As Variant) As Long
Static n As Long
If IsMissing(iStartValue) Then
    MyFun = n
    n = n +  1 
Else
    n = iStartValue
    MyFun = True
End If
End Function

В запросе обращаемся к ней дважды:

в части WHERE - с параметрами (чтоугодно,N), где N равно нужному начальному значению счетчика;

в части SELECT - в качестве первого параметра передавать любое поле из таблицы, второй параметр не указывать.

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

Q7: Как сымитировать счетчик в обычном запросе либо ленточной форме?

A1:
SELECT (Select Sum(1) From t AS p Where p.f<=p1.f), p1.f
FROM t AS p1
ORDER BY p1.f;

A2:
SELECT DCount("f", "t","f<=" & CStr(f)), f
FROM t
ORDER BY f;

Примечание 1. Поле f обязано быть уникальным.

Примечание 2. Способ 1 быстрее работает, но является необновляемым.

Q8: Как получить значение счетчика только что добавленной записи?

A1: Если запись добавляется через рекордсет, то так:

Код: plaintext
1.
2.
3.
rs.AddNew
переменная = rs!полесчетчика
...
rs.Update

A2: Более широкий круг применимости у такого способа:

Код: plaintext
1.
2.
3.
4.
5.
Dim rs As ADODB.Recordset 
Set rs = New ADODB.Recordset
CurrentProject.Connection.Execute "INSERT ..."
rs.Open "SELECT @@identity as cou", CurrentProject.Connection
переменная = rs!cou
rs.Close

Однако и этот способ имеет ограничения, а именно:

работает только через ADO, только в Jet 4 и позже, и только с базами формата Аксесса 2000 и позже;

возвращает значение только из записи, добавленной программно, но не через юзер-интерфейс.

A3: Для adp годится такая модификация того же способа:

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]

Q9: Как создать одним запросом таблицу со счетчиком?

A: create table xx (id counter)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504900
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Опубликовано!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504919
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые, прошу сразу не бить, но позвольте спросить - насколько порочна идея, касающаяся SQL-adp. Принцип состоит в использовании id таблицы SQL server. Т.е. составлять уникальный (???) номер строки, добавляя по 1 к id.
Добавляя не арифметически, а строчно. Просветите пожалуйста, насколько будет уникален такой номер.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504923
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Он не будет уникален, потому что два юзера могут одновременно создать одинаковое значение.

А что значит строчно? Типа, если было
11111111111111111111111111111
то добавить 1 и получить
111111111111111111111111111111
?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504927
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504932
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но тогда он не только не будет уникальным, но и поле придется под него заводить бешеного размера, и все равно оно быстро кончится. Зачем делать плохо, если можно делать хорошо?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504941
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сан Саныч, прошу прошения за неточность, я имел ввиду следующее

ID - 1234
1 строка - 12341
2 строка 12342
3 строка 12343
4 строка 12344
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504949
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч - я чёкнулся - простите
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504953
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А если будет 12349, то дальше 123410? Или 123491?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504954
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не конец дня и праздник впереди - убить меня мало
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504958
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если 123410 ?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504971
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да ничего, я просто так спросил. Ответ-то я уже дал.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504976
sposad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял, спасибо. Хотел поздравить с наступающими, но не знаю, насколько это уместно у вас. Но в любом случае удачи !
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32504977
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
:^))) Взаимно!
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32507983
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал я воспользоваться информацией из вашего фака для увеличения рукотворного счетчика при выполнении запроса на Insert в MDB. Сказано много, но полезного мало. Помогли код из Гетца и замечание ЛП том, что в функцию вычисления счетчика надо чего-то подавать из select-a.
В общем, вот как это примерно вышло:
таблицы
test(MyCou) - текущее значение счетчика
1(cou,value) - куда добавляем
2(cou,value) - откуда добавляем
немного переделанная функция из Гетца (не показаны обработчики ошибок)
Function ManualCou(ByVal strFieldName As String, XZ As Variant) As Long
'Вход:
'имя поля счетчика в таблице с текущими значениями счетчиков
'любой
'!!При использовании в запросе вторым параметром подставлять к-л столбец из select
On Error GoTo adhGetNextAutoNumber_Err

Dim strTableName As String
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

strTableName = "test"
Set wrk = DAO.DBEngine.Workspaces(0)
Set db = CurrentDb
Set rstAutoNum = db.OpenRecordset(strTableName, dbOpenTable, dbDenyRead)

' Increment and return the autonumber value
rstAutoNum.MoveFirst
rstAutoNum.Edit
lngNextAutoNum = rstAutoNum.Fields(strFieldName)
rstAutoNum.Fields(strFieldName) = lngNextAutoNum + 1
rstAutoNum.Update

ManualCou = 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
end function
Тестовый запрос (работает!)
INSERT INTO 1 ( [value], cou )
SELECT [2].value, ManualCou("myCou",[2]![value]) AS cou
FROM 2
WITH OWNERACCESS OPTION;
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32508291
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А чего именно не хватает в факе? Там на первый вопрос есть Вариант 3 (от Гетца). Очень похож на этот.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32509401
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч,
Это этот похож на тот :-)
Конечно, дареному коню в зубы не смотрят, но, тем не менее, взять вариан 3 и без переделок применить его в запросе на добавление мне не удалось.
На мой взгляд, там надо написать, что ежели кто хочет использовать эту функцию в запросе, надо ее переделать так, чтоб она на вход принимала один фиктивный(неиспользуемый) параметр и при вызове этой функции подавать туда что-нибудь из select, а иначе функция, как справедливо заметил ЛП, один раз выполнится и все, значение счетчика будет одинаково для всех строк результата.
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32509562
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Я чего-то не понимаю. А разве там сказано, что эту функцию надо вызывать из селекта?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32621671
squid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу поднять эту замечательную тему.....
Прочитал ее с удовольствием (или нет..) но у из-за того что у меня также возникла надобность в генерации собственного счетчика. (от Акссесса отказаться низзя)
Я взял за основу гетца и дополнил пример так что в одной табице содержатся последние значения счетчиков для любой таблицы.

Выношу на суд кому интересно


********************************
Option Compare Database
Option Explicit

' Database storing autonumber values
Const adhcAutoNumDb = "Ch02Auto.Mdb"
' Number of lock retry attempts
Const adhcLockRetries = 5
' Lower bound of range of retry wait
Const adhcLockLBound = 2
' Upper bound of range of retry wait
Const adhcLockUBound = 10

'Error constants
Const adhcErrRI = 3000
Const adhcLockErrCantUpdate2 = 3260
Const adhcLockErrTableInUse = 3262


Sub DbCreate()
Dim i As Long
For i = 1 To 10
CurrentDb.Execute ("CREATE Table Table" & i & " (id int UNIQUE not null, str char(50))")
Next i
End Sub

Sub DbDelete()
Dim i As Long
On Error Resume Next
For i = 1 To 10
CurrentDb.Execute ("DROP Table Table" & i)
Next i
End Sub

Sub StartTest()
Dim i As Long
Dim st As Date
Dim a As Long
Dim TNum As Long
st = Now
a = 100000#

For i = 1 To a
TNum = Int(10 * Rnd) + 1
CurrentDb.Execute ("INSERT INTO Table" & TNum & " (id,str) values (" & adhGetNextAutoNumber("Òàáëèöà" & CStr(TNum)) & ",'fdhfhgf')")
Next i
MsgBox a / DateDiff("s", st, Now) & " êëþ÷åé / ñåê"
End Sub
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 rst As 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 db = CurrentDb
Set rst = db.OpenRecordset("SysTCount", dbOpenTable, dbDenyRead)
Set rstAutoNum = rst.OpenRecordset

rstAutoNum.FindFirst ("TableName='" & strTableName & "'")
If rstAutoNum.NoMatch Then ' Ñ÷åò÷èê â òàáëèöå íå çàðåãåñòðèðîâàí
rstAutoNum.AddNew
rstAutoNum!TableName = strTableName
rstAutoNum!Last_ID = 0
rstAutoNum.Update
rstAutoNum.FindFirst ("TableName='" & strTableName & "'")
End If

rstAutoNum.Edit
rstAutoNum!Last_ID = rstAutoNum!Last_ID + 1
rstAutoNum.Update

adhGetNextAutoNumber = rstAutoNum!Last_ID ' 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


*********************************************
Значит запустил на пробу см верзхгние процедуру тест
+
параллельно сдлелав копию БД - клиента
(Set db = DBEngine.OpenDatabase("C:\....\db1.mdb"))

на 100 тыс записей по 10 разным таблицам все прошло на ура !!!!!
просто на отлично. в поле str я вписывал какая бд внесла запись. Просмотрев результаты - ни одного выпадения, ни одного сообщения об ошибке.

Большое спасибо всем кто приводил свои рассуждения и большое спасибо Гетцу. Обязательно куплю его двух томник ;-)))
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32681180
Dima-cp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я новичек в access. Научите как правильно пользоваться этой формулой - Nz(DMax(...),0)+1

В форме, в свойствах цифрового поля ввожу Значение по умолчанию - Nz(DMax(...),0)+1
Access пишет: Ошибка синтаксиса во веденном выражении. Введена запятая, перед которой отсутствует значение или индентификатор.
что не так?
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #32833145
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня страсть как понадобилось сказать DBEngine.Idle на языке ADO.
Оказалось, что это JRO.JetEngine.RefreshCache adoConnectionObject.

В процессе поиска нашлись две реализации «клиентских» счетчиков от Microsoft.
(как оказалось – достаточно «древних»)
В рамках которых как раз рассматривается тема «сетевой синхронизации изменений в БД».
В FAQ эти реализации счетчиков точно не попали, а были ли в рамках этого топика – не
знаю. Скорее всего нет – по причине отсутствия в FAQ.

В целом, описал бы так – «похоже на Гетца, но совсем не Гетц».
Рекомендую посмотреть:

http://support.Microsoft.com/default.aspx?scid=kb;en-us;240317
http://support.microsoft.com/kb/191253/EN-US/


Кроме того (хоть это и не про счетчики, а про синхронизацию) хочется упомянуть еще две статьи
http://support.microsoft.com/default.aspx?scid=kb;en-us;200300
. http://support.microsoft.com/kb/180223/EN-US/


У меня в AccessXP оказалось, что по умолчанию выставлен как раз режим синхронной
записи транзакций.

ЗЫ
Из всего показанного в статьях кода больше всего удивило, пожалуй,
применение RefresheCache на рекордсете с серверным курсором как
аналога/заменителя Resync для рекордсета на клиентском курсоре.
Не уверен, что вполне понимаю, что именно в той строке написано.
«Обновить кэш» перед открытием рекордсета – относительно понятно.
После открытия но до входа в режим редактирования – кажется, еще понятней. А тут после входа в режим редактирования записи.

Возьмется кто прокомментировать этот момент – почему так надо?


(с выражением лица)
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #33051338
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мож кому пригодится

В FAQ не нашел - наверное плохо искал

MSSQL + ODBC + Акс97
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #33051377
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
paparomeМож кому пригодится

В FAQ не нашел - наверное плохо искал

MSSQL + ODBC + Акс97
Первый сейчас добавлю в фак, спасибо. А второй - это скорее для SQL сервера...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #33051476
Мшсещырф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир Саныч paparomeМож кому пригодится

В FAQ не нашел - наверное плохо искал

MSSQL + ODBC + Акс97
Первый сейчас добавлю в фак, спасибо. А второй - это скорее для SQL сервера...

2 Саныч
а хорошо ли в "первом" MoveFirst рисовать ?
(особенно, если добавляется несколько записей подряд...
и еще много-много точек
)

клавиша F1 в этом месте как будто такой код рекомендует.

Код: plaintext
\nWith rstTemp\n        .AddNew\n        !FirstName = strFirst\n        !LastName = strLast\n        .Update\n        .Bookmark = .LastModified\nEnd With


С изменением в лице
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #33051851
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Victosha
Да - проверил - работает

Тогда даже не обязательно открывать "пустой" рекордсет

Спасибо
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #33052804
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Шправлено.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211863
DenisKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я заранее извиняюсь что мой вопрос обсасывался по разному. Но может кто-нибудь вышлет пример или выложит здесь как мне сделать запрос на обновление поля таблицы счетчиком???

Просьба не кидаться камнями, FAQ я 100 раз прочитал, дайте пример работающий пожалуйста.. надо обновить в базе более 4000 записей...
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211886
Фотография ILL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imho в акцессе (в JET) одним запросом это не сделать
не терпит от подзапросы в SET
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211890
Фотография ILL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обнови из кода
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211892
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenisKSЯ заранее извиняюсь что мой вопрос обсасывался по разному. Но может кто-нибудь вышлет пример или выложит здесь как мне сделать запрос на обновление поля таблицы счетчиком???

а я не понял сути проблемы
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211899
Фотография ILL HEAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я понял что трэба обновить некотрое поле последовательными числовыми значениями
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211913
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда 2 способа
1.создать поле счетчик и сделать UPDATE t1 SET t1.id = [ПолеСчетчик];
2./topic/190598&pg=2&hl=%ed#1610065
там проблема чуть шире, но убрать else нетрудно
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34211969
DenisKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица в акссессе, в ней есть числовое поле, которое нужно обновить счетчиком, т.е. по порядку с одного до 4000 расставить числа
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34212050
DenisKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander GНу тогда 2 способа
1.создать поле счетчик и сделать UPDATE t1 SET t1.id = [ПолеСчетчик];
2./topic/190598&pg=2&hl=%ed#1610065
там проблема чуть шире, но убрать else нетрудно
Ваш пример подошел но я помучился и сделал через Recordset..
Вопрос как обнулить счетчик код которого вы дали по ссылке? Не могу разобраться..
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34212054
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public i As Long

Public Function Num(a As Integer)
    i = i +  1 
    Num = i
End Function

Public Sub lalala()
i =  0 
CurrentProject.Connection.Execute "UPDATE t10 SET id = num(nz(id))"
End Sub
...
Рейтинг: 0 / 0
FAQ. Что мы знаем про каунтеры (aka счетчики)
    #34212101
DenisKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Во всем разобрался.. еще раз убедился что этот форум самый информативный по данной тематике!
...
Рейтинг: 0 / 0
176 сообщений из 176, показаны все 8 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / FAQ. Что мы знаем про каунтеры (aka счетчики)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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