Мир объектов Excel 2000


Интерактивная форма документа "Счет-фактура" офиса РР


Я буду рассматривать вопросы создания интерактивных документов на конкретном примере. Надеюсь, он будет достаточно убедительным и позволит продемонстрировать, как многие из проблем, возникающих в процессе создания подобных документов, так и пути решения этих проблем.

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

Я напомню, что один из тезисов, пропагандируемых мною в офисном программировании, состоит в том, что программист является членом команды разработчиков, целью которой является создание системы документов. Программный проект, создаваемый программистом, не является самоцелью, - он лишь часть документа. Другие части документа могут быть созданы другими участниками совместной работы без программирования. Об этом я достаточно подробно говорил во всех предыдущих книгах по офисному программированию. В частности, в книге [2] я подробно описал процесс создания бланка "Счет-фактура" офиса РР, который был создан "руками", без программирования. Именно этот документ и послужит нам основой для дальнейшей работы. Вот как он выглядит:


Рис. 7.1.  Документ "Счет-фактура" в начальной стадии

Наша цель - придать интерактивность уже созданному документу.

Программную работу с документом начнем с инициализации. И первый шаг в инициализации - подключение базы данных офиса РР. Это разумно, поскольку, как я уже говорил, интерактивный документ практически всегда взаимодействует с базой данных. Инициализация документа проводится, обычно, в момент открытия документа, а это значит - в обработчике события Open. Вот текст этого обработчика:

Private Sub Workbook_Open() 'Инициализация документа InitAccount End Sub


Заметьте, обычно, я пытаюсь строить простые обработчики событий, текст которых состоит из одной строчки, содержащей вызов соответствующей процедуры стандартного модуля. Здесь, и в дальнейшем, я буду следовать этому принципу. А посему, мне, прежде всего, пришлось добавить в программный проект стандартный модуль, которому я дал имя InterAction. Приведу заголовочную часть этого модуля:

'Модуль InterAction 'Обеспечивает интерактивность документа "Счет-фактура" 'Глобальные переменные Public Con1 As New ADODB.Connection Public Cmd1 As New ADODB.Command Public Rst1 As New ADODB.Recordset

Уже из объявлений переменных можно понять, что связь с базой данных будет осуществляться через объекты ADO, ведь недаром их описанию я посвятил две главы. В модуль InterAction я буду помещать все вызываемые процедуры, приводимые в данной главе. Вот первая из этих процедур:

Public Sub InitAccount() 'Установить соединение с базой данных CreateConnection 'Конфигурирование команды ConfigCommand 'Очистить поля бланка ClearFields End Sub

Как видите, при инициализации документа решатся три задачи - устанавливается соединение с базой данных, задается исходная конфигурация объекта Command и производится чистка полей бланка. Каждая из этих задач решается соответствующей процедурой. О чистке поговорим чуть позже, а вот текст процедуры CreateConnection привести самое время:

Public Sub CreateConnection() 'Создание соединения с базой данных офиса РР Dim strConnStr As String, PathDB As String PathDB = ThisWorkbook.Path & "\dbPP2000.mdb" If Con1.State = adStateOpen Then Con1.Close 'закрыть соединение

'Конфигурирование соединения Con1 Con1.Provider = "Microsoft.jet.oledb.4.0" Con1.ConnectionString = "Data Source=" & PathDB 'Открытие соединения Con1.Open 'печать характеристик соединения ' Debug.Print "Attributes = ", Con1.Attributes ' Debug.Print "CommandTimeout = ", Con1.CommandTimeout ' Debug.Print "ConnectionString = ", Con1.ConnectionString ' Debug.Print "ConnectionTimeout = ", Con1.ConnectionTimeout ' Debug.Print "CursorLocation = ", Con1.CursorLocation ' Debug.Print "DefaultDatabase = ", Con1.DefaultDatabase ' Debug.Print "Mode = ", Con1.Mode ' Debug.Print "Properies.Count = ", Con1.Properties.Count ' Debug.Print "State = ", Con1.State ' Debug.Print "Version = ", Con1.Version End Sub



Я не буду особенно комментировать эту процедуру, да и другие процедуры, где речь идет о связи Excel с базой данных. Я надеюсь, что перед этой главой Вы уже прочли три предыдущие главы, посвященные этому вопросу. Заметьте, что процедура CreateConnection сохранила свое название и лишь слегка видоизменена в сравнении с текстом, приведенным в главе 5.

Теперь, когда некоторые начальные действия уже выполнены, можно переходить к решению основной задачи - придание интерактивных свойств нашему документу. Заметьте, в бланке документа можно выделить несколько частей или разделов. Некоторые из них постоянные и не меняются в процессе работы с бланком. К ним, например, относятся шапка документа и утверждающие подписи. В шапке указывается название организации, логотип, реквизиты. Эти части документа нас сейчас интересовать не будут. Выделим три раздела бланка "Счет-фактура", в которые добавим интерактивность. Эти разделы условно будем называть:

  • Реквизиты покупателя (заказчика).
  • Сотрудники.
  • Заказы.


Давайте подробнее рассмотрим работу, которую следует выполнить при формировании каждого из этих разделов.


Содержание раздела