Olá amigos! Na parte A deste artigo mostramos como criar um log de acesso para o site, salvando as informações em um XML. Nesta Parte B vamos exibir um relatório com gráfico utilizando SilverLight. Gostaria de ressaltar que relatório não necessariamente precisa ser exibido utilizando a tecnologia Silverlight.
Imagem de exemplo do Gráfico gerado com o SilverLight.
O Silverlight é a mais nova tecnologia da Microsoft que permite desenvolver aplicações com alta interatividade com o usuário. Funciona com plugin, que deve ser instalado na máquina, similar ao Macromedia Flash.
Para saber mais sobre o Silverlight acesse: http://www.silverlight.net
Framework ASP.NET 2.0 com VB.net
Visual Studio 2005.Conhecimentos em JavaScript.
Ter o plugin do Silverlight instalado.Ter o SDK do Silverlight Instalado.(http://silverlight.net/GetStarted/)
Abra o projeto criado na parte A deste artigo. Crie uma pasta chamada "RelatorioSilverLight" na raiz do seu projeto.
Apenas como guia, segue um printscreen da estrutura de diretórios deste projeto:
Estrutura de Diretórios.
Instale primeiramente o plugin do silverlight na sua máquina.
Para utilizar o Silverlight com o Visual Studio 2005 é necessário instalar o SP1 do Visual Studio. Recomendo ter o framework mais atual. (http://silverlight.net/GetStarted/)O Silverlight possui arquivos do tipo xaml. Estes são os arquivos de marcações para ser exibido o Silverlight.
Vamos criar um arquivo Gráfico.xaml, e inserir o código abaixo.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="500" Height="200" Name="MeuGrafico" >
<TextBlock Width="500" Height="23.2" Canvas.Left="0" Canvas.Top="50" Foreground="#000000" Name="NomePagina" />
<!-- Aqui é o Fundo cinza d Grafico -->
<Rectangle StrokeThickness="1" Width="500" RadiusX="17" RadiusY="0" Height="44" Stroke="#46000000">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,-0.409" StartPoint="0.5,1.409">
<GradientStop Color="white" Offset="0.242"/>
<GradientStop Color="whitesmoke" Offset="0.333"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!-- Retangulo com fundo azul do Grafico -->
<Rectangle StrokeThickness="1" RadiusX="17" RadiusY="0" Height="44" Stroke="#46000000" Name="Grafico">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,-0.409" StartPoint="0.5,1.409">
<GradientStop Color="white" Offset="0.242"/>
<GradientStop Color="navy" Offset="0.333"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Canvas>
</Canvas>O Silverlight possui tags do tipo <Canvas>. Esta tag marca nossa área de trabalho. Para este arquivo definimos uma Altura de 200px e uma largura de 500px.
Dentro do Canvas, definimos três Elementos. O primeiro é uma TextBlock, e dois retângulos.
A TextBlock é o elemento que receberá o nome da página que estamos visualizando a estatística. Definimos para ele uma largura, uma altura, uma distância de 50 px do topo do nosso Canvas, um nome "NomePagina", e um fundo branco.
No Silverlight podemos definir formas geométricas, como retângulos, elipses, polígonos, entre outros.
Para gerarmos o gráfico, temos dois retângulos. O Primeiro é o fundo do gráfico, de cor cinza claro (whitesmoke).
O Segundo retângulo é a barra azul do nosso gráfico. A sua largura será variável de acordo com a página que estamos visualizando.
Vamos agora criar o código JavaScript que está por trás do arquivo xaml. Crie um arquivo chamado Grafico.xaml.js.
if (!window.SilverlightJSApplication1)
window.SilverlightJSApplication1 = {};
SilverlightJSApplication1.Scene = function()
{
}
SilverlightJSApplication1.Scene.prototype =
{
handleLoad: function(plugIn, userContext, rootElement)
{
// Atribuo o plugin
this.plugIn = plugIn;
// Acho meu Grafico
var oMeuGrafico = rootElement.children.getItem(0);
// Uma forma de achar um elemento, pelo indice
oMeuGrafico.children.getItem(0).text = label + ' (' + porcentagem + ')%';
// Outra forma de achar o elemento, pelo nome
// Multiplico x 5 Pois meu 100% é 500px;
oMeuGrafico.findName("Grafico").width = (porcentagem * 5);
}
}Este arquivo recebe uma variável porcentagem. (Mais adiante veremos como passar o valor desta variável: porcentagem). O Valor da Porcentagem multiplicamos por 5, pois o nosso 100% é 500px.
O Valor da nossa TextBlock, recebe o nome da página, concatenado com a porcentagem.
Vamos agora criar um arquivo javascript que chama o nosso silverlight, passando como parâmetro a porcentagem o nome da página. Está função é a "createSilverlight". Nesta função passamos alguns parâmetros adicionais como o tamanho do arquivo, a versão que estamos utilizando, o nosso arquivo Grafico.XAML que está o nosso código para o Silverlight, entre outros.
var porcentagem ;
var label;
function createSilverlight( iPorcentagem, sLabel)
{
porcentagem = iPorcentagem;
label = sLabel;
// Crio uma nova cena
var scene = new SilverlightJSApplication1.Scene();
Silverlight.createObjectEx({
source: 'Grafico.xaml',
parentElement: document.getElementById('SilverlightPlugInHost'),
id: 'SilverlightPlugIn',
properties: {
width: '500',
height: '500',
background:'#ffffff',
isWindowless: 'false',
version: '1.0'
},
events: {
onError: null,
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
},
context: null
});
}
if (!window.Silverlight)
window.Silverlight = {};
Silverlight.createDelegate = function(instance, method) {
return function() {
return method.apply(instance, arguments);
}
}
Adicione o arquivo padrão do silverlight.js. Este arquivo está contido no fonte deste projeto.
Agora que criamos os nossos arquivos Silverlight, vamos criar a nossa interface em ASP.NET que chama os arquivos do Silverlight, e lê o nosso XML, criado na Parte A deste artigo.
Crie a página "Relatorio.aspx" . Nesta página vamos criar o código abaixo:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Relatorio.aspx.vb" Inherits="Relatorio" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Relatório de Acesso</title>
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript" src="base.js"></script>
<script type="text/javascript" src="Grafico.xaml.js"></script>
</head>
<body>
<form id="form1" runat="server">
<h3>
Relatório de acesso do meu site com Silverlight e XML!
</h3>
Minhas Páginas:
<asp:DropDownList runat="server" ID="ddlPaginas" AutoPostBack="true">
</asp:DropDownList>
<br /> <br />
<div id="SilverlightPlugInHost">
<asp:Literal runat="server" ID="litSilverlight"></asp:Literal>
</div>
</form>
</body>
</html>Note que estamos chamando os arquivos criados anteriormente em JavaScript (Silverlight.js, base.js, Grafico.xaml.js). Adicionamos uma Div com o ID SilverlightPlugInHost, e um literal, que vamos usar para chamarmos nossa função do Silverlight, com os parâmetros de porcentagem, e nome da Página.
Por fim, vamos criar o código por trás do funcionamento da Página Relatório.aspx. Abra o seu arquivo Relatorio.aspx.vb.
Inicialmente vamos criar o método que lê o XML criado na Parte A deste Artigo.
''' <summary>
''' sub que lê o XML
''' </summary>
''' <remarks></remarks>
Sub lerXML()
' Exemplo didático de como criar uma estrutura de tabela
' Pode ser implementado como você preferir.
dt.TableName = "Log"
dt.Columns.Add("Data")
dt.Columns.Add("IP")
dt.Columns.Add("URL")
dt.Columns.Add("Query")
dt.Columns.Add("Browser")
dt.Columns.Add("URLAnterior")
' leio o XML
dt.ReadXml(sCaminhoCompleto)
End SubEm seguida, criamos o método que popula da nossa DropDownList com as páginas no XML.
''' <summary>
''' Sub que carrega o Combo com as minhas páginas
''' </summary>
''' <remarks></remarks>
Sub carregarCombo()
If System.IO.File.Exists(sCaminhoCompleto) Then
Dim bExiste As Boolean = False
' Faço um for, para cada página aparecer apenas uma vez
For Each dr As Data.DataRow In dt.Rows
bExiste = False
For Each oItem As ListItem In ddlPaginas.Items
If oItem.Value = dr("URL") Then
bExiste = True
Exit For
End If
Next
' Se não existir, eu adiciono
If Not bExiste Then
ddlPaginas.Items.Add(New ListItem(dr("URL"), dr("URL")))
End If
Next
End If
ddlPaginas.Items.Insert(0, New ListItem("Minhas Paginas", ""))
End SubQuando o usuário mudar o Valor da DropDown List, vamos criar em tempo de execução o JS so nosso Silverlight, passando como parâmetro a página selecionada, e a porcentagem.
''' <summary>
''' Quando eu mudar minha combo, eu regero o JavaScript do Silverlight
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub ddlPaginas_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlPaginas.SelectedIndexChanged
Dim dtResultado As Data.DataRow()
Dim iTotal As Int32
Dim iPorcent As Integer
' Trato só para se voltar para o selecione
If ddlPaginas.SelectedValue <> "" Then
dtResultado = dt.Select("URL = '" & ddlPaginas.SelectedValue & "'")
iTotal = UBound(dtResultado)
If dt.Rows.Count > 0 Then ' Verificação para não ter divisão por zero
iPorcent = Math.Round((iTotal / dt.Rows.Count) * 100)
' Aqui eu atribuo minha função JavaScript que chama o Silverlight
litSilverlight.Text = "<script type=""text/javascript"">" & vbCrLf & _
"createSilverlight('" & iPorcent & "', '" & ddlPaginas.SelectedValue & "');" & vbCrLf & _
"</script>"
End If
Else
litSilverlight.Text = "<strong>Selecione a página</strong>"
End If
End Sub
Por fim, criamos a função de load, que chamará nosso método de carregar combo.
Private sCaminhoArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("CaminhoArquivoLog").ToString
Private sArquivoLog As String = System.Configuration.ConfigurationManager.AppSettings("ArquivoLog").ToString
Private sCaminhoCompleto As String = sCaminhoArquivoLog & sArquivoLog
Private dt As New Data.DataTable
''' <summary>
''' Load da página, é chamado sempre que o usuário (re)carrega a página
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Sempre leio o XML
lerXML()
If Not Page.IsPostBack Then
' Carrego minhas paginas do combo
carregarCombo()
End If
End SubO Silverlight é uma tecnologia bem recente, que com certeza crescerá bastante. Neste artigo procurei fazer um exemplo bem simples, para termos o primeiro contato com a tecnologia.
Clique aqui para dar download no projeto de exemplo.
Forte Abraço.
Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.
Thomas Alexander Semple é engenheiro eletrônico com ênfase em telecomunicações e é líder de projetos da T4W. Com mais de 10 anos de experiência, participa de projetos para empresas dos mais diversos segmentos. A T4W (www.t4w.com.br) é uma empresa de tecnologia onde sua área de desenvolvimento vem atendendo empresas de médio e grande porte em projetos corporativos e especiais. Thomas A. Semple também escreve periodicamente para as revistas .Net Magazine e Web Mobile.
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.