Раздел "Сотрудники"
В этом разделе нашего документа будем сохранять информацию о сотруднике офиса, оформляющего заказ. Конечно, проще всего ввести фамилию сотрудника непосредственно в соответствующее поле документа. Но быстрее и методически правильнее выбирать нужные данные из списка фамилий, предоставляемого интерактивным документом. Заполнение этого списка ведется на основе сведений о сотрудниках, хранящихся в базе данных. Вот несколько очевидных преимуществ такого подхода:
- Список, составленный на основе базы данных, позволяет выбирать фамилии только тех сотрудников, которые имеют право на оформление заказа.
- Исчезает возможность намеренно или по ошибке указать фамилию несуществующего сотрудника или сотрудника, не имеющего права на оформление заказа.
Для реализации этого подхода я добавил в документ элемент управления класса Combobox, предназначенный для хранения списка сотрудников. Сразу же скажу еще об одном элементе управления, добавленном мною в документ, - класса Label, метке или надписи, предназначенной для хранения текущей даты. Понятно, что без текущей даты не обходится ни один из документов, и эта дата должна создаваться автоматически, используя соответствующую встроенную функцию Date, возвращающую текущую дату в нужном формате. Конечно в документах, создаваемых на основе Excel, для хранения даты можно использовать любую из ячеек рабочего листа, и я применю этот подход чуть позже при формировании листа печати. Сейчас же хочу продемонстрировать использование различных элементов управления, и потому я предпочел для отображения даты ввести отдельный элемент управления. Взгляните, как выглядит интерфейс этой части документа с добавленными элементами управления:
увеличить изображение
Рис. 7.7. Документ с элементами управления для хранения текущей даты и списка сотрудников
Добавленным элементам управления я дал соответственно имена - AccountDate и ListOfTeam, и установил подходящее форматирование и другие свойства этих элементов. Останавливаться на этих деталях не буду, отмечу только, что для списка свойство Style я установил, равным 0, что запрещает вносить данные в поле ввода списка в момент работы с документом, - разрешен только выбор из заранее сформированного списка.
Главный вопрос при работе с этими элементами, - как и когда задавать текущую дату и формировать список фамилий на основе сведений из базы данных. Вопрос "когда" решается очевидным способом, - разумнее всего инициализацию отдельных элементов документа проводить в момент общей инициализации, то есть в момент открытия документа. На вопрос "как" проще всего ответить, приведя программный код. Поскольку, благодаря принятой стратегии построения обработчиков событий, текст их остается неизменным, то мне достаточно показать дополнения, сделанные в процедуре InitAccount, вызываемой в обработчике события Open нашего документа:
Public Sub InitAccount() 'Установить соединение с базой данных CreateConnection 'Конфигурирование команды ConfigCommand 'Очистить поля бланка ClearFields 'Задать дату и создать список сотрудников CreateListOfTeam End Sub
Сделанные изменения подсвечены, и, как видите, они состоят из вызова процедуры CreateListOfTeam, текст которой сейчас приведу:
Public Sub CreateListOfTeam() 'Задать дату и создать список сотрудников Dim myDate As Object Dim myCombo As ComboBox 'Установить дату Set myDate = ThisWorkbook.Worksheets(1).OLEObjects("AccountDate").Object myDate.Caption = Date 'Создать список сотрудников Set myCombo = ThisWorkbook.Worksheets(1).OLEObjects("ListOfTeam").Object Cmd1.CommandText = "Select [ФИО] From [Сотрудники]" Set Rst1 = Cmd1.Execute With Rst1 .MoveFirst Do While Not .EOF myCombo.AddItem .Fields(0) .MoveNext Loop End With End Sub
Приведу краткие комментарии:
- Оба добавленных в документ элемента управления входят в коллекцию OLEObjects того рабочего листа, на котором расположены элементы. Добраться до них в коллекции можно по данным им именам. Чтобы работать с ними, как с объектами, я создал в процедуре два объекта myDate и myCombo соответствующих классов.
- Дату я установил, задав свойство Caption объекта myDate, вызвав функцию Date в качестве значения этого свойства.
- Формирование списка по информации базы данных рассматривалось уже неоднократно, поэтому ничего принципиально нового нет - формируется текст команды, позволяющий читать данные из таблицы "Сотрудники", команда выполняется и создается набор записей. Обычная схема прохождения по набору записей позволяет сформировать по значениям полей записи элементы списка объекта myCombo. Результаты работы можно видеть на рис. 7.7.
Давайте теперь перейдем к основному разделу нашего документа, связанному с оформлением самого заказа, и покажем, как добавить интерактивность этой части документа.