Sumário

04 :. Usando Expressões Regulares
Edição 12 Número 12 Ano 03 2009 EDITORES Alexandre Tarifa Diego Nogare Emerson Facunte Sergio Gonçalves REVISÃO Felipe Pocchini Fernanda Sallai MONTAGEM / FORMATAÇÃO Milton Carvalhaes EDITORAÇÃO E DIAGRAMAÇÃO Adriano Almeida COLABORADORES Adriano Luciano Candido Caio Azevedo Diego Nogare Felipe Pocchini Fernanda Sallai Fúlvio Cezar Canducci Dias Ricardo José Alves
Neste artigo veremos como utilizar Expressões Regulares para validar e-mail e CEP.
Por: Fernanda Sallai

07 :. Chamadas de Funções e Mensagens com Javascript
Como criar uma classe de envio de mensagem e Chamada de Funções em Javascript.
Por: Fúlvio Cezar Canducci Dias

14:. Aplicações 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 opinião sobre a revista, caso tenha alguma critica, sugestão, ou elogio entre em contato. Caso tenha interesse em publicar um artigo na revista envie o título 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
Continuação do artigo explorando Microsoft SQL Reporting Service 2005
Por: Caio Azevedo

Produzido por:

www.codificando.net

03:. Editorial

36:. .Close ( )

Edição 12 Número 12 Ano 03 2009

Editorial
Pessoal, no mês de outubro tivemos bastante novidade com relação ao Codificando .Net, não só na revista, mas como um todo! Eu acredito, de verdade, que o principal fator de sucesso desta revista gratuita são as pessoas que dedicam várias horas de seus dias para colaborar de forma voluntária para que a mensagem possa ser entregue em todos os cantos do país (e de fora também!). Como todos nós 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 revisões técnicas, ele já fez o novo layout do site da revista, e está trabalhando no layout do site dos PodCasts. Não menos importante que o novo membro, a galera que já está com a gente no time é de fundamental importância para que o trabalho seja realizado da melhor forma possível. Agradeço intensamente a todos vocês: Adriano Almeida, Fernanda Sallai, Milton Carvalhaes! Muito obrigado time. Diego Nogare site@codificandomagazine.net

e-magazine

Usando Expressões Regulares
Neste artigo veremos como utilizar Expressões 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 usuário é correto usando as expressões regulares. OBS: Estou realizando a validação através de código gerenciado, mas é possível fazer a mesma validação utilizando componentes do próprio Visual Studio, mas isso não será abordado neste artigo. Primeiramente. Mas o que são expressões regulares?! Conforme Aurélio Marinho Jargas "É uma composição de símbolos, caracteres com funções especiais, que, agrupados entre si e com caracteres literais, formam uma seqüência, uma expressão. Esta expressão é 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 condições". Vamos à prática?! A parte de criar um projeto não será abordada neste artigo. Neste exemplo usarei uma aplicação Windows Forms e a lingua-

gem C#, mas é claro que poderá ser utilizado em qualquer tipo de aplicação e linguagem fazendo algumas adaptações conforme sua escolha. Criaremos o layout conforme a figura 1.

Figura 1. Criando layout do formulário

Codificando.net e-magazine

No evento Click do botão btnVerificar inclua o código conforme listagem 1.
private void btnVerificar_Click (object sender, EventArgs e) { //Se os campos informados estão no formato incorreto if (!ValidarCampos()) { //Exibe uma mensagem informando o campo com formato inválido MessageBox.Show (mensagem, "ATENÇÃO", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }

/// <summary> /// Validar formatos dos campos /// </summary>
Out / Nov - 2009

www.codificando.net

|

4

Usando Expressões 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 não 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 é inválido. Por favor verifique."; txtEmail.Focus(); return formatoCorreto; } } //Se o txtCep.Text não estiver vazio if (txtCep.Text != string.Empty) { //Se o formato de cep estiver incorreto if (!ValidaCep (txtCep.Text)) { formatoCorreto = false; mensagem = "O CEP informado é inválido. Por favor verifique."; txtCep.Focus (); return formatoCorreto; } } return formatoCorreto; } /// <summary> /// Validar o formato do CEP /// </summary>

/// <param name="cep">CEP informado pelo usuário</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 dígitos do cep for igual a 8 if (cep.Length == 8) { //a variável cep recebe os cinco primeiros dígitos + - + três últimos dígitos ex: 09999-999 cep = cep.Substring(0, 5) + "-" + cep.Substring(5, 3); //txtCep.Text recebe o valor da variável 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 usuário</ 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 codificação do botão btnVerificar.

Codificando.net e-magazine
|

Ao executar o código e informar dados no formato inválido (figura 2) é exibida as mensagens (figura 3 e 4) conforme o

www.codificando.net

Out / Nov - 2009

5

Usando Expressões Regulares
formato do campo informado pelo usuário incorretamente. 2. (?<user>[^@]+)@(?<host>.+) a. ( ) – definem um grupo

e-magazine

b. ? – opcional. Ocorre 0 ou 1 vez. c. <user> - nome usuário 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 expressão acima. f. <host> - provedor do email g. . – casa com qualquer coisa. Por exemplo .com
Figura 3. Exibindo mensagem do e-mail com formato inválido.

Figura 2. Informando formatos inválidos de email e CEP.

Espero que tenham gostado e até o próximo artigo... Fernanda Sallai
(fernanda.sallai@codificando.net) cursa o 4º ano de Sistemas de Informação na FICS – Faculdades Integradas Campos Salles, reside em São Paulo – SP, atualmente realiza estágio na empresa Pakua IT Systems no desenvolvimento de aplicações web e escreve periodicamente em seu blog. www.fernandasallai.com

Codificando.net e-magazine

Figura 4. Exibindo mensagem do CEP com formato inválido.

Explicando sobre as expressões regulares que estão no método acima: 1. [0-9]{5}-[0-9]{3} a. [0-9] – é uma lista de itens permitidos. Nesse caso de números entre 0 até 9 b. {5} – neste caso especifica a quantidade de itens. Neste caso irá aparecer 5 ocorrências.

www.codificando.net

Out / Nov - 2009

|

6

e-magazine

Chamadas de Funções e Mensagens em Javascript
Nesse artigo mostrarei como criar uma classe de envio de mensagem em Javascript que também terá suporte para chamar funções de javascript que estejam na página.
Por: Fúlvio Cezar Canducci Dias

Criaremos uma aplicação Class Library chamada JvScript usando a linguagem Visual Basic conforme as figuras 1 e 2.

O próximo passo é adicionar ao projeto duas referências que serão de extrema importância: 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 referências

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 referências que serão adicionadas no projeto.

www.codificando.net

Out / Nov - 2009

|

7

Chamadas de Funções e Mensagens em Javascript

e-magazine

O Diagrama de Classes é um componente visual para construções de classes no Visual Studio. Veja na figura 6 como adicioná-lo no nosso projeto e na figura 7 a visualização 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 métodos. 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 métodos do projeto. Veja como adicionar uma classe na figura 8.

Codificando.net e-magazine

Figura 10. Visualizando a codificação da classe Chaves.vb.

Figura 8. Adicionando uma nova classe no diagrama.

O propósito desse projeto não é construir passo a passo a classes e sim demonstrar o poder e a flexibilidade que elas trarão para o desenvolvimento de páginas em .

www.codificando.net

Out / Nov - 2009

|

8

Chamadas de Funções e Mensagens em Javascript
ASPX. A figura 10 exibe o nosso “Diagrama de Classes” finalizado com as suas heranças, agregações e sobrecargas de métodos e a listagem 1 exibe a codificação gerada na criação do diagrama.

e-magazine

Abaixo tem os códigos fontes gerados em nosso “Diagrama de Classes”, mas, que também foram modificados para sua adequação 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

9

Chamadas de Funções 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 Funções 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 Funções 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) herdarão (abstração de dados: Especialização) a sua única propriedade Chave. A propriedade Chave é do tipo String. Classe Alerta.vb: terá as propriedades Alerta e Chave (herança da classe Chaves.vb) e as duas são do tipo String. Essa classe será utilizada como tipo de dado para as classes ClienteJS.vb e ScriptManageJs.vb (abstração de dados: Agregação). Classe Funcao.vb: a classe Funcao.vb terá as propriedades Funcao e Chave (herança da classe Chaves.vb) e as duas são do tipo String. Essa classe será utilizada como tipo de dado para as classes ClienteJs e ScriptManagerJs.vb (abstração de dados: Agregação).

executa dentro dos famosos UpdatePanel do Ajax, ou seja, a diferença da classe ClienteJs.vb e ScriptManagerJs é que a ScriptManagerJs você vai trabalhar junto com o ScriptManager e o ClienteJs.vb não 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 página.

Figura 11. Exibindo o layout da página.

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 serão 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á métodos de envio de mensagens com várias sobrecargas de métodos que mostrará alerta ou chamará outras funções em Javascript. Classe ScriptManagerJS: a classe ScriptManagerJS é praticamente igual à classe ClienteJS.vb tendo a diferença que ela

Antes de fazer as codificações nos botões 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 botões do nosso projeto Web um que está

www.codificando.net

Out / Nov - 2009

|

12

Chamadas de Funções 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 página vamos criar um função básica em Javascript conforme a listagem 2.

Listagem 2. Incluindo função em javascript. Figura 11. Visualizando o resultado após o clique do botão BT_ForaUP e BT_DentroUP.

Dê um duplo clique no Botão “Fora do UpdatePanel” e vamos criar sua rotina exemplo de como utilizar a nossa DLL criada para emitir alertas e funções de Javascript. Observe a listagem 3 e 4 a codificação do evento click dos botões e na figura 12 o resultado após o clique dos botões:

Bom pessoal esse é um simples exemplo de como trabalhar com Classes no Visual Studio. Fúlvio Cezar Canducci Dias
fulviocanducci@hotmail.com) Sou estudante do curso de Sistemas de Informação 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 aplicações Web (IIS e FTP) e Active Directory (configurações intermediárias)

Codificando.net e-magazine

Listagem 3. Incluindo codificação no botão BT_ForaUP.

Listagem 4. Incluindo codificação no botão BT_DentroUP.

www.codificando.net

Out / Nov - 2009

|

13

e-magazine

Aplicações em N Camadas com ASP .NET - PARTE I
Aplicando conceitos de camadas em ASP.Net
Por: Felipe Pocchini

Aplicações em n camadas são desenvolvidas de forma distribuída, onde cada camada tem sua responsabilidade dentro do contexto. Para um modelo de aplicação Web são comumente usadas 3 camadas: Presentation(Apresentação), Business (Lógica do negócio) e Data(Responsável pelas transações 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 aplicações em n camadas.

Figura 2: Criando uma solução em branco.

Com a solução criada, é hora de criar as camadas. Vamos começar 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 botão direito na solução e adicionar um novo projeto.

Codificando.net e-magazine

Figura 1: Exemplo de aplicação em N Camadas.

Para começar 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 solução (Add > New Project).

Esse novo projeto vai ser do tipo Class

www.codificando.net

Out / Nov - 2009

|

14

Aplicações 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 fácil:

Figura 4: Projeto do tipo Class Library.

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

Essa é a visualização da classe Cliente dentro do diagrama.
Figura 5: Projeto criado.

Por padrão, 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, responsável em gerenciar as classes do projeto conforme mostra a figura a baixo:

Codificando.net e-magazine

Figura 8: Visualização 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 necessárias para manipular a entidade Cliente. Como o foco é estudar aplicações em n camadas, vamos trabalhar com atributos simples pra não 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

Aplicações 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 código 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 segurança na persistência 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).

Faça 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

Aplicações em N Camadas com ASP .NET - PARTE I

e-magazine

} }

Com a classe Cliente definida, temos nossa camada de entidades concluída utilizando apenas uma entidade nesse exemplo. Na segunda parte desse artigo vamos criar a camada de dados (Data) que ficará responsável pelas transações SQL com o banco de dados. Participe desse artigo deixando seu comentário. http://www.desenvolvendoparaweb.net/ group/aspnet Para saber mais: http://msdn.microsoft.com/pt-br/library/ bb384398.aspx Até a próxima, grande abraço a todos. Felipi Pocchini
Graduado em Ciência da Computação pela Universidade José do Rosário Vellano (UNIFENAS), em Alfenas – MG, trabalha com desenvolvimento de aplicações Web e Windows Forms utilizando a tecnologia .Net. Moderador da comunidade Desenvolvendo para Web, colaborador da comunidade Codificando.Net e mantém 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 aplicações distribuídas garantindo que todas as mensagens persistam e são recebidas mesmo quando ocorrem falhas no sistema possibilitando uma nova geração de aplicações altamente escaláveis. Os desenvolvedores de software criam a maioria das aplicações usando processamento seqüencial e síncrono. Neste modelo a transação é iniciada, o dado é bloqueado (para evitar o uso por outras transações), as alterações são efetuadas e o dado é desbloqueado. Isto funciona bem para certas aplicações, mas existem aplicações as quais necessitam de consistência para operações que envolvem vários bancos de dados, plataformas e até mesmo outras empresas. Muitas vezes estas transações simplesmente enviam alguma requisição de processamento e não exigem um retorno imediato de resposta, pois têm a garantia de suas requisições serem processadas tão breve quanto possível. Embora essas transações sejam assíncronas, não corremos o risco de quebra de integridade dos dados, pois todas as requisições são colocadas em uma fila transacional, ou seja, esta fila de requisi-

ções pode ser modificada e as requisições já disparadas são perfeitamente gerenciadas pelo Service Broker, podendo ser retiradas e modificadas. Desta forma, mesmo em caso de falha no sistema, teremos todas as transações preservadas pelo Service Broker em uma tabela e elas serão aplicadas tão logo quanto possível garantindo que as mensagens envolvidas no processo sejam corretamente formatadas, entendidas e processadas pelas aplicações que as enviam e recebem. Com este trabalho, não há um consumo de recursos geradores de esperas que impactem na performance da aplicação e a segurança tem um nível de confiabilidade maior. As partes envolvidas, ou seja, as que enviam e recebem, são os endpoints. A implementação física de um endpoint são os bancos de dados envolvidos. O Service Broker é a ponte de envio e recepção de dados entre os endpoints. O endpoint que envia é o initiator e o endpoint receptor é o target. O gerenciamento desta comunicação pelo Service Broker é chamado de conversation, a troca de dados entre os endpoints, cujo tipo é um dialog, ou seja, a comunicação entre dois endpoints. Os objetos que compõem o Service Broker são:

Codificando.net e-magazine
|

www.codificando.net

Out / Nov - 2009

18

Implementando o Service Broker

e-magazine

Queues, que são as tabelas onde as mensagens (messages) são 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 físico, isolando os queues, impondo regras na conversação permitida através dos contracts; Contracts, que é a lista de message types que podem ser enviadas e recebidas; Message types, tipos de mensagem suportados e formatação que garante a aceitação destas mensagens.

CRIANDO UMA MESSAGE TYPE Vamos criar duas message types com validação WELL_FORMED_XML, conforme mostrado na Figura 2.

Figura 2 – Criando uma message type

HABILITANDO O SERVICE BROKER O Service Broker vem desabilitado por padrão, por não ser necessário à execução principal do SQL Server 2005. Através do SQL Server Management Studio, insira o comando conforme Figura 1. Utilizaremos como banco de dados o AdventureWorks. Atente para as nomenclaturas, que são case-sensitive.

Os tipos de message types são: • NONE – qual aceita qualquer dado em qualquer formato no corpo da mensagem; • • • EMPTY – força o corpo da mensagem a não 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

serão 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 saídas da conversation estarão completamente definidos. CRIANDO MESSAGE QUEUES Neste passo vamos criar duas queues: a QueueCDMProdutoID e QueueCDMResultado. CDM no nome é a abreviação 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 necessária 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 conteúdo das queues, conforme a Figura 7:

Figura 9: Consultando as queues novamente: começo ...

Figura 7 – Consultando as queues

Como podemos observar, as filas estão 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: começo …

Figura 15: Consultando as queues novamente.

Verificamos agora que estão vazias. As Mensagens foram tratadas. Ricardo José Alves
Pós graduando em Bancos de Dados e Business Intelligence possui o título de Bacharel em Ciência da Computação com ênfase em Análise de Sistemas e Técnico em Processamento de Dado, além de Extensão em Gestão de Projetos Analista de Sistemas e Suporte, atuando há 12 anos em gerência de projetos de infraestrutura, arquitetura de soluções, desenvolvimento de sistemas e gerenciamento de TI na área bancária e governo.
Figura 13 : Recebendo a message: meio …

Adriano Luciano Candido
(adriano.luciano@gmail.com) é Pós-graduado no MBA em Gestão Projetos da FGV, certificado nos títulos da Microsoft: MCPD, MCDBA, MCSD.NET, MCSD, MCAD, MCSA. Instrutor oficial Microsoft e consultor especializado em tecnologia Microsoft e em Gestão de Projeto, atuando a mais de 10 anos no mercado de tecnologia. Palestrante e professor de pós-graduação em diversas universidades de São Paulo. Mantém 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 através de RFC
Mais um artigo de como utilizar o .Net SAP Connetor 2.0
Por: Diego Nogare

Para finalizar a seqüência dos artigos de SAP prometidos, esta publicação contempla a criação 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 à versão 2003, para isso, criamos uma alternativa para se trabalhar com versões mais atuais do Visual Studio. Este artigo não 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 aplicações foram construídas nos artigos citados, a idéia era apenas exemplificar as formas de trabalho com SAP Connector, não me apeguei

em nenhum momento em desenvolver em camadas. Porém, para se trabalhar com versões mais recentes do VS, será necessário desenvolver as partes do Proxy e RFCs do SAP em uma Class Library, e então 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 versões mais recentes do VS utilizando o SAP. Vou iniciar a explicação, mostrando como é a geração da DLL através da Class Library do Visual Studio 2003, passando para as referências das DLLs necessárias no VS2005 / VS2008, e finalizando com a criação da mesma aplicação de leitura do SAP criada anteriormente, mas utilizando as versões mais recentes do VS. A geração da DLL, consiste em criar um novo projeto do tipo Class Library dentro da Solution e realizar toda a parte de inclusão do Proxy (onde serão 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 referências necessárias para trabalhar com a DLL gerada pela Class Library do VS2003 para utilizar as RFCs do SAP. São necessárias três novas referências para a nova aplicação funcionar, as referências são: 1. DLL da Class Library gerada. No exemplo, é chamada de “interfaceSAP.dll”; DLL do SAP Connector 2.0, que está na pasta de instalação do SAP Connector, geralmente fica dentro de “C:\Program Files\SAP\SAP .NET Connector 2.0 \SAP.Connector.dll”; Referência do próprio .Net para “System.Web.Services”, que é através desta tecnologia que o .Net se conecta ao SAP usando o componente do SAP Connector.

Após esta alteração 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, é necessário criar uma aplicação no VS2005 e/ou VS2008 para utilizar esta DLL e conseguir trabalhar com o SAP. Vamos então, criar um projeto do VS2008 do tipo Windows Forms Application, usarei o C# Express para mostrar que com a versão Express do Visual Studio também é possível realizar esta tarefa. Um alerta interessante, é que a forma que será realizado para o VS2008 pode ser utilizada para o VS2005 também, sem nenhuma mudança significativa. A Figura 2 exibe o projeto criado no VS2008.

2.

3.

Codificando.net e-magazine
|

Veja a Figura 3 e 4, as referências 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 códigos 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: Referências do projeto, antes da adição necessária.

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: Referências do projeto, depois das adições necessárias.

Listagem 1: Código em C# do método acessarSAP.

Agora que as referências necessárias foram inclusas no projeto, vamos adicionar um dataGridView no formulário e provar que a solução funciona. No método LOAD do formulário, adicionamos uma chamada para o método acessarSAP() que carregar os dados na grid.

A execução da aplicação com este código, dá um retorno muito próximo do que foi apresentado no artigo de leitura do SAP utilizando o VS2003. Veja a Figura 5, como ficou o resultado da aplicação construída 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 informações, seja possível criar as primeiras aplicações simples com o .Net para se trabalhar com o SAP, coisa que é muito comum nas empresas hoje em dia. Diego Nogare
Graduado em Ciência da Computação, Pós-Graduado em Engenharia de Computação com ênfase em Desenvolvimento Web com .NET. Colaborador do Portal Linha de Código e da revista SQL Magazine, Líder do grupo de usuários Codificando .NET, Líder dos Microsoft Student Partners [MSP] de São Paulo e Microsoft Most Valuable Professional [MVP] em SQL Server, possui certificações MCP e MCTS em SQL Server 2005, é palestrante em eventos da Microsoft, Codificando .NET e INETA BR, mantém o site: www.diegonogare.net.

Figura 5: Aplicação desenhada com o Visual Studio 2008.

Com a finalização deste artigo, fechamos o ciclo de 3 artigos sobre o SAP que havia prometido. Foram criados aplicações 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
Continuação do artigo explorando Microsoft SQL Reporting Service 2005
Por: Caio Azevedo

Olá pessoal, continuando nosso artigo sobre o reporting services versão SQL 2005, começaremos a analisar o que chamamos de relatórios, Local Mode, como complemento disponibilizamos a aplicação DEMO no site da comunidade: http://comunidade.codificando.net/, boa leitura.
Figura 2.1 – arquitetura local mode

Parte 2 – local mode Também conhecidos como client-side, os relatórios ditos locais seguem o modelo de desenvolvimento e deploy dos relatórios desenvolvidos como o Microsoft Access e Crystal Reports, onde os relatórios são parte integrante da aplicação.

Características Os relatórios “local mode” caracterizamse especialmente por:

A segurança é herdada da aplicação que o hospeda.

Codificando.net e-magazine

Arquitetura Nesse modelo de relatórios, todo processamento é realizado no cliente. A aplicação é responsável por obter os dados proveniente de qualquer fonte de dados, e o controle ReportViewer apresenta os relatórios. A figura abaixo apresenta a arquitetura dos relatórios Local Mode.

Filtros, ordenação, agrupamento e funções de agregação estão disponíveis. Possui formatação rica e inteligente, com imagens, fontes e cores. Interatividade com bookmarks e DocumentMap. Liberdade para interatividade com o usuário final. Integração 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 instrução de acesso e/ou conexão à base de dados).

mos que seguir basicamente os seguintes passos:

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

Modelagem do repositório de dados local ⇒ DataSet – estrutura de dados com integridade relacional Elaboração do layout “inteligência” do relatório ⇒ Header, Body, Footer e

Uso de patterns – dados agrupados, tabular, matriz, colunas múltiplas, gráficos. ⇒ Criação de parâmetros, formatação condicional Recuperação dos dados, preenchimento do dataset e bind com o relatório APIs do ADO .NET, Stored Procedures, T-SQL Controle ReportViewer

Figura 2.2 – correlação dos elementos

Processo de criação

A partir dessa sessão começaremos a implementar alguns relatórios 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 aplicação Para nossos exemplos tomaremos uma aplicação Windows Forms, como apresentado na figura abaixo, atente para as pastas DataSources e Reports, onde respectivamente armazenaremos os DataSets e os relatórios criados.

Codificando.net e-magazine

Figura 2.3 – modelo de dados utilizado em nossos exemplos

Retornando ao processo de criação. Para qualquer relatório implementado tewww.codificando.net

Out / Nov - 2009

|

28

Explorando SQL Reporting Services 2005 – Parte II

e-magazine

Figura 2.4 – template de aplicação

Repositório de dados local - dataset Relatórios são representações formatadas de um conjunto de registros provenientes de uma consulta em um repositório de dados. Para os relatórios criados na plataforma do Reporting Services é necessário um DataSet tipado com uma ou mais tabelas que será a estrutura de dados volátil contendo as informações dos relatórios, esse dataSet será preenchido no aplicativo que hospeda o relatório e será utilizado na sua formatação. Nota: Um DataSet é uma representação na memória de um banco de dados relacional. Maiores informações consultar a página 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 criação dos nossos, bem como das tabelas necessárias para criação dos relatórios. Nesse primeiro exemplo teremos um relatório tabular com os produtos, suas respectivas categorias, quantidade em estoque e valor unitário. Então modelaremos um dataset com uma única tabela contendo esses campos como mostrado na figura 2.6. A figura 2.5 ilustra a criação de um novo dataset através da inclusão de um novo item (DataSet) ao projeto.

Figura 2.6 – datatable do dataset exemplo

Formatando os relatórios Tipos e Estrutura do Relatório: Uma vez modelado o DataSet, é hora de utilizá-lo para formatar o relatório. O primeiro passo é decidir que tipo de relatório será utilizado, por exemplo, se os dados estiverem relacionados a agrupamento de itens a melhor escolha é utilizar um relatório tabular (como no caso desse nosso primeiro exemplo), no entanto relatórios com gráficos é mais indicado para representar dados sumarizados. A estrutura dos relatórios do RS inclui três sessões como mostrado

Codificando.net e-magazine

Figura 2.5 – criação 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 – sessões do relatório e dataSet

Header: indicado para incluir informações estáticas referentes ao relatório tais como título, data, logo da empresa e se for o caso, alguns dos parâmetros informados pelo usuário. Body: é a região dos detalhes do relatório, onde os dados provenientes das consultas (armazenados no DataSet), filtros e ordenação serão exibidos. Footer: ideal para outras informações do relatório, tais como numero de página e informações de direitos autorais.

A tabela a seguir descreve resumidamente os itens da nossa caixa de ferramentas: Mais informações sobre os itens mais importantes: Item Poiter Textbox Descrição Seleciona os itens do relatório. Item mais utilizado da toolbox, exibe informações provenientes do datasource ou mesmo textos estáticos. Line Desenha uma linha como separa-

Codificando.net e-magazine

Report itens Parte fundamental da formatação dos relatórios, os Report Items, disponíveis na Toolbox do Visual Studio, funcionam como um canal entre o DataSource e a estrutura do relatório. Os Report Itens são simples objetos, parecidos com os controles das aplicações 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 sessões header e body. Table

dor de informações. Exibe detalhadamente as informações do relatório em formato tabular, além de disponibilizar sessões de cabeçalho e rodapé.

Matrix

Exibe detalhadamente as informações do relatório correlacionando linhas e colunas.

Rectangle

Agrupa informações relacionadas.

www.codificando.net

Out / Nov - 2009

|

30

Explorando SQL Reporting Services 2005 – Parte II

e-magazine

Item List

Descrição Exibe detalhadamente as informações do relatório, parecido com o table, no entanto sem tantos recursos tais como as sessões de cabeçalho e rodapé. .

Image

Permite inserir imagens no relatório.

te no Footer temos informações sumarizadas dos dados do relatório. É possível ter mais de uma tabela em um relatório. É muito importante dominar são as propriedades do componente Table (figura 2.9 abaixo), especialmente as tabs Groups, onde é possível configurar diversos agrupamentos das informações e Filter, onde podemos estabelecer restrições aos dados visíveis aos usuários.

Subreport

Inclui outro(s) relatório(s) dentro de um relatório principal.

Chart

Exibe as informações do relatório em formato gráfico, com diversas opções de formatação.

Textbox
Figura 2.9 – Table Properties

Pode-se dizer que não é possível construir um relatório sem o Textbox, que é sem dúvida o componente mais versátil que temos à disposição, podendo ser utilizado para diversas utilidades, do título do relatório no header, à exibição de totalizadores, enfim, esse controle é usado para exibir textos estáticos, fazer bind com data source, campos calculados e expressões. Table É o melhor item para relatórios detalhados. Cada tabela possui uma estrutura com sessões Header, Detail e Footer, não confundir com as sessões homônimas do próprio relatório. O Header é indicado para os nomes das colunas, no Details, temos um conjunto de linhas provenientes do datasource e finalmen-

Subreport Um relatório é considerado um subreport quando inserido em outro relatório. O subrelatório funciona como um filho do relatório que o hospeda (parent), tornando os sub-relatórios uma poderosa ferramenta para, por exemplo, implementar o tão requisitado conceito master/detail, no entanto é preciso ter muita cautela na sua utilização uma vez que temos perdas consideráveis na performance do relatório. Chart O item Chart, é responsável pela apresentação de informações numéricas em formato de gráficos. As ferramentas de gráficos foram inseridas nos relatórios 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

sição os tipos mais comuns de gráficos – pizza, barra e colunas. Formatação Um relatório não é capaz de atrair a atenção dos leitores se suas informações não forem bem formatadas, dados numéricos, por exemplo, são muito melhor compreendidos se devidamente formatados conforme seu tipo – numérico inteiro, decimal, moeda ou cientifica, por exemplo, outra informação digna de atenção na sua formatação são os campos referentes à data e hora. No processo de criação dos relatórios a formatação é feita através 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 relatório 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 relatórios atrativos aos usuários, outros atributos das caixas de texto podem ser customizados tais como Fontes, Cor, Alinhamento e Decoração, todos esses, além 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 – Formatação texto

Figura 2.10 – Formatação texto

Dicas Importantes: 1. Certifique-se que o tipo do campo esteja devidamente bem definido no DataTable, do contrário a formatação simplesmente não funciona, e o tipo default dos campos é System.String.

E finalmente, dentro da formatação, eis um recurso muito poderoso dos relatórios do RS que é a formatação condicional, onde através do editor de Expressions, que utiliza um dialeto da linguagem Visual Basic, é possível criar instruções 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" ) Parametrização Os relatórios possuem um mecanismo de parametrização, onde é possível passar informações a partir do cliente para o relatório em tempo de execução. A figura 2.12 ilustra a janela Report Parameters para criação dos parâmetros de um relatório, onde, para acessar basta clicar com o botão direito fora das sessões do relatório.

Filters), sendo essa funcionalidade, mais indicada para criação de relatórios do tipo master/detail com subreports. Consumindo o relatório Controle reportviewer Para interação dos relatórios com os clientes, temos o controle ReportViewer, disponível no visual Studio, em duas versões uma para web e outra para Windows forms. Com ele é possível disponibilizar para as aplicações um conjunto de funcionalidades tais como:

Exportação dos dados nos formatos Excel e PDF. Suporte a impressão e visualização de impressão do relatório . Rica Interatividade com navegação, document map, bookmarks e ordenação. Pesquisa de texto no corpo do relatório.


Figura 2.12 – parâmetros

Codificando.net e-magazine

Os parâmetros aqui criados podem ser utilizados para formatação condicional ou em expressões. Ao contrário dos relatórios remote mode, esse modelo de relatórios não tem uma área para que o usuário selecione ou digite o valor dos parâmetros, sendo responsabilidade do cliente providenciar uma interface para coleta dessas informações e gerar o conjunto de dados devidamente filtrado e carregá-lo no dataSet, os parâmetros são pouco utilizados para seleção dos registros, uma vez que é mais indicado fazer essa restrição diretamente na pesquisa, ainda que tenhamos como aplicar filtros (propriedade das tabelas, tab

Zoom

O controle é capaz de processar e renderizar os relatórios independente do seu modelo, local ou remote. A figura abaixo exibe o controle ReportViewer em ação renderizando um relatório.

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, botão Stop, os botões de pesquisa, de exportação, impressão, dentre outras, podem ser desativados na sua janela de propriedade, como mostrado na figura abaixo. Outra propriedade importantíssima do ReportViewer é seu ProcessingMode.

e-magazine

Eis um pseudocódigo utilizado em um cliente de um relatório 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

Código cliente Uma vez modelados, o relatório e seu respectivo DataSet, chegou a hora de relacionar tudo, e como já dissemos todo processamento é feito no cliente, da obtenção dos dados no repositório para carga do dataset à renderização do relatório via controle ReportViewer. A figura 2.15 apresenta o fluxo padrão de um código cliente para utilização de relatórios RS em client-mode.

Codificando.net e-magazine

Por hoje é isso pessoal, na próxima edição imperdível, só códigos, diversos exemplos para boas horas de diversão, grande abraço e até lá.
Figura 2.15 – fluxo padrão do código cliente

www.codificando.net

Out / Nov - 2009

|

34

Explorando SQL Reporting Services 2005 – Parte II

e-magazine

Caio Azevedo
Graduado em Ciência da Computação, Engenharia Civil e louco por ciências exatas em especial física e matemática. Coordenador da Célula Microsoft da Magna Sistema e Arquiteto Microsoft, palestrante, tecno-colunista e instrutor da treinando .net. MCP, MCAD, MCSD, MCTS e MCPD. E fanático pela série 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 extensão ou integração com isso nossa vida de desenvolvedor fica cada vez mais fácil. Além de aplicativos, é possível encontrar diversos frameworks e bibliotecas de desenvolvimento, a própria Microsoft estimula o site colocando suas bibliotecas e aplicativos livres, como o ASP.NET AJAX e MVC. Um ponto curioso é a baixíssima quantidade de projetos nacionais... não encontrei praticamente nada... Será que não temos essa cultura? Eu mesmo, nunca pensei em subir nada por lá, porém 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 não encontro nada começa um projeto do zero. Como diz o amigo Ramon Durães: “Não tem que ser difícil”. []´s Alexandre Tarifa

Nos tempos do VB 6 e até mesmo no início da era .Net lá para 2002/2003 era muito comum ouvir dizer de aplicações “open source” desenvolvidas em JAVA ou outra plataformas disponíveis para a comunidade... hoje em dia graças ao site codeplex (www.codeplex.com) e outras iniciativas de comunidade conseguimos encontrar aplicações com muita qualidade disponíveis para download gratuitamente, ou as vezes tão barato que podemos considerar gratuito. Para que vou perder o tempo desenvolvendo um fórum? Ou até mesmo um blog? Dentro do codeplex temos soluções completas e claro, com o código fonte, com isso você será capaz de customizar a aplicação e deixar ela redondinha com as necessidades do seu site. Um ponto muito interessante é que o pessoal que desenvolve esse tipo de solução tem pensado cada vez mais em

www.codificando.net

Abril // Maio-2009 Out Nov 2009

|

36

Sign up to vote on this title
UsefulNot useful