On Error GoTo Err_Кнопка18_Click

End If

End If

Nz(Выражение)

проверяет, является ли выражение в скобках равным Null. Если да, то она возвращает значение 0, в противном случае максимальный код товара. Для формирования кода нового товара к найденному максимальному коду нужно добавить 1. Таким образом, значением поля является 1, если в таблице «Товар» еще нет ни одной строки данных и увеличенный на единицу максимальный код товара, если в таблице уже существуют записи.

2. Для создания программы добавляющей код товара в новую запись необходимо с помощью правой кнопки мыши вызвать окно свойств, в котором выбрать вкладку «События» и для события «До обновления» выбрать позицию «Процедура обработки события». Далее, вызвав с помощью кнопки построитель процедур, ввести фрагмент программы.

If Nz([Код товара]) = 0 Then

[Код товара] = [Поле15]

Смысл фрагмента состоит в следующем: по умолчанию код товара в таблице базы данных для вновь вводимого значения имеет значение Null. То есть, если вводится новый товар, то его код равен Null и выражение Nz([Код товара])будет равно 0.И, следовательно,полю «Код товара» необходимо присвоить значение, вычисленное в объекте «Поле15».

3. После того как будет проверена работоспособность этих средств, т.е. в режиме просмотра формы будет видно, что код товара формируется правильно, поле «Код товара» можно скрыть, установив свойство «Вывод на экран» в положение «Нет» и удалив совсем надпись «Код товара». Далее в форме можно установить размеры и вид шрифтов, цвета шрифтов и фона, после чего закрыть ее подтвердив предложение о сохранении изменений. В поле «Цена» нужно установить формат вывода на экран с двумя знаками после точки (копейки). Для этого в свойствах «Формат поля» и «Число десятичных знаков» нужно установить значения «Фиксированный» и 2 – соответственно. В итоге форма должна выглядеть примерно так.

 

Аналогичным образом разработайте форму

«Ввод данных о клиенте» и заполните её списком клиентов.

Описание создания формы «Заказы»

Разработка формы «Заказы» включает новые виды объектов и приемы работы с ними. Для того, чтобы приступить к разработке этой формы необходимо создать отдельно форму «Заказы», форму «Спецификация» и форму «Оплата», а затем включить форму «Спецификация» в форму «Заказы» в качестве подчиненной и установить вызов формы «Оплата» из формы «Заказы» с помощью кнопки.

Создание макета формы «Заказы»

 

Особенностью создания формы «Заказ» является то, что после запуска мастера построения форм необходимо выбрать внешний вид «В один столбец». Это позволяет разместить в форме данные одной записи. При создании макета формы в него необходимо включить поля «Код заказа», «Код клиента», «Дата заказа» и «Дата доставки» и переместить их в раздел заголовка формы, как указано на рисунке. При этом текст надписи к полю «Код заказа» лучше заменить на «Заказ N».

 

 

После изменения размещения объектов управления на форме она должна принять примерно следующий вид. При этом необходимо помнить, что в Access 2007 совокупность вышеуказанных полей автоматически объединяется в таблицу. Для того, чтобы разрешить перемещать и настраивть эти поля независимо, нужно выделить эту таблицу и далее нажать кнопку «Удалить» в разделе «Макет элемента управления» панели «Упорядочить». А далее можно настраивать каждое поле независимо.

 

 

 

 

Поле «Код клиента» лучше заменить на поле со списком. Проще всего сначала удалить поле «Код клиента» (выделив его и нажав клавишу Del), а затем вставить «Поле со списком». В форме «Товар» мы уже вставляли поле со списком. И там был выбран вариант «Будет введен фиксированный набор значений». Теперь в поле со списком нужно выбирать имена клиентов, которые ранее были введены в таблицу «Клиенты». Причем строку таблицы «Заказ» должен попадать «Код заказа», а в экранной форме отражалось бы название организации клиента. Это возможно сделать, выбрав в первом появившемся окне мастера создания поля со списком вариант «Объект «поле со списком» будет использовать значения из таблицы или запроса». Окна дальнейшего диалога построения поля со списком показаны ниже.

 

 

       
   
 
 

 


 

 

После нажатия кнопки «Готово» в последнем окне в форму «Заказ» будет вставлено поле со списком и она примет следующий вид.

При закрытии формы СУБД сохранит ее с именем той таблицы, на которой она была создана, то есть «Заказ».

Внимание! Вставленное поле со списком будет иметь имя не «Код клиента», а другое, назначенное системой. В нашем случае «ПолеСоСписком11». Эта информация пригодится далее.Пака приостановим работу с формой «Заказ» и приступим к созданию формы «Спецификация».

Создание подчиненной формы «Спецификация»

Закройте форму «Заказ» (она будет доработана позже) и создайте ленточную форму «Спецификация». Особенностями создания формы являются: расчетное поле «Стоимость», поле с итоговой суммой и автоматическое занесение цены в поле «Цена». Вид этой формы в режиме конструктора должен быть примерно таким.

Такая форма получается в результате следующих действий:

· Создайте ленточную форму «Спецификация» для одноименной таблицы;

· В разделе заголовка формы удалите надпись «Спецификация» из и поднимите надписи полей под верхний край раздела как показано на рисунке;

· Скройте поле «Код заказа», установив свойство «Вывод на экран» в положение «Нет» и измените его размер на максимально узкий.;

· Удалите поле «Код товара», вставив вместо него поле со списком, как было рассмотрено ранее. В Access 2007 необходимо помнить, что при создании списка полей в форме с помощью мастера поля и их наименования оформляются в виде таблицы, потому удаление и вставка поля отображаются как удаление и вставка столбца таблицы. При создании поля со списком в качестве таблицы выбора используйте таблицу «Товар», а в качестве полей для формирования списка товаров «Код товара» и «Наименование». После размещения поля со списком в области данных оно размещается поверх столбцов таблицы. Чтобы сделать его столбцом перетащите надпись поля с соответствующее место заголовка формы, а затем измените надпись, например, на «Наименование товара», как показано на рисунке. Поле создаётся с автоматически присвоенным именем, которое будет использовано ниже. В нашем случае это ПолеСоСписком13.

· Таким же образом добавьте в область данных несвязное поле, введя в свойство «Данные» выражение =[Цена]*[Количество]*(1+[Наценка]-[Скидка]). Это удобнее сделать воспользовавшись построителем выражений. Надпись поля поменяйте на «Стоимость» (см. рисунок).

· В примечание формы введите несвязное поле ( имя поля «Поле15»), введя в свойство «Данные» выражение =Sum([Цена]*[Количество]*(1+[Наценка]-[Скидка])). Не забывайте про построитель выражений. При его использовании возникает меньше ошибок. В этом поле будет рассчитываться сумма всего заказа. Поле лучше скрыть, задав в свойстве «Вывод на экран» значение «Нет». Это поле будет использовано для дальнейших построений. Запомните имя поля, которое создаст СУБД в вашем случае.

· Для автоматического занесения цены после выбора товара в свойство «После обновления» поля «Код товара» нужно вставить процедуру обработки, включающую следующий код:

[Цена]=DLookup("[Цена]", "[Товар]", "[Код товара]=" & ПолеСоСписком13)

 

Здесь полю «Цена» присваивается значение, возвращаемое функцией Dlookup , которая использует три параметра: имя поля с ценой, имя таблицы, условие отбора. Функция Dlookup выбирается из встроенных функций, предоставляемых построителем выражений в группе «По подмножеству». Условие представляет совой вычисляемое выражение, включающее текстовую константу и код товара из поля ПолеСоСписком13. Если введенный код товара будет, например, равен 2, то выражение даст "[Код товара]=2", и в таком виде будет передано функции Dlookup для поиска.

После внесения всех изменений сохраните форму «Спецификация».

Создание связанной формы «Оплата»

Еще одной формой, которая необходима для формы «Заказ» является форма «Оплата», которая в режиме конструктора имеет вид:

Форма создается для таблицы «Оплата» и имеет следующие особенности:

· Создать форму с помощью мастера для всех полей таблицы с внешним видом - ленточный;

· Скрыть поле «Номер заказа» и сузить его размер до минимального;

· Автоматически сформировать «Номер заказа» перенеся его из формы «Заказы». Для этого в событии «До обновления» формы «Оплата» необходимо с помощью редактора создать процедуру обработки события следующего вида:

If Nz([Номер заказа] )= 0 Then

[Номер заказа] = Forms![Заказ]![Номер заказа]

Эта процедура для каждой новой записи значению поля «Номер заказа» присваивает значение одноименного поля из формы «Заказы».

· В примечание формы добавьте несвязанное поле с итоговой суммой по заказу, включив в свойство «Данные» формулу и изменив надпись как показано на рисунке.

· Закройте созданную форму с сохранением изменений.

 

Продолжение создания формы «Заказ»

 

После создания формы «Оплата» можно продолжить разработку формы «Заказы». В дополнение к уже созданным элементам формы необходимо:

· Вставить подчиненную форму «Спецификация»;

· Добавить кнопку «Новый», которая позволит создать запись для нового заказа, присвоив ему очередной номер и задав дату заказа равную текущей дате.

· Добавить кнопку, вызывающую форму «Оплата» с отображением записей только для данного заказа;

· Создать поле с итоговыми суммами по заказу.

Указанные действия выполняются следующим образом.

Откройте ранее разработанную форму «Заказ» в режиме конструктора. Вставка подчиненной формы:

На вкладке панели элементов «Конструктор» щелкнуть в группе «Элементы управления» кнопку «Подчиненная форма/отчёт», а затем при нажатой левой клавише выделить место под подчиненную форму в форме «Заказ». После этого запускается мастер построения подчиненных форм. Первым окном, которое появится на экране, будет:

 

 

Следующее окно позволяет установить связь между основной и подчиненной формами. Для этого нужно установить положение переключателей, как показано на рисунке.

 

Последнее окно запрашивает имя подчиненной формы. Здесь нужно просто нажать кнопку «Готово». Далее следует отрегулировать размер прямоугольника под подчинённую форму, чтобы форма «Спецификация» разместилась целиком.

Создание кнопки «Новый»

Форма «Заказ» создана в режиме «В один столбец» и отображает сведения об одном заказе. В таких формах нет свободной строки для добавления новой записи, как это происходит в ленточных формах (формы «Справочник товаров», «Списки клиентов» и т.д.). Поэтому нужно создать средство для создания новой (пустой) записи о заказе. Тут же надо предусмотреть занесение в новый заказ номера заказа и даты заказа. Номер заказа будет формироваться по известному принципу: максимальный существующий номер плюс 1. В качестве даты заказа в большинстве случаев удобно использовать системную дату компьютера. Все эти действия реализуются программным кодом привязанным к нажатию кнопки. Для этого создадим кнопку с надписью «Новый».

При вставке в форму «Заказ» кнопки «Новый» (действия по созданию кнопки смотри ниже) в Access 2007 в событие «Нажатие кнопки» , как указывалось выше, добавляется внедрённый макрос. Можно, конечно, сделать указанные действия в виде макросов, но для этого вначале нужно было бы изучить специфические средства макросов. Поэтому программный код будем создавать в VBA.

Итак, сначала в форму необходимо вставить кнопку из вкладки «Конструктор», как это было описано выше, и выбрав категорию «Обработка записей» и действие «Добавить запись». В окне выбора формы кнопки необходимо включить переключатель «Текст» и ввести слово – Новый. Созданная кнопка позволяет добавлять новые записи в таблицу «Заказ». При создании кнопки СУБД автоматически добавляет в событие «Нажатие кнопки» внедрённый макрос обработки события следующего вида:

Преобразовать внедрённый макрос в программный код на VBA в Access 2007 невозможно, потому сформируем из внедрённого макроса изолированный. Для этого выделим два первых оператора макроса как показано на рисунке и скопируем в буфер (Ctrl-C). Оператор в третьей строке должен выдавать сообщение об ошибке, если будет невозможно создать новую запись о заказе. Но для наших целей он не нужен. Затем на вкладке «Создание» выбреем позицию «Макрос» как показано на рисунке:

В появившемся окне конструктора макроса вставим из буфера выделенные ранее строки и сохраним макрос под именем, например «НовыйЗаказ». Затем в свойствах кнопки «Новый» выберем событие «Нажатие кнопки» и для его обработки укажем вновь сформированный макрос как показано ниже.

Теперь событие обрабатывает не внедрённый, а изолированный макрос и его можно преобразовать в код VBA. Это делается так:

 

 

На вкладке «Работа с базами данных» нажать кнопку «Преобразовать макросы формы». В появившемся всплывающем окне

нажать кнопку «Преобразовать». О завершении преобразования сообщается транспорантом

 

 

Теперь событие обрабатывает программный код на VBA:

'------------------------------------------------------------

' Кнопка18_Click

'------------------------------------------------------------

Private Sub Кнопка18_Click()

On Error GoTo Кнопка18_Click_Err

 

DoCmd.GoToRecord , "", acNewRec

 

Кнопка18_Click_Exit:

Exit Sub

 

Кнопка18_Click_Err:

MsgBox Error$

Resume Кнопка18_Click_Exit

 

End Sub

 

Этот программный код имеет следующий смысл.

 

 

Операторы On Error ,MsgBox Error$ ,Resume являются операторами БЕЙСИКа и служат для организации обработки ошибок. Это стандартный набор операторов, создаваемый мастером построения кнопок. Оператор DoCmd.GoToRecord , , acNewRec осуществляет создание новой записи о заказе и переход к ней.

Однако в задачу кнопки входит также создание нового номера записи и занесение текущей даты в дату заказа. Поэтому в процедуру после оператораDoCmd.GoToRecord , , acNewRecнеобходимо добавить следующие операторы:

[Номер заказа] = Nz(DMax ( "[Номер заказа]" , "[Заказ]")) +1

[Дата заказа] = Date()

DoCmd.GoToControl "ПолеСоСписком11"

Этим фрагментом программы в поле «Номер заказа»заносится максимальный код товара увеличенный на единицу; в поле «Дата заказа» заносится системная дата и последним оператором управление передается объекту «ПолеСоСписком11». Это поле со списком, которым мы заменили «Код клиента» ранее.

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

 

Private Sub Кнопка18_Click()