Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 5136 / 389 | Оценка: 4.23 / 3.83 | Длительность: 28:12:00
Специальности: Программист, Менеджер
Лекция 7:

Создание интерактивных офисных документов в Excel

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

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

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

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

Решение всех перечисленных задач инициирует пользователь в тот момент, когда он нажимает кнопку "Сформировать заказ". Рассмотрим работу обработчика события 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 с заполненным списком предъявляет пользователю. Вот как выглядит эта форма в процессе работы:

Форма 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. Форма закрывается, поскольку выбор пользователя обработан, так что в показе формы уже нет необходимости. Командная кнопка "Сохранить заказ" в обычном состоянии документа выключена, поскольку пока заказ не сформирован, пользователь и не должен пытаться сохранить его. Теперь же, после формирования заказа, документ переходит в новое состояние, в котором эта кнопка будет играть основную роль, позволяя сохранить сформированный заказ в базе данных. Но об этом чуть позже. А сейчас поговорим о том, что еще нужно сделать, чтобы закончить формирование заказа.
Работа с заказом

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

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

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

Полностью сформированная таблица заказа

увеличить изображение
Рис. 7.11. Полностью сформированная таблица заказа
Ольга Гафарова
Ольга Гафарова

Добрый день. Подскажите формулы при решении задачи на рис. 2.2 в лекции №2. Закон Ома, какие должны использоваться формулы для I и R

Курс: Основы офисного программирования и документы Excel

Серегй Лушников
Серегй Лушников