- •Глава1 Постановка задачи и разработка бизнес-правил
- •1.1.Некоторые определения
- •Глава2 Основы теории проектирования баз данных
- •Глава3 Обзор возможностей и особенностей различных СУБД
- •3.5.MS SQL Server
- •Глава4 Основы языка программирования
- •4.3. "Горячая десятка"
- •Глава5 Объектно-ориентированное программирование
- •5.1.Объектная модель и ее свойства
- •Объекты для работы с данными
- •Объекты для управления работой приложения
- •Объекты для оформления интерфейса пользователя
- •Объекты-контейнеры
- •Невизуальные объекты
- •Объекты OLE
- •Глава6 Создание базы данных
- •6.1.Visual FoxPro
- •Создание и модернизация структуры базы данных
- •Использование словаря данных
- •Создание и модернизация структуры таблиц
- •Глава7 Средства работы с данными
- •Запросы выборки
- •Запросы добавления
- •Запросы обновления
- •Запросы удаления
- •Запрос добавления
- •Запрос - Создание таблицы
- •Запрос удаления
- •Запрос обновления
- •Перекрестный запрос
- •Microsoft Access
- •Глава8 Использование технологии клиент-сервер
- •8.1. Работа с внешними данными с помощью технологии ODBC
- •Команды Transact-SQL
- •Создание представлений
- •Создание триггеров
- •Синхронный и асинхронный процессы
- •Создание внешних представлений
- •9.1.Инструментарий разработчика
- •Создание формы "Прием заказов" на Access
- •Разработка меню в Visual FoxPro
- •Разработка меню в Access
- •Глава10 Использование готовых компонентов в приложении
- •10.1.Основные преимущества модульного проектирования прикладных программ
- •Управление объектами Excel
- •Управление объектами Word for Windows
- •Построение графиков с помощью MS Graph 5.0
- •Построение отчета в Word for Windows
- •Запись информации в Schedule+
- •10.4.Применяем ActiveX
- •Иерархический список
- •Календарь
- •Глава11 Подготовка отчетных данных
- •11.1.Создание отчетов в Visual FoxPro
- •Управление режимом печати
- •Глава12 Подготовка и отладка пользовательского приложения
- •12.1.Общие принципы отладки приложения
- •Отладка программы в Access
- •Обработка ошибок процессора баз данных в Access
- •Отладка программы в Visual Basic
- •Визуальные средства проектирования
- •Поставка программного пакета
- •Требования к установке
- •Project Manager
- •Работа с кодом программы
- •Создание базы данных
- •Работа с данными
- •Расширение возможностей технологии клиент-сервер
- •Построение пользовательского интерфейса
- •Расширение функций OLE
- •Отладка приложения
|
|
converted to PDF by HupBaH9I |
|
HasDataLabel, Interior, |
ClearFormats, Copy, Delete |
|
InvertIfNegative, |
|
|
MarkerBackgroundColor, |
|
|
MarkerBackgroundColorIndex, |
|
|
MarkerForegroundColor, |
|
|
MarkerForegroundColorIndex, |
|
|
MarkerStyle, PictureType, |
|
|
PictureUnit |
|
Series |
AxisGroup, Border, ErrorBars, |
Interior, InvertIfNegative, |
|
Explosion, HasDataLabels, |
MarkerBackgroundColor, |
|
HasErrorBars |
MarkerBackgroundColorIndex, |
|
|
MarkerForegroundColor, |
|
|
MarkerForegroundColorIndex, |
|
|
MarkerStyle, PictureType, |
|
|
PictureUnit, Smooth, Type, |
|
|
ApplyDataLabels, |
|
|
ClearFormats, Copy, |
|
|
DataLabels, Delete, ErrorBar, |
|
|
Points, Trendlines |
Series- |
Border, Name |
Delete |
Lines |
|
|
TickLabels Font, Name, NumberFormat, |
Delete |
|
|
Orientation |
|
TrendLine |
Backward, Border, DataLabel, Clear Formats, Delete |
|
|
DisplayEquation, |
|
|
DisplayRSquared, Forward, |
|
|
Index, Intercept, |
|
|
InterceptIsAuto, Name, |
|
|
NameIsAuto, Order, Period, |
|
|
Type |
|
UpBars |
Border, Interior, Name |
Delete |
Walls |
Border, Interior, Name |
ClearFormats |
Построение графиков с помощью MS Graph 5.0
Возможности отображения данных с помощью MS Graph 5.0 рассмотрим на примере построения формы в Visual FoxPro, в которой пользователь мог бы анализировать изменение данных с помощью графиков различного типа. Внешний вид такой формы приведен на рис. 10.6. Форма включает внедренный объект MS Graph 5.0 для отображения графика, раскрывающийся список для изменения отображаемых данных, раскрывающийся список и две кнопки выбора для изменения типа графика, кнопку управления для закрытия формы и элементы внешнего оформления.
converted to PDF by HupBaH9I
Рис. 10.6.
Для создания этой формы предварительно нам придется создать вспомогательную таблицу для хранения внедренного объекта MS Graph (графика). В этой же таблице (ее структура приведена в табл. 10.5) удобно хранить и дополнительную информацию о заголовках, а также сам запрос для получения наиболее "свежих" данных. Создать ее можно интерактивно с помощью Конструктора таблицы и информации, приведенной в табл. 10.5, или, что будет быстрее, с помощью следующих команд:
CREATE TABLE Graphs (title C(25), number I, query M, y_number I,; y1_caption C(25), y2_caption C(25), graph G)
APPEND BLANK
APPEND GENERAL graph CLASS "MSGraph"
Таблица 10.5. Структура таблицы GRAPHS.DBF для хранения внедренного графика
Поле |
Тип |
Ширина |
Назначение поля |
TITLE |
Character |
25 |
Заголовок графика |
NUMBER |
Integer |
4 |
Номер графика |
QUERY |
Memo |
4 |
Команда SQL запроса |
Y_NUMBER |
Integer |
4 |
Число осей Y |
Y1_CAPTION Character |
25 |
Заголовок первой оси |
|
|
|
|
Y |
Y2_CAPTION Character |
25 |
Заголовок второй оси |
|
|
|
|
Y |
GRAPH |
General |
4 |
График в виде |
|
|
|
внедренного объекта |
|
|
|
MS Graph 5.0 |
Всозданную таблицу запишите необходимые данные. Обратите внимание, что число символов
вSQL запросе, записываемом в поле Query, не должно превышать 256 и он должен быть записан
водну строку. Для того чтобы уложиться в это число, не стоит пренебрегать никакими способами сокращения длины команды, в том числе полезно вспомнить о возможности использования
внутренних псевдонимов, как это показано в следующем примере (здесь сознательно не используется символ переноса строк):
SELECT m.month_name,SUM(d.Price*d.quantity),m.month_numb
FROM Months m,Invoices i,Inv_Details d WHERE i.kod_id = d.kod_id AND MONTH(i.inv_date) = m.month_numb GROUP BY m.month_name ORDER BY m.month_numb INTO CURSOR Datafile
Для временного хранения результата запроса мы используем курсор с именем Datafile. Теперь откроем Конструктор формы и разместим в новой форме объект OLE Bound Control.
converted to PDF by HupBaH9I
Присвоим ему имя olbGraph. В Data Environment формы добавим только что созданную таблицу и для свойства ControlSource объекта olbGraph выберем поле graph.
В коде события Init обновим данные для отображаемого графика:
ThisForm.LockScreen = .T. SELECT Graphs
GO TOP cCom = Query
cCom =LEFT(cCom, LEN(cCom) - 2)
* Выполняем запрос, записанный в поле примечаний Query &cCom
ThisForm.RefreshGraph
ThisForm.ChangeGraphType
ThisForm.LockScreen = .F.
В коде для события Load формы опишем массив aType возможных типов графиков. В дальнейшем этот массив будет источником данных для списка типов графиков:
PUBLIC ARRAY aType[4,2] aType[1,1] = "С областями" aType[2,1] = "Гистограмма" aType[3,1] = "График" aType[4,1] = "Круговая" aType[1,2] = 1
aType[2,2] = 3 aType[3,2] = 4 aType[4,2] = 5
Тогда в событии Destroy формы не забудем стереть этот массив: RELEASE aType
Для отображения названий графиков создадим раскрывающийся список с именем cmbData. Присвоим ему следующие значения свойств:
RowSourceType = 2 - псевдоним; RowSource = Graphs.title
Вкоде события Init для объекта cmbData запишем: This.Value = Graphs.Title
Вкоде события InteractiveChange для объекта cmbData: LOCAL cData, cCom
ThisForm.LockScreen = .T. cData = This.Value SELECT Graphs
LOCATE FOR Title = cData cCom = Query
cCom =LEFT(cCom, LEN(cCom) - 2) &cCom
ThisForm.RefreshGraph
ThisForm.ChangeGraphType ThisForm.olbGraph.Object.ChartTitle.Caption = cData ThisForm.LockScreen = .F.
Для выбора типа графика разместим в форме раскрывающийся список с именем cmbType. Присвоим ему следующие значения свойств:
∙RowSourceType = 5 - массив;
∙RowSource = aType - имя массива;
∙BoundColumn = 2 - значение свойства Value определяется по второй колонке массива.
Вкоде события Init объекта cmbType для первоначального выбора первого типа графика запишем:
This.Value = 1
В коде события InteractiveChange для объекта cmbType предусмотрим выполнение пользовательского метода:
converted to PDF by HupBaH9I
ThisForm.ChangeGraphType Опишем для формы пользовательский метод ChangeGraphType: LOCAL NType
nType = ThisForm.cmbType.Value
IF ThisForm.opgShow.Value = 1 * Двухмерный график
ThisForm.olbGraph.Type = NType ELSE
* Трехмерный график
ThisForm.olbGraph.Type = NType + 8 ENDIF
Для выбора двухмерного или трехмерного вида графика разместим в форме две кнопки выбора в группе кнопок выбора opgShow.
В коде события InteractiveChange для объекта opgShow предусмотрим выполнение пользовательского метода:
ThisForm.ChangeGraphType
Опишем для формы пользовательский метод RefreshGraph: LOCAL cGraphString, nY_lim
cGraphString = ""
*Сколько полей должно участвовать в построении графика nY_lim = Graphs.Y_number + 1
SELECT Datafile
*Создаем список полей, разделенных через табулятор,
*в конце строки записываем символ CHR(13)
FOR iCounter = 1 TO nY_lim
cGraphString = cGraphString + FIELDS(iCounter) ;
+ IIF(iCounter << nY_lim, CHR(9), CHR(13))
ENDFOR
*Приводим к символьному типу данные
*и формируем строку для передачи в OLE-объект
SCAN
FOR iCounter = 1 TO nY_lim
cGraphString = cGraphString + IIF(TYPE(Fields(iCounter))='C',; EVALUATE(FIELDS(iCounter)); ,str(EVALUATE(FIELDS(iCounter))));
+ IIF(iCounter << nY_lim, CHR(9), CHR(13)) ENDFOR
ENDSCAN SELECT Graphs
APPEND GENERAL graph DATA cGraphString
Построение графиков с помощью MS Excel 7.0
Работу с объектами Excel проиллюстрируем на примере создания формы для анализа данных в виде графиков, функционально аналогичной рассмотренной выше. При использовании Excel мы не связаны такими жесткими ограничениями на работу с данными, как в MS Graph, за счет того, что в Excel есть доступ к данным, на основании которых строится график через объект Sheet. В MS Graph данные располагаются в DataSheet, но к ним можно обеспечить только интерактивный, а не программный доступ. В то же время использование возможностей Excel требует больше ресурсов компьютера и лицензионной копии пакета на компьютере пользователя, в то время как MS Graph поставляется в составе всех пакетов разработки Microsoft. Посмотрите оба варианта форм для вывода графиков и выберите для себя более подходящий.
Для воплощения нашей идеи в Конструкторе формы создадим следующие объекты.
∙oleChart - это объект OLE Container Control, с помощью которого мы встраиваем график Excel в форму. Нажимаем на панели инструментов Form Controls кнопку OLE Container Control и обводим в форме контур будущего графика. На экран выводится диалоговое окно Insert Object, в котором мы выбираем объект Excel Chart. Нажимаем кнопку OK и в обведенном контуре появляется график Excel, построенный на основании принятых по умолчанию данных, расположенных на втором рабочем листе таблицы. Одновременно, в соответствии с принципом редактирования на месте, изменяется главное меню Visual FoxPro для предоставления нам возможности отредактировать внешний вид представленного графика. Впоследствие можно вернуться к интерактивному
converted to PDF by HupBaH9I
редактированию графика, нажав на этом объекте правую кнопку мыши и выбрав в контекстном меню команду Edit.
∙cmdExit - кнопка управления для выхода из формы. Свойству Caption присвоим значение
"OK".
∙cmdType - кнопка управления для изменения типа графика. При нажатии на кнопку будет происходить изменение типа графика. Свойству Caption присвоим значение "Тип".
∙cmdSubType - кнопка управления для изменения подтипа графика. При нажатии на кнопку будет происходить изменение подтипа графика. Свойству Caption присвоим значение "Подтип".
∙cmbData - комбинированный список для изменения данных для графика. Для этого объекта установим следующие значения свойств, отличных от принятых по умолчанию, после того как разместим элемент управления в форме:
BoundColumn = 2
ColumnCount = 2
ColumnWidths = 150,0
FirstElement = 1
Name = cmbData
NumberOfElements = ALEN(aDataTables)
RowSource = aDataTables
RowSourceType = 5
Style = 2
Value = "Total1"
Как видно из перечисленных свойств, для формирования данных в списке мы будем использовать двумерный массив aDataTables. Первую колонку массива отведем для списка данных, доступных для графического отображения. Именно этот список будет видеть пользователь. Во второй колонке разместим названия источников данных (таблиц или курсоров). При запуске формы в списке будет выбран первый пункт, и для построения графика будет использована таблица Total1.
Остальные элементы управления не являются обязательными и служат для улучшения внешнего вида формы.
Для описания массива, используемого в комбинированном списке в событии Load объекта Form, запишем:
PUBLIC aDataTables(3,2) aDataTables(1,1) = "Результаты продаж" aDataTables(2,1) = "Доход" aDataTables(3,1) = "Прибыль" aDataTables(1,2) = "Total1" aDataTables(2,2) = "Total2" aDataTables(3,2) = "Total3"
Этот массив можно описать в пользовательской программе и вне формы, и тогда набор данных, доступных для графического отображения, можно будет изменять. С этой целью в
качестве источника данных для комбинированного списка можно использовать и таблицу с двумя полями, которую легче редактировать, чем массив.
Для изменения данных на графике в соответствии с изменением выбранного пункта в списке в событии InteractiveChange объекта cmbData запишем следующий код:
ThisForm.LockScreen = .T. SELECT (ThisForm.cmbData.Value)
&& Устанавливаем рабочую область nRow = 2
SCAN && Считываем данные
ThisForm.oleChart.Object.Parent.Sheets("Sheet1").; Cells(nRow,2).;
Value = Sum1 ThisForm.oleChart.Object.Parent.Sheets("Sheet1").; Cells(nRow,3).;
Value = Sum2 ThisForm.oleChart.Object.Parent.Sheets("Sheet1").;
Cells(nRow,4).; Value = Sum3
converted to PDF by HupBaH9I
nRow = nRow + 1 ENDSCAN ThisForm.LockScreen = .F.
Здесь мы использовали блокировку изменения данных в форме, чтобы предотвратить последовательное изменение данных в каждом столбце графика (первая и последняя строка фрагмента кода). После ссылки на объект oleChart необходимо использовать свойство Object для того, чтобы Visual FoxPro понял, что указанное далее свойство Parent относится к объекту Excel. В противном случае Visual FoxPro решит, что мы ссылаемся на объект Form - родительский объект для объекта oleChart. Свойство Parent для объекта Excel нам необходимо для того, чтобы сослаться на объект Workbook. Только после этого мы можем использовать метод Sheets для получения ссылки на рабочий лист Sheet1, на котором находятся данные. Метод Cells позволяет нам указать конкретную ячейку таблицы, в которой мы хотим поменять данные с помощью свойства Value. Значения Sum1, Sum2 и Sum3 - это поля в таблицах, которые используются как источники данных для построения графиков и отображают изменение какого-то показателя во времени.
Для отображения данных из первой таблицы при запуске формы в событии Init объекта Form следует поместить такой код:
ThisForm.cmbData.Value = ThisForm.cmbData.List(1,2)
ThisForm.cmbData.InteractiveChange
Добавим в форму собственные свойства NType и nSubType для задания типа и подтипа выводимого графика. Для этого достаточно в меню Form выбрать команду New Property. По умолчанию присвоим им значения 3 и 1 соответственно.
В событии Click для объекта cmdType запишем следующий код:
IF ThisForm.nType >> 13
ThisForm.nType = 0
ENDIF
ThisForm.nType = ThisForm.nType + 1
ThisForm.OleChart.Type = ThisForm.nType
Это обеспечит приращение значения для типа графика при нажатии на кнопку "Тип" и сброс значения на начало отсчета при исчерпании числа типов графика.
В событии Click для объекта cmdSubType запишем следующий код:
IF ThisForm.nSubType >> 3
ThisForm.nSubType = 0
ENDIF
ThisForm.nSubType = ThisForm.nSubType + 1
ThisForm.OleChart.SubType = ThisForm.nSubType
Для некоторых типов графиков в Excel существует меньшее число подтипов или их вообще не существует. В этом случае при нажатии на кнопку "Подтип" изменений в графике не произойдет. При необходимости можно учесть эти нюансы, слегка модернизировав приведенный выше фрагмент.
Всобытии Click для объекта cmdExit для закрытия формы запишем следующий код: RELEASE ThisForm
Взавершение нам осталось включить в объект DataEnvironment формы таблицы, которые мы будем использовать в качестве источника данных для графика.
Внешний вид формы приведен на рис. 10.7.
converted to PDF by HupBaH9I
Рис. 10.7. Форма для представления графиков с помощью MS Excel 7.0
В современных условиях все больше специалистов могут самостоятельно использовать стандартные пакеты программ. Например, готовить графики и другую расчетную информацию с помощью пакета Excel. В этом случае достаточно только правильно импортировать данные из СУБД в Excel. Один из возможных способов представлен ниже. Он реализован в форме "Характеристика модели автомобиля", разработка которой была описана в предыдущей главе.
Программный код для передачи данных в Microsoft Excel:
oleExcel=CREATEOBJECT("Excel.Application") &&Создаем объект Excel oleExcel.Visible=.T. && Делаем его видимым
oleExcel.Workbooks.Add && Добавляем Книгу oleExcel.Selection.ColumnWidth = 20 && Ширина 1 колонки oleExcel.Range("B1").Select oleExcel.Selection.ColumnWidth = 12 && Ширина 2 колонки oleExcel.Range("C1").Select oleExcel.Selection.ColumnWidth = 12 && Ширина 3 колонки oleExcel.Columns("A:A").Select && Отмечаем 1 колонку oleExcel.Selection.WrapText = .T.
&&Перенос непоместившихся символов на следующую строку oleExcel.Range("A1:C1").Select oleExcel.Selection.HorizontalAlignment =7
&&Заголовок размещаем в 1, 2 и 3 ячейках первой строки oleExcel.Range("A2:C2").Select
oleExcel.Selection.HorizontalAlignment = -4108
&&Центрируем 1, 2 и 3 ячейки второй
&&строки
oleExcel.Columns("A:B").Select oleExcel.Selection.Borders(2).Weight=2 && Линия справа oleExcel.Columns("A:C").Select oleExcel.Selection.Borders(3).Weight=2 && Нижняя линия oleExcel.Range("A2:C2").Select oleExcel.Selection.Borders(3).Weight=-4138
&&Верхняя линия oleExcel.Selection.Borders(4).Weight=-4138
&&Нижняя линия
oleExcel.Range("A1:C1").Select oleExcel.Selection.Font.Bold = .T. oleExcel.Selection.Font.ColorIndex = 25
oleExcel.ActiveCell.FormulaR1C1 = "Характеристика модели автомобиля" oleExcel.Range("A2").Select
oleExcel.ActiveCell.FormulaR1C1 = "Наименование модели" oleExcel.Range("A2:C2").Select oleExcel.Selection.Font.Bold = .T. oleExcel.Range("B2").Select