Access 2007
.pdfДля быстрого поиска нужных вам функций Access предлагает компонент, именуемый Построителем выражений. Для его запуска выполните следующие действия:
1.Откройте запрос в Конструкторе.
2.Щелкните правой кнопкой мыши поле, в которое вы хотите вставить выражение, и выберите команду Построить (Build).
Если вы создаете вычисляемое поле, нужно щелкнуть правой кнопкой мыши в ячейке Поле, Если создается условие отбора, следует щелкнуть правой кнопкой мыши в ячейке
Условие отбора.
После выбора команды Построить на экране появляется окно Построителя выражений, отображающее текущее содержимое поля (рис. 7.3).
Рис. 7.3. Построитель выражений состоит из текстового поля в верхней части окна, в котором можноредактировать выражение, кнопок быстрой вставки знаков обычных операций (таких как +, -, / и *, если почему-либо вы не можете их найти на клавиатуре), и трехпанельного обозревателя в нижней части окна, который поможет найти нужные поля и функции
3.Вставьте или отредактируйте выражение.
УПостроителя выражений есть два ускоряющих приема работы, которые вы, может быть, захотите испробовать. Можно вставлять имя без ввода с клавиатуры (рис. 7.4) и можно найти функцию с помощью обзора (рис. 7.5).
Примечание
Построитель выражений — универсальное средство создания выражений в вычисляемых полях и условиях отбора. Некоторые параметры имеют смысл только в одном из его назначений. Логические операторы, такие как символ равенства (=), And, Or, Not и Like, удобны для задания условий фильтрации (см. разд. "Построение условий отбора" главы 6), но бесполезны в вычисляемых полях.
251
Рис. 7.4. Для вставки имени поля щелкните дважды кнопкой мыши папку Таблицы в самом левом списке. Затем щелкните мышью вложенную папку, соответствующую нужной вам таблице. И, наконец, дважды щелкните кнопкой мыши имя поля в среднем списке для добавления его в ваше выражение. Этот прием рекомендуется только тем, кто любит щелкать кнопкой мыши
Рис. 7.5. Для поиска функции начните с двойного щелчка кнопкой мыши папки Функции в левом списке. Затем выберите вложенную папку Встроенные функции. (Другие варианты отображают любые пользовательские функции, которые вы добавили в вашу БД с помощью пользовательского кода VBA.) Далее выберите категорию функции в среднем списке. В правом списке показаны все функции в выбранной категории. Вы можете дважды щелкнуть кнопкой мыши функцию для вставки ее в выражение
252
Примечание
Когда вы вставляете имена полей в Построителе выражений, они записываются в более длинном формате с обязательным указанием имени таблицы. Вы увидите [Products] ! [Price] вместо просто [Price]. He волнуйтесь — для программы Access это одно и то же.
4. Щелкните мышью кнопку ОК.
Программа Access скопирует ваше новое выражение в ячейку Поле или Условие отбора.
Примечание
Когда в Построителе выражений вставляется функция, программа добавляет заполнители (например, <number> и <precision>), на место которых нужно ввести аргументы. Замените этот текст нужными вам значениями.
Рис. 7.6. В справке функции Round () описываются ее назначение и два параметра. Второй параметр — количество знаков в дробной части — заключен в квадратные скобки, что означает необязательное значение. Пропустите его, и программа Access округлит значение до ближайшего целого числа. Слева приведен перечень функций, который позволяет просмотреть любую другую функцию Access и прочесть ее описание
253
Большинство специалистов Access считают Построитель выражений слишком тяжеловесным, чтобы использовать его в работе. Но несмотря на то, что это не самое эффективное средство написания выражений, построитель предоставляет прекрасный способ знакомства с новыми загадочными функциями, благодаря своей справке для встроенных функций. Если вы нашли функцию, которая кажется многообещающей, но хотите получить дополнительную информацию, выберите ее в списке и щелкните мышью кнопку Справка (Help). Вы будете вознаграждены кратким резюме, объясняющим назначение функции и описывающим ее параметры, которые нужно задать, как показано на рис. 7.6.
Форматирование чисел
Format ( ) — интересная математическая функция, преобразующая числа в текст. Она интересна, потому что создаваемый текст можно отформатировать несколькими способами, управляя, таким образом, представлением чисел.
Для того чтобы понять разницу, вернемся к выражению, использованному ранее для снижения цены:
SalePrice: [Price] * 0.95
Даже если у поля Price не Денежный тип, вычисленные значения в поле SalePrice (продажная цена) выводятся как обычные числа (без знака валюты, разделителя тысяч и т. д.). Вы увидите значение 43.2 вместо желаемого $43.20.
Решить эту проблему можно, применив функцию Format ( ) для задания денежного формата вывода:
SalePrice: Format([Price] / 0.95, "Currency")
Теперь вычисленные значения содержат знак валюты. Более того, поскольку денежные суммы отображаются с двумя знаками после точки, вам не нужно больше применять функцию Round ( ).
Хитрость применения функции Format () состоит в выборе текста, задаваемого в качестве второго аргумента для получения желаемого результата. В табл. 7.2. приведены возможные варианты.
Таблица 7.2. Варианты форматирования
Формат |
Описание |
Пример |
Денежный |
Выводит число с двумя знаками в дробной части, |
$1 433.20 |
|
разделителями для тысяч и знаком валюты |
|
Фиксированный |
Отображает число с двумя десятичными знаками |
1433.20 |
|
|
|
Основной |
Выводит на экран число с двумя десятичными знаками |
1 433.20 |
|
и разделителями тысяч |
|
|
|
|
Процентный |
Отображает процентное значение (число, умноженное |
143320.00% |
|
на 100, и со знаком процента). Выводит две цифры |
|
|
справа от десятичной точки |
|
|
|
|
Экспоненциальный |
Отображает число в научной нотации с двумя деся- |
1.43Е+03 |
|
тичными знаками |
|
|
|
|
254
Таблица 7.2 (окончание)
Формат |
Описание |
Пример |
Да/нет |
Отображает Нет, если число равно 0, и Да, если число |
Да |
|
отлично от 0. Можно использовать аналогичные |
|
|
типы формата Истина/Ложь и Вкл/Выкл |
|
|
|
|
Практические занятия для опытных пользователей. Улучшенные числовые форматы
Истинные педанты не будут довольны вариантами, перечисленными в табл. 7.2. Им нужен полный контроль количества десятичных знаков в числе. Один из возможных вариантов — использовать функции FormatCurrency( ), FormatPercent ( ) и FormatNumber ( ) (в зависимости от необходимости вывода значения как денежного, процентного или обычного числового). В этих функциях в качестве первого аргумента задается число, которое нужно отформатировать, а в качестве второго — число десятичных знаков, которое нужно сохранить.
Для более полного контроля можно определить собственный формат, точно описывающий то, что вы хотите получить, и затем применить его в функции Format (). В данной книге не рассматриваются пользовательские числовые форматы, по вы можете посмотреть дополнительную информацию в справочной системе программы Access (см. рис. 7.6).
Дополнительные математические функции
Математическим функциям в программе Access не уделяется должного внимания, потому что потребность в них возникает крайне редко. Вы уже видели функции Round ( ) и Format ( ) — самые полезные в этой категории — но есть еще несколько других (табл. 7.3), к которым знатоки Access обращаются время от времени в вычисляемых полях.
Таблица 7.3. Функции для числовых данных
Функция |
Описание |
Пример |
Результат |
Sqr ( ) |
Извлекает квадратный корень |
Sqr(9) |
3 |
|
|
|
|
Abs() |
Возвращает положительное значение |
Abs(-6) |
6 |
|
(отрицательные числа становятся положитель- |
|
|
|
ными) |
|
|
|
|
|
|
Round () |
Округляет число до заданного числа десятичных |
Round(8.89, 1) |
3.9 |
|
знаков |
|
|
|
|
|
|
Fix ( ) |
Возвращает целую часть числа, отбрасывая |
Fix(8 . 89) |
8 |
|
любую дробную часть |
|
|
Int( ) |
То же что функция Fix (), но отрицательные |
Int( - 8 . 89) |
-9 |
|
числа округляются до ближайшего меньшего |
|
|
|
целого числа, а не большего |
|
|
|
|
|
|
255
Таблица 7.3. (окончание)
Функц |
Описание |
Пример |
Результ |
Rnd( ) |
Генерирует случайное |
Int |
Случа |
|
дробное число в диапазоне |
((6) |
йное |
Val ( ) |
Преобразует числовые |
Val |
315 |
|
данные в текстовом поле в |
("315 |
|
|
настоящее число так, что |
Crossl |
|
Forma |
Преобразует число в |
Format( |
$243.60 |
t( ) |
форматированную тексто- |
243 .6 , |
|
Малоизвестная или недооцененная возможность. Использование случайных чисел для сортировки в случайном порядке
Функцией Rnd ( ) пользуются редко — в конце концов, кому нужны столбцы, заполненные искусственно сгенерированными данными? Однако инициативные гуру Access предложили одно интригующее применение для функции Rnd ( ). Они применяют ее для сортировки таблицы, таким образом, чтобы записи выводились в случайном порядке.
По существу вы добавляете вычисляемое поле, содержащее случайное число. Можно использовать в поле выражение, такое как Random: Rnd ( ). Если посмотреть результаты вашего запроса, то можно увидеть случайное значение в диапазоне от 0 до 1 (например, 0.7045, 0.2344 и т. д.) рядом с каждой записью.
Теперь вернитесь в Конструктор и сбросьте флажок Вывод на экран для того, чтобы поле Random не выводилось на лист данных. Далее выберите порядок в ячейке Сортировка по возрастанию или по убыванию (что на самом деле не имеет значения) и снова выполните запрос. Ву-а-ля! Каждое выполнение запроса выводит на экран записи в разном порядке, в соответствии со случайными числами, которые программа Access генерирует на лету.
Текстовые функции
Все функции, которые вы видели до этого момента, работали с числовыми данными. Но с текстом тоже можно делать многое. В целом есть три способа обработки текста.
■Слияние текста. Вы можете соединить несколько текстовых полей в одном. Для этого способа не нужна функция — достаточно оператора &, описанного в разд. "Выражения с текстовыми значениями "ранее в этой главе.
Извлечение подстроки из текстовой строки. Может быть, вам потребуется первое слово из заголовка или первые 100 символов в описании.
■Замена строчных букв прописными и наоборот. Возможно, вы захотите отобразить строчные буквы прописными или наоборот.
256
В табл. 7.4 перечислены функции, наиболее часто применяемые для обработки текста.
Таблица 7.4. Функции для работы с текстом
Функция |
Описание |
Пример |
|
Результат |
UCase( ) |
Выводит текст прописными буквами |
UCase("Hi There") |
HI THERE |
|
|
|
|
|
|
LCase( ) |
Выводит тест строчными буквами |
LCase("Hi There") |
hi there |
|
|
|
|
|
|
Left ( ) |
Выводит заданное вами число символов, |
Left("Hi There", |
2) |
Hi |
|
начиная от левого края строки |
|
|
|
Right 0 |
Выводит заданное вами число символов, |
Right ("Hi There", 5) |
There |
|
|
начиная от правого края строки |
|
|
|
|
|
|
|
|
Mid ( ) |
Выводит часть строки, начиная с заданной |
Mid ("Hi There", |
4, 2) |
Th |
|
позиции, и заданное число символов |
|
|
|
|
|
|
|
|
Trim ( ) |
Удаляет пробелы с обеих сторон (или |
Trim(" Hi There |
") |
Hi There |
|
используйте LTrim ( ) и RTrim( ) для |
|
|
|
|
|
|
|
|
Len ( ) |
Подсчитывает количество символов в |
Len("Hi There") |
|
8 |
|
текстовой строке |
|
|
|
С помощью этих функций вы можете создать вычисляемое поле, которое отображает фрагмент длинной текстовой строки или изменяет вид отображения (строчные или прописные буквы). Применение этих функций в условиях отбора не столь очевидно. Можно создать условие фильтрации, задающее совпадение с частью текстовой строки, а не со всей строкой. Далее приведен пример условия отбора, выбирающего записи, начинающиеся с "Choco": Left([ProductName], 5) = "Choco"
На рис. 7.7 показано, как ввести это условие отбора.
Функция Len ( ) — особый случай. Она проверяет текстовое значение и возвращает числовую информацию (в данном случае количество символов в строке, включая все пробелы, буквы, цифры и специальные символы). Эта функция не слишком полезна в простых вычисляемых выражениях, т. к. вас редко будет интересовать количество букв в текстовой строке. Но она позволяет создавать интересные условия отбора, включая, например, такое, которое отбирает все записи с полем Description короче 15 символов.
Len{Description) < 15
Практические занятия для опытных пользователей. Как извлечь первое слово из текстовой строки
Функции обработки строк созданы с ориентацией на символы. Они умеют подсчитывать символы, но не понимают, что такое слово пли предложение.
257
Единственный способ обойти это ограничение — применить функцию Instr ( ), которая ищет один или несколько символов в текстовой строке. (Название Instr ( ) — это сокращение от "in string", поскольку вы ищите конкретные символы внутри текстовой строки.) Для поиска символов "he" с строке "Hi There" нужно применить функцию Instr ( ) следующим образом: Instr("Hi There", "he")
Результат равен 5, потому что текст "he" начинается с пятой символьной позиции. Если программа Access не находит совпадения, функция Instr ( ) возвращает 0. Если же есть множественные совпадения, Instr () возвращает позицию первого.
Сама по себе эта функция не очень полезна в условиях отбора и вычисляемых полях. Но ее можно использовать в сочетании с другими функциями, такими как Mid ( ) и Left ( ), для вырезания части строки, расположенной рядом с какой-либо буквой. Можно применить функцию Instr ( ) для поиска первого пробела и вырезать весь текст до этого пробела. Таким образом, вы извлечете целое слово.
Далее приведено слегка ошеломляющее вычисляемое поле, которое получает первое слово из поля ProductName с помощью вложенных функций (см. разд. "Вложенные функции" ранее в этой главе). Оно разбито на несколько строк для того, чтобы разместить его на странице книги. Когда будете его набирать, поместите все выражение в одну строку.
FirstWordProduct:
Left([ProductName], Instr([ProductName], " " - 1 ) )
Это выражение переводится следующим образом: "Найди позицию первого пробела, вычти единицу и извлеки все символы слева от пробела". Вычислите это поле для значения Banana Cream Fudge и вы получите вырезанный текст Banana, что выглядит как впечатляющий яркий трюк.
Рис. 7.7. Функции Left ( ), Right ( ) и Mid ( ) действуют во многом аналогично ключевому слову Like, помогая найти совпадения кусочков длинной текстовой строки
258
Функции для обработки дат
Вы уже видели, как можно использовать операции сложения и вычитания при работе с датами
(см. разд. "Поля с датами "ранее в этой главе). Но вы можете выполнить гораздо больше действий с помощью некоторых функций Access для работы с датами.
Несомненно, многие применяют функции Now () и Date (), с которыми вы познакомились в главе 4. Эти функции извлекают текущие дату и время или только текущую дату. Их можно применять в запросах, работающих с заказами, принесшими доход в текущем году.
Вот условие для выбора просроченных проектов: =<Date ( )
Вставьте его в ячейку Условие отбора поля DueDate (срок платежа) и вы увидите только те записи, в которых поле DueDate содержит дату, наступившую ранее нынешнего дня.
Анализ дат может быть более сложным в сочетании с функцией DatePart (), которая извлекает часть информации из даты. DatePart () может определить номер месяца или год, позволяя игнорировать другие подробности (такие как число или время). С помощью DatePart () и Date () можно легко написать условие фильтрации, отбирающее заказы, сделанные в текущем месяце.
DatePart("m", [DatePlaced])=DatePart("m", Date())
And DatePart("yyyy", [DatePlaced])=DatePart("yyyy", Date ())
Это довольно длинное выражение на самом деле представляет собой комбинацию двух условий, соединенных ключевым словом And. Первое условие сравнивает номер месяца текущей даты с датой, хранящейся в поле DatePlaced:
DatePart("m", [DatePlaced])=DatePart ("m", Date( ))
Приведенное выражение устанавливает, что у обеих дат один и тот же календарный месяц, но вы должны также убедиться в том, что год у них тоже совпадает:
DatePart("yyyy", [DatePlaced])=DatePart("yyyy", Date ( ))
Сложность применения функции DatePart ( ) (и некоторых других функций для дат) заключается в понимании идеи компонентов, составляющих дату. Применяя символ m в функции DatePart ( ), вы получите номер месяца, а используя текст уууу, извлечете четерехсимвольный номер года. В табл. 7.5 приведены все возможные варианты.
Таблица 7.5. Компоненты даты
Компонент |
Описание |
Значение на 20 февраля, 2006 г. 1:30 РМ |
уууу |
Год в четырехсимвольном формате |
2006 |
|
|
|
q |
Квартал от 1 до 4 |
1 |
|
|
|
т |
Месяц от 1 до 12 |
2 |
|
|
|
у |
День в году, от 1 до 365 (обычно) |
51 |
|
|
|
d |
День в месяце от 1 до 31 |
20 |
w |
День недели, от 1 до 7 |
2 |
259
Таблица 7.5 (окончание)
Компонент |
Описание |
Значение на 20 февраля, 2006 г. 1:30 РМ |
ww |
Неделя в году, от 1 до 52 |
8 |
|
|
|
h |
Час, от 1 до 24 |
13 |
|
|
|
n |
Минута, от 1 до 60 |
30 |
|
|
|
s |
Секунда, от 1 до 60 |
0 |
|
|
|
Для тех, кто понимает. Вычисления для дат и времени
Используя функции для дат, всегда следует помнить о датах, содержащих информацию о времени. (Напоминаю, все даты могут содержать данные о времени суток. Но, выбирая подходящий формат для поля с датами, вы сообщаете программе Access о том, нужно ли отображать временной компонент даты и разрешать пользователям вводить его, как объясняется в разд. "Дата/время " главы 2. Чаще всего вы будете пользоваться форматом, скрывающим любую информацию о времени суток.)
Проблема: функция Date ( ) возвращает текущую дату со значением времени суток, равным 0. Другими словами, если текущая дата — 4 июля 2008 г., то функция Date ( ) возвращает первую секунду 4 июля 2008 г. — момент, когда часы показывают полночь (12:00 a.m.)
Если вы не храните значения времени суток, эта проблема не важна, поскольку у всех ваших дат время суток равно 0. Но что произойдет, если вы используете Полный формат даты (см. табл. 2.3) в поле DueDate, разрешающий пользователям вводить и дату, и время. Теперь у условия отбора =<Date ( ) несколько иной смысл — вы сообщаете Access о необходимости отобрать, как совпадающие, все поля с датами, наступившими до первой секунды текущего дня. Это условие не выберет запись со сроком платежа, назначенным на 16:00 текущего дня.
В данной ситуации, возможно, нужно изменить условие отбора на следующее: <(Date()+l)
Date () +1 — это завтра. Другими словами, это условие отбирает любые записи со сроком платежа, истекшим до первой секунды завтрашнего дня.
Между прочим, у программы Access есть функция Now (), возвращающая текущую дату и время. Таким образом, следующее условие фильтрации отбирает все записи, соответствующие текущему моменту (текущего дня) или любому моменту времени во все предшествующие дни:
=<Now( )
Компоненты дат применяются в нескольких функциях обработки дат, включая функции DatePart ( ), DateAdd ( ) и DateDiff ( ). В табл. 7.6 приведены эти и дополнительные полезные функции, относящиеся к датам.
260