Создание выражений
С помощью выражений можно выполнять разнообразные операции с данными. Например, вы можете определить, сколько дней прошло с момента отправки заказа, или объединить содержимое полей FirstName и LastName и поместить результат в поле FullName. Разделы этой статьи содержат пошаговые инструкции по созданию выражений.
В этой статье
Вычисление значений элементов управления в формах и отчетах
При использовании выражения в качестве источника данных элемента управления создается вычисляемый элемент управления. Предположим, например, что имеется отчет, в котором отображаются товары на складе, и необходимо создать в нижнем колонтитуле итог для суммирования данных по всем строкам отчета.

Чтобы вычислить итог, поместите элемент управления «поле» в нижний колонтитул отчета и настройте для свойства ControlSource этого поля следующее выражение:
=Sum([table_field])
В данном случае table_field — это имя поля, содержащего значения промежуточных итогов. Оно может находиться в таблице или запросе. Функция Sum вычисляет итог для всех значений в table_field .

- В области навигации щелкните правой кнопкой мыши форму, которую необходимо изменить, и выберите в контекстном меню пункт Режим макета или Конструктор.
- Выделите элемент управления, в который необходимо ввести выражение.
- Если окно свойств не отображается, нажмите клавишу F4.
- Чтобы создать выражение вручную, на вкладке Данные страницы свойств выберите свойство ControlSource (Данные) поля, а затем введите выражение, предварив его знаком равенства ( = ). Например, для вычисления итога, как показано выше, введите =Sum([table_field]) . Вместо элемента table_field укажите действительное имя поля.
- Чтобы создать выражение с помощью построителя выражений, нажмите кнопку Сборка в поле свойства. После ввода выражения окно свойств будет выглядеть так:
Использование выражений в условиях запросов
Вы можете использовать условия, чтобы ограничить результаты запроса. Введите условия в виде выражения, и приложение Access вернет только соответствующие ему строки.
Предположим, вы хотите просмотреть все заказы с датой отгрузки в течение первых трех месяцев 2017 г. Чтобы задать условие, введите следующее выражение в ячейку Условия столбца «Дата и время» в запросе. В нашем примере используется столбец «Дата и время» с именем ShippedDate. Чтобы определить диапазон дат, введите следующее условие:
Between #1/1/2017# And #3/31/2017#
Столбец ДатаИсполнения будет выглядеть подобным образом:

Для каждой записи в таблице заказов, для которой значение в столбце ShippedDate попадает в указанный интервал дат, будет создана запись в выходных данных запроса. Обратите внимание: в выражении даты заключаются в знаки решетки ( # ). Значение между знаками решетки трактуется в Access как значение с типом данных «Дата и время». Это означает, что с такими значениями могут производиться соответствующие вычисления, например вычитание одной даты из другой.

- В области навигации щелкните правой кнопкой мыши запрос, который необходимо изменить, и выберите в контекстном меню пункт Конструктор.
- Выберите ячейку Условия в столбце, для которого необходимо создать условие отбора.
- Чтобы создать выражение вручную, введите выражение условия. Не начинайте выражение условия с оператора = .
- Чтобы использовать построитель выражений, на вкладке Конструктор в группе Настройка запроса нажмите кнопку Построитель . Если для редактирования выражения вам требуется больше места, установите курсор в ячейку Условие отбора, а затем нажмите сочетание клавиш SHIFT+F2, чтобы открыть окно Область ввода: Совет Чтобы сделать текст более удобным для чтения, выберите Шрифт.
Создание вычисляемого поля в запросе
Предположим, вы создаете запрос и хотите показать результаты расчета, в котором используются другие поля запроса. Чтобы создать вычисляемое поле, нужно ввести выражение в пустую ячейку в строке Поле запроса. Допустим, в вашем запросе есть поля Количество и Цена. Их значения требуется перемножить, чтобы получить вычисляемое поле Сумма. Для этого в строке Поле запроса введите следующее выражение:
Extended Price: [Quantity] * [Unit Price]
Поскольку выражение начинается с текста Extended Price: , новый столбец получит имя Сумма. Это имя часто называется псевдонимом. Если псевдоним не указан, он будет создан автоматически, например такой: Expr1.

При выполнении запроса в Access выполняется расчет каждой строки, как показано ниже:

- В области навигации щелкните правой кнопкой мыши запрос, который необходимо изменить, и выберите в контекстном меню пункт Конструктор.
- Выберите ячейку Поле в столбце, в котором необходимо создать вычисляемое поле.
- Чтобы создать выражение вручную, просто введите его. Не начинайте выражение условия с оператора = . В начале выражения должно стоять понятное название, за которым следует двоеточие. Например, введите Extended Price: , чтобы задать название в выражении, которое создает вычисляемое поле с именем Extended Price. После двоеточия введите условие для выражения.
- Чтобы использовать построитель выражений, на вкладке Конструктор в группе Настройка запроса нажмите кнопку Построитель.
Создание вычисляемого поля в таблице
В Access можно создать вычисляемое поле в таблице. Благодаря этому для выполнения расчетов не придется создавать отдельный запрос. Например, если у вас есть таблица, в которой перечислены количество, цена и налоговая ставка для каждой позиции заказа, вы можете добавить вычисляемое поле общей стоимости:
[Quantity]*([UnitPrice]+([UnitPrice]*[TaxRate]))
В вычислении нельзя использовать поля из других таблиц или запросов, а результаты вычислений доступны только для чтения.
- Откройте таблицу, дважды щелкнув ее в области навигации.
- Прокрутите таблицу по горизонтали до крайнего правого столбца и нажмите в заголовке столбца кнопку Щелкните, чтобы добавить.
- В появившемся списке выберите пункт Вычисляемое поле и укажите тип данных результата. В Access откроется построитель выражений.
- Введите формулу вычисления, которую вы хотите использовать для этого поля, например:
[Quantity] * [Unit Price]
Задание значений по умолчанию для поля таблицы
С помощью выражения можно задать для поля таблицы значение по умолчанию, которое Access будет использовать для новых записей, если не предоставлено другое значение. Допустим, вы хотите автоматически вставлять дату и время в поле «Дата_заказа» при добавлении новой записи. Для этого можно использовать следующее выражение:
- В области навигации дважды щелкните таблицу, которую нужно изменить. Таблица откроется в режиме таблицы.
- Выберите поле, которое требуется изменить.
- На ленте щелкните Поля таблицы, а затем в группе Свойства выберите значение по умолчанию. В Access откроется построитель выражений.
- Введите выражение, начинающееся со знака равенства (=).
Примечание. При связывании элемента управления с полем таблицы действует следующее правило: если для элемента управления и для поля заданы значения по умолчанию, значение по умолчанию элемента управления имеет приоритет.
Задание значений по умолчанию для элементов управления
Другим объектом, где часто применяются выражения, является свойство Значение по умолчанию элемента управления. Свойство Значение по умолчанию элемента управления аналогично свойству Значение по умолчанию поля в таблице. Например, чтобы использовать текущую дату в качестве значения по умолчанию для текстового поля, вы можете указать следующее выражение:
Date()
В этом выражении используется функция Date, которая возвращает текущую дату, но не время. Если текстовое поле привязано к полю таблицы, которое имеет значение по умолчанию, то значение по умолчанию элемента управления будет иметь приоритет перед значением по умолчанию поля таблицы. Часто имеет смысл настроить свойство Значение по умолчанию для поля таблицы. Если в этом случае к одному и полю таблицы привязано несколько элементов управления в разных формах, каждый из них будет иметь одно значение по умолчанию, и ввод данных во всех формах будет согласованным.
- В области навигации щелкните правой кнопкой мыши форму или отчет, которые необходимо изменить, и выберите в контекстном меню пункт Конструктор или Режим макета.
- Выделите элемент управления, который необходимо изменить.
- Если окно свойств не отображается, нажмите клавишу F4.
- На вкладке Все окна свойств перейдите к ячейке свойства Значение по умолчанию.
- Введите выражение или нажмите кнопку Сборка в поле свойства, чтобы создать выражение с помощью построителя выражений.
Добавление правила проверки в поле таблицы или запись
Выражения весьма полезны при проверке данных, которые вводятся в базу данных: они позволяют отсеять неподходящие сведения. В таблицах можно создавать правила проверки двух типов: для полей, которые не позволяют вводить в поля недопустимые данные, и для записей, которые не позволяют создавать записи, нарушающие правило. В обоих случаях используются выражения.
Предположим, что в таблице Inventory имеется поле Units On Hand и требуется задать условие, разрешающее пользователям вводить только неотрицательные значения. Иначе говоря, количество товара никогда не может быть отрицательным. Это можно сделать, указав для поля Units On Hand следующее правило проверки:
ПРОЦЕДУРА: ввод правила проверки для поля или записи
- В области навигации дважды щелкните нужную таблицу. Таблица откроется в режиме таблицы.
- При вводе условия на значение поля выделите поле, которое необходимо изменить.
- На ленте щелкните Поля таблицы, а затем в группе Проверка полей щелкните Проверка, а затем — Правило проверки поля или Правило проверки. В Access откроется построитель выражений.
- Начните вводить необходимые условия. Например, для условия на значение поля, требующего ввода неотрицательных значений, введите следующее выражение:
Выражения правил проверки являются логическими, т. е. их результатом может быть только значение True или False . Если значение не равно True , Access не сохраняет вводимые данные и выводит сообщение об ошибке. Если в этом примере ввести в поле Units On Hand отрицательное значение, правило проверки выдаст результат False и значение будет отклонено. Если вы не ввели сообщение об ошибке, как описано в предыдущем разделе, Access отобразит собственное сообщение, в котором указано, что введенное значение запрещено правилом проверки для поля.
ПРОЦЕДУРА: ввод сообщения проверки правильности
Чтобы сделать базу данных более удобной в использовании, можно задать собственные сообщения проверки правильности. Эти сообщения будут использоваться вместо стандартных сообщений, выводимых приложением Access, когда данные не соответствуют условию. В сообщение можно включить сведения, помогающие пользователю ввести правильные данные, например «Значение в поле Units On Hand не может быть отрицательным».
- В области навигации дважды щелкните таблицу, которую нужно изменить. Таблица откроется в режиме таблицы.
- При создании сообщения для условия на значение поля выделите соответствующее поле.
- На ленте щелкните Поля таблицы, а затем в группе Проверка полей щелкните Проверка, а затем — Сообщение проверки поля или Сообщение проверки.
- В диалоговом окне Введите сообщение о проверке введите сообщение, которое будет выводиться, если данные не соответствуют условию на значение, и нажмите кнопку ОК.
Добавление правила проверки в элемент управления
Как и у полей таблицы и записей, у элементов управления есть свойство ValidationRule (Правило проверки), для которого можно создать выражение. Предположим, что используется форма ввода интервала дат для отчета и требуется, чтобы начальная дата была не раньше, чем 01.01.2017. Вы можете задать свойства Правило проверки и Текст проверки для текстового поля, в котором введите следующую начальную дату:
Условие на значение
Сообщение об ошибке
Невозможно ввести дату ранее 01.01.2017.
Если вы попытаетесь ввести дату раньше 1/1/2017, появится сообщение, в котором отображается текст в свойстве Текст проверки . Если текст не был введен в поле свойства Текст проверки , Access отображает универсальное сообщение. После нажатия кнопки ОК фокус ввода вернется в текстовое поле.
Если условие на значение задается для поля таблицы, оно будет действовать при любом изменении значения этого поля в базе данных. Напротив, если условие на значение задается для элемента управления в форме, оно будет действовать только при использовании этой формы. Чтобы задать разные условия на значение для разных пользователей, иногда имеет смысл создать эти условия отдельно для полей таблицы и элементов управления в форме.
- В области навигации щелкните правой кнопкой мыши форму или отчет, которые необходимо изменить, и выберите в контекстном меню пункт Конструктор или Режим макета.
- Щелкните правой кнопкой мыши элемент управления, который требуется изменить, и выберите в контекстном меню пункт Свойства. Будет отображено окно свойств элемента управления.
- На вкладке Все выберите ячейку свойства Validation Rule (Правило проверки).
- Введите выражение или нажмите кнопку Сборка в поле свойства, чтобы создать выражение с помощью построителя выражений. Не начинайте выражение с оператора =.
- Чтобы настроить сообщение, которое появится при вводе значения, не соответствующего условию, укажите нужный текст в ячейке свойства Сообщение об ошибке.
Группировка и сортировка данных в отчетах
В области Группировка, сортировка и итоги можно определить уровни группировки и порядок сортировки для данных в отчете. Как правило, группировка и сортировка выполняются по полю, выбранному в списке, но если требуется выполнить группировку или сортировку по вычисляемому значению, можно указать выражение.
Группировка — это процедура суммирования столбцов с одинаковыми значениями. Например, пусть в базе данных хранятся сведения о продажах для офисов в разных городах, а один из отчетов этой базы данных называется «Продажи по городам». Запрос, который обеспечивает данные для этого отчета, группирует их по названию города. Такого рода группировка облегчает восприятие и понимание информации.
Напротив, сортировка представляет собой процесс наложения порядка сортировка на строки (записи) в результатах запроса. Например, можно отсортировать записи по значению первичного ключа (или по другому набору значений в другом поле) по возрастанию или по убыванию либо отсортировать записи по одному или нескольким символам в указанном порядке, например по алфавиту.
ПРОЦЕДУРА: добавление группировки и сортировки в отчет

- В области навигации щелкните правой кнопкой мыши отчет, который необходимо изменить, и выберите в контекстном меню пункт Режим макета или Конструктор.
- На ленте щелкните Конструктор отчета, а затем в группе Группирование & итоги щелкните Группировать& Сортировка. Ниже отчета появится область Группировка, сортировка и итоги.
- Чтобы добавить к отчету уровень группировки, нажмите Добавить группировку.
- Чтобы добавить к отчету порядок сортировки, нажмите Добавить сортировку. В области появится новый уровень группировки или порядок сортировки, а также список полей с данными для этого отчета. На приведенном ниже рисунке показан типичный новый уровень группировки (по полю «Категория») и порядок сортировки (по полю «Производитель»), а также список доступных полей для группировки и сортировки.
- Ниже списка доступных полей нажмите выражение, чтобы открыть построитель выражений.
- Введите нужное выражение в поле выражения (верхнее поле) построителя выражений. Обязательно начните выражение с оператора равенства ( = ).
ПРОЦЕДУРА: добавление выражения в существующую группировку или сортировку
- В области навигации щелкните правой кнопкой мыши отчет, который необходимо изменить, и выберите в контекстном меню пункт Режим макета или Конструктор.
- Выберите уровень группировки или порядок сортировки, который требуется изменить.
- Щелкните стрелку вниз рядом с пунктом Группировка (уровни группировки) или Сортировка (порядок сортировки). Появится список доступных полей
- В нижней части этого списка нажмите выражение, чтобы открыть построитель выражений.
- Введите выражение в поле выражения (верхнем поле) построителя выражений. Убедитесь, что выражение начинается с оператора равенства (=).
Управление запуском макрокоманд
В некоторых случаях выполнять макрокоманду или набор макрокоманд в макросе нужно только в том случае, если выполнено определенное условие. Предположим, необходимо, чтобы макрокоманда выполнялась только в том случае, если значение в поле не меньше 10. Для этого в блоке Если макроса можно задать соответствующее условие с помощью выражения.
Например, допустим, что текстовое поле называется «Позиции». Выражение для условия будет выглядеть следующим образом:
[Items]>=10

- В области навигации щелкните правой кнопкой мыши макрос, который необходимо изменить, и выберите в контекстном меню пункт Конструктор.
- Перейдите к блоку Если, который требуется изменить, или добавьте блок Если из области «Каталог макрокоманд».
- Щелкните верхнюю строку блока Если.
- Введите условное выражение в поле или нажмите кнопку Сборка рядом с полем выражения, чтобы приступить к использованию построителя выражений.
Можно ввести только логическое выражение, которое принимает значения True или False . Макрокоманды внутри блока Если будут выполняться только в том случае, если условие примет значение True .
Нумерация строк в запросе

Много раз обсуждались подобные темы, но не одна из них мне не смогла помочь. Необходимо в запросе пронумеровать строки, и чтоб не зависимо как будет сортироваться запрос номера срок шли по порядку. В принципе я сделал то что мне нужно таким вот образом:
1 2 3
SELECT (SELECT SUM(1) FROM [Выбор агента] p WHERE p.Дата p1.Дата) AS Нумерация, p1.Дата AS Дата, p1.Агент AS Агент, p1.Сумма AS Сумма FROM [Выбор агента] AS p1 ORDER BY p1.Дата;
Но проблема в том что если попадаются две одинаковых даты, то нумерация сбивается, подскажите как это исправить? Свой пример вылаживаю. Если в форме выбрать Иванова, и запустить запрос все нормально, а если выбрать Петрова, то нумерация сбивается. За ранее спасибо за помощь.
| Нумерация.rar (26.9 Кб, 698 просмотров) |
| Здесь вы можете заказать любую студенческую или школьную работу. |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Нумерация строк в запросе
Добрый день, помогите запросом для нумерации строк в запросе, есть таблица с полем код все записи.
Нумерация строк в запросе
Всем привет! Подскажите, нужно чтобы нумерация была у таблицы, не получается, делаю так: .
Нумерация строк в запросе
Подскажите, как в запросе указать создание в выходных данных нумерации строк, в таблице источнике.
Нумерация строк в запросе на объединение
Форумчане, помогите разобраться с запросом. Есть два списка-рейтинга, которые уже имеют свою.
3543 / 1117 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
Добавьте в запрос «Выбор агента» поле Платежи.Ідентифікатор. Запрос «Нумерация» будет такой
1 2 3 4 5
SELECT (SELECT Sum(1) FROM [Выбор агента] p WHERE p.Датаp1.Дата Or (p.Дата=p1.Дата And p.Ідентифікаторp1.Ідентифікатор)) AS Нумерация, p1.Дата AS Дата, p1.Агент AS Агент, p1.Сумма AS Сумма FROM [Выбор агента] AS p1 ORDER BY p1.Дата, p1.Ідентифікатор
Регистрация: 19.10.2011
Сообщений: 187
Сообщение от minob 
Добавьте в запрос «Выбор агента» поле Платежи.Ідентифікатор. Запрос «Нумерация» будет такой
Спасибо за помощь! Очень благодарен! Все получилось.
Регистрация: 19.10.2011
Сообщений: 187
В этой же теме у меня вознилка еще трудность, необходимость пронумеровать в одном запросе все платежи чтоб каждый агент был под своей нумерацией. Нашел тему похожую на форумах решаемая с помощью вот такого запроса:
1 2 3 4
SELECT Q.agent, D.n FROM (SELECT agent, COUNT(*) AS c FROM Платежи GROUP BY agent) AS Q, (SELECT (D2.digit & D1.digit & D0.digit) +1 AS n FROM Digits AS D0, Digits AS D1, Digits AS D2) AS D WHERE (((D.n)[Q].[c])) ORDER BY Q.agent, D.n;
где Digits отдельный запрос:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
SELECT TOP 1 0 AS digit FROM Платежи UNION ALL SELECT TOP 1 1 FROM Платежи UNION ALL SELECT TOP 1 2 FROM Платежи UNION ALL SELECT TOP 1 3 FROM Платежи UNION ALL SELECT TOP 1 4 FROM Платежи UNION ALL SELECT TOP 1 5 FROM Платежи UNION ALL SELECT TOP 1 6 FROM Платежи UNION ALL SELECT TOP 1 7 FROM Платежи UNION ALL SELECT TOP 1 8 FROM Платежи UNION ALL SELECT TOP 1 9 FROM Платежи;
Получилось вроде как, но не как не получается добавить туда другие поля, сумму и дату. Может кто подскажет как это реализовать? Или может быть как то другой метод?
3543 / 1117 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
Сообщение от vavilom 
Нашел тему похожую на форумах решаемая с помощью вот такого запроса
Помню этот запрос. Но дело в том, что данный запрос был написан для таблицы с единственным полем, которое не было уникальным. Для вашего случая, боюсь, он бесполезен.
Так как вы не сообщили, строки какого запроса/таблицы вам необходимо пронумеровать, то в приведенном запросе нумеруются строки ранее выложенной таблицы «Платежи» (имя поля Name изменил на dat)
1 2 3 4 5 6 7
SELECT (SELECT Sum(1) FROM Платежи p WHERE p.agent=p1.agent And (p.datp1.dat Or (p.dat=p1.dat And p.Ідентифікаторp1.Ідентифікатор))) AS Нумерация, p1.agent AS Агент, p1.dat AS Дата, p1.summa AS Сумма FROM Платежи AS p1 ORDER BY p1.agent, p1.dat, p1.Ідентифікатор
Добавлено через 12 минут
Вообще-то необходимость в такой нумерации обычно возникает при выводе данных в отчет. В отчете же есть возможность организовать такую нумерацию, не прибегая к нумерации в запросе.
Регистрация: 19.10.2011
Сообщений: 187
Сообщение от minob 
Вообще-то необходимость в такой нумерации обычно возникает при выводе данных в отчет. В отчете же есть возможность организовать такую нумерацию, не прибегая к нумерации в запросе.
Спасибо огромное за помощь! Если честно даже не знал что в отчете можно нумеровать, ну пока сделаю нумерацию в запросе, а потом как нибудь для развития надо будет разобраться с нумерацией в отчете.
7384 / 4521 / 294
Регистрация: 12.08.2011
Сообщений: 13,910
Раз уж нельзя давать ссылки на другие форумы, то выкладываю фак c sql.ru (c) полностью:
Автор: Владимир Саныч, участники форума по Аксессу
Прислал: Владимир Саныч
Q1 : Как создать свой счетчик (чтобы поле было не типа счетчик)?
Q2 : Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины?
Q3 : Может ли поле счетчика содержать повторяющиеся значения?
Q4 : В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это — баг или фича?)
Q5 : Как сымитировать счетчик в отчете?
Q6 : Как сымитировать счетчик в запросе на добавление?
Q7 : Как сымитировать счетчик в обычном запросе либо ленточной форме?
Q8 : Как получить значение счетчика только что добавленной записи?
Q9 : Как создать одним запросом таблицу со счетчиком?
Вопросы с ответами
Q1 : Как создать свой счетчик (чтобы поле было не типа счетчик)?
A: Надо написать функцию, к которой обращаться либо в DefaultValue контрола (к сожалению, DefaultValue поля в таблице допускает только ограниченный набор стандартных функций), либо в программе, которая добавляет запись через рекордсет, либо в запросе на добавление. Ниже приведено несколько вариантов такой функции. Особое внимание надо уделить обработчику ошибок.
Так можно нумеровать записи даже внутри группы, а не только насквозь через всю таблицу. Для этого надо правильно задать параметры DMax.
Правда, надо отдельно позаботиться о ситуации, когда два юзера обратятся к этому «генератору счетчиков» одновременно.
Заводим отдельную таблицу с одним полем типа счетчик и без данных. Приводимая ниже процедура обращается к такой таблице и возвращает очередное значение для «нашего» счетчика. Внимание — файл, в котором сидит эта таблица, запрещено сжимать.
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
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) освобождения таблицы.
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
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 : Как заставить счетчик начать выдавать значения начиная с некоторой заданной величины?
Добавить в таблицу со счетчиком при помощи инсерта запись, в которой полю счетчика дается значение на 1 меньше, чем надо. Потом удалить эту запись. Способ работает только при условии, что этот счетчик этого или большего значения еще не выдавал. (Если таким образом дать счетчику отрицательное значение, то он начнет выдавать отрицательные значения, несмотря на то что уже выдавал значения, большие их. Играя на этом, можно добиться, чтобы счетчик выдавал любые значения, в т.ч. и те, которые уже были.)
Сжать базу, в которой сидит таблица со счетчиком. Счетчик будет выдавать значения начиная с наибольшего из существующих +1. В некоторых версиях Аксесса это работает только при условии, что таблица со счетчиком пуста (и тогда счетчик начнет выдавать значения с 1).
Начиная с Аксесса 2000, можно запустить запрос наподобие такого:
alter table Таблица1 alter column ПолеСчетчик counter(1,1)
Q3 : Может ли поле счетчика содержать повторяющиеся значения?
В принципе да. Этого несложно достичь, меняя состояние счетчика описанными способами. Однако если при этом возникнут нарушения ключа (вообще говоря, поле счетчика можно и не делать ключевым, но обычно все-таки принято делать), то записи просто не смогут добавляться. Каждая неудачная попытка добавить запись будет увеличивать значение счетчика на 1. Когда зона существующих значений будет пройдена, то записи опять смогут добавляться.
Q4 : В таблице есть счетчик, но его значения идут не подряд, несколько чисел в середине отсутствуют. Как перезаполнить поле, чтобы дырок не было? (Другой вариант вопроса. Счетчик показывает, что последняя запись в моей таблице имеет номер N, а реально записей меньше. Почему счетчик неправильно считает количество записей в таблице? Что это — баг или фича?)
Это нормальная ситуация. Если возникла необходимость, чтобы значения счетчика шли подряд, значит база была спроектирована неверно. Поле счетчика должно служить только для однозначной идентификации записей (и, возможно, порядка их занесения), юзер не должен видеть его значений, а если и увидит, то не должен возражать против тех значений, которые есть. Счетчик не служит для подсчета записей.
Q5 : Как сымитировать счетчик в отчете?
Заводим текстбокс и задаем ему свойства:
ControlSource = «=1»
RunningSum = Over All
Q6 : Как сымитировать счетчик в запросе на добавление?
Пишем функцию примерно такого вида:
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 : Как сымитировать счетчик в обычном запросе либо ленточной форме?
1 2 3
SELECT (Select Sum(1) From t AS p Where p.f<=p1.f), p1.f FROM t AS p1 ORDER BY p1.f;
Access. Для нумерации записей в таблице используется поле Счетчик
Word. Способы принудительного перехода на новую страницу:
Word. Чтобы разбить одну ячейку на несколько столбцов нужно: в меню таблица выбрать команду Добавить таблицу
В какой строке правильно записан адрес электронной почты?
Доступ к информации – это Ознакомление с информацией, ее обработка, в частности, копирование модификация или уничтожение информации.
Если на экране нет горизонтальной полосы прокрутки, необходимо: Выполнить команду Сервис — Параметры — Вид и установите соответствующий флажок
Маска ввода в таблицах Access определяет формат ввода данных в поле с помощью специальных знаков и символов.
Материальная форма информации — это сообщение
Основная функция базы данных в Excel – это
Основная характеристика монитора — это: Диагональ, Размер пикселя, Время отклика, Угол обзора, Яркость, Контрастность, Цветопередача
Сколько возможных десятичных чисел вместе с нулем можно записать в байте? 256
Нумерация в БД

Прошу помочь с таким вопросом: есть БД, в которой нумерация должна вестись следующим образом:
— 3301 — 3899
— 4000 — 4899
— 5000 — 5899
— 13000 — 13899
— 14000 — 14899
и так до 20899
Прилагаю, то что имеется. К сожалению, моих познаий недостаочно ((
| Здесь вы можете заказать любую студенческую или школьную работу. |
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Нумерация
Доброго времени суток! У меня такой вот вопрос: Есть допустим несколько начальников смены, у.
Нумерация
у меня такой вопрос можно ли продолжить нумирацию. вот у меня поле в котором идет нумирация.
автоматическая нумерация
Можно сделать так чтобы в колонке ID, когда добавляешь новые записи автоматически нумеровалось не.

Нумерация строк
Доброй ночи всем, кто не спит! Подскажите, как сделать нумерацию строк, чтобы по умолчанию новая.
Регистрация: 12.11.2013
Сообщений: 252

2. лучше делать в 2003, здесь все на 2003
3. можно сделать бронирование по заданному пользователем числу?
4. можно бронировать новые
Принцип такой: приходит условно 200 документов, скрепленных в пачки по 10-20 штук отсортированы по дате. Операторы разбирают эту кучу и начинают их вбивать в базу. Главное чтобы порядок соблюдался по дате, то есть если есть за 1 января 10 документов, то и номера должны следовать по порядку. Как-то так. А относительно нумерации от 3301 и т.д., как я описывал выше — то это заморочка всей компании, которая появилась задолго до того как начали компы использовать.
2833 / 1375 / 215
Регистрация: 13.05.2011
Сообщений: 4,213
1. Можно и в 2003
2. Пока, на уровне легко, можно установить определенное число (т.е. например 20. Тогда при бронировании будет бронироваться 20 документов. В выложенном примере оказывается не сделал про сказанные 8. Сейчас для примера сделал 8). А может быть, что пришло 18 документов, а бронь прошла на 20? Тогда как? Можно эти два зарегистрировать в следующий день? Если нет, то выход есть, но немного неудобный.
3. Файл в формате mdb. Вроде должен открываться?
| Докум2.rar (44.0 Кб, 9 просмотров) |
Регистрация: 12.11.2013
Сообщений: 252
так вот поэтому и лучше чтобы пользователь сам указывал количество документов для брони. Иначе придется что-то изобретать чтобы лишние брони снимать.
Форма все равно не открывается(((
2833 / 1375 / 215
Регистрация: 13.05.2011
Сообщений: 4,213
давайте я еще поэксперентирую, как добьюсь, чтобы бронировалось сколько надо оператору, то можно тему на 99 процентов считать закрытой. остальное решаемо.
Регистрация: 12.11.2013
Сообщений: 252
ок )) спасибо
8826 / 5784 / 584
Регистрация: 27.03.2013
Сообщений: 19,376
Сообщение от Panzermensch 
. Форма все равно не открывается(((.
Да тоже попробовал. Сразу ошибка вылезает. Может это из за того, что у меня Акс 2000. а не 2002?
Вот так:
Часто бывает, но обычно борюсь с этим так:
ИЛИ
В МЕНЮ
Сервис — Служебные программы — Преобразовать базу данных — В формат Акцесс 2000.
или
Создав ЧИСТУЮ БД и импортировав в нее ВСЕ, ошибка изчезает,
но не в этот раз.
Когда такое окошко вылезает, в 99 % ни чего поделать нельзя, или просто не знаю как.
2833 / 1375 / 215
Регистрация: 13.05.2011
Сообщений: 4,213
Прошу всеобщей помощи для продолжения темы Panzermensch. Я хотел сделать свой макет на его файл. Сделал в формате mdb (почему-то на некоторых компах не открывается). Хочу объяснить, что сделал и на чем остановился.
1. В форме Рег_докум в верхней части (Загаловок) выбирается пользователь;
2. В поле Кол-во документов (пока не работает) необходимо забронировать некоторое число номеров документов, с которыми пользователь будет работать. Например: 7;
3. Нажимаем кнопку Бронь номера. При этом в таблице Номерагалочками отмечаются Номера по возрастанию (не важно в каком порядке они записаны) и проставляется пользователь, который их забронировал.
4. Ниже в поле номер идет выбор забронированных номеров, присваивается им название и т.д.
Все работает только при одном бронировании, т.е. пока таблица Номера чистая или, если мы второй раз выберем число забронированных номеров больше, чем было в первый раз. Я знаю причину этого, не знаю как ее устранить.
Бронь происходит через запрос на Добавление. Причем в запросе установил счетчик и все номера постоены по возрастанию. Далее устанавливаю условия: показать не зарегистрированные (поле логическое=Ложь), поле Сотрудники Is Null и самое главное показываю на поле Счетчика условие выбрать цифры Кол-во документов (пока не работает)).
Когда таблица пустая он выбирает с 1 по 7. Но если в таблице уже забронированы номера, я мы выбираем после 7 цифру 5, то по условию отбора = Ложь на счетчике показываются номера от восьмого и выше. Т.е. Необходимо сделать так, чтобы при выполнении условия = ложь, что-то отсеялось, а что-то осталось, но то, что осталось должны начинаться на счетчике с цифры 1. Тогда вопрос решен и все пойдет.
| Документы.rar (38.5 Кб, 4 просмотров) |