Как "заставить" счетчик начинать нумеровать с произвольного номера и с произвольным инкрементом

Андрей Митин

Иногда необходимо изменить начальный номер счетчика с которого начинается автоматический отсчет. Просто так в Access это сделать не удастся.

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

Редактировать поле "счетчик" можно разными путями - либо запросом на добавление, либо из кода VBA с помощью объекта Recordset.

Пример с использованием временной таблицы и запроса:

Допустим, у Вас есть таблица Table1, которая содержит поле счетчика ID, которое вы желаете стартовать с другого номера. Не вводите пока никаких записей в таблицу. Создайте, другую временную таблицу с одним полем типа Длинное целое, которое имеете тоже имя (в нашем случае ID), что и поле счетчика в первой таблице. Создайте запись во временной таблице, введя номер на единицу меньше того, с какого вы желаете стартовать счетчик в таблице Table1. Создайте запрос на добавление, чтобы добавить одну запись из второй таблицы в первую таблицу, и запустите его. Удалите вторую временную таблицу, удалите запись, которая появилась в таблице Table1 и начинайте вводить данные.

Пример с использованием запроса:

'Есть таблица "Table1" с полем "ID" типа "счетчик"

PARAMETERS [Number] Long;

INSERT INTO Table1( [ID] )

Select [Number] As Expr1;

Создаете новый запрос, добавляете таблицу,  выбираете режим SQL, вставляете эти строки и сохраняете запрос.

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

Пример с использованием VBA:

'Есть таблица "Table1" с полем "ID" типа "счетчик"

Public Function AddNumer(lNum As Long) As Long

On Error GoTo Err_

Dim rs As Recordset

Set rs = CurrentDb.OpenRecordset("Table1")

rs.AddNew

rs![ID] = lNum

rs.Update

Ex_:

Exit Function

Err_:

Resume Ex_

End Function

Учтите только, что если Вы введете число меньше, чем значение счетчика в данный момент, запись добавится, но нумерация все равно будет идти по принципу: максимальное число + 1. Например, у Вас значение счетчика было 333, Вы добавляете запись со значением 222 - запись, конечно, добавится, но все равно счетчик будет продолжать нумеровать 334, 335, 336....., т.е. максимальное значение в данном поле + 1.

После удаления всех записей из таблицы, поле счетчик не сбрасывается на единицу, а продолжает последовательно нумеровать и дальше. Поэтому необходимо после очистки таблицы сжать (compact) базу данных. Если из таблицы удалить не все записи, то после сжатия значение поля autonumber при добавлении будет равно максимальному - тому, что уже есть в таблице +1 (Если, конечно, свойство поля счетчик "New Values" установлено в "Increment"). Другой путь сбросить на единицу - удалить поле счетчика и создать его снова в таблице.

Можно использовать мощные инструкции SQL:

'Есть таблица "Table1" с полем "ID" типа "счетчик"

ALTER TABLE Table1 ALTER COLUMN ID Counter(1,1)

Создаете новый запрос, добавляете таблицу,  выбираете режим SQL, вставляете эти строки и сохраняете запрос.

Можно сказать, что это малодокументированная команда ;) с широкими возможностями управления полем типа счетчик.

Команда позволяет задавать для таблицы начальный отсчет (1,1) и инкремент (1,1). Можно задавать, например, начальный отсчет с 1000 с инкрементом в 10 ...Counter(1000,10), причем никаких ограничений не накладывается - можно задавать значение меньшее, чем максимально присутствующее в этом поле, в отличие от примера с использованием запроса. Никаких процедур по сжатию базы для сброса счетчика не требуется. Понятно, что если будет пересечение, т.е. добавляемое значение счетчика уже присутствует в таблице, то механизм индексирования не даст ввести дублирующее значение и вывесит предупреждающее сообщение. Также нельзя таким способом изменить значение счетчика, если поле счетчика (в данному случае ID) участвует в одной или нескольких связях. С другой стороны, что стоит удалить связь, выполнить запрос на изменение счетчика и заново создать связь....


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=7323