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


Формирование заказа


Какие задачи предполагается решать на этапе формирования заказа? Их несколько:

  • Показать список всех возможных товаров, сведения о которых хранятся в базе данных. Поскольку в нашем случае товаром являются книги, то список будет содержать сведения о книгах, выпускаемых и продаваемых офисом РР. Напомню, что вся информация о книгах хранится в отдельной таблице с именем "Книги".
  • Дать возможность пользователю выбрать из списка все книги, которые он хочет заказать.
  • На основании выбора, сделанного пользователем, автоматически заполнить все возможные поля документа в разделе заказы.

Принципиально, решение всех этих задач уже обсуждалось. Мы умеем связываться с базой данных, получать нужный набор записей, формировать по данным этих записей список в некоторой форме, которая предъявляется пользователю с предоставлением ему возможности выбора нужных элементов списка. Обсуждалась также и задача переноса данных из набора записей в поля документа. Так что нам осталось посмотреть, как выглядит реализация, написанная мной для решения этих задач в данной конкретной ситуации.

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

Private Sub FormOrder_Click() 'Формирование заказа OrderForm End Sub

Как всегда, основную работу выполняет вызываемая в обработчике процедура. Вот ее текст:

Public Sub OrderForm() 'Формирование заказа! Dim txt As String Dim i As Integer Dim RowIndex As Integer 'Число столбцов списка Const ColumnCount = 4 'Создание набора записей с информацией о книгах Cmd1.CommandText = "Select [Автор],[Название],[Год издания]," & _ "[Цена] From [Книги]" Set Rst1 = Cmd1.Execute 'Формирование списка формы Books Books.ListOfBooks.Clear Books.ListOfBooks.ColumnCount = ColumnCount RowIndex = 0 With Rst1 .MoveFirst Do While Not .EOF On Error Resume Next 'Текущая запись переносится в список 'Первый столбец Books.ListOfBooks.AddItem .Fields(0) 'Остальные столбцы For i = 1 To ColumnCount - 1 txt = "" txt = .Fields(i) Books.ListOfBooks.Column(i, RowIndex) = txt Next i RowIndex = RowIndex + 1 .MoveNext Loop End With 'Показать форму со списком книг Books.Show End Sub


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

Во второй, основной части процедуры происходит заполнение списка класса Listbox, содержащего несколько столбцов, каждый из которых хранит информацию об авторе книги, ее названии, стоимости и цене. Записи не фильтруются, и потому в список включается информация обо всех товарах - всех книгах, данные о которых хранятся в базе. Заметьте, оператор On Error позволяет справляться с трудностями, которые могут возникнуть, если не все поля записи будут заполнены.

Наконец, третья часть процедуры состоит из одного оператора, который форму Books с заполненным списком предъявляет пользователю. Вот как выглядит эта форма в процессе работы:


Рис. 7.9.  Форма Books для выбора книг, представленных в заказе

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

Дальнейшие действия опять инициируются пользователем. Он производит выбор в списке книг и нажимает командную кнопку с надписью "Выбери нас" в форме Books. Затем в дело вступает обработчик события Click для этой кнопки. Так и реализуется та самая интерактивность, о которой идет речь в этой главе. Вот код этого обработчика:

Private Sub SelectUs_Click() 'Данные о выбранных книгах переносятся в поля документа SelectedBooks End Sub

Что же делает процедура SelectedBooks? Задача ее проста, - зная выбор пользователя, сформировать поля бланка заказа, по крайней мере, те из них, которые не требуют дополнительных решений от пользователя. Вначале взгляните на результат ее работы:


увеличить изображение
Рис. 7.10.  Таблица заказа, сформированная по выбору пользователя

А теперь рассмотрим, как это делается:

Public Sub SelectedBooks() 'Данные о выбранных книгах переносятся в поля документа Dim i As Integer, j As Integer Dim curField As Range, curField1 As Range Dim txt As String Dim myNds As Object 'Dim myNds As TextBox 'Чистка полей документа ClearBookFields 'Инициализация Set curField = Range("A34:D34") Set curField1 = Range("E34") With ThisWorkbook.Worksheets(1).OLEObjects Set myNds = .Item("NDS").Object .Item("NDS").Visible = True .Item("LabelNDS").Visible = True



'Проход по списку With Books.ListOfBooks j = 0 For i = 0 To .ListCount - 1 If .Selected(i) Then 'Книга выбрана 'Перенос данных в поля документа curField.Offset(j) = .List(i, 0) & " '" & _ .List(i, 1) & "'" curField1.Offset(j) = "шт." curField1.Offset(j, 2) = .List(i, 3) curField1.Offset(j, 4) = myNds.Text j = j + 1 End If Next i End With 'Включить кнопку "Сохранить Заказ" .Item("SaveOrder").Object.Enabled = True End With 'Спрятать форму "Книги" Books.Hide End Sub

Текст процедуры довольно большой, и он нуждается в некоторых дополнительных комментариях:

  • Начну с рассмотрения локальных объектов, описанных в процедуре. Я ввел два объекта Range - curField и curField1. Они используются при формировании таблицы заказа для заполнения полей документа. Один из них задает области, полученные слиянием ячеек, другой - области, состоящие из одной ячейки. Более подробно стоит сказать об объекте myNds класса Textbox. Дело в том, что я разместил на документе еще два элемента управления - два OLE-объекта. Один из них является меткой, другой - полем ввода. Предназначены они для того, чтобы можно было задавать значение ставки НДС, которое по умолчанию будет использоваться при формировании таблицы заказов и проведения необходимых вычислений. Объекты эти я решил сделать видимыми только в момент формирования заказа. В остальное время они будут невидимыми. Объект myNds используется при проведении вычислений в процессе формирования таблицы заказа. Взгляните еще раз на рис. 7.10, - он сделан тогда, когда эти два элемента управления являются видимыми. В окне ввода в этот момент можно задать значение НДС, принимаемое по умолчанию.
  • Прежде чем заполнять поля таблицы заказов данными о новом заказе, следует ее очистить от возможно уже заполненного предыдущего заказа. Эту функцию и выполняет вызываемая процедура ClearBookFields. Поскольку эта процедура вызывается и в других местах, то о ней я скажу подробнее чуть позже и там же приведу ее текст.
  • В разделе инициализации процедуры я устанавливаю значения введенных объектов curField, curField1, myNds, а также делаю видимыми объекты, связанные с НДС. Это позволяет показать пользователю ставку НДС, используемую в расчетах, и дает ему возможность при необходимости изменить значение ставки.
  • Основная работа делается в цикле по списку товаров. Отбирая выбранные пользователем товары, - свойство Selected списка позволяет это сделать, - переношу данные о книгах в поля таблицы заказов. Значение поля НДС берется из OLE-объекта, о котором я говорил чуть выше.
  • С программистской точки зрения стоит обратить внимание на технику использования смещения Offset, позволяющую эффективно работать с объектами Range внутри таблицы.
  • В заключительной части процедуры делаются две вещи - включается командная кнопка "Сохранить заказ" и закрывается форма Books. Форма закрывается, поскольку выбор пользователя обработан, так что в показе формы уже нет необходимости. Командная кнопка "Сохранить заказ" в обычном состоянии документа выключена, поскольку пока заказ не сформирован, пользователь и не должен пытаться сохранить его. Теперь же, после формирования заказа, документ переходит в новое состояние, в котором эта кнопка будет играть основную роль, позволяя сохранить сформированный заказ в базе данных. Но об этом чуть позже. А сейчас поговорим о том, что еще нужно сделать, чтобы закончить формирование заказа.



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