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


Пример использования DSC


В наших примерах неоднократно появлялась база данных "Офис РР". В главе 18 она использовалась при построении OLAP-куба и сводной таблицы. Теперь я воспользуюсь ею и построенным OLAP-кубом, чтобы создать Web-страницу, на которой будет строиться круговая диаграмма, отражающая вклад каждого из сотрудников в общее дело добывания заказов. На страницу будут помещены два компонента OWC - Chart и Data Source. Компонент DSC будет посредником в передаче данных от базы данных к диаграмме.

Наша страница не будет интерактивной, так как сам элемент Chart, как вы помните, не имеет собственной инструментальной панели. И я не буду выносить сами данные на страницу, передавая их, например, в элемент SpreadSheet. Не буду я и программно добавлять интерфейс элементу Chart. Тем не менее, этот пример кажется мне достаточно интересным, так как позволяет продемонстрировать, как самому создать страницу с расположенными на ней элементами OWC. А главное, он показывает роль DSC как посредника при передаче данных. Вот полный HTML-текст Web-страницы, созданной в редакторе FrontPage:

<html> <head> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>MDB-база данных -> Data Source -> Chart</title> <link rel="STYLESHEET" href="file:///Styles.css" type="text/css"> </head>

<body> <h1>Связывание: MDB-база данных -> Data Source -> Chart </h1>

<!-- Chart Control --> <object classid="clsid:0002E500-0000-0000-C000-000000000046" id="ChartSpace1" style="HEIGHT:80%; WIDTH:100%" width="576" height="384"> </object> <p> </p>

<!-- Data Source Control --> <object classid="clsid:0002E530-0000-0000-C000-000000000046" id="DSC" width="16" height="15"> <param name="XMLData" value="<xml xmlns="urn:schemas-microsoft-com:office:access"> <DataSourceControl> <OWCVersion <9.0.0.2710> </OWCVersion> <MaxRecords> 0 </MaxRecords> <GridX> 10 </GridX> <GridY> 10 </GridY> <Datamodel version="0816"> </Datamodel> </DataSourceControl> </xml>"> </object>


<!-- Script for loading the chart --> <script language=VBScript> '--------------------------------------------------------------------------
Sub Window_onLoad() ' Код выполняется при загрузке страницы в браузер. ' Устанавливается соединение компонента DSC с базой данных Access. ' Формируется RecordsetDef как источник данных для построения диаграммы. ' Установка строки соединения элемента DSC Dim sDBPath 'Путь к базе данных sDBPath = "c:\!o2000\DsCd\Ch19\dbPP2000.mdb" DSC.ConnectionString = _ "provider=microsoft.jet.oledb.4.0;data source=" & sDBPath
' Добавляется RecordsetDef с именем ChartData, ' который будет источником данных для компонента Chart ' Формируется запрос к базе данных Access Dim myQ 'Запрос к базе данных myQ = "SELECT Заказы.Сотрудник, Sum(Заказы.Стоимость) AS [Sum-Стоимость]" _ & "FROM Заказы " _ & "WHERE (((Заказы.ДатаЗаказа)>=#9/1/1997# And" _ & "(Заказы.ДатаЗаказа)<=#11/9/2001#))" _ & "GROUP BY Заказы.Сотрудник" 'Определение Recordset, который будет элементом, 'определяющим данные - Data Member для компонента Chart DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"
'Вызов процедуры, осуществляющей связывание DSC с компонентом Chart. BindChartToDSC ChartSpace1, DSC, "ChartData", "Сотрудник", "SUM-Стоимость"
End Sub 'Window_onLoad()
'--------------------------------------------------------------------------
Sub BindChartToDSC(cspace, dsc, sRSName, sCategories, sValues) ' Связывает Chart с набором данных - Recordset компонента Data Source. ' Создает круговую диаграмму - Pie chart. ' Параметры процедуры: ' cspace ссылка на ChartSpace object ' dsc ссылка на Data Source control ' sRSName имя набора Recordset в Data Source ' sCategories имя столбца в наборе, содержащего имена сотрудников ' sValues имя столбца в наборе, содержащего суммарную стоимость заказов
Dim cht ' Chart object который будет создан в пространстве диаграммы Dim ser ' серия данных Dim dls 'метки круговой диаграммы ' Определение объекта Constants, позволяющего использовать ' именованные константы в script-коде. set c = cspace.Constants




' Чистим Chart space cspace.Clear
' Устанавливаем DSC как источник данных для Chart set cspace.DataSource = dsc
' Устанавливаем набор данных внутри Data Source, используемый Chart. cspace.DataMember = sRSName
' Создаем круговую диаграмму Pie chart в пространстве диаграмм. set cht = cspace.Charts.Add() cht.HasLegend = True cht.HasTitle = True cht.Title.Caption = "Распределение заказов в стоимостном исчислении" cht.Title.Font.Bold = True cht.Type = c.chChartTypePie
' Определяем единственную серию в диаграмме - объект ser ' и вызываем ее метод SetData для связывания с данными серии. ' Значение 0 второго параметра указывает, что используется первый набор ' данных источника Data Source. set ser = cht.SeriesCollection.Add() ser.SetData c.chDimCategories, 0, sCategories 'Ось категорий ser.SetData c.chDimValues, 0, sValues 'Ось значений
' задаем метки круговой диаграммы - Pie chart. set dls = ser.DataLabelsCollection.Add() dls.HasPercentage = True dls.HasValue = False End Sub 'BindChartToDSC()
</script> </body> </html>
А вот как выглядит эта страница, открытая в Internet Explorer:

увеличить изображение
Рис. 10.13.  Web-страница с компонентами Data Source и Chart
Главное в этом коде - сценарий, написанный мной на VBScript. Почти половину программного текста составляют комментарии, поясняющие все этапы работы. Тем не менее, я добавлю еще несколько общих замечаний:
  • На странице нет ничего, кроме заголовка, вставки двух компонентов OWC - Chart и Data Source - и, естественно, script кода.
  • При открытии страницы в Internet Explorer будет вызываться обработчик этого события - процедура Window_onLoad. В ней и выполняется нужная нам работа по связыванию базы данных и компонентов.
  • На первом шаге работы этой процедуры DSC связывается с базой данных и получает от нее данные. На втором шаге - вызывается процедура BindChartToDsc, строящая диаграмму, источником данных для которой уже служит сам DSC.

Говоря о работе DSC, можно отметить:
  1. С использованием свойства этого компонента - ConnectionString - устанавливается связь с базой данных.


    DSC.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source=" & sDBPath
    Соответствующая строка, как обычно, состоит из двух частей и задает провайдера базы данных и путь к самой базе. В данном случае используется провайдер Jet для связи с базой данных Access.
  2. Затем добавляется новый элемент в коллекцию RecordsetDefs, определяющий набор данных - Data Member источника данных. DSC.RecordsetDefs.AddNew myQ, DSC.Constants.dscCommandText, "ChartData"
    Этот набор получает имя ChartData. Команда, определяющая действия по доставке данных, в данном случае задается текстом SQL-запроса к базе данных. Сам текст запроса записан в строку, заданную переменной myQ. В процессе выполнения запроса данные группируются, происходит суммирование стоимости всех заказов, выполненных тем или иным сотрудником.
  3. На следующем шаге вызывается процедура BindChartToDsc, строящая диаграмму, которой передается информация о DSC и его наборе данных - ChartData. Замечу еще, что для тех, кто привык работать с ADO, нет ничего нового в синтаксисе и семантике работы с DSC.

Несколько слов о работе процедуры BindChartToDsc. Отмечу главное:
set cspace.DataSource = dsc cspace.DataMember = sRSName
так устанавливается связь объекта cspace, - основного объекта, задающего пространство диаграммы, - с источником данных и набором данных внутри этого источника. Остальные операторы внутри процедуры выполняют рутинную работу по формированию различных областей диаграммы.
Надеюсь, этот пример позволяет ощутить возможности компонента DSC и его роль в получении данных от различных источников с последующей их передачей другим компонентам OWC.

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