Revista MSDN Magazine Edição 06 - Criação de um OLAP Reporting App no ASP.NET usando o SQL Server 2000 Analysis Services e o Office XP

Artigo Originalmente Publicado na MSDN Magazine Edição 06

Clique aqui para ler todos os artigos desta edição

Criação de um OLAP Reporting App no ASP.NET usando o SQL Server 2000 Analysis Services e o Office XP por Jeffrey Hasan e Kenneth Tu

Muitas empresas analisam os dados críticos de negócios usando a tecnologia OLAP (Online Analytical Processing). O data mining baseado em OLAP fornece um meio de consultar conjuntos de dados multidimensionais e de se aprofundar nos dados para descobrir padrões. O ASP.NET e o Microsoft Office Web Components (OWC) permitem a geração de relatórios OLAP baseados na Web. Os controles OWC incluem os componentes PivotTable e Chart que podem ser incorporados em uma Web page e ter seus scripts criados por programadores. Neste artigo, os autores criam uma aplicação de relatórios OLAP baseada na Web que usa o ASP.NET, o OWC e o SQL Server 2000 Analysis Services para ilustrar o processo.

Um número crescente de empresas vem usando a tecnologia OLAP (Online Analytical Processing) e o data mining para analisar seus conjuntos de dados complexos. O OLAP foi projetado especificamente para analisar conjuntos de dados multidimensionais, onde os padrões e relações entre os dados não são imediatamente óbvios. O Microsoft® SQL Server™ 2000 Analysis Services é uma escolha comum para o processamento OLAP e para o data mining, pois ele está quase totalmente integrado ao SQL Server 2000 e continua a se integrar ainda mais a cada novo lançamento do SQL Server.

Com a popularidade cada vez maior da tecnologia OLAP, os desenvolvedores estão sendo mais solicitados a criar soluções de relatório personalizadas que dependem de fontes de dados multidimensionais baseadas na tecnologia OLAP. Isso é um esforço complicado, visto que os relatórios baseados em OLAP, ou o data mining, demandam flexibilidade e um alto nível de interatividade. O data mining, por definição, não é estático. Na verdade, o usuário deve ter a capacidade de construir qualquer modo de exibição (view) de dados dentro das limitações de estruturação do cubo de dados em questão. Por um momento, compare essa abordagem com as consultas tradicionais sobre sistemas de gerenciamento de bancos de dados relacionais (RDBMSs), que são restringidos por relações bem definidas entre as tabelas de membros. As consultas RDBMS podem certamente se tornar criativas, mas somente até certo ponto. Com estruturas de dados baseadas em OLAP, você tem muito mais flexibilidade em relação ao que pode consultar. Os relatórios tradicionais e estáticos não o ajudarão muito na hora de ver e entender os dados baseados em OLAP.

Os desenvolvedores de software enfrentam um enorme desafio quando são solicitados a criar uma solução de relatório baseada em OLAP. Primeiro, a solução deve ser capaz de se conectar a uma fonte de dados multidimensional e de consultá-la. Segundo, ela deve permitir que o usuário examine em detalhes os dados, com flexibilidade e facilidade. Terceiro, ela deve permitir que o usuário salve um relatório detalhado personalizado, pois não há como prever qual modo de exibição de dados será considerado importante pelo usuário. Quarto, a solução deve possuir uma interface legível que inclua gráficos, pois os relatórios se mostram mais eficazes quando exibidos dessa maneira.

Gostaria de incluir um quinto requisito, este opcional: a solução de relatórios baseada em OLAP deve ser baseada na Web, ou seja, deve ser implementada como um aplicativo Web baseado no servidor e ser acessível a partir de um navegador da Web (pela Internet ou Intranet). Com cinco requisitos como esses, o que um desenvolvedor de software pode fazer?

Por esse motivo, a Microsoft fornece um conjunto de componentes, chamado OWC (Office Web Components), que ajudam a criar para a Web soluções de relatório personalizadas, sofisticadas e amigáveis baseadas em OLAP. Os componentes OWC consistem em uma coleção de controles COM para a publicação de planilhas eletrônicas, pivot tables (tabelas dinâmicas) e gráficos na Web. Eles representam uma experiência interativa e valiosa para o usuário, assim como faz o Microsoft Excel. Os componentes OWC também apresentam uma interface de programação muito completa, com um alto grau de funcionalidade e flexibilidade, permitindo a criação de uma solução personalizada. A Figura 1 mostra o componente OWC PivotTable®, que lhe permite conectar-se a uma fonte de dados OLAP e fazer consultas nela usando uma interface drag and drop conveniente.

Figura 1 Componente OWC PivotTable

A finalidade deste artigo é satisfazer às necessidades dos desenvolvedores que estejam usando o ASP.NET e o Office Web Components para desenvolver para a Web uma solução de relatório personalizada baseada em OLAP. Apresentaremos uma arquitetura de aplicativos que incorpora os Web Services baseados em XML e mostraremos como criá-la e como configurar sua fonte de dados OLAP para acesso por HTTP. Além disso, descreveremos como implantar a solução para os usuários. A maioria dos aplicativos Web são totalmente instalados em um Web server e não requerem interação com o cliente durante o processo de implantação. No entanto, o OLAP e o OWC introduzem exigências especiais ao cliente que deseja utilizar sua solução personalizada.

Termos e conceitos importantes

A tecnologia OLAP é repleta de termos especializados que podem representar uma barreira à compreensão de seus benefícios reais. Este artigo pressupõe que você esteja familiarizado com a tecnologia OLAP e especificamente com o SQL Server 2000 Analysis Services. Mesmo assim, antes de prosseguir, gostaríamos de esclarecer termos e conceitos importantes deste artigo e, de modo geral, das tecnologias OLAP e data mining.

Primeiro, é importante distinguir as tecnologias OLAP e data mining. Uma fonte de dados (ou repositório) baseada em OLAP pode ser subdividida em um ou mais cubos, que são estruturas de dados multidimensionais que podem ser consultadas por meio de uma MDX. Um cubo contém um conjunto de atributos chamado dimensões, que correspondem a grosso modo a campos de bancos de dados, exceto pelo fato de que também possuem um conjunto hierárquico de níveis. Por exemplo, uma dimensão de tempo anual pode ser subdividida em níveis de trimestres, meses e semanas. Um cubo também possui um conjunto de medidas, que são os valores de dados reais e são tipicamente numéricos. Por exemplo, um cubo no varejo permitirá a exibição de vendas unitárias (medida) de acordo com o local de armazenamento (dimensão) e a época do ano (dimensão).

O SQL Server 2000 Analysis Services permite a execução do processamento OLAP, com a permissão do Microsoft Management Console (MMC) um snap-in chamado Analysis Manager. Trata-se simplesmente de uma interface de um pivot table integrada ao Analysis Services. Os dados baseados em OLAP normalmente são exibidos por meio de uma pivot table, o que permite que você arraste e solte várias dimensões e medidas em um layout do tipo planilha. O controle PivotTable traduz as operações de arrastar e soltar (drag and drop) em consultas MDX, que ele transmite para as fontes de dados OLAP, recebendo um resultset.

O Analysis Manager instala um serviço PivotTable no servidor de banco de dados, o qual inclui um provider OLE DB que permite conexões com fontes de dados OLAP. O provider se chama Microsoft OLE DB Provider for OLAP Services 8.0. Sem ele, nenhuma conexão com as fontes de dados OLAP seria possível. A string de conexão desse provider inclui um atributo DataSource para o nome de repositório e um atributo DataMember para o nome do cubo ao qual você está se conectando. O serviço PivotTable também deve estar instalado na máquina do cliente; caso contrário, o controle PivotTable do cliente não conseguirá se comunicar com a fonte de dados OLAP.

Arquitetura de aplicativos de relatório OLAP baseada na Web

A Figura 2 descreve a arquitetura de alto nível de nosso aplicativo de relatório OLAP baseado na Web. A arquitetura de aplicativos de relatório inclui três caminhos, numerados de forma a corresponderem à seqüência do workflow do aplicativo. Eles se combinam para fornecer o seguinte conjunto de recursos:

Figura 2 Arquitetura OLAP

O XML é o principal representante desta arquitetura de aplicativos. O componente OWC PivotTable serializa de forma nativa, seu conteúdo em XML. Além de copiar os dados como XML, você também pode carregar o componente PivotTable com dados XML, desde que ele esteja em conformidade com o esquema XML definido para Excel. Essa propriedade permite que os desenvolvedores do ASP.NET criem Web Services baseados em XML que se comuniquem bidirecionalmente com um controle OWC PivotTable. Um Web Method pode gerar XML formatado para preencher o controle PivotTable (Caminho 1 – Pathway 1), enquanto outro pode aceitar a saída serializada de um controle PivotTable e salvá-la em um meio persistente, como um banco de dados ou um arquivo (Caminho 3 - Pathway 3).

Uma vez estabelecida uma conexão entre o controle PivotTable e a fonte de dados OLAP, o usuário fica livre para começar a montar um modo de exibição personalizado dos dados usando a interface drag and drop do controle PivotTable. Toda vez que o controle é atualizado, ele cria dinamicamente uma consulta MDX (expressão multidimensional) e envia a solicitação diretamente para a fonte de dados OLAP através do gateway HTTP (Caminho 2 - Pathway 2). Essa comunicação ocorre independentemente do Web server; a Web page tem contato direto com o banco de dados. Nesta arquitetura, a função do Web server é estabelecer a conexão inicial entre o controle PivotTable e a fonte de dados OLAP e permitir o salvamento e a recuperação de relatórios PivotTable personalizados.

Office Web Components

O OWC versão 10 provê funcionalidades prontas para uso que não são somente eficazes como também familiares ao usuário. A sua solução personalizada pode, portanto, obter uma mais rápida aceitação por parte de usuários que já estejam familiarizados e à vontade com o Excel. A Tabela 1 resume os componentes OWC (versão 10) fornecidos com o Office XP. Observe que o Office 2000 é fornecido com uma versão anterior do OWC (versão 9), que provê interfaces de programação e do usuário muito mais limitadas. Grande parte de nossa análise do OWC versão 10 também se aplica ao OWC versão 9, apesar de que nem tudo o que analisamos será utilizado na versão anterior.

Os desenvolvedores de ASP.NET utilizam-se de alguns recursos para incorporar componentes OWC a um projeto Web. A maioria dos exemplos de código on-line partem do pressuposto que você esteja interagindo com os componentes OWC usando linguagem de scripts do lado cliente, como o VBScript. Apesar de essa abordagem ser útil, ela ignora uma outra abordagem mais avançada, possibilitada pelo ASP.NET. Em outras palavras, você pode criar uma instância server-side de um componente OWC, fazer uma conexão, definir propriedades e depois usar essa instância para gerar dados XML para uma instância client-side separada, do componente PivotTable. Essa lógica de programação está contida na porção OLAP Data Access Objects do diagrama da arquitetura (veja a Figura 2), no Caminho 1 - Pathway 1. O XML pode então ser transmitido ao componente client-side usando um XML Web Service, também mostrado no Caminho 1 - Pathway 1.

Tabela 1 Office Web Components (versão 10)

Componente

Descrição

PivotTable

Permite que os usuários se conectem a qualquer fonte de dados OLAP que ofereça suporte ao Microsoft OLE DB Provider for OLAP Services 8.0 e superiores. (Também se conecta a planilhas do Excel e a bancos de dados relacionais do SQL Server e do Access.) O controle PivotTable permite que os usuários analisem os dados por tabelas dinâmicas, agrupamento, filtragem e classificação.

Spreadsheet

Apresenta uma interface de usuário em formato de planilha, incluindo um mecanismo de recálculo e uma vasta biblioteca de funções.

Chart

Exibe graficamente dados de um controle DataSource, PivotTable ou Spreadsheet vinculado. O componente Chart será atualizado automaticamente quando vinculado a um controle PivotTable e se o usuário utilizar novamente tabelas dinâmicas para os dados.

DataSource

Gerencia a comunicação com o back-end dos servidores de bancos de dados. Os componentes PivotTable e Spreadsheet podem, na verdade, se conectar a uma fonte de dados de forma independente, sem usar especificamente um controle DataSource. Isso se dá ao fato de seus dados XML poderem conter uma string de conexão de banco de dados OLE de forma direta.

A Tabela 2 resume os componentes OWC com que trabalharemos neste artigo: especialmente o PivotTable e Chart. Os controles Spreadsheet e DataSource não são abordados aqui porque eles não influenciam na arquitetura em análise. A Tabela 3 e a Tabela 4 resumem as interfaces de programação dos componentes PivotTable e Chart, respectivamente.

Tabela 2 Objetos relacionados a PivotTable e Chart

Membro

Descrição

PivotTable

Permite que os usuários se conectem a qualquer fonte de dados OLAP que ofereça suporte ao OLE DB Provider for OLAP Services 8.0 e superiores. (Também se conecta a planilhas do Excel e a bancos de dados relacionais do SQL Server e do Access.) O controle PivotTable permite que os usuários analisem os dados por tabelas dinâmicas, agrupamento, filtragem e classificação.

PivotView

Representa um modo de exibição específico do PivotTable. Usado para manipular as linhas, as colunas, as escalas e a formatação de um modo de exibição do PivotTable.

PivotDataAxis

Contém métodos e propriedades relacionados ao eixo de dados.

PivotResultColumnAxis

Contém métodos e propriedades relacionados ao eixo de coluna.

PivotResultRowAxis

Contém métodos e propriedades relacionados ao eixo de linha.

PivotFieldSet

Um conjunto de campos definido no cubo.

PivotField

Um campo específico definido no cubo.

ChartSpace

Permite que os usuários se conectem a qualquer fonte de dados OLAP que ofereça suporte ao OLE DB Provider for OLAP Services 8.0 e superiores. (Também se conecta a planilhas do Excel e a bancos de dados relacionais do SQL Server e do Access.) O controle ChartSpace permite que os usuários exibam graficamente os dados e vinculem o controle a uma PivotTable ou Spreadsheet existente.

ChCharts

Uma coleção de objetos ChChart.

ChChart

Representa um gráfico no ChartSpace. Um ChartSpace pode conter até 64 gráficos.

Tabela 3 Interface de programação do componente PivotTable

Membro

Tipo

Descrição

ActiveView

Propriedade

Representa o layout da PivotTable ativa. Esta propriedade retorna um objeto PivotView.

ColumnAxis

Propriedade

Representa os campos no eixo de coluna. Retorna um objeto PivotAxis.

ConnectionString

Propriedade

Define a string de conexão ADO para um servidor Analysis Services. O parâmetro DataSource dentro da propriedade ConnectionString determina o tipo de protocolo de conexão que o componente OWC utilizará.

DataAxis

Propriedade

Representa a escala no eixo de dados. Retorna um objeto PivotAxis.

DataMember

Propriedade

Define o nome do membro de dados que o controle solicitará ao Analysis Services. É o mesmo nome do cubo.

IncludedMembers

Propriedade

Define os membros a serem incluídos em um PivotField. A propriedade aceita como entrada um membro único ou um array de membros.

IsIncluded

Propriedade

Define o campo a ser incluído e ativado no PivotFieldSet.

RowAxis

Propriedade

Representa os campos no eixo de linha. Retorna um objeto PivotAxis.

XMLData

Propriedade

Define ou retorna os dados XML para o controle PivotTable do relatório atual. Os detalhes sobre o relatório (formatação e dados) estão contidos nos dados XML. Também inclui detalhes da conexão OLAP.

AddCustomGroupField

Método

Adiciona um campo do grupo personalizado ao PivotFieldSet específico.

AddCustomGroupMember

Método

Adiciona um membro do grupo personalizado a um PivotFieldSet específico.

InsertFieldSet

Método

Insere um conjunto de campos no eixo de linha ou coluna.

CommandExecute

Evento

É disparado depois que um comando é executado. As constantes ChartCommandIdEnum e PivotCommandId contêm listas dos comandos aceitos para cada componente OWC.

Query

Evento

É disparado toda vez que uma consulta é ativada pela PivotTable.

Tabela 4 Interface de programação do componente Chart

Membro

Tipo

Descrição

DataSource

Propriedade

Define a fonte de dados para o controle de gráfico. Quando definido para outro controle (PivotTable ou Spreadsheet, por exemplo), vincula efetivamente o controle de gráfico ao outro controle.

Type

Propriedade

Define o tipo de gráfico conforme definido pela enumeração ChartChartTypeEnum. O padrão é um gráfico de barras.

O componente PivotTable possui uma interface complicada, mas o aspecto mais importante a ser lembrado é a propriedade XMLData. Ela é uma representação XML do conteúdo completo da PivotTable, incluindo as informações de conexão da fonte de dados OLAP. A propriedade XMLData também armazena as dimensões e medidas atualmente em exibição e a formatação aplicada. Essa propriedade pode ser definida e recuperada e é um meio importante de personalizar um componente PivotTable dinamicamente.

Configurando a fonte OLAP para acesso por HTTP

Para podermos começar a criar o aplicativo OLAP Reporting baseado na Web, devemos configurar a fonte de dados do Analysis Services para acesso pelo Microsoft Internet Information Services (IIS). O Web site do IIS pode ser configurado no mesmo servidor em que o Analysis Services esteja instalado e deve conter um único arquivo chamado msolap.asp. Esse arquivo faz a ponte entre as solicitações que vêm por uma porta HTTP e a fonte de dados Analysis Services. O arquivo está localizado no caminho \Program Files (Arquivos de Programas)\Microsoft Analysis Services\bin. Recomendamos que seja feita a configuração da fonte de dados para acesso por uma conexão segura (HTTPS) que use um certificado SSL (Secure Sockets Layer). Esta etapa requer a aquisição de um certificado SSL para o servidor Analysis Services. Você também pode usar uma conexão não-segura (HTTP) para acessar a fonte de dados, mas não recomendamos essa alternativa.

Depois que o IIS estiver instalado no servidor Analysis Services, você poderá configurar um novo Web site para acesso HTTPS. Primeiro, crie um novo diretório de Web site fora do diretório raiz padrão da Web (\Inetpub\wwwroot\). Recomendamos que você interrompa o site Web padrão por questões de segurança. Além disso, você deverá fechar a porta 80 no seu firewall e abrir a porta 443 para acesso HTTPS depois que o certificado SSL estiver instalado.

Copie o arquivo msolap.asp do diretório \Program Files (Arquivos de Programas)\Microsoft Analysis Services\bin para o novo diretório do Web site e use o IIS Manager para configurar o novo diretório do Web site como um Aplicativo Web e inclua um Host Header Name para o Web site (por exemplo, olap.mycompany.com).

Adquira e instale o certificado SSL no servidor. O Web site já deve estar acessível pela porta 80 durante o processo de verificação para aquisição. Com o certificado instalado, feche a porta 80 e abra a porta 443 no seu firewall. Use o IIS Manager para definir a segurança de diretório (Directory Security) de modo que o acesso anônimo (Anonymous Access) fique desativado e a autenticação básica (Basic Authentication), ativada. Por fim, reinicialize o IIS para aplicar as alterações.

Depois que o acesso HTTPS estiver configurado, atualize a string de conexão do OLE DB que aponta para a fonte de dados OLAP. O formato da string de conexão é o seguinte:

Provider=MSOLAP;user id=Domain\Username;password=Password;Data

Source=https://ServerName;Initial Catalog=OLAPDataSourceName

Acesso de segurança OLAP

Como a fonte de dados OLAP fica acessível por HTTPS, as credenciais de segurança são essenciais, tendo em vista que sua fonte de dados agora está disponível praticamente a qualquer pessoa que navegue pelo seu Web site. Por exemplo, um usuário remoto pode abrir o Excel e conectar uma PivotTable à sua fonte de dados OLAP, simplesmente fornecendo a URL para o Analysis Server e o nome do Initial Catalog.

O Analysis Services implementa as funções de segurança do cubo com base nas contas de usuário do Windows NT®. Basicamente, você cria uma ou mais contas de usuário locais do Windows NT no servidor e atribui a elas uma função de banco de dados SQL Server. Em seguida, você atribui a função de banco de dados a uma função de cubo e atribui esta ao cubo específico. A função do cubo herda essencialmente a user ID e credenciais de senha do Windows NT. Você pode então incluir a user ID e as credenciais de senha a string de conexão da fonte de dados OLAP.

Observe que uma fonte de dados OLAP pode conter vários cubos. Você pode se conectar a um cubo específico, definindo o valor da tag XML <datamember>do controle OWC PivotTable como um nome de cubo válido (explicado na próxima seção). Esse cubo deve ser atribuído a uma função que corresponda às credenciais na string de conexão da fonte de dados OLAP.</datamember>

Criando o aplicativo

Chegou a hora de criar este aplicativo usando o ASP.NET e o OWC 10. A interface do usuário do aplicativo está contida em um único Web Form, chamado owc10.aspx, mostrado na Figura 3. A interface contém um controle clinet-side OWC PivotTable incorporado assim como um conjunto de botões para realizar conexões com uma fonte de dados OLAP e para salvar e recuperar relatórios personalizados. Essa funcionalidade é diretamente fornecida por um conjunto de Web methods no XML Web Service encontrado no wsOLAP.asmx. A interface do usuário se encaixa nesses Web methods usando um conjunto de funções client-side JavaScript no arquivo de script olap.js. Essas funções JavaScript delegam a maioria das solicitações aos métodos do Web Service, fazendo chamadas client-side para os métodos. Isso é obtido usando-se um arquivo DHTML chamado webservice.htc.

Figura 3 aplicativo OLAP Reporting baseado na Web

O aplicativo de exemplo, chamado OLAPReport, encontra-se disponível para download. Ele usa o Foodmart 2000 data warehouse como sua fonte de dados OLAP e o cubo Sales (Vendas) como seu membro de dados (data member). O Foodmart 2000 é instalado com o SQL Server 2000 Analysis Services.

Depois que é feito o download dos arquivos do projeto e eles são instalados, há algumas etapas que devem ser seguidas para que o projeto compilado funcione corretamente. Primeiro, você precisará modificar a string de conexão OLE DB que o aplicativo usa para fazer referência à fonte de dados OLAP. A string de conexão é armazenada como uma configuração de aplicativo (application setting) personalizada no arquivo Web.config:

Observe que a string de conexão não contém credenciais de segurança (como User ID e senha). Essas credenciais serão necessárias apenas se você tiver implementado funções (papéis) de segurança no Analysis Server. Conforme descrito anteriormente, incentivamos a inclusão de funções de segurança. Uma vez incluídas, basta adicionar as credenciais ao final da string de conexão.

Lembre-se de que você precisará configurar o Analysis Server para acesso HTTP a fim de que esta string de conexão funcione. Essas etapas também já foram descritas. O projeto é configurado inicialmente para usar http://localhost/olap como sua fonte de dados; portanto, você precisará criar um diretório virtual chamado olap no Web site padrão e copiar o arquivo msolap.asp para esse diretório. Como um atalho, você poderá simplesmente substituir o valor DataSource pelo nome da sua máquina, omitindo o https://. Isso permitirá uma conexão padrão com a fonte de dados OLAP, em vez de uma conexão HTTP. Isso funciona para fins de demonstração, mas lembre-se de que, se você não permitir o acesso HTTP, não poderá expor seu Analysis Server a usuários que estejam fora do domínio da rede.

Por fim, antes de prosseguir, talvez seja necessário definir uma referência ao componente OWC10 COM do projeto OLAPReport. (O projeto de instalação [setup project] deve cuidar disso para você, mas é útil conhecer as etapas, de qualquer forma). Para incluir a referência, abra o Solution Explorer e, em seguida, clique com o botão direito do mouse no ícone do projeto e selecione Add Reference no menu pop-up. Quando a caixa de diálogo abrir, mude para a guia COM e localize o componente chamado Microsoft Office XP Web Components (OWC10.DLL). Clique no botão de seleção (Select) e, em seguida, clique em OK. O Visual Studio .NET gerará um wrapper .NET para o componente e adicionará uma referência de projeto a OWC10.

Conexão do controle à fonte de dados

Agora vamos implementar os três recursos do aplicativo, um de cada vez. Primeiro, vamos analisar o Caminho 1 (Pathway 1) — como definir uma conexão entre um controle OWC client-side e a fonte de dados OLAP. Essa função é iniciada usando-se o botão Set Connection na interface do usuário (veja a Figura 3). Esse botão chama a função JavaScript initializePivotTable e passa o nome do cubo de dados com que irá se conectar; neste caso, "Sales".

A função JavaScript, por sua vez, faz uma chamada assíncrona ao Web method InitializePivotTableXML (ativado pelo comportamento DHTML chamado webservice.htc, já apresentado). O Web method se conecta à fonte de dados OLAP e gera o XMLData da PivotTable. A saída do Web method é tratada por uma função JavaScript chamada onInitializePivotTableResult. A Listagem 1 mostra o código para as funções JavaScript, enquanto a Listagem 2 mostra o código para o Web method. Os códigos nessas duas listagens são simples e, melhor de tudo, são reutilizáveis. Simplificando, essas funções nos permitem gerar XMLData personalizado no Web server para transmissão ao controle client-side PivotTable.

No processo de estabelecimento de uma conexão, estamos inicializando efetivamente o controle OWC com um relatório em branco para o cubo de dados Sales. O relatório vazio preenche a Field List (lista de campos) com todos os campos e medidas disponíveis para o cubo de dados. O usuário pode então criar um relatório personalizado, arrastando e soltando campos nos campos de linha (Row) e coluna (Column) e medidas (Measures) nos campos de totais (Totals) da PivotTable. Toda vez que o usuário solta um campo na PivotTable, o controle envia uma consulta diretamente para a fonte de dados, que, por sua vez, envia de volta mais resultados da consulta. Essa troca é conduzida independentemente do Web Service, que é exigido somente para estabelecimento da conexão inicial entre o controle a fonte de dados. Essa troca é representada pelo Pathway 2 (Caminho 2) na Figura 2.

Listagem 1 Conectando-se a uma fonte de dados OLAP

function initializePivotTable(strDataMember) {      // Esta função chama o Web Method   // InitializePivotTableXML()   var iCallID = service.svcOLAP.callService          (onInitializePivotTableResult,        'InitializePivotTableXML',         strDataMember); } function onInitializePivotTableResult(result) {   // Este função trata o InitializePivotTableXML()   // resultado do Web method   text = result.value;   if (!result.error) {       // Atribui o XML ao PivotList XMLData       frm1.PivotTable1.XMLData = text;   }   else {       alert("Unhandled error - " +             result.errorDetail.code +             " " + result.errorDetail.string);   } }

Listagem 2 Geração de XMLData para um controle PivotTable

Public Function InitializePivotTableXML( _   ByVal strDataMember As String) As String   Dim m_XML As String   Dim strOLAPConn As String = _       ConfigurationSettings.AppSettings("OLAPConnectionString")   Try     Dim objPT As PivotTableClass = _         New PivotTableClass     objPT.ConnectionString = strOLAPConn     objPT.DataMember = strDataMember     m_XML = objPT.XMLData     objPT = Nothing   Catch err As Exception     m_XML = "<err>" & err.Source & " - " & _             err.Message & "</err>"   Finally   End Try   Return (m_XML) End Function

Geração dinâmica de um relatório PivotTable personalizado

Agora vamos nos aprofundar no modelo de objeto PivotTable, gerando de maneira programática um relatório personalizado. O relatório personalizado que queremos criar permite ao usuário selecionar duas cidades e comparar as vendas (Store Sales) da família de produtos de bebidas (Drinks Product Family). Utilizamos a mesma abordagem do Caminho 1 (Pathway 1), o que significa que chamamos um Web method para gerar um XMLData que descreva o relatório. Atribuímos, então, o XMLData do Web method à propriedade XMLData do controle incorporado. A interface contém duas listas drop-down de nomes de cidades e um botão chamado Load Custom Report, como mostra a Figura 3). Esse botão invoca a função JavaScript chamada LoadCustomReport, que aceita como entrada os dois nomes de cidades do Web Form. Essa função, por sua vez, chama o Web method LoadCustomPivotTableReport, que monta de maneira programática o XMLData para o relatório personalizado. Por fim, uma função de tratamento (handler) JavaScript recebe o XMLData do Web method e o atribui à propriedade XMLData do PivotControl incorporado. A Listagem 3 mostra o código do Web method.

Listagem 3 Web Method LoadCustomPivotTableReport

Public Function LoadCustomPivotTableReport(_   ByVal strCity1 As String, _   ByVal strCity2 As String) As String   Dim m_XML As String   Dim strOLAPConn As String = _      ConfigurationSettings.AppSettings("OLAPConnectionString")   Dim objPT As PivotTableClass = New PivotTableClass   Dim objPTView As PivotView   Dim fldCity, fldName, fldProdFamily As PivotField   Dim fSetCustomers, fSetProduct As PivotFieldSet   Try     objPT.ConnectionString = strOLAPConn     objPT.DataMember = "Sales"     objPT.AllowFiltering = False     objPTView = objPT.ActiveView     objPTView.TitleBar.Caption = "City Comparison of Drink Sales"     ' Define as colunas     objPTView.ColumnAxis.InsertFieldSet(objPTView.FieldSets("Time"))     objPTView.ColumnAxis.FieldSets("Time").Fields("Year").Expanded = True     ' Define as linhas     fSetCustomers = objPTView.FieldSets("Customers")     objPTView.RowAxis.InsertFieldSet(fSetCustomers)     fSetCustomers.Fields("Country").IsIncluded=False     fSetCustomers.Fields("State Province").IsIncluded = False     fSetCustomers.Fields("Name").IsIncluded = False     ' Define os membros das linhas     fldCity = fSetCustomers.Fields("City")     fldCity.IncludedMembers = _        New Object() {strCity1, strCity2}     ' Exclui todas linhas do fieldset     fSetProduct = objPTView.FieldSets("Product")     objPTView.RowAxis.InsertFieldSet(fSetProduct)     fSetProduct.Fields("Product Department").IsIncluded = False     fSetProduct.Fields("Product Category").IsIncluded = False     fSetProduct.Fields("Product Subcategory").IsIncluded = False     fSetProduct.Fields("Brand Name").IsIncluded = False     fSetProduct.Fields("Product Name").IsIncluded = False     fldProdFamily = fSetProduct.Fields("Product Family")     fldProdFamily.IncludedMembers = "Drink"     ' Define as medidas     objPTView.DataAxis.InsertTotal(objPTView.Totals("Store Sales"))     objPTView.DataAxis.Totals("Store Sales").NumberFormat = "Currency"     ' Retorna os dados XML para o cliente     m_XML = objPT.XMLData     objPT = Nothing   Catch err As Exception     m_XML = "<err>" & err.Source & " - " & _             err.Message & "</err>"   Finally   End Try     Return (m_XML) End Function

O método LoadCustomPivotTableReport usa muitas das propriedades PivotTable descritas na Tabela 3. Lembre-se também das seguintes dicas:

Salvar e recuperar relatórios personalizados

Agora que já nos esforçamos para criar esse relatório personalizado, não vamos queremos repetir esse processo toda vez que precisarmos gerar outro. Felizmente, os dados necessários para duplicar esse relatório estão contidos na propriedade XMLData. Assim, salvar um relatório é simplesmente salvar o conteúdo da propriedade XMLData em um meio de armazenamento persistente, como um banco de dados relacional. Carregar um relatório é simplesmente recuperar o XMLData armazenado e vinculá-lo novamente ao PivotTable. Esse recurso é mostrado como Caminho 3 (Pathway 3) na Figura 2.

O Web Service do aplicativo inclui dois métodos para salvar e recuperar o XMLData dos relatórios personalizados. Nesse exemplo, gravaremos, na verdade, o XMLData em um arquivo de texto chamado OLAPReport1.xml. A interface fornece dois botões: Save Report e Load Saved Report. O botão Save Report chama uma função JavaScript que envia o XMLData da PivotTable para o seguinte Web method:

function SaveReport() { // Chama o Web Service para salvar o relatorio var strReportXMLData = frm1.PivotTable1.XMLData; var iCallID = _ service.svcOLAP.callService(onSaveReportResult, _ 'SaveReport', strReportXMLData, _ 'OLAPReport1.xml'); }

O Web method, por sua vez, grava o XMLData em um arquivo. O botão Load Saved Report chama uma função JavaScript que faz o oposto, como mostra a Listagem 4. Essa função chama um Web method que abre o arquivo de texto, recupera o XMLData e, em seguida, passa-o de volta para vinculação (binding) ao controle PivotTable. A abordagem do arquivo é conveniente para fins de demonstração, mas um sistema de produção deve usar um banco de dados relacional para armazenar o XMLData para relatórios personalizados. Esta abordagem apresenta um melhor gerenciamento de concorrência e também permite o armazenamento de relatórios de maneira mais organizada.

Listagem 4 Carga do XMLData para um relatório personalizado

function LoadSavedReport() { // Chama o Web Service method para carregar o relatorio salvo var iCallID = service.svcOLAP.callService(onLoadSavedReportResult, 'LoadSavedReport', 'OLAPReport1.xml'); } function onLoadSavedReportResult(result) { // Esta função trata o Web Service result // wsOLAP.onLoadSavedReportResult() var text = result.value; if (!result.error) { // Atribui o XML ao valor XMLData PivotList frm1.PivotTable1.XMLData = text; } }

Usando eventos OWC

Os componentes OWC 10 apresentam vários eventos úteis que você pode capturar em tratadores de eventos (event handlers) client-side. Eles podem ser escritos em VBScript ou em JavaScript. Em VBScript, você usa a notação de eventos básica, como mostrado aqui:

Sub <objectname>_<eventname>

Em JavaScript, você deve usar a sintaxe para eventos:

<script language="javascript" event="EventName" for="ObjectName"></script>

O aplicativo de exemplo demonstra como capturar os eventos Query e CommandExecute. O código de tratamento de eventos é mostrado na Listagem 5. Quando o evento Query é disparado, o aplicativo acrescenta um logging de evento ao campo text area do lado esquerdo da página Web. Quando o evento CommandExecute é disparado, verificamos se é um comando de atualização (refresh). Se for, o aplicativo acrescentará a data e a hora ao text area do logging de evento.

Vinculando um gráfico ao controle PivotTable

Em muitos casos, uma representação gráfica dos dados é muito valiosa para o usuário. Felizmente, o OWC possui um controle ChartSpace que apresenta exatamente esse tipo de funcionalidade. Para aprimorar nosso próprio relatório personalizado, vamos gerar um gráfico de barras que represente os dados. Apesar de parecer uma tarefa monumental, o controle ChartSpace nos ajudará muito nesse sentido. Um dos seus recursos úteis é que ele pode vincular (bind) outro controle, como o controle PivotTable, como sua fonte de dados principal. Ele apresentará, então, o modo de exibição PivotTable atual em um formato gráfico. O efeito final é que as alterações no modo de exibição do PivotTable se refletirão automaticamente no controle ChartSpace.

No nosso caso, uma vez que tenhamos gerado o relatório PivotTable personalizado, simplesmente teremos de atribuir o controle PivotTable à propriedade DataSource do controle ChartSpace.

// Vincula o controle Chart ao controle PivotTable frm1.ChartSpace1.Clear(); frm1.ChartSpace1.DataSource = frm1.PivotTable1; // Define o tipo de gráfico como 3DBar frm1.ChartSpace1.Charts(0).Type = 50;

Precisamos chamar o método Clear antes de atribuir a propriedade DataSource, a fim de remover a instância do gráfico anterior. O controle ChartSpace apresenta muitas propriedades customizáveis, incluindo a propriedade Type, que aceita um valor de enumeração ChartChartTypeEnum para definir o layout do gráfico.

Criando agrupamentos personalizados

Por fim, vamos analisar um novo e importante recurso do OWC 10 — a capacidade de criar agrupamentos personalizados. Nosso relatório agrupa atualmente as vendas da loja com base no conjunto de campos Time. Nesse caso, Time é agrupado em Ano/Trimestre/Mês. Suponha que desejemos agrupar nosso relatório personalizado utilizando um agrupamento diferente dos campos definidos no cubo de dados. Podemos fazer isso usando os recursos de agrupamento personalizados do OWC 10. Um botão rotulado Apply Custom Grouping chama uma função JavaScript que, por sua vez, chama o Web method ApplyCustomGrouping. O parâmetro de entrada é o XMLData do relatório carregado no momento. O Web method carregará, então, um objeto PivotTable e usará o método AddCustomGroupField para definir o grupo personalizado, neste caso um agrupamento de tempo de semestre. O código é mostrado na Listagem 6.

Listagem 6 Criando grupos personalizados

Public Function ApplyCustomGrouping( _   ByVal strReportXMLData As String) As String   Dim m_xml As String   Dim objPT As PivotTableClass = New PivotTableClass   Dim objPTView As PivotView   Dim fsTime As PivotFieldSet   Dim fsHalfYear As PivotField   Try     objPT.XMLData = strReportXMLData     objPTView = objPT.ActiveView     ' Define a variável para o campo Time     fsTime = objPTView.FieldSets("Time")     ' Adiciona um campo do grupo customizado     ' chamado "Group1" para o campo Time     fsHalfYear = fsTime.AddCustomGroupField(_      "CustomGroup1", CustomGroup1", "Quarter")     ' Adiciona um campo customizado para os membros     ' Inclui todos "Q1" e "Q2" inferior a 1997     fsHalfYear.AddCustomGroupMember _         (fsTime.Member.ChildMembers("1997").Name, _         New Object() {"Q1", "Q2"}, "1stHalf")     ' Adiciona outro campo customizado para membros     ' "Q3" e "Q4" inferior a 1997     fsHalfYear.AddCustomGroupMember _         (fsTime.Member.ChildMembers("1997").Name, _         New Object() {"Q3", "Q4"}, "2ndHalf")     fsHalfYear.Expanded = False     m_xml = objPT.XMLData     objPT = Nothing   Catch err As Exception     m_xml = "<err>" & err.Source & " - " & _              err.Message & "</err>"   Finally End Try Return (m_xml) End Function

Observe que adicionamos um grupo personalizado ("CustomGroup1") com dois membros ("1stHalf" e "2ndHalf") para abranger o ano. Os membros personalizados são adicionados usando-se o método AddCustomGroupMember. Quando você utiliza essa função no Web Form, o controle ChartSpace também incorpora o agrupamento personalizado ao gráfico de barras — um outro benefício do uso dos componentes integrados do Office Web Components 10.

Existe uma questão significativa com o suporte a grupos personalizado. No momento, o XMLData não salva os dados apropriados para utilizar os mesmos nomes dos agrupamentos personalizados. Se você for salvar o XMLData (como fizemos anteriormente com a funcionalidade Save Report) e depois carregar o PivotTable com o XMLData salvo, o título (caption) do grupo personalizado ("1stHalf", "2ndHalf") aparecerá como GUIDs. Apesar de tudo, a integração dos componentes OWC 10 é maior que na versão anterior, tornando-o uma ferramenta muito útil para relatórios OLAP baseados na Web.

Requisitos do cliente para uso do HTTP

Agora que criamos nosso OLAP Reporting App baseado na Web, há quatro etapas de configuração que todo cliente Web deve implementar antes de usar o aplicativo. Primeiro, todos os clientes Web devem possuir uma cópia local licenciada do Office XP instalado em sua máquina. Como alternativa, eles podem ter acesso a uma cópia licenciada do Office XP em um servidor pelo qual eles tenham acesso à rede. Os componentes OWC fazem parte do pacote do Office XP e estão sujeitos aos mesmos requisitos de licenciamento.

Segundo, todo cliente Web deve usar o Internet Explorer 5.0 ou superior. Há diversas razões para isso. O aplicativo Web usa o Web Service DHTML behavior, que exige o Internet Explorer 5.0 ou superior. Além disso, os componentes OWC client-side são componentes Microsoft COM, ou seja, não são executados nativamente em navegadores não-Microsoft. (Estamos cientes de que alguns navegadores permitem plug-ins para execução de controles COM client-side, mas ainda não fizemos esse teste com o OWC).

A terceira etapa de configuração é que todo cliente Web deve ter o provider OLE DB correto instalado: especificamente, o Microsoft OLE DB Provider for OLAP Services 8.0 ou superior. Esse provider é instalado com o PivotTable Service redistribuível, o que inclui um conjunto de DLLs e a versão necessária do MDAC (Microsoft Data Access Components). Você pode instalar o PivotTable Service a partir do CD-ROM do SQL Server 2000 em \Msolap\Install\Pts. Será necessário escolher um dos dois arquivos de instalação fornecidos: PtsLite.exe ou PtsFull.exe. Este segundo instala o PivotTable Service e o MDAC, enquanto o primeiro instala somente o PivotTable Service. Se não tiver certeza de qual versão você precisa, instale o PtsFull.exe. Quase sempre você precisará do PivotTable Service em cada máquina cliente Web, pois somente o Microsoft Analysis Services instala o serviço automaticamente. Você pode usar o assistente PivotTable do Excel para identificar se a máquina em que está sendo executado o cliente Web já tem o PivotTable Service instalado.

A quarta etapa de configuração consiste em todo cliente Web adicionar o domínio Web do aplicativo à sua lista de sites confiáveis no Internet Explorer. O aplicativo reside em um domínio diferente do da máquina do cliente; portanto, o componente OWC PivotTable deve cruzar um limite de domínio toda vez que consultar a fonte de dados OLAP. Por essa razão, o domínio Web do aplicativo deve ser incluído como um dos sites confiáveis do cliente. Para garantir que isso ocorra, abra o Internet Explorer e clique no menu Tools (Ferramentas) | Options (Opções). Selecione a guia Security (Segurança), clique no ícone de Trusted sites (sites confiáveis) e, em seguida, clique no botão Sites.

Você também poderá fornecer a seus clientes um arquivo de registro que atualizará automaticamente a lista que eles possuem de sites confiáveis. Veja aqui um exemplo de atualização de chave de registro (registry):

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\mycompany.com] "https"=dword:00000002

Observe que o arquivo de registro deve ser executado uma vez por usuário na máquina do cliente. Isso porque ela atualiza o grupo de registro (registry hive) HKEY_CURRENT_USER. Por exemplo, se dois usuários de domínio compartilharem a mesma máquina, cada um terá de executar o arquivo de registro para sua própria conta.

Conclusão

As soluções de relatório OLAP baseadas na Web apresentam um desafio técnico fascinante, pois elas envolvem diversas tecnologias sofisticadas, incluindo o SQL Server 2000 Analysis Services, o Office Web Components, o XML e o ASP.NET. A arquitetura que apresentamos aqui foi projetada para utilizar todas essas tecnologias com o melhor de suas capacidades. Outras arquiteturas certamente são possíveis, especialmente com a evolução futura das tecnologias atuais.

</eventname></objectname>

Artigos relacionados