If IsNull(ДатаПоступл) Then
ДатаПоступл = Date
End If
End Sub
Перейдем к определению розничной цены. Здесь потребуется не только кнопка, но и поле, в которое будет вводиться значение наценки, используемое при расчете розничной цены. Поэтому разместим на форме поле под названием Наценка, и при включенной на панели элементов кнопке Мастера поместим на форму кнопку Вычислить розничную цену. В качестве действия, выполняемого при нажатии кнопки, можно выбрать сохранение записи, т.е. при нажатии данной кнопки будет сохраняться текущая запись. Строка сохранения записи, записанная мастером выглядит так:
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, ,acMenuVer70
Здесь указывается, какую команду меню следует выполнить. Аналогичным образом можно программно выполнять любые команды меню Access.
Выполним расчет розничной цены в соответствии с торговой наценкой, которая может варьироваться. Для торговой наценки используется свободное поле, т.е. поле, которое не связано ни с одним полем источника данных. В это поле будем вводить наценку, а при нажатии кнопки Вычислить розничную цену будет определяться и записываться в соответствующее поле розничная цена единицы товара, определяемого текущей записью на форме. Код событийной процедуры содержит один оператор присваивания:
ЦенаРозничн = ЦенаПоставщик * (1 + Наценка/100).
Удобно вводить наценку в процентах, поэтому она делится на 100.
Теперь, если написать вышеприведенный оператор перед оператором сохранения, то после изменения розничной цены запись будет автоматически сохраняться.
Чтобы исключить ввод в поле Наценка нечислового значения, выберем для свойства Формат поля этого элемента управления значение Фиксированный.
Добавим в событийную процедуру для кнопки Вычислить розничную цену проверку условия Наценка>0, чтобы нельзя было назначить розничную цену меньше оптовой. При нарушении этого условия будет появляться сообщение об ошибке, которое выводит процедура MsgBox. В результате все тело процедуры примет вид:
If Наценка > 0 Then
ЦенаРозничн = ЦенаПоставщик * (1 + Наценка/100)
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Else
MsgBox ("Наценка должна быть больше нуля!")
End If
Как правило, есть некоторое значение наценки, которое применяется для большинства товаров. Поэтому будет естественным, если это значение будет автоматически вводиться в поле Наценка на форме. Для этого мы воспользуемся событием загрузки формы. Событие Загрузка (Load) возникает при открытии формы и выводе на экран ее записей.
Такая процедура при открытии формы Прием товаров выглядит следующим образом:
Private Sub Form_Load()
Наценка = 20
End Sub
В результате работы этой процедуры в поле Наценка при загрузке формы будет введено значение 20. Если потребуется использовать какое-либо другое значение наценки, то его можно изменить вручную в процедуре.
Использование вычисляемого поля на форме рассмотрим на примере расчета предполагаемой прибыли, которая представляет собой просуммированную для всех товаров разность между розничной и оптовой ценой. Встроенная статистическая функция Sum вычисляет итоговое значение для всех записей источника данных. Поэтому, если мы разместим в области заголовка или примечания формы вычисляемое поле с формулой
=Sum([ЦенаРозничн] - [ЦенаПоставщик])*[Количество],
то получим требуемый результат. Для этого поместим в область заголовка свободное поле и введем вышеприведенную формулу в свойство Данные, воспользовавшись Построителем выражений. Заметим, что знак равенства "=" является обязательным атрибутом вычисляемого поля. Чтобы результат выводился в денежных единицах, на карточке Макет нужно выбрать формат Денежный для этого поля.
Создание Подчиненной формы Товары
Подчиненные формы предоставляют большую гибкость при отображении и вводе данных из нескольких таблиц. Можно даже редактировать все поля, не задумываясь о целостности данных. Кроме того, подчиненная форма позволяет вводить в форму данные со связями типа один-ко-многим. Подчиненная форма - это форма внутри формы. Она дает возможность использовать данные из нескольких таблиц в одной форме. С ее помощью можно одновременно отображать данные из одной таблицы, записанные в одном формате, и данные из другой таблицы, записанные в совершенно другом формате. Например, в главной форме можно отображать одну запись о клиенте, а в подчиненной форме - несколько записей о приобретенных им товарах и их стоимости. При создании подчиненной формы происходит ее связывание с главной формой. В подчиненной форме будут отображены только те записи, которые связаны с главной формой. Основное преимущество подчиненных форм состоит в том, что они отображают связи один-ко-многим. Главная форма представляет часть связи один, а подчиненная - многим.
Для создания подчиненных форм чаще всего используется Мастер форм. Без использования Мастера придется отдельно создавать как главную, так и подчиненную форму, а затем внедрять подчиненную форму в главную и связывать их. Самым удобным способом создания подчиненных форм без использования Мастера является метод перетаскивания формы из окна БД, потому что в этом случае Access пытается установить связь между формами.
Первым шагом при создании и внедрении подчиненных форм является создание формы, которая будет использоваться как подчиненная, что и было сделано в задании 5. При создании подчиненной формы необходимо также задать значение Таблица для свойства формы Режим по умолчанию.
Готовую подчиненную форму можно вставить в главную. Самый простой способ сделать это – отобразить главную форму и перетащить в нее подчиненную, при этом автоматически будет создан элемент управления подчиненной формы, и они, возможно, будут связаны. Для вставки подчиненной формы в главную форму нужно выполнить следующие действия:
Отобразить главную форму в режиме конструктора так, чтобы было видно и окно БД.
Отобразить объекты карточки Формы в окне БД.
Выделить подчиненную форму и перетащить ее в главную.
Задать такой размер подчиненной формы, чтобы она помещалась на экране ниже главной.
Удалить надпись подчиненной формы.
Вызвать окно свойств подчиненной формы для проверки правильности связи.
Если строки свойств Подчиненные поля и Основные поля пусты, то это значит, что главная форма не связана с подчиненной.
При перетаскивании формы из окна БД в другую форму для создания подчиненной формы Access пытается автоматически установить связь между формами. То же самое происходит и при перетаскивании какой-либо формы или отчета в другой отчет.
Access устанавливает связь, если соблюдаются следующие условия:
Главная и подчиненная форма создана на основе таблиц, связь между которыми указана в окне Схема данных.
В главной и подчиненной формах содержатся поля с одинаковыми типами и именами, а одно из полей главной формы является ключевым полем базовой таблицы.
Если Access обнаружит связь или одинаковые поля, в строках свойств формы будут показаны имена полей, определяющих связь. Следует убедиться в правильности автоматического связывания. Если в главной таблице используются результаты выполнения запроса (или одно из перечисленных условий не выполняется), Access не будет выполнять автоматическое связывание.
Строки свойств Подчиненные поля и Основные поля должны содержать одинаковое количество полей и представлять данные одинакового типа. Даже если названия полей различаются, можно установить связь для этих полей, если в них содержатся однотипные данные. Поэтому для создания связи нужно для свойств Подчиненные поля и Основные поля ввести одинаковое имя поля. Если связь не установлена, то при отображении формы в подчиненной форме будут показаны все записи из соответствующей таблицы. Если связь установлена, то в подчиненной форме будут представлены только отобранные записи, соответствующие записи главной формы.