Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горев “Эффективная работа с СУБД”.pdf
Скачиваний:
208
Добавлен:
28.06.2014
Размер:
4.71 Mб
Скачать

 

 

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

Соседние файлы в предмете Программирование на Delphi