Опубликован: 13.09.2006 | Уровень: для всех | Доступ: свободно
Лекция 10:

Возможности и применение Office Web-компонентов

Список полей

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

Объектная модель и программирование

В предыдущей главе, учитывая важность этого вопроса, я много внимания уделил сводным таблицам в Excel. В частности, там подробно анализировалась объектная модель этого компонента, рассматривались вопросы программного создания сводных таблиц. Переходя к обзору объектной модели компонента PivotTable, замечу сразу, что его объектная модель имеет существенные отличия от своего аналога в Excel, по крайней мере, эти отличия сказываются на верхнем уровне модели.

Напомню, в Excel два класса объектов и их коллекции определяют работу со сводными таблицами. Объекты PivotCache и коллекция PivotCaches отвечают за связь с источником данных и хранение в оперативной памяти данных, необходимых для сводной таблицы. Именно эти объекты имеют такие свойства, как SourceType, SourceData, Connection, CommandText, которые обеспечивают связь с источником данных. Объект PivotTable в этой модели отвечает за структуру сводной таблицы, работу с ней.

В объектной модели компонента PivotTable объект Pivot Cache и его коллекция исчезли, - их функции перешли к самому объекту PivotTable. Теперь у него есть свойства: DataSource, ConnectionString, CommandText, ProviderType, XMLData, DataMember, позволяющие связаться с различными источниками данных. Ту роль, которую играл объект PivotTable в модели Excel, теперь играет новый объект PivotView, встроенный в объект PivotTable. Этот объект возвращается при вызове свойства ActiveView, и он отвечает за конфигурацию сводной таблицы.

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

  • RowAxis, ColumnAxis возвращают объект PivotGroupAxis - определяющий измерения (оси) по строкам и столбцам сводной таблицы.
  • DataAxis - возвращает объект PivotDataAxis, задающий ось данных.
  • FilterAxis - возвращает объект PivotFilterAxis, задающий ось фильтров.

Все Axis-объекты и сам объект PivotView имеют свойство FieldSets, возвращающее соответствующую коллекцию PivotFieldSets, которая задает множество полей, расположенных на той или иной оси. Методы и свойства объекта PivotField, задающего отдельное поле позволяют выполнять операции над этим полем - сортировку, фильтрацию.

Я ограничусь этим кратким обзором, и не буду углубляться в детали объектной модели. В следующей главе будет дан пример построения интерактивного Web-документа, содержащего сводную таблицу. Там мы на практике познакомимся со многими упомянутыми здесь объектами.

Компонент Data Source

Компонент Data Source (DSC), оставаясь невидимым, выполняет большую работу по связыванию с различными внешними источниками данных, построению и выполнению команд по их доставке. В свою очередь он служит, как правило, источником данных для других компонент OWC - SpreadSheet, Chart, Pivot Table. Этот компонент несет основную нагрузку по доставке данных и при работе со страницами доступа данных в Access (Access 2000 Data Access Pages).

Так как DSC реализует стандартный интерфейс источников данных - IDataSource Interface, - определенный и поддерживаемый Internet Explorer (начиная с версии 5) и Visual Basic (начиная с версии 6), то эти контейнеры воспринимают его как правильный источник данных. Это означает, что при размещении компонента DSC на Web-странице или на форме Visual Basic он может служить источником данных для других элементов, расположенных на этой странице или форме.

Замечу, что не только DSC, но и другие компоненты OWC могут служить источниками данных и удовлетворяют интерфейсу IDataSource. Так, компонент SpreadSheet может поставлять данные компонентам Chart и Pivot Table, а последний, в свою очередь, может поставлять данные для компонента Chart.

Источники данных имеют достаточно сложную структуру и состоят из наборов данных, называемых элементами (членами) источника - Data Member. Каждый такой элемент задает некоторый набор данных - Recordset, который может использоваться при связывании источника данных с тем или иным элементом, расположенным на Web-странице. Для компонента SpreadSheet в качестве элемента источника - Data Member - может использоваться любой диапазон его ячеек. Для компонента DSC элементы источника следует определять. Эти определения элементов составляют специальную коллекцию - RecordsetDefs.

В детали объектной модели этого компонента я углубляться не буду. Вместо этого я приведу пример, в котором на Web-странице строится круговая диаграмма по данным внешнего источника - базы данных Access. Посредником в связывании данных будет выступать компонент Data Source. На этом примере я постараюсь прояснить и роль Data Member, и роль RecordsetDefs.

Прежде чем перейти к примеру, хочу отметить следующее. Надеюсь, понятно, что поскольку элемент является невидимым, то никакого интерфейса у него нет, так что общение с ним возможно только на программном уровне. Поэтому в данном разделе я приведу достаточно большой кусок программного кода. Следует заметить также, что элемент действительно невидим в момент выполнения, например при просмотре Web-страницы в Internet Explorer. Однако в режиме проектирования, например, при открытии страницы в приложении FrontPage, местоположение элемента отмечается небольшим значком с изображением ключа -.

Пример использования 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:

Web-страница с компонентами Data Source и Chart

увеличить изображение
Рис. 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.

Компоненты OWC, работающие на стороне сервера

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

  • У клиента нет компонентов OWC и он не располагает лицензией на Office 2000, необходимой при легальной работе с компонентами.
  • Клиент открывает Web-страницы в браузере, не являющемся контейнером COM-объектов, например, клиент использует обозреватель NetScape.
  • В ряде случаев эффективнее перенести всю работу на сервер, а клиенту пересылать по запросу или в момент возникновения определенных событий моментальные снимки диаграмм, электронных и сводных таблиц.

Обычно Com-объекты работают либо как видимые объекты, либо как невидимые объекты (in memory). Компоненты OWC спроектированы так, что для них возможны оба способа работы. На стороне сервера они работают, конечно же, как невидимые объекты, поскольку там нет клиента, который мог бы с ними работать в интерактивном режиме. Они создаются программно, с использованием метода CreateObject, вызываемого объектом Server. Вот как может выглядеть код, создающий на стороне сервера компонент Chart, или, более точно, основной его объект cspase:

Set m_cspace = Server.CreateObject("OWC.Chart")

После того как объект получен, остальная часть работы с этим объектом на сервере ведется так же, как и на стороне клиента. Завершающим аккордом на стороне сервера является преобразование построенной диаграммы или сводной таблицы в графический образ, который и пересылается клиенту. Для этой цели используется метод ExportPicture, которым обладают компоненты OWC.

Компоненты OWC и офисное программирование

Подводя итоги, отмечу, что включенные в состав Office 2000 компоненты OWC выполняют важную работу, позволяя проводить полноценный анализ данных, возможный ранее только в Excel, как при работе в интрасетях, так и при построении собственных решений на базе различных контейнеров, допускающих работу с COM-объектами.

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

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

Ольга Гафарова
Ольга Гафарова
Непонятен ход решения задачи
Серегй Лушников
Серегй Лушников
Может ли объект Recordset быть потомком объекта Record?
Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Светлана Ведяева
Светлана Ведяева
Россия, Саратов