Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8   вперед  Ctrl      все
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
А чего это в Москве 3 выходных? В Израиле был Йом Кипур, это я знаю, а в Москве что?
7 окт 03, 15:51    [367069]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Темный
Member

Откуда:
Сообщений: 11941
2 Владимир Саныч:
ЛЕНЬ и бактерии не полностью выздоровевшего Л.П.
Да плюс тяжелый физический труд в течение 2 дней и последующий за ним отходняк в виде вышеуказанных причин.
7 окт 03, 17:03    [367279]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Лох Позорный
Member

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

Похоже, что база накрылась.

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

Темный писал:
ЛЕНЬ и бактерии не полностью выздоровевшего Л.П.

Что, я уже своей ленью начал людей заражать? Придется перед монитором в марлевой повязке сидеть
8 окт 03, 09:54    [367880]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
fedd
Member

Откуда: Москва
Сообщений: 33999
а про дыры в нумерации - по моему самый часто задаваемый вопрос про щетчики...
13 окт 03, 11:01    [373838]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

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

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

A: Никаких средств для этого нет. Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений.
13 окт 03, 14:37    [374203]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
fedd
Member

Откуда: Москва
Сообщений: 33999
гут. надо еще пару ламерских частых вопросов припомнить.......
13 окт 03, 14:42    [374218]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
funddd
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 1369
Неужели и я смогу внести свою лепту!
Q: А как все-таки избавиться от дырок в счетчике? (ну если очень нада!!!)
A: Пользоваться данным советом сугубо осторожно!!! Возможны большие проблемы с сортировкой данных!!!
1. Удалить поле счетчик.
2. Сохранить таблицу.
3. Создать поле счетчик (естественно, с тем же именем)
4. Сохранить таблицу.

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

Ответственности за использование этого текста нести не хочу, и не буду. :)
13 окт 03, 14:59    [374274]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
АлексейЕ
Guest
автор писал:
Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений.


Мне кажется, что данное утверждение слишком категорично. Думаю, нет ни чего страшного в том, что пользователю будет выводиться (только для чтения) номер счетчика. В небольших базах где, количество номенклатуры не очень большое, и не требуется вводить сложную кодировку номенклатуры, счетчик в полнее может служить именно кодом товара (элемента справочника).
А вот что касается "провалов" или "пробелов" в счетчике, то они могут образоваться при удалении элемента справочника, что будет вполне нормальным и для бухгалтерского (управленческого) учета, т.к. в данном случае в коде элемента справочника не зашифровываются индивидуальные характеристики элемента, группы элементов. А повторять код хоть и удаленного элемента справочника, в данном случае может привести к ошибкам.
13 окт 03, 15:05    [374290]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

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

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

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

2 АлексейЕ:

Да, я уже подумал, что был слишком категоричен. Предлагаю новую формулироку: ...юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть.
13 окт 03, 15:12    [374308]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
АлексейЕ
Guest
2 Владимир Саныч

А может так?

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

или что-то типа этого.
13 окт 03, 15:24    [374340]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
Что-то метод предложенный funddd, мне не нравиться.
Удалять таблицу - это значит удалить и индексы и связи. Заново их создовать? Зачем? Когда ХамТрамвайный предложил (да и по сей день предлагает :) более приятный способ : через Alter (есно после удаления данных хотя можно и до). Правда только для 2000/2002/2003. Для 97 - прокатит простое Сжатие
13 окт 03, 15:25    [374341]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
По-моему, у меня сказано то же самое, только короче. Кроме того, не хотелось бы затрагивать частные случаи типа учетной политики предприятия.
13 окт 03, 15:27    [374350]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
Поправка:
Я имел виду "не удалить таблицу", а удалить счетчик (что в принципе роли не играет)
13 окт 03, 15:27    [374351]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Виктор, я с тобой.
13 окт 03, 15:28    [374353]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Senin Viktor
Member

Откуда: Подмосковье
Сообщений: 5006
Ну кто на нас с Санычем?
13 окт 03, 15:33    [374372]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Темный
Member

Откуда:
Сообщений: 11941
ИМХО, переиндексировать индекс - это бред! Ну и что, что пробелы в значениях. А если это значение является внешним ключом???


--------------------
Best wishes, Dmitriy
13 окт 03, 15:45    [374419]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
АлексейЕ
Guest
2 Владимир Саныч

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

Одним словом ИМХО.
13 окт 03, 15:46    [374427]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Темный
Member

Откуда:
Сообщений: 11941
Оффтопик: А что "занудный бухгалтер" делает на форуме sql.ru? Или не такой уж он и занудный?


--------------------
Best wishes, Dmitriy
13 окт 03, 15:55    [374459]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
АлексейЕ
Guest
Темный писал:
А что "занудный бухгалтер" делает на форуме sql.ru?

Это просто "занудный бухгалтер широкого профиля" :)
13 окт 03, 16:19    [374519]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

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

Пусть лучше программист знает, что это не требуется никогда. А если это потребуется, то пусть он узнает об этом от заказчика. И напишет программу, в которой все равно счетчик не отображается, а отображается специально сделанное поле, в котором предусмотрена защита от дырок.
13 окт 03, 16:51    [374617]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
АлексейЕ
Guest
2 Владимир Саныч

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

P.S. И бублики все заштопаем. :)
13 окт 03, 16:57    [374628]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
:^) Гусары, молчать...
13 окт 03, 17:02    [374645]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Темный
Member

Откуда:
Сообщений: 11941
Ну не могу я промолчать!!!! Единственное, могу заменить все смайликами!
--------------------
Best wishes, Dmitriy
13 окт 03, 17:47    [374773]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Темный
Member

Откуда:
Сообщений: 11941
Оправлять бы пора, в фак уже, многостаночник Владимир Саныч!
--------------------
Best wishes, Dmitriy
13 окт 03, 19:53    [374970]     Ответить | Цитировать Сообщить модератору
 Re: FAQ. Что мы знаем про каунтеры (aka счетчики)  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Итак, выдаю новую версию. Тут оказалось, что в течение 2,5 месяцев стояла версия с багом. В моем посте от 3 авг добавка про rsCounter.Update добавлена к ответу на совсем другой вопрос. :^)

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

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

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

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

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

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 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) освобождения таблицы.

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, можно запустить запрос наподобие такого:

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

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

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

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

A: Никаких средств для этого нет. Если возникла такая необходимость, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть.
17 окт 03, 16:38    [381738]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить