Você está na página 1de 36

Sumrio

04 :. Usando Expresses Regulares


Edio 12 Nmero 12 Ano 03 2009 EDITORES Alexandre Tarifa Diego Nogare Emerson Facunte Sergio Gonalves REVISO Felipe Pocchini Fernanda Sallai MONTAGEM / FORMATAO Milton Carvalhaes EDITORAO E DIAGRAMAO Adriano Almeida COLABORADORES Adriano Luciano Candido Caio Azevedo Diego Nogare Felipe Pocchini Fernanda Sallai Flvio Cezar Canducci Dias Ricardo Jos Alves
Neste artigo veremos como utilizar Expresses Regulares para validar e-mail e CEP.
Por: Fernanda Sallai

07 :. Chamadas de Funes e Mensagens com Javascript


Como criar uma classe de envio de mensagem e Chamada de Funes em Javascript.
Por: Flvio Cezar Canducci Dias

14:. Aplicaes com N camadas em ASP .Net - Parte I


Aplicando conceitos de camadas em ASP.Net
Por: Felipe Pocchini

18:. Implementando Service Broker


Sistema de Fila de Mensagens
Por: Ricardo Jos Alves /Adriano Luciano Candido

Fale com Editor


muito importante para a equipe saber a sua opinio sobre a revista, caso tenha alguma critica, sugesto, ou elogio entre em contato. Caso tenha interesse em publicar um artigo na revista envie o ttulo e um resumo do tema em formato Word.
site@codificandomagazine.net

23 :. Workaround com .NET SAP Connector 2.0.


Mais um artigo de como utilizar o .Net SAP Connetor 2.0. .
Por: Diego Nogare

27:. SQL Reporting Service 2005 Parte II


Continuao do artigo explorando Microsoft SQL Reporting Service 2005
Por: Caio Azevedo

Produzido por:

www.codificando.net

03:. Editorial

36:. .Close ( )

Edio 12 Nmero 12 Ano 03 2009

Editorial
Pessoal, no ms de outubro tivemos bastante novidade com relao ao Codificando .Net, no s na revista, mas como um todo! Eu acredito, de verdade, que o principal fator de sucesso desta revista gratuita so as pessoas que dedicam vrias horas de seus dias para colaborar de forma voluntria para que a mensagem possa ser entregue em todos os cantos do pas (e de fora tambm!). Como todos ns somos de comunidade, nada mais justo do que buscarmos um novo membro pro time na nossa comunidade. Analisamos todos os candidatos, buscando o que mais havia colaborado conosco. Pra nossa alegria, o Felipe Pocchini foi escolhido o novo membro do time.

O Felipe j chegou trabalhando bastante, apesar de originalmente ter sido contratado pra nos ajudar nas revises tcnicas, ele j fez o novo layout do site da revista, e est trabalhando no layout do site dos PodCasts. No menos importante que o novo membro, a galera que j est com a gente no time de fundamental importncia para que o trabalho seja realizado da melhor forma possvel. Agradeo intensamente a todos vocs: Adriano Almeida, Fernanda Sallai, Milton Carvalhaes! Muito obrigado time. Diego Nogare site@codificandomagazine.net

e-magazine

Usando Expresses Regulares


Neste artigo veremos como utilizar Expresses Regulares para validar e-mail e CEP
Por: Fernanda Sallai

Neste artigo aprenderemos como verificar se o formato de email e ou CEP informado pelo usurio correto usando as expresses regulares. OBS: Estou realizando a validao atravs de cdigo gerenciado, mas possvel fazer a mesma validao utilizando componentes do prprio Visual Studio, mas isso no ser abordado neste artigo. Primeiramente. Mas o que so expresses regulares?! Conforme Aurlio Marinho Jargas " uma composio de smbolos, caracteres com funes especiais, que, agrupados entre si e com caracteres literais, formam uma seqncia, uma expresso. Esta expresso interpretada como uma regra, que indicar sucesso se uma entrada de dados qualquer estiver de acordo com essa regra, ou seja, obedecer exatamente a todas as suas condies". Vamos prtica?! A parte de criar um projeto no ser abordada neste artigo. Neste exemplo usarei uma aplicao Windows Forms e a lingua-

gem C#, mas claro que poder ser utilizado em qualquer tipo de aplicao e linguagem fazendo algumas adaptaes conforme sua escolha. Criaremos o layout conforme a figura 1.

Figura 1. Criando layout do formulrio

Codificando.net e-magazine

No evento Click do boto btnVerificar inclua o cdigo conforme listagem 1.


private void btnVerificar_Click (object sender, EventArgs e) { //Se os campos informados esto no formato incorreto if (!ValidarCampos()) { //Exibe uma mensagem informando o campo com formato invlido MessageBox.Show (mensagem, "ATENO", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }

/// <summary> /// Validar formatos dos campos /// </summary>


Out / Nov - 2009

www.codificando.net

Usando Expresses Regulares

e-magazine

/// <returns>True se o campo est com formato correto e false se est incorreto</returns> private bool ValidarCampos() { bool formatoCorreto = true; //Se o txtEmail.Text no estiver vazio if (txtEmail.Text != string.Empty) { //Se o formato de email estiver incorreto if (!IsValidEmail (txtEmail.Text)) { formatoCorreto = false; mensagem = "O e-mail informado invlido. Por favor verifique."; txtEmail.Focus(); return formatoCorreto; } } //Se o txtCep.Text no estiver vazio if (txtCep.Text != string.Empty) { //Se o formato de cep estiver incorreto if (!ValidaCep (txtCep.Text)) { formatoCorreto = false; mensagem = "O CEP informado invlido. Por favor verifique."; txtCep.Focus (); return formatoCorreto; } } return formatoCorreto; } /// <summary> /// Validar o formato do CEP /// </summary>

/// <param name="cep">CEP informado pelo usurio</param> /// <returns>True se o formato do cep estiver correto e false se est incorreto</returns> private bool ValidaCep (string cep) { //Se a quantidade de dgitos do cep for igual a 8 if (cep.Length == 8) { //a varivel cep recebe os cinco primeiros dgitos + - + trs ltimos dgitos ex: 09999-999 cep = cep.Substring(0, 5) + "-" + cep.Substring(5, 3); //txtCep.Text recebe o valor da varivel cep txtCep.Text = cep; } //retorna true ou false return System.Text.RegularExpressions.Regex .IsMatch(cep, ("[0-9]{5}-[0-9] {3}")); } /// <summary> /// Validar o formato do e-mail /// </summary> /// <param name="email">E -mail informado pelo usurio</ param> /// <returns>True se o formato do e-mail estiver correto e false se est incorreto</ returns> private bool IsValidEmail (string email) { //retorna true ou false return System.Text.RegularExpressions.Regex .IsMatch(email, ("(?<user>[^@]+)@ (?<host>.+)")); } }
Listagem 1. Criando codificao do boto btnVerificar.

Codificando.net e-magazine
|

Ao executar o cdigo e informar dados no formato invlido (figura 2) exibida as mensagens (figura 3 e 4) conforme o

www.codificando.net

Out / Nov - 2009

Usando Expresses Regulares


formato do campo informado pelo usurio incorretamente. 2. (?<user>[^@]+)@(?<host>.+) a. ( ) definem um grupo

e-magazine

b. ? opcional. Ocorre 0 ou 1 vez. c. <user> - nome usurio d. [^@] lista negada. Neste caso pode ocorrer de tudo exceto o @. e. + - mais. Tem que ter. Ocorre 1 ou mais vezes. Neste caso vai ter que existir 0 segundo @ da expresso acima. f. <host> - provedor do email g. . casa com qualquer coisa. Por exemplo .com
Figura 3. Exibindo mensagem do e-mail com formato invlido.

Figura 2. Informando formatos invlidos de email e CEP.

Espero que tenham gostado e at o prximo artigo... Fernanda Sallai


(fernanda.sallai@codificando.net) cursa o 4 ano de Sistemas de Informao na FICS Faculdades Integradas Campos Salles, reside em So Paulo SP, atualmente realiza estgio na empresa Pakua IT Systems no desenvolvimento de aplicaes web e escreve periodicamente em seu blog. www.fernandasallai.com

Codificando.net e-magazine

Figura 4. Exibindo mensagem do CEP com formato invlido.

Explicando sobre as expresses regulares que esto no mtodo acima: 1. [0-9]{5}-[0-9]{3} a. [0-9] uma lista de itens permitidos. Nesse caso de nmeros entre 0 at 9 b. {5} neste caso especifica a quantidade de itens. Neste caso ir aparecer 5 ocorrncias.

www.codificando.net

Out / Nov - 2009

e-magazine

Chamadas de Funes e Mensagens em Javascript


Nesse artigo mostrarei como criar uma classe de envio de mensagem em Javascript que tambm ter suporte para chamar funes de javascript que estejam na pgina.
Por: Flvio Cezar Canducci Dias

Criaremos uma aplicao Class Library chamada JvScript usando a linguagem Visual Basic conforme as figuras 1 e 2.

O prximo passo adicionar ao projeto duas referncias que sero de extrema importncia: System.Web e System.Web.Extensions.Veja como adicion -las nas figuras 4 e 5:

Figura 1. Criando um novo Projeto.

Codificando.net e-magazine

Figura 4. Adicionando referncias

Figura 2. Configurando o projeto.

O projeto criado ser exibido conforme figura 3 e renomeie a Class1.vb para Alerta.vb veja figura 3.

Figura 3. Exibindo estrutura do projeto criado. Figura 5. Selecionando as referncias que sero adicionadas no projeto.

www.codificando.net

Out / Nov - 2009

Chamadas de Funes e Mensagens em Javascript

e-magazine

O Diagrama de Classes um componente visual para construes de classes no Visual Studio. Veja na figura 6 como adicion-lo no nosso projeto e na figura 7 a visualizao do diagrama.

A classe Chaves.vb ser composta por apenas um campo (de nome _chave) e uma propriedade (de nome Chave) . O motivo principal de criar essa classe Chaves.vb, que a Alerta.vb e a classe Funcao.vb herdaram os mtodos. Na figura 9 e 10 visualize a classe Chaves.vb criada.

Figura 6. Adicionando diagrama de classes

Figura 7. Visualizando o diagrama de classes Figura 9. Visualizando a classe Chaves.Vb.

Vamos agora criar todas as classes e mtodos do projeto. Veja como adicionar uma classe na figura 8.

Codificando.net e-magazine

Figura 10. Visualizando a codificao da classe Chaves.vb.

Figura 8. Adicionando uma nova classe no diagrama.

O propsito desse projeto no construir passo a passo a classes e sim demonstrar o poder e a flexibilidade que elas traro para o desenvolvimento de pginas em .

www.codificando.net

Out / Nov - 2009

Chamadas de Funes e Mensagens em Javascript


ASPX. A figura 10 exibe o nosso Diagrama de Classes finalizado com as suas heranas, agregaes e sobrecargas de mtodos e a listagem 1 exibe a codificao gerada na criao do diagrama.

e-magazine

Abaixo tem os cdigos fontes gerados em nosso Diagrama de Classes, mas, que tambm foram modificados para sua adequao a esse projeto.

Figura 11. Exibindo o diagrama de classes.

Classe Alerta Public Class Alerta Inherits Chaves Private _alerta As String Public Sub New() Chave = "" Alerta = "" End Sub Public Property Alerta() As String Get Return _alerta End Get Set(ByVal value As String) _alerta = value End Set End Property End Class Classe Chave Public Class Chaves Private _chave As String Public Sub New() Chave = "" End Sub Public Property Chave() As String Get Return _chave End Get Set(ByVal value As String) _chave = value End Set End Property End Class

Classe Funcao Public Class Funcao Inherits Chaves Private _funcao As String Public Sub New() Chave = "" Funcao = "" End Sub Public Property Funcao() As String Get Return _funcao End Get Set(ByVal value As String) _funcao = value End Set End Property End Class

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

Chamadas de Funes e Mensagens em Javascript


Classe ClienteJS Imports System Imports System.Web Imports System.Web.UI Public Class ClienteJS Private _alerta As New Alerta Private _funcao As New Funcao Private _pagina As Page Public Sub New() Alertas = _alerta Funcoes = _funcao End Sub Public Sub New(ByVal _alerta_ As Alerta) Alertas = _alerta End Sub Public Sub New(ByVal _pagina As Page, ByVal _alerta_ As Alerta) Alertas = _alerta Pagina = _pagina End Sub Public Sub New(ByVal _funcao_ As Funcao) Funcoes = _funcao_ End Sub Public Sub New(ByVal _pagina As Page, ByVal _funcao_ As Funcao) Funcoes = _funcao_ Pagina = _pagina End Sub Public Property Alertas() As Alerta Get Return _alerta End Get Set(ByVal value As Alerta) _alerta = value End Set End Property Public Property Funcoes() As Funcao Get Return _funcao End Get Set(ByVal value As Funcao) _funcao = value End Set End Property Public Property Pagina() As Page Get Return _pagina End Get Set(ByVal value As Page) _pagina = value End Set End Property Public Sub EnviarAlerta() EnviarAlerta(Pagina) End Sub Public Sub EnviarAlerta(ByVal _pagina As Page) If

e-magazine

_pagina.ClientScript.IsClientScriptBlo ckRegistered(Alertas.Chave) = False Then _pagina.ClientScript.RegisterClientScr iptBlock(_pagina.GetType, Alertas.Chave, "alert('" & Alertas.Alerta & "');", True) _pagina.ClientScript.IsClientScriptBlo ckRegistered(Alertas.Chave) End If End Sub Public Sub EnviarAlerta(ByVal _pagina As Page, ByVal _alerta As Alerta) Alertas = _alerta Pagina = _pagina EnviarAlerta() End Sub Public Sub EnviarAlerta(ByVal _pagina As Page, ByVal _chave As String, ByVal _alerta As String) Alertas.Alerta = _alerta Alertas.Chave = _chave Pagina = _pagina EnviarAlerta() End Sub Public Sub EnviarFuncao() EnviarFuncao(Pagina) End Sub Public Sub EnviarFuncao(ByVal _pagina As Page) If _pagina.ClientScript.IsClientScriptBlo ckRegistered(Funcoes.Chave) = False Then _pagina.ClientScript.RegisterClientScr iptBlock(_pagina.GetType, Funcoes.Chave, Funcoes.Funcao & ";", True) _pagina.ClientScript.IsClientScriptBlo ckRegistered(Funcoes.Chave) End If End Sub Public Sub EnviarFuncao(ByVal _pagina As Page, ByVal _funcao As Funcao) Funcoes = _funcao Pagina = _pagina EnviarFuncao() End Sub Public Sub EnviarFuncao(ByVal _pagina As Page, ByVal _chave As String, ByVal _funcao As String) Funcoes.Chave = _chave Funcoes.Funcao = _funcao Pagina = _pagina EnviarFuncao() End Sub End Class

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

10

Chamadas de Funes e Mensagens em Javascript


lasse ScriptManagerJS Imports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.ScriptManager Public Class ScriptManagerJS Private _alerta As New Alerta Private _funcao As New Funcao Private _pagina As Page Public Sub New() Alertas = _alerta Funcoes = _funcao Pagina = _pagina End Sub Public Sub New(ByVal _alerta_ As Alerta) Alertas = _alerta_ End Sub Public Sub New(ByVal _pagina As Page, ByVal _alerta_ As Alerta) Alertas = _alerta_ Pagina = _pagina End Sub Public Sub New(ByVal _funcao_ As Funcao) Funcoes = _funcao_ End Sub Public Sub New(ByVal _pagina As Page, ByVal _funcao_ As Funcao) Funcoes = _funcao_ Pagina = _pagina End Sub Public Property Alertas() As Alerta Get Return _alerta End Get Set(ByVal value As Alerta) _alerta = value End Set End Property Public Property Funcoes() As Funcao Get Return _funcao End Get Set(ByVal value As Funcao) _funcao = value End Set End Property Public Property Pagina() As Page Get Return _pagina End Get Set(ByVal value As Page) _pagina = value End Set End Property Public Sub EnviarAlerta() EnviarAlerta(Pagina) End Sub Public Sub EnviarAlerta(ByVal _pagina As Page)

e-magazine

If _pagina.ClientScript.IsClientScriptBl ockRegistered(Alertas.Chave) = False Then ScriptManager.RegisterClientScriptBlock (_pagina, _pagina.GetType, Alertas.Chave, "alert('" & Alertas.Alerta & "');", True) _pagina.ClientScript.IsClientScriptBl ockRegistered(Alertas.Chave) End If End Sub Public Sub EnviarAlerta(ByVal _pagina As Page, ByVal _alerta As Alerta) Alertas = _alerta Pagina = _pagina EnviarAlerta() End Sub Public Sub EnviarAlerta(ByVal _pagina As Page, ByVal _chave As String, ByVal _alerta As String) Alertas.Chave = _chave Alertas.Alerta = _alerta Pagina = _pagina EnviarAlerta() End Sub Public Sub EnviarFuncao() EnviarFuncao(Pagina) End Sub Public Sub EnviarFuncao(ByVal _pagina As Page) If _pagina.ClientScript.IsClientScriptBl ockRegistered(Funcoes.Chave) = False Then ScriptManager.RegisterClientScriptBlock (_pagina, _pagina.GetType, Funcoes.Chave, Funcoes.Funcao & ";", True) _pagina.ClientScript.IsClientScriptBl ockRegistered(Funcoes.Chave) End If End Sub Public Sub EnviarFuncao(ByVal _pagina As Page, ByVal _funcao As Funcao) Funcoes = _funcao EnviarFuncao(_pagina) End Sub Public Sub EnviarFuncao(ByVal _pagina As Page, ByVal _chave As String, ByVal _funcao As String) Funcoes.Chave = _chave Funcoes.Funcao = _funcao Pagina = _pagina EnviarFuncao() End Sub End Class

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

11

Chamadas de Funes e Mensagens em Javascript

e-magazine

Explicarei o que cada classe faz para um melhor entendimento: Classe Chaves.vb: ser uma classe de apoio pois, o seu motivo de existir ser que outras duas classes (Alerta e Funcao) herdaro (abstrao de dados: Especializao) a sua nica propriedade Chave. A propriedade Chave do tipo String. Classe Alerta.vb: ter as propriedades Alerta e Chave (herana da classe Chaves.vb) e as duas so do tipo String. Essa classe ser utilizada como tipo de dado para as classes ClienteJS.vb e ScriptManageJs.vb (abstrao de dados: Agregao). Classe Funcao.vb: a classe Funcao.vb ter as propriedades Funcao e Chave (herana da classe Chaves.vb) e as duas so do tipo String. Essa classe ser utilizada como tipo de dado para as classes ClienteJs e ScriptManagerJs.vb (abstrao de dados: Agregao).

executa dentro dos famosos UpdatePanel do Ajax, ou seja, a diferena da classe ClienteJs.vb e ScriptManagerJs que a ScriptManagerJs voc vai trabalhar junto com o ScriptManager e o ClienteJs.vb no precisa. Criaremos um novo projeto ASP.NET AJAX- Enabled Web Site onde usaremos a DLL compilada do nosso projeto JvScript ( a DLL est localizada na pasta bin\Debug\JvScript.dll). Iremos realizar dois testes: um rodando dentro de um UpdatePanel e outro fora do UpdatePanel. A figura 11 exibe o layout da pgina.

Figura 11. Exibindo o layout da pgina.

Codificando.net e-magazine

Classe ClienteJs.vb:a classe ClienteJS.vb ter as propriedades Pagina que do tipo Page, e dois tipos de dados que sero das classes Alerta.vb e Funcao.vb respectivamente Alertas (do tipo de dado Alerta - Classe Alerta.vb) e Funcoes (do tipo de dados Funcao - Classe Funcao.vb). Essa classe possuir mtodos de envio de mensagens com vrias sobrecargas de mtodos que mostrar alerta ou chamar outras funes em Javascript. Classe ScriptManagerJS: a classe ScriptManagerJS praticamente igual classe ClienteJS.vb tendo a diferena que ela

Antes de fazer as codificaes nos botes vamos fazer referenciar a nossa DLL (JvScript.dll). Veja na figura 12 a estrutura do projeto.

Figura 12. Visualizando a estrutura do projeto.

Agora vamos fazer as duas rotinas dos botes do nosso projeto Web um que est

www.codificando.net

Out / Nov - 2009

12

Chamadas de Funes e Mensagens em Javascript

e-magazine

dentro do UpdatePanel ( esse ta com o nome de Dentro do UpdatePanel) e o outro fora do UpdatePanel(esse ta com o nome Fora do UpdatePanel), mas, antes disso na tag Head da pgina vamos criar um funo bsica em Javascript conforme a listagem 2.

Listagem 2. Incluindo funo em javascript. Figura 11. Visualizando o resultado aps o clique do boto BT_ForaUP e BT_DentroUP.

D um duplo clique no Boto Fora do UpdatePanel e vamos criar sua rotina exemplo de como utilizar a nossa DLL criada para emitir alertas e funes de Javascript. Observe a listagem 3 e 4 a codificao do evento click dos botes e na figura 12 o resultado aps o clique dos botes:

Bom pessoal esse um simples exemplo de como trabalhar com Classes no Visual Studio. Flvio Cezar Canducci Dias
fulviocanducci@hotmail.com) Sou estudante do curso de Sistemas de Informao da Faculdade UNIESP Presidente Prudente e programador Web a 5 anos com as linguagem PHP, ASP, ASP.NET(C# e vb.Net). Configuro Servidores 2003 Server para rodar aplicaes Web (IIS e FTP) e Active Directory (configuraes intermedirias)

Codificando.net e-magazine

Listagem 3. Incluindo codificao no boto BT_ForaUP.

Listagem 4. Incluindo codificao no boto BT_DentroUP.

www.codificando.net

Out / Nov - 2009

13

e-magazine

Aplicaes em N Camadas com ASP .NET - PARTE I


Aplicando conceitos de camadas em ASP.Net
Por: Felipe Pocchini

Aplicaes em n camadas so desenvolvidas de forma distribuda, onde cada camada tem sua responsabilidade dentro do contexto. Para um modelo de aplicao Web so comumente usadas 3 camadas: Presentation(Apresentao), Business (Lgica do negcio) e Data(Responsvel pelas transaes com o banco da dados). Para este artigo, iremos usar uma camada a mais chamada Entity(nossa biblioteca de entidades). Vamos criar um controle de clientes simples, onde nosso objetivo focar no aprendizado de aplicaes em n camadas.

Figura 2: Criando uma soluo em branco.

Com a soluo criada, hora de criar as camadas. Vamos comear com a camada que ser a biblioteca de entidades. nela que definiremos todas as entidades que vamos usar nesse exemplo. Para adicionar a camada ao projeto, vamos clicar com o boto direito na soluo e adicionar um novo projeto.

Codificando.net e-magazine

Figura 1: Exemplo de aplicao em N Camadas.

Para comear o desenvolvimento, iremos abrir o Visual Studio 2008 ou 2010 e criar um novo projeto do tipo Blank Solution.

Figura 3: Adicionando um novo projeto a soluo (Add > New Project).

Esse novo projeto vai ser do tipo Class

www.codificando.net

Out / Nov - 2009

14

Aplicaes em N Camadas com ASP .NET - PARTE I

e-magazine

Library, pois ser apenas a biblioteca de entidades.

Pronto, com o diagrama de classes aberto vamos criar a classe Cliente de maneira muito fcil:

Figura 4: Projeto do tipo Class Library.

Com o projeto adicionado a soluo, podemos agora trabalhar na entidade principal que ser a classe Cliente.
Figura 7: Adicionando uma nova classe ao diagrama (Add > Class).

Essa a visualizao da classe Cliente dentro do diagrama.


Figura 5: Projeto criado.

Por padro, j criada no projeto uma nova classe onde voc poder delet-la, pois iremos utilizar um timo recurso do Visual Studio chamado View Class Diagram, responsvel em gerenciar as classes do projeto conforme mostra a figura a baixo:

Codificando.net e-magazine

Figura 8: Visualizao da classe Cliente dentro do diagrama.

Figura 6: Visualizando o diagrama de classes da camada de entidades (View Class Diagram).

Dando continuidade, iremos adicionar os atributos e as propriedades necessrias para manipular a entidade Cliente. Como o foco estudar aplicaes em n camadas, vamos trabalhar com atributos simples pra no prolongar muito nosso tempo. Mais uma vez vamos contar com recursos do Visual Studio para facilitar nossa vida:

www.codificando.net

Out / Nov - 2009

15

Aplicaes em N Camadas com ASP .NET - PARTE I

e-magazine

Crie mais esses atributos seguindo os passos acima: cpf, email, id, telefone.

Para visualizar o cdigo da entidade Cliente, basta dar um duplo clique na classe.
using System; using System.Collections.Generic; using System.Text; namespace NTier.Entity { public class Cliente { /// <summary> /// Atributos /// </summary> #region Atributos private private private private private int id; string nome; string cpf; string email; string telefone;

Figura 9: Adicionando atributos na classe Cliente (Add > Field).

Crie mais esses atributos seguindo os passos acima: cpf, email, id, telefone. Vamos encapsular os atributos para manter a segurana na persistncia das entidades do projeto.

#endregion /// <summary> /// Propriedades /// </summary> #region Propriedades public int Id { get { return id; } set { id = value; } }

Figura 10: Encapsulando os atributos da classe Cliente (Add > Encapsulate Field > Ok > Apply).

Faa isso para todos os atributos utilizados na entidade Cliente. O resultado final ser esse:

public string Nome { get { return nome; } set { nome = value; } } public string Cpf { get { return cpf; } set { cpf = value; } } public string Email { get { return email; } set { email = value; } } public string Telefone { get { return telefone; } set { telefone = value; } } #endregion

Codificando.net e-magazine

Figura 11: Classe Cliente com todos os atributos e propriedades definidas.

www.codificando.net

Out / Nov - 2009

16

Aplicaes em N Camadas com ASP .NET - PARTE I

e-magazine

} }

Com a classe Cliente definida, temos nossa camada de entidades concluda utilizando apenas uma entidade nesse exemplo. Na segunda parte desse artigo vamos criar a camada de dados (Data) que ficar responsvel pelas transaes SQL com o banco de dados. Participe desse artigo deixando seu comentrio. http://www.desenvolvendoparaweb.net/ group/aspnet Para saber mais: http://msdn.microsoft.com/pt-br/library/ bb384398.aspx At a prxima, grande abrao a todos. Felipi Pocchini
Graduado em Cincia da Computao pela Universidade Jos do Rosrio Vellano (UNIFENAS), em Alfenas MG, trabalha com desenvolvimento de aplicaes Web e Windows Forms utilizando a tecnologia .Net. Moderador da comunidade Desenvolvendo para Web, colaborador da comunidade Codificando.Net e mantm o blog www.felipepocchini.net.

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

17

e-magazine

Implementando o Service Broker


Sistema de filas de Mensagens
Por: Ricardo Jos Alves /Adriano Luciano Candido

O SQL Server 2005 introduziu o Service Broker, um sistema de filas de mensagens para aplicaes distribudas garantindo que todas as mensagens persistam e so recebidas mesmo quando ocorrem falhas no sistema possibilitando uma nova gerao de aplicaes altamente escalveis. Os desenvolvedores de software criam a maioria das aplicaes usando processamento seqencial e sncrono. Neste modelo a transao iniciada, o dado bloqueado (para evitar o uso por outras transaes), as alteraes so efetuadas e o dado desbloqueado. Isto funciona bem para certas aplicaes, mas existem aplicaes as quais necessitam de consistncia para operaes que envolvem vrios bancos de dados, plataformas e at mesmo outras empresas. Muitas vezes estas transaes simplesmente enviam alguma requisio de processamento e no exigem um retorno imediato de resposta, pois tm a garantia de suas requisies serem processadas to breve quanto possvel. Embora essas transaes sejam assncronas, no corremos o risco de quebra de integridade dos dados, pois todas as requisies so colocadas em uma fila transacional, ou seja, esta fila de requisi-

es pode ser modificada e as requisies j disparadas so perfeitamente gerenciadas pelo Service Broker, podendo ser retiradas e modificadas. Desta forma, mesmo em caso de falha no sistema, teremos todas as transaes preservadas pelo Service Broker em uma tabela e elas sero aplicadas to logo quanto possvel garantindo que as mensagens envolvidas no processo sejam corretamente formatadas, entendidas e processadas pelas aplicaes que as enviam e recebem. Com este trabalho, no h um consumo de recursos geradores de esperas que impactem na performance da aplicao e a segurana tem um nvel de confiabilidade maior. As partes envolvidas, ou seja, as que enviam e recebem, so os endpoints. A implementao fsica de um endpoint so os bancos de dados envolvidos. O Service Broker a ponte de envio e recepo de dados entre os endpoints. O endpoint que envia o initiator e o endpoint receptor o target. O gerenciamento desta comunicao pelo Service Broker chamado de conversation, a troca de dados entre os endpoints, cujo tipo um dialog, ou seja, a comunicao entre dois endpoints. Os objetos que compem o Service Broker so:

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

18

Implementando o Service Broker

e-magazine

Queues, que so as tabelas onde as mensagens (messages) so armazenadas. a estrutura de armazenamento usada para armazenar as mensagens a serem processadas; Services est atrelado a um queue e a camada que abstrai o armazenamento fsico, isolando os queues, impondo regras na conversao permitida atravs dos contracts; Contracts, que a lista de message types que podem ser enviadas e recebidas; Message types, tipos de mensagem suportados e formatao que garante a aceitao destas mensagens.

CRIANDO UMA MESSAGE TYPE Vamos criar duas message types com validao WELL_FORMED_XML, conforme mostrado na Figura 2.

Figura 2 Criando uma message type

HABILITANDO O SERVICE BROKER O Service Broker vem desabilitado por padro, por no ser necessrio execuo principal do SQL Server 2005. Atravs do SQL Server Management Studio, insira o comando conforme Figura 1. Utilizaremos como banco de dados o AdventureWorks. Atente para as nomenclaturas, que so case-sensitive.

Os tipos de message types so: NONE qual aceita qualquer dado em qualquer formato no corpo da mensagem; EMPTY fora o corpo da mensagem a no ter dado nenhum;

Codificando.net e-magazine

WELL_FORMED_XML permitido apenas um corpo de mensagem em formato XML; VALID_XML WITH SCHEMA COLLECTION permitido apenas um corpo de mensagem em formato XML, mas o documento checado frente a um schema collection.

CRIANDO UM CONTRACT Vamos criar um contract para as duas messages criadas anteriormente, conforme Figura 3.

Figura 1 Habilitando o Service Broker

www.codificando.net

Out / Nov - 2009

19

Implementando o Service Broker

e-magazine

sero usados para possibilitar que um ID de produto seja enviado a outro banco de dados e tenha uma fatura (CDM) retornada, conforme Figura 5.

Figura 3 Criando um contract

Este contract vai restringir os dois tipos de mensagens em uma conversa em particular, proporcionando um canal onde as entradas e sadas da conversation estaro completamente definidos. CRIANDO MESSAGE QUEUES Neste passo vamos criar duas queues: a QueueCDMProdutoID e QueueCDMResultado. CDM no nome a abreviao de ContaDoMaterial, a fatura em si. Desta forma estaremos criando a estrutura de armazenamento das messages, conforme a Figura 4.

Figura 5 Criando dois services

CRIANDO CONVERSATIONS A conversation criada na Figura 6 vai usar os services e o contract criados anteriormente.

Codificando.net e-magazine

Figura 6 : Criando uma conversation

ENVIANDO E RECEBENDO MENSAGENS Criamos, portanto toda a infraestrutura necessria para nosso exemplo de Service Broker. Agora vamos finalmente inserir mensagens na fila (messages no queue criado) utilizando o comando SEND

Figura 4 Criando duas queues

CRIANDO SERVICES Agora criaremos dois services os quais

www.codificando.net

Out / Nov - 2009

20

Implementando o Service Broker

e-magazine

e remover elas usando o comando RECEIVE e repass-las para processamento. Vamos visualizar o contedo das queues, conforme a Figura 7:

Figura 9: Consultando as queues novamente: comeo ...

Figura 7 Consultando as queues

Como podemos observar, as filas esto vazias. Utilizando agora o resultado da consulta no @DialogTeste, vamos enviar uma mensagem do tipo EnviarContaDoMaterialProduto, de acordo com a Figura 8.

Figura 10: Consultando as queues novamente: meio ...

Codificando.net e-magazine

Figura 8 : Consultando as queues

Vamos consultar as queues novamente. Veja os resultados na Figura 9, 10 e 11.

Figura 11 : Consultando as queues novamente: final da linha.

Nas figuras 12, 13 e 14, vamos proceder ao recebimento e visualizar o resultado.

www.codificando.net

Out / Nov - 2009

21

Implementando o Service Broker

e-magazine

Figura 12: Recebendo a mensagem: comeo

Figura 15: Consultando as queues novamente.

Verificamos agora que esto vazias. As Mensagens foram tratadas. Ricardo Jos Alves
Ps graduando em Bancos de Dados e Business Intelligence possui o ttulo de Bacharel em Cincia da Computao com nfase em Anlise de Sistemas e Tcnico em Processamento de Dado, alm de Extenso em Gesto de Projetos Analista de Sistemas e Suporte, atuando h 12 anos em gerncia de projetos de infraestrutura, arquitetura de solues, desenvolvimento de sistemas e gerenciamento de TI na rea bancria e governo.
Figura 13 : Recebendo a message: meio

Adriano Luciano Candido


(adriano.luciano@gmail.com) Ps-graduado no MBA em Gesto Projetos da FGV, certificado nos ttulos da Microsoft: MCPD, MCDBA, MCSD.NET, MCSD, MCAD, MCSA. Instrutor oficial Microsoft e consultor especializado em tecnologia Microsoft e em Gesto de Projeto, atuando a mais de 10 anos no mercado de tecnologia. Palestrante e professor de ps-graduao em diversas universidades de So Paulo. Mantm o site www.adrianoluciano.net

Codificando.net e-magazine

Figura 14 : Recebendo a mensagem: final da linha.

Consultando novamente as duas queues, conforme Figura 15.

www.codificando.net

Out / Nov - 2009

22

e-magazine

Workaround para trabalhar no SAP com o .NET SAP Connector 2.0 atravs de RFC
Mais um artigo de como utilizar o .Net SAP Connetor 2.0
Por: Diego Nogare

Para finalizar a seqncia dos artigos de SAP prometidos, esta publicao contempla a criao de um Workaround para se trabalhar com o .NET SAP Connector 2.0 no Visual Studio 2005 ou Visual Studio 2008. Infelizmente, o componente do SAP para se conectar no VS limitado verso 2003, para isso, criamos uma alternativa para se trabalhar com verses mais atuais do Visual Studio. Este artigo no vai entrar em detalhes de como funciona a parte de Escrita ou de Leitura de RFCs do SAP, se quiserem acompanhar estes processos, foram criados e publicados dois outros artigos sobre estes assuntos. Eles podem ser acessados pelos links abaixo. Leitura: http://www.linhadecodigo.com.br/ Artigo.aspx?id=2343 Escrita: http://www.linhadecodigo.com.br/ Artigo.aspx?id=2354 Da forma que as aplicaes foram construdas nos artigos citados, a idia era apenas exemplificar as formas de trabalho com SAP Connector, no me apeguei

em nenhum momento em desenvolver em camadas. Porm, para se trabalhar com verses mais recentes do VS, ser necessrio desenvolver as partes do Proxy e RFCs do SAP em uma Class Library, e ento gerar uma DLL deste projeto no VS 2003 e importar essa DLL gerada no VS2005 / VS2008. Basicamente este o Workaround que existe para se trabalhar com verses mais recentes do VS utilizando o SAP. Vou iniciar a explicao, mostrando como a gerao da DLL atravs da Class Library do Visual Studio 2003, passando para as referncias das DLLs necessrias no VS2005 / VS2008, e finalizando com a criao da mesma aplicao de leitura do SAP criada anteriormente, mas utilizando as verses mais recentes do VS. A gerao da DLL, consiste em criar um novo projeto do tipo Class Library dentro da Solution e realizar toda a parte de incluso do Proxy (onde sero inseridas as RFCs) dentro deste novo projeto. Veja a Figura 1, a Solution Explorer com o projeto de Class Library.

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

23

Workaround com o .NET SAP Connector 2.0

e-magazine

Figura 2: Solution Explorer do VS2008.

Figura 1: Solution Explorer do VS2003, com a Class Library e seus arquivos.

Agora que a Solution foi criada, hora de adicionar as referncias necessrias para trabalhar com a DLL gerada pela Class Library do VS2003 para utilizar as RFCs do SAP. So necessrias trs novas referncias para a nova aplicao funcionar, as referncias so: 1. DLL da Class Library gerada. No exemplo, chamada de interfaceSAP.dll; DLL do SAP Connector 2.0, que est na pasta de instalao do SAP Connector, geralmente fica dentro de C:\Program Files\SAP\SAP .NET Connector 2.0 \SAP.Connector.dll; Referncia do prprio .Net para System.Web.Services, que atravs desta tecnologia que o .Net se conecta ao SAP usando o componente do SAP Connector.

Aps esta alterao simples no projeto que havia sido criado anteriormente, uma DLL referente sua Class Library compilada e ficar na pasta de build do seu projeto. Agora que j existe a DLL que faz os meios de campo entre o . Net e o SAP, necessrio criar uma aplicao no VS2005 e/ou VS2008 para utilizar esta DLL e conseguir trabalhar com o SAP. Vamos ento, criar um projeto do VS2008 do tipo Windows Forms Application, usarei o C# Express para mostrar que com a verso Express do Visual Studio tambm possvel realizar esta tarefa. Um alerta interessante, que a forma que ser realizado para o VS2008 pode ser utilizada para o VS2005 tambm, sem nenhuma mudana significativa. A Figura 2 exibe o projeto criado no VS2008.

2.

3.

Codificando.net e-magazine
|

Veja a Figura 3 e 4, as referncias do projeto antes e depois de adicionar estas acima.

www.codificando.net

Out / Nov - 2009

24

Workaround com o .NET SAP Connector 2.0

e-magazine

Acompanhe a Listagem 1, os cdigos em C# para acessar o SAP e popular um DataTable.


private void acessarSAP() { try { lendoSAP proxy = new lendoSAP("XXXXX"); BAY2_N2RV_RPCAMTable tabelaSAP = new BAY2_N2RV_RPCAMTable (); proxy.Bay2_N2rv_Rfc_Pxp_Camph(ref tabelaSAP);
Figura 3: Referncias do projeto, antes da adio necessria.

DataTable dt = new DataTable(); dt.Columns.Add("codigo"); dt.Columns.Add("nome"); foreach (BAY2_N2RV_RPCAM linha in tabelaSAP) { DataRow dr = dt.NewRow (); dr["codigo"] = linha.Codca; dr["nome"] = linha.Descc; dt.Rows.Add(dr); } dataGridView1.DataSource = dt; } catch (Exception ex) { MessageBox.Show (ex.Message); } }

Codificando.net e-magazine

Figura 4: Referncias do projeto, depois das adies necessrias.

Listagem 1: Cdigo em C# do mtodo acessarSAP.

Agora que as referncias necessrias foram inclusas no projeto, vamos adicionar um dataGridView no formulrio e provar que a soluo funciona. No mtodo LOAD do formulrio, adicionamos uma chamada para o mtodo acessarSAP() que carregar os dados na grid.

A execuo da aplicao com este cdigo, d um retorno muito prximo do que foi apresentado no artigo de leitura do SAP utilizando o VS2003. Veja a Figura 5, como ficou o resultado da aplicao construda com C# 2008 Express.

www.codificando.net

Out / Nov - 2009

25

Workaround com o .NET SAP Connector 2.0

e-magazine

Acredito que com estas informaes, seja possvel criar as primeiras aplicaes simples com o .Net para se trabalhar com o SAP, coisa que muito comum nas empresas hoje em dia. Diego Nogare
Graduado em Cincia da Computao, Ps-Graduado em Engenharia de Computao com nfase em Desenvolvimento Web com .NET. Colaborador do Portal Linha de Cdigo e da revista SQL Magazine, Lder do grupo de usurios Codificando .NET, Lder dos Microsoft Student Partners [MSP] de So Paulo e Microsoft Most Valuable Professional [MVP] em SQL Server, possui certificaes MCP e MCTS em SQL Server 2005, palestrante em eventos da Microsoft, Codificando .NET e INETA BR, mantm o site: www.diegonogare.net.

Figura 5: Aplicao desenhada com o Visual Studio 2008.

Com a finalizao deste artigo, fechamos o ciclo de 3 artigos sobre o SAP que havia prometido. Foram criados aplicaes para exemplificar a Leitura e Escrita do SAP utilizando o SAP .Net Connector 2.0 no Visual Studio 2003, e um workaround para se trabalhar com o Visual Studio 2005 e 2008.

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

26

e-magazine

Explorando Microsot SQL Reporting Services 2005 Parte II


Continuao do artigo explorando Microsoft SQL Reporting Service 2005
Por: Caio Azevedo

Ol pessoal, continuando nosso artigo sobre o reporting services verso SQL 2005, comearemos a analisar o que chamamos de relatrios, Local Mode, como complemento disponibilizamos a aplicao DEMO no site da comunidade: http://comunidade.codificando.net/, boa leitura.
Figura 2.1 arquitetura local mode

Parte 2 local mode Tambm conhecidos como client-side, os relatrios ditos locais seguem o modelo de desenvolvimento e deploy dos relatrios desenvolvidos como o Microsoft Access e Crystal Reports, onde os relatrios so parte integrante da aplicao.

Caractersticas Os relatrios local mode caracterizamse especialmente por:

A segurana herdada da aplicao que o hospeda.

Codificando.net e-magazine

Arquitetura Nesse modelo de relatrios, todo processamento realizado no cliente. A aplicao responsvel por obter os dados proveniente de qualquer fonte de dados, e o controle ReportViewer apresenta os relatrios. A figura abaixo apresenta a arquitetura dos relatrios Local Mode.

Filtros, ordenao, agrupamento e funes de agregao esto disponveis. Possui formatao rica e inteligente, com imagens, fontes e cores. Interatividade com bookmarks e DocumentMap. Liberdade para interatividade com o usurio final. Integrao com o controle ReportViewer.

www.codificando.net

Out / Nov - 2009

27

Explorando SQL Reporting Services 2005 Parte II

e-magazine

DataSet como estrutura de dados. Arquivos .RDLC (nenhuma instruo de acesso e/ou conexo base de dados).

mos que seguir basicamente os seguintes passos:

E seus elementos fundamentais correlacionam-se conforme a figura abaixo:

Modelagem do repositrio de dados local DataSet estrutura de dados com integridade relacional Elaborao do layout inteligncia do relatrio Header, Body, Footer e

Uso de patterns dados agrupados, tabular, matriz, colunas mltiplas, grficos. Criao de parmetros, formatao condicional Recuperao dos dados, preenchimento do dataset e bind com o relatrio APIs do ADO .NET, Stored Procedures, T-SQL Controle ReportViewer

Figura 2.2 correlao dos elementos

Processo de criao

A partir dessa sesso comearemos a implementar alguns relatrios exemplo, para tal utilizaremos um banco de dados que controla pedidos de uma loja de departamentos. O diagrama abaixo apresenta as tabelas e seus respectivos relacionamentos.

Template de aplicao Para nossos exemplos tomaremos uma aplicao Windows Forms, como apresentado na figura abaixo, atente para as pastas DataSources e Reports, onde respectivamente armazenaremos os DataSets e os relatrios criados.

Codificando.net e-magazine

Figura 2.3 modelo de dados utilizado em nossos exemplos

Retornando ao processo de criao. Para qualquer relatrio implementado tewww.codificando.net

Out / Nov - 2009

28

Explorando SQL Reporting Services 2005 Parte II

e-magazine

Figura 2.4 template de aplicao

Repositrio de dados local - dataset Relatrios so representaes formatadas de um conjunto de registros provenientes de uma consulta em um repositrio de dados. Para os relatrios criados na plataforma do Reporting Services necessrio um DataSet tipado com uma ou mais tabelas que ser a estrutura de dados voltil contendo as informaes dos relatrios, esse dataSet ser preenchido no aplicativo que hospeda o relatrio e ser utilizado na sua formatao. Nota: Um DataSet uma representao na memria de um banco de dados relacional. Maiores informaes consultar a pgina do MSDN especifica sobre essa estrutura de dados em: http://msdn2.microsoft.com/enus/system.data.dataset.aspx.

Podemos criar objetos DataSets de diversas formas, utilizaremos aqui o wizard do Visual Studio para criao dos nossos, bem como das tabelas necessrias para criao dos relatrios. Nesse primeiro exemplo teremos um relatrio tabular com os produtos, suas respectivas categorias, quantidade em estoque e valor unitrio. Ento modelaremos um dataset com uma nica tabela contendo esses campos como mostrado na figura 2.6. A figura 2.5 ilustra a criao de um novo dataset atravs da incluso de um novo item (DataSet) ao projeto.

Figura 2.6 datatable do dataset exemplo

Formatando os relatrios Tipos e Estrutura do Relatrio: Uma vez modelado o DataSet, hora de utiliz-lo para formatar o relatrio. O primeiro passo decidir que tipo de relatrio ser utilizado, por exemplo, se os dados estiverem relacionados a agrupamento de itens a melhor escolha utilizar um relatrio tabular (como no caso desse nosso primeiro exemplo), no entanto relatrios com grficos mais indicado para representar dados sumarizados. A estrutura dos relatrios do RS inclui trs sesses como mostrado

Codificando.net e-magazine

Figura 2.5 criao de datasets

www.codificando.net

Out / Nov - 2009

29

Explorando SQL Reporting Services 2005 Parte II

e-magazine

na figura 2.7:

Figura 2.8 Toolbox Figura 2.7 sesses do relatrio e dataSet

Header: indicado para incluir informaes estticas referentes ao relatrio tais como ttulo, data, logo da empresa e se for o caso, alguns dos parmetros informados pelo usurio. Body: a regio dos detalhes do relatrio, onde os dados provenientes das consultas (armazenados no DataSet), filtros e ordenao sero exibidos. Footer: ideal para outras informaes do relatrio, tais como numero de pgina e informaes de direitos autorais.

A tabela a seguir descreve resumidamente os itens da nossa caixa de ferramentas: Mais informaes sobre os itens mais importantes: Item Poiter Textbox Descrio Seleciona os itens do relatrio. Item mais utilizado da toolbox, exibe informaes provenientes do datasource ou mesmo textos estticos. Line Desenha uma linha como separa-

Codificando.net e-magazine

Report itens Parte fundamental da formatao dos relatrios, os Report Items, disponveis na Toolbox do Visual Studio, funcionam como um canal entre o DataSource e a estrutura do relatrio. Os Report Itens so simples objetos, parecidos com os controles das aplicaes Window e Web Forms, e como tal, o grande segredo do bom uso desses itens conhecer suas propriedades. A figura 2.8 apresenta nossa caixa de ferramentas, onde j utilizamos alguns textbox e um table para formatar as sesses header e body. Table

dor de informaes. Exibe detalhadamente as informaes do relatrio em formato tabular, alm de disponibilizar sesses de cabealho e rodap.

Matrix

Exibe detalhadamente as informaes do relatrio correlacionando linhas e colunas.

Rectangle

Agrupa informaes relacionadas.

www.codificando.net

Out / Nov - 2009

30

Explorando SQL Reporting Services 2005 Parte II

e-magazine

Item List

Descrio Exibe detalhadamente as informaes do relatrio, parecido com o table, no entanto sem tantos recursos tais como as sesses de cabealho e rodap. .

Image

Permite inserir imagens no relatrio.

te no Footer temos informaes sumarizadas dos dados do relatrio. possvel ter mais de uma tabela em um relatrio. muito importante dominar so as propriedades do componente Table (figura 2.9 abaixo), especialmente as tabs Groups, onde possvel configurar diversos agrupamentos das informaes e Filter, onde podemos estabelecer restries aos dados visveis aos usurios.

Subreport

Inclui outro(s) relatrio(s) dentro de um relatrio principal.

Chart

Exibe as informaes do relatrio em formato grfico, com diversas opes de formatao.

Textbox
Figura 2.9 Table Properties

Pode-se dizer que no possvel construir um relatrio sem o Textbox, que sem dvida o componente mais verstil que temos disposio, podendo ser utilizado para diversas utilidades, do ttulo do relatrio no header, exibio de totalizadores, enfim, esse controle usado para exibir textos estticos, fazer bind com data source, campos calculados e expresses. Table o melhor item para relatrios detalhados. Cada tabela possui uma estrutura com sesses Header, Detail e Footer, no confundir com as sesses homnimas do prprio relatrio. O Header indicado para os nomes das colunas, no Details, temos um conjunto de linhas provenientes do datasource e finalmen-

Subreport Um relatrio considerado um subreport quando inserido em outro relatrio. O subrelatrio funciona como um filho do relatrio que o hospeda (parent), tornando os sub-relatrios uma poderosa ferramenta para, por exemplo, implementar o to requisitado conceito master/detail, no entanto preciso ter muita cautela na sua utilizao uma vez que temos perdas considerveis na performance do relatrio. Chart O item Chart, responsvel pela apresentao de informaes numricas em formato de grficos. As ferramentas de grficos foram inseridas nos relatrios do RS pela empresa Dunda Software, estando dispo-

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

31

Explorando SQL Reporting Services 2005 Parte II

e-magazine

sio os tipos mais comuns de grficos pizza, barra e colunas. Formatao Um relatrio no capaz de atrair a ateno dos leitores se suas informaes no forem bem formatadas, dados numricos, por exemplo, so muito melhor compreendidos se devidamente formatados conforme seu tipo numrico inteiro, decimal, moeda ou cientifica, por exemplo, outra informao digna de ateno na sua formatao so os campos referentes data e hora. No processo de criao dos relatrios a formatao feita atravs de uma caixa de dialogo na tab Format das propriedades de uma caixa de texto, vide abaixo figura 2.10.

2. 3.

Garanta que o idioma do relatrio esteja devidamente configurado. Considere o uso de Expressions do tipo, Common Functions Text (Format, FormatCurrency, FormatDateTime, FormatNumber e FormatPercent).

Ainda com o intuito de tornar nossos relatrios atrativos aos usurios, outros atributos das caixas de texto podem ser customizados tais como Fontes, Cor, Alinhamento e Decorao, todos esses, alm de outros atributos podem ser configurados na janela de propriedades do Textbox como mostrado na figura 2.11.

Codificando.net e-magazine

Figura 2.11 Formatao texto

Figura 2.10 Formatao texto

Dicas Importantes: 1. Certifique-se que o tipo do campo esteja devidamente bem definido no DataTable, do contrrio a formatao simplesmente no funciona, e o tipo default dos campos System.String.

E finalmente, dentro da formatao, eis um recurso muito poderoso dos relatrios do RS que a formatao condicional, onde atravs do editor de Expressions, que utiliza um dialeto da linguagem Visual Basic, possvel criar instrues condicionais como a descrita abaixo. =IIf(Fields!

www.codificando.net

Out / Nov - 2009

32

Explorando SQL Reporting Services 2005 Parte II

e-magazine

QT_ESTOQUE.Value<230,"Red","Blue" ) Parametrizao Os relatrios possuem um mecanismo de parametrizao, onde possvel passar informaes a partir do cliente para o relatrio em tempo de execuo. A figura 2.12 ilustra a janela Report Parameters para criao dos parmetros de um relatrio, onde, para acessar basta clicar com o boto direito fora das sesses do relatrio.

Filters), sendo essa funcionalidade, mais indicada para criao de relatrios do tipo master/detail com subreports. Consumindo o relatrio Controle reportviewer Para interao dos relatrios com os clientes, temos o controle ReportViewer, disponvel no visual Studio, em duas verses uma para web e outra para Windows forms. Com ele possvel disponibilizar para as aplicaes um conjunto de funcionalidades tais como:

Exportao dos dados nos formatos Excel e PDF. Suporte a impresso e visualizao de impresso do relatrio . Rica Interatividade com navegao, document map, bookmarks e ordenao. Pesquisa de texto no corpo do relatrio.

Figura 2.12 parmetros

Codificando.net e-magazine

Os parmetros aqui criados podem ser utilizados para formatao condicional ou em expresses. Ao contrrio dos relatrios remote mode, esse modelo de relatrios no tem uma rea para que o usurio selecione ou digite o valor dos parmetros, sendo responsabilidade do cliente providenciar uma interface para coleta dessas informaes e gerar o conjunto de dados devidamente filtrado e carreg-lo no dataSet, os parmetros so pouco utilizados para seleo dos registros, uma vez que mais indicado fazer essa restrio diretamente na pesquisa, ainda que tenhamos como aplicar filtros (propriedade das tabelas, tab

Zoom

O controle capaz de processar e renderizar os relatrios independente do seu modelo, local ou remote. A figura abaixo exibe o controle ReportViewer em ao renderizando um relatrio.

Figura 2.13 reportviewer

www.codificando.net

Out / Nov - 2009

33

Explorando SQL Reporting Services 2005 Parte II


Parte dos recursos do ReportViewer, tais com, Zoom, boto Stop, os botes de pesquisa, de exportao, impresso, dentre outras, podem ser desativados na sua janela de propriedade, como mostrado na figura abaixo. Outra propriedade importantssima do ReportViewer seu ProcessingMode.

e-magazine

Eis um pseudocdigo utilizado em um cliente de um relatrio local mode.


string cnString = "Database=<banco>;Server=<servidor >;User Id=sa;PassWord=sa"; SqlConnection conReport = new SqlConnection(cnString); SqlCommand cmdReport = new SqlCommand(); DataSet dsReport = new WFormReport.DataSources.ProdutosporCatego ria(); conReport.Open(); SqlParameter[] parms = {new SqlParameter("@idCategorias", SqlDbType.VarChar,20)}; parms[0].Value = 1,2,3; cmdReport.CommandType = CommandType.StoredProcedure; cmdReport.Connection = conReport; foreach (SqlParameter parm in parms) cmdReport.Parameters.Add (parm); cmdReport.CommandText = "getProdutosinCategorias"; SqlDataReader drReport = cmdReport.ExecuteReader(); dsReport.Tables[0].Load(drReport); drReport.Close(); conReport.Close(); reportViewer1.LocalReport.ReportPath = ProdutosporCategoria.rdlc"; ReportDataSource rds = new ReportDataSource(); rds.Name = "ProdutosporCategoria_ProdutosEsto que"; rds.Value = dsReport.Tables[0]; reportViewer1.LocalReport.DataSources.Clear (); reportViewer1.LocalReport.DataSources.Add (rds); reportViewer1.RefreshReport();

Figura 2.14 propriedades do reportviewer

Cdigo cliente Uma vez modelados, o relatrio e seu respectivo DataSet, chegou a hora de relacionar tudo, e como j dissemos todo processamento feito no cliente, da obteno dos dados no repositrio para carga do dataset renderizao do relatrio via controle ReportViewer. A figura 2.15 apresenta o fluxo padro de um cdigo cliente para utilizao de relatrios RS em client-mode.

Codificando.net e-magazine

Por hoje isso pessoal, na prxima edio imperdvel, s cdigos, diversos exemplos para boas horas de diverso, grande abrao e at l.
Figura 2.15 fluxo padro do cdigo cliente

www.codificando.net

Out / Nov - 2009

34

Explorando SQL Reporting Services 2005 Parte II

e-magazine

Caio Azevedo
Graduado em Cincia da Computao, Engenharia Civil e louco por cincias exatas em especial fsica e matemtica. Coordenador da Clula Microsoft da Magna Sistema e Arquiteto Microsoft, palestrante, tecno-colunista e instrutor da treinando .net. MCP, MCAD, MCSD, MCTS e MCPD. E fantico pela srie star wars may the force be with you. http://caioazvdo.blogspot.com/

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

35

e-magazine

Open Source
Por: Alexandre Tarifa

modelos de extenso ou integrao com isso nossa vida de desenvolvedor fica cada vez mais fcil. Alm de aplicativos, possvel encontrar diversos frameworks e bibliotecas de desenvolvimento, a prpria Microsoft estimula o site colocando suas bibliotecas e aplicativos livres, como o ASP.NET AJAX e MVC. Um ponto curioso a baixssima quantidade de projetos nacionais... no encontrei praticamente nada... Ser que no temos essa cultura? Eu mesmo, nunca pensei em subir nada por l, porm j deveria ter feito isso. Hoje sempre que tenho a necessidade de desenvolver algo passo por l e na internet em geral e somente quando no encontro nada comea um projeto do zero. Como diz o amigo Ramon Dures: No tem que ser difcil. []s Alexandre Tarifa

Nos tempos do VB 6 e at mesmo no incio da era .Net l para 2002/2003 era muito comum ouvir dizer de aplicaes open source desenvolvidas em JAVA ou outra plataformas disponveis para a comunidade... hoje em dia graas ao site codeplex (www.codeplex.com) e outras iniciativas de comunidade conseguimos encontrar aplicaes com muita qualidade disponveis para download gratuitamente, ou as vezes to barato que podemos considerar gratuito. Para que vou perder o tempo desenvolvendo um frum? Ou at mesmo um blog? Dentro do codeplex temos solues completas e claro, com o cdigo fonte, com isso voc ser capaz de customizar a aplicao e deixar ela redondinha com as necessidades do seu site. Um ponto muito interessante que o pessoal que desenvolve esse tipo de soluo tem pensado cada vez mais em

www.codificando.net

Abril // Maio-2009 Out Nov 2009

36