Anda di halaman 1dari 36

Sumário

04 :. Usando Expressões Regulares


Neste artigo veremos como utilizar Expressões
Edição 12 Número 12 Ano 03 2009 Regulares para validar e-mail e CEP.
Por: Fernanda Sallai
EDITORES
Alexandre Tarifa
Diego Nogare
Emerson Facunte
Sergio Gonçalves 07 :. Chamadas de Funções e
Mensagens com Javascript
REVISÃO
Felipe Pocchini Como criar uma classe de envio de mensagem
Fernanda Sallai e Chamada de Funções em Javascript.
Por: Fúlvio Cezar Canducci Dias
MONTAGEM / FORMATAÇÃO
Milton Carvalhaes

EDITORAÇÃO E DIAGRAMAÇÃO
14:. Aplicações com “N” camadas
Adriano Almeida em ASP.Net - Parte I
COLABORADORES Aplicando conceitos de camadas em ASP.Net
Adriano Luciano Candido
Caio Azevedo Por: Felipe Pocchini
Diego Nogare
Felipe Pocchini
Fernanda Sallai 18:. Implementando Service Broker
Fúlvio Cezar Canducci Dias
Ricardo José Alves Sistema de Fila de Mensagens

Por: Ricardo José Alves /Adriano Luciano Candido

Fale com Editor 23 :. Workaround com .NET SAP


Connector 2.0.
É muito importante para a equipe
saber a sua opinião sobre a revis- Mais um artigo de como utilizar o .Net SAP
ta, caso tenha alguma critica, su- Connetor 2.0.
.
gestão, ou elogio entre em conta-
to. Por: Diego Nogare

Caso tenha interesse em publicar


um artigo na revista envie o título 27:. SQL Reporting Service 2005
e um resumo do tema em formato Parte II
Word.
Continuação do artigo explorando Microsoft
site@codificandomagazine.net 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 re-
vista, 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 men-
sagem 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. Anali-
samos 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 gem C#, mas é claro que poderá ser utili-
se o formato de email e ou CEP informado zado em qualquer tipo de aplicação e
pelo usuário é correto usando as expres- linguagem fazendo algumas adaptações
sões regulares. conforme sua escolha. Criaremos o la-
yout conforme a figura 1.
OBS: Estou realizando a validação através
de código gerenciado, mas é possível fazer
a mesma validação utilizando componen-
tes do próprio Visual Studio, mas isso não
será abordado neste artigo.

Primeiramente. Mas o que são expressões


regulares?!
Figura 1. Criando layout do formulário

Conforme Aurélio Marinho Jargas "É uma


No evento Click do botão btnVerificar Codificando.net e-magazine
composição de símbolos, caracteres com
funções especiais, que, agrupados entre si inclua o código conforme listagem 1.
e com caracteres literais, formam uma se- private void btnVerificar_Click
qüência, uma expressão. Esta expressão é (object sender, EventArgs e)
{
interpretada como uma regra, que indicará //Se os campos informa-
dos estão no formato incorreto
sucesso se uma entrada de dados qualquer if (!ValidarCampos())
estiver de acordo com essa regra, ou seja, {
//Exibe uma mensagem
obedecer exatamente a todas as suas con- informando o campo com formato invá-
lido
dições". MessageBox.Show
(mensagem, "ATENÇÃO", MessageBoxBut-
tons.OK, MessageBoxIcon.Warning);
Vamos à prática?! }
}
A parte de criar um projeto não será abor- /// <summary>
dada neste artigo. Neste exemplo usarei /// Validar formatos dos
campos
uma aplicação Windows Forms e a lingua- /// </summary>

www.codificando.net Out / Nov - 2009 | 4


Usando Expressões Regulares e-magazine

/// <returns>True se o /// <param name="cep">CEP


campo está com formato correto e informado pelo usuário</param>
false se está incorreto</returns> /// <returns>True se o
private bool ValidarCam- formato do cep estiver correto e
pos() false se está incorreto</returns>
{ private bool ValidaCep
bool formatoCorreto = (string cep)
true; {
//Se a quantidade de
//Se o txtEmail.Text dígitos do cep for igual a 8
não estiver vazio if (cep.Length == 8)
{
if (txtEmail.Text != //a variável cep
string.Empty) recebe os cinco primeiros dígitos
{ + - + três últimos dígitos ex:
//Se o formato de 09999-999
email estiver incorreto cep =
if (!IsValidEmail cep.Substring(0, 5) + "-" +
(txtEmail.Text)) cep.Substring(5, 3);
{ //txtCep.Text re-
formatoCorre- cebe o valor da variável cep
to = false; txtCep.Text =
mensagem = "O cep;
e-mail informado é inválido. Por }
favor verifique."; //retorna true ou
txtEma- false
il.Focus(); return Sys-
return forma- tem.Text.RegularExpressions.Regex
toCorreto; .IsMatch(cep, ("[0-9]{5}-[0-9]
} {3}"));
} }
//Se o txtCep.Text /// <summary>
não estiver vazio /// Validar o formato do
if (txtCep.Text != e-mail
string.Empty) /// </summary>
{ /// <param name="email">E
//Se o formato de -mail informado pelo usuário</
cep estiver incorreto param>
if (!ValidaCep /// <returns>True se o
(txtCep.Text)) formato do e-mail estiver correto
{ e false se está incorreto</ Codificando.net e-magazine
formatoCorre- returns>
to = false; private bool IsValidEmail
mensagem = "O (string email)
CEP informado é inválido. Por fa- {
vor verifique."; //retorna true ou
txtCep.Focus false
(); return Sys-
return forma- tem.Text.RegularExpressions.Regex
toCorreto; .IsMatch(email, ("(?<user>[^@]+)@
} (?<host>.+)"));
} }
}
return formatoCorre-
to; Listagem 1. Criando codificação do botão btnVe-
} rificar.

/// <summary>
/// Validar o formato do Ao executar o código e informar dados
CEP no formato inválido (figura 2) é exibida
/// </summary>
as mensagens (figura 3 e 4) conforme o

www.codificando.net Out / Nov - 2009 | 5


Usando Expressões Regulares e-magazine

formato do campo informado pelo usuário 2. (?<user>[^@]+)@(?<host>.+)


incorretamente. a. ( ) – definem um grupo

b. ? – opcional. Ocorre 0 ou 1 vez.

c. <user> - nome usuário

d. [^@] – lista negada. Neste caso pode


Figura 2. Informando formatos inválidos de e-
mail e CEP. ocorrer de tudo exceto o “@”.

e. + - mais. Tem que ter. Ocorre 1 ou


mais vezes. Neste caso vai ter que e-
xistir 0 segundo “@” da expressão aci-
ma.

f. <host> - provedor do email

g. . – casa com qualquer coisa. Por e-


xemplo .com
Figura 3. Exibindo mensagem do e-mail com for-
mato inválido.
Espero que tenham gostado e até o próxi-
mo 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 desen-
volvimento de aplicações web e escreve periodicamente
Figura 4. Exibindo mensagem do CEP com for-
mato inválido.
em seu blog.
www.fernandasallai.com
Codificando.net e-magazine

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 permiti-
dos. Nesse caso de números entre 0
até 9

b. {5} – neste caso especifica a quanti-


dade de itens. Neste caso irá apare-
cer 5 ocorrências.

www.codificando.net Out / Nov - 2009 | 6


e-magazine

Chamadas de Funções e Mensa-


gens 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 O próximo passo é adicionar ao projeto


chamada JvScript usando a linguagem Vi- duas referências que serão de extrema
sual Basic conforme as figuras 1 e 2. importância: System.Web e Sys-
tem.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 fi-


gura 3 e renomeie a Class1.vb para Aler-
ta.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 componen- A classe Chaves.vb será composta por a-


te visual para construções de classes no penas um campo (de nome _chave) e uma
Visual Studio. Veja na figura 6 como adi- propriedade (de nome Chave) . O motivo
cioná-lo no nosso projeto e na figura 7 a principal de criar essa classe Chaves.vb, é
visualização do diagrama. que a Alerta.vb e a classe Funcao.vb her-
daram os métodos. Na figura 9 e 10 visua-
lize 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.

O propósito desse projeto não é construir


passo a passo a classes e sim demonstrar
Figura 8. Adicionando uma nova classe no dia-
grama.
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 e-magazine

ASPX. A figura 10 exibe o nosso


“Diagrama de Classes” finalizado com
as suas heranças, agregações e sobrecar-
gas de métodos e a listagem 1 exibe a
codificação gerada na criação do diagra-
ma.

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 Classe Funcao


Public Class Alerta Public Class Funcao
Inherits Chaves Inherits Chaves
Private _alerta As String Private _funcao As String
Public Sub New() Public Sub New()
Chave = "" Chave = ""
Alerta = "" Funcao = ""
End Sub End Sub
Public Property Alerta() As Public Property Funcao() As
String String
Get Get

Codificando.net e-magazine
Return _alerta Return _funcao
End Get End Get
Set(ByVal value As String) Set(ByVal value As String)
_alerta = value _funcao = value
End Set End Set
End Property End Property
End Class 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

www.codificando.net Out / Nov - 2009 | 9


Chamadas de Funções e Mensagens em Javascript e-magazine

Classe ClienteJS _pagina.ClientScript.IsClientScriptBlo


ckRegistered(Alertas.Chave) = False
Imports System
Then
Imports System.Web
Imports System.Web.UI
_pagina.ClientScript.RegisterClientScr
Public Class ClienteJS
iptBlock(_pagina.GetType, Aler-
Private _alerta As New Alerta
tas.Chave, "alert('" & Alertas.Alerta
Private _funcao As New Funcao
& "');", True)
Private _pagina As Page
Public Sub New()
_pagina.ClientScript.IsClientScriptBlo
Alertas = _alerta
ckRegistered(Alertas.Chave)
Funcoes = _funcao
End If
End Sub
End Sub
Public Sub New(ByVal _alerta_ As
Public Sub EnviarAlerta(ByVal
Alerta)
_pagina As Page, ByVal _alerta As A-
Alertas = _alerta
lerta)
End Sub
Alertas = _alerta
Public Sub New(ByVal _pagina As
Pagina = _pagina
Page, ByVal _alerta_ As Alerta)
EnviarAlerta()
Alertas = _alerta
End Sub
Pagina = _pagina
Public Sub EnviarAlerta(ByVal
End Sub
_pagina As Page, ByVal _chave As S-
Public Sub New(ByVal _funcao_ As
tring, ByVal _alerta As String)
Funcao)
Alertas.Alerta = _alerta
Funcoes = _funcao_
Alertas.Chave = _chave
End Sub
Pagina = _pagina
Public Sub New(ByVal _pagina As
EnviarAlerta()
Page, ByVal _funcao_ As Funcao)
End Sub
Funcoes = _funcao_
Public Sub EnviarFuncao()
Pagina = _pagina
EnviarFuncao(Pagina)
End Sub
End Sub
Public Property Alertas() As
Public Sub EnviarFuncao(ByVal
Alerta
_pagina As Page)
Get
If
Return _alerta
_pagina.ClientScript.IsClientScriptBlo
End Get
ckRegistered(Funcoes.Chave) = False
Set(ByVal value As Alerta)
Then
_alerta = value
End Set
_pagina.ClientScript.RegisterClientScr
End Property
iptBlock(_pagina.GetType, Fun-
Public Property Funcoes() As
coes.Chave, Funcoes.Funcao & ";",
Codificando.net e-magazine
Funcao
True)
Get
Return _funcao
_pagina.ClientScript.IsClientScriptBlo
End Get
ckRegistered(Funcoes.Chave)
Set(ByVal value As Funcao)
End If
_funcao = value
End Sub
End Set
Public Sub EnviarFuncao(ByVal
End Property
_pagina As Page, ByVal _funcao As Fun-
Public Property Pagina() As Page
cao)
Get
Funcoes = _funcao
Return _pagina
Pagina = _pagina
End Get
EnviarFuncao()
Set(ByVal value As Page)
End Sub
_pagina = value
Public Sub EnviarFuncao(ByVal
End Set
_pagina As Page, ByVal _chave As S-
End Property
tring, ByVal _funcao As String)
Public Sub EnviarAlerta()
Funcoes.Chave = _chave
EnviarAlerta(Pagina)
Funcoes.Funcao = _funcao
End Sub
Pagina = _pagina
Public Sub EnviarAlerta(ByVal
EnviarFuncao()
_pagina As Page)
End Sub
If
End Class

www.codificando.net Out / Nov - 2009 | 10


Chamadas de Funções e Mensagens em Javascript e-magazine
lasse ScriptManagerJS If
Imports System _pagina.ClientScript.IsClientScriptBl
Imports System.Web ockRegistered(Alertas.Chave) = False
Imports System.Web.UI Then
Imports System.Web.UI.ScriptManager ScriptMan-
Public Class ScriptManagerJS ager.RegisterClientScriptBlock
Private _alerta As New Alerta (_pagina, _pagina.GetType, Aler-
Private _funcao As New Funcao tas.Chave, "alert('" & Alertas.Alerta
Private _pagina As Page & "');", True)
Public Sub New()
Alertas = _alerta _pagina.ClientScript.IsClientScriptBl
Funcoes = _funcao ockRegistered(Alertas.Chave)
Pagina = _pagina End If
End Sub End Sub
Public Sub New(ByVal _alerta_ As Public Sub EnviarAlerta(ByVal
Alerta) _pagina As Page, ByVal _alerta As A-
Alertas = _alerta_ lerta)
End Sub Alertas = _alerta
Public Sub New(ByVal _pagina As Pagina = _pagina
Page, ByVal _alerta_ As Alerta) EnviarAlerta()
Alertas = _alerta_ End Sub
Pagina = _pagina Public Sub EnviarAlerta(ByVal
End Sub _pagina As Page, ByVal _chave As S-
Public Sub New(ByVal _funcao_ As tring, ByVal _alerta As String)
Funcao) Alertas.Chave = _chave
Funcoes = _funcao_ Alertas.Alerta = _alerta
End Sub Pagina = _pagina
Public Sub New(ByVal _pagina As EnviarAlerta()
Page, ByVal _funcao_ As Funcao) End Sub
Funcoes = _funcao_ Public Sub EnviarFuncao()
Pagina = _pagina EnviarFuncao(Pagina)
End Sub End Sub
Public Property Alertas() As Public Sub EnviarFuncao(ByVal
Alerta _pagina As Page)
Get If
Return _alerta _pagina.ClientScript.IsClientScriptBl
End Get ockRegistered(Funcoes.Chave) = False
Set(ByVal value As Alerta) Then
_alerta = value ScriptMan-
End Set ager.RegisterClientScriptBlock
End Property (_pagina, _pagina.GetType, Fun-

Codificando.net e-magazine
Public Property Funcoes() As Fun- coes.Chave, Funcoes.Funcao & ";",
cao True)
Get
Return _funcao _pagina.ClientScript.IsClientScriptBl
End Get ockRegistered(Funcoes.Chave)
Set(ByVal value As Funcao) End If
_funcao = value End Sub
End Set Public Sub EnviarFuncao(ByVal
End Property _pagina As Page, ByVal _funcao As
Public Property Pagina() As Page Funcao)
Get Funcoes = _funcao
Return _pagina EnviarFuncao(_pagina)
End Get End Sub
Set(ByVal value As Page) Public Sub EnviarFuncao(ByVal
_pagina = value _pagina As Page, ByVal _chave As S-
End Set tring, ByVal _funcao As String)
End Property Funcoes.Chave = _chave
Public Sub EnviarAlerta() Funcoes.Funcao = _funcao
EnviarAlerta(Pagina) Pagina = _pagina
End Sub EnviarFuncao()
Public Sub EnviarAlerta(ByVal End Sub
_pagina As Page) End Class

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 executa dentro dos famosos UpdatePanel
melhor entendimento: do Ajax, ou seja, a diferença da classe Cli-
enteJs.vb e ScriptManagerJs é que a S-
Classe Chaves.vb: será uma classe de criptManagerJs você vai trabalhar junto
apoio pois, o seu motivo de existir será com o ScriptManager e o ClienteJs.vb não
que outras duas classes (Alerta e Fun- precisa.
cao) herdarão (abstração de dados: Espe-
cialização) a sua única propriedade Cha- Criaremos um novo projeto ASP.NET A-
ve. A propriedade Chave é do tipo S- JAX- Enabled Web Site onde usaremos a
tring. DLL compilada do nosso projeto JvScript
( a DLL está localizada na pasta
Classe Alerta.vb: terá as propriedades “bin\Debug\JvScript.dll”). Iremos reali-
Alerta e Chave (herança da classe Cha- zar dois testes: um rodando dentro de um
ves.vb) e as duas são do tipo String. Essa UpdatePanel e outro fora do UpdatePa-
classe será utilizada como tipo de dado nel. A figura 11 exibe o layout da página.
para as classes ClienteJS.vb e ScriptMa-
nageJs.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á utili-
zada como tipo de dado para as classes
ClienteJs e ScriptManagerJs.vb
(abstração de dados: Agregação).
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 ti- Antes de fazer as codificações nos botões vamos
po Page, e dois tipos de dados que serão fazer referenciar a nossa DLL (“JvScript.dll”).
das classes Alerta.vb e Funcao.vb respec- Veja na figura 12 a estrutura do projeto.
tivamente Alertas (do tipo de dado Aler-
ta - 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 cha-
mará outras funções em Javascript.

Classe ScriptManagerJS: a classe Script-


Figura 12. Visualizando a estrutura do projeto.
ManagerJS é praticamente igual à classe
Agora vamos fazer as duas rotinas dos
ClienteJS.vb tendo a diferença que ela
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, an-
tes 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 Bom pessoal esse é um simples exemplo
criada para emitir alertas e funções de de como trabalhar com Classes no Visual
Javascript. Observe a listagem 3 e 4 a co- Studio.
dificação do evento click dos botões e na
figura 12 o resultado após o clique dos Fúlvio Cezar Canducci Dias
botões: 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

Codificando.net e-magazine
(configurações intermediárias)

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 desenvolvi-


das de forma distribuída, onde cada ca-
mada 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 Figura 2: Criando uma solução em branco.

de clientes simples, onde nosso objetivo é


Com a solução criada, é hora de criar as
focar no aprendizado de aplicações em n
camadas. Vamos começar com a camada
camadas.
que será a biblioteca de entidades. É nela
que definiremos todas as entidades que
vamos usar nesse exemplo.

Para adicionar a camada ao projeto, va-


mos 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 Figura 3: Adicionando um novo projeto a solu-


abrir o Visual Studio 2008 ou 2010 e criar ção (Add > New Project).

um novo projeto do tipo Blank Solution. 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 Pronto, com o diagrama de classes aberto
entidades. vamos criar a classe Cliente de maneira
muito fácil:

Figura 4: Projeto do tipo Class Library.

Com o projeto adicionado a solução, po-


demos agora trabalhar na entidade princi-
pal que será a classe Cliente.
Figura 7: Adicionando uma nova classe ao diagrama
(Add > Class).

Essa é a visualização da classe Cliente den-


tro do diagrama.

Figura 5: Projeto criado.

Por padrão, já é criada no projeto uma no-


va classe onde você poderá deletá-la, pois
iremos utilizar um ótimo recurso do Visu-

Codificando.net e-magazine
al Studio chamado View Class Diagram,
responsável em gerenciar as classes do
projeto conforme mostra a figura a baixo:
Figura 8: Visualização da classe Cliente dentro do
diagrama.

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
Figura 6: Visualizando o diagrama de classes da
prolongar muito nosso tempo.
camada de entidades (View Class Diagram).

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 Para visualizar o código da entidade Cliente,
passos acima: cpf, email, id, telefone. basta dar um duplo clique na classe.

using System;
using System.Collections.Generic;
using System.Text;
namespace NTier.Entity
{
public class Cliente
Figura 9: Adicionando atributos na classe Cli-
{
ente (Add > Field). /// <summary>
/// Atributos
/// </summary>
#region Atributos
Crie mais esses atributos seguindo os
private int id;
passos acima: cpf, email, id, telefone. private string nome;
private string cpf;
private string email;
Vamos encapsular os atributos para private string telefone;
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 public string Nome


Cliente (Add > Encapsulate Field > Ok > Apply). {
get { return nome; }
set { nome = value; }
Codificando.net e-magazine
Faça isso para todos os atributos utiliza- }
dos na entidade Cliente. O resultado
final será esse: 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; }
Figura 11: Classe Cliente com todos os atributos }
e propriedades definidas.
#endregion

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 se-
gunda parte desse artigo vamos criar a cama-
da 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 Win-
dows 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 ções pode ser modificada e as requisições
Broker, um sistema de filas de mensa- já disparadas são perfeitamente gerencia-
gens para aplicações distribuídas garan- das pelo Service Broker, podendo ser reti-
tindo que todas as mensagens persistam radas e modificadas. Desta forma, mesmo
e são recebidas mesmo quando ocorrem em caso de falha no sistema, teremos todas
falhas no sistema possibilitando uma no- as transações preservadas pelo Service
va geração de aplicações altamente esca- Broker em uma tabela e elas serão aplica-
láveis. das tão logo quanto possível garantindo
que as mensagens envolvidas no processo
Os desenvolvedores de software criam a sejam corretamente formatadas, entendi-
maioria das aplicações usando processa- das e processadas pelas aplicações que as
mento seqüencial e síncrono. Neste mo- enviam e recebem. Com este trabalho, não
delo a transação é iniciada, o dado é blo- há um consumo de recursos geradores de
queado (para evitar o uso por outras esperas que impactem na performance da
transações), as alterações são efetuadas e aplicação e a segurança tem um nível de
o dado é desbloqueado. Isto funciona confiabilidade maior.
bem para certas aplicações, mas existem
aplicações as quais necessitam de consis- As partes envolvidas, ou seja, as que envi-

Codificando.net e-magazine
tência para operações que envolvem vá- am e recebem, são os endpoints. A imple-
rios bancos de dados, plataformas e até mentação física de um endpoint são os
mesmo outras empresas. Muitas vezes bancos de dados envolvidos. O Service
estas transações simplesmente enviam Broker é a ponte de envio e recepção de
alguma requisição de processamento e dados entre os endpoints. O endpoint que
não exigem um retorno imediato de res- envia é o initiator e o endpoint receptor é
posta, pois têm a garantia de suas requi- o target. O gerenciamento desta comunica-
sições serem processadas tão breve ção pelo Service Broker é chamado de con-
quanto possível. versation, a troca de dados entre os endpo-
ints, cujo tipo é um dialog, ou seja, a co-
Embora essas transações sejam assíncro- municação entre dois endpoints.
nas, não corremos o risco de quebra de
integridade dos dados, pois todas as re- Os objetos que compõem o Service Broker
quisições são colocadas em uma fila são:
transacional, ou seja, esta fila de requisi-

www.codificando.net Out / Nov - 2009 | 18


Implementando o Service Broker e-magazine

• Queues, que são as tabelas onde as CRIANDO UMA MESSAGE TYPE


mensagens (messages) são armazena-
das. É a estrutura de armazenamento Vamos criar duas message types com vali-
usada para armazenar as mensagens dação WELL_FORMED_XML,
a serem processadas;
conforme mostrado na Figura 2.
• Services está atrelado a um queue e é
a camada que abstrai o armazena-
mento físico, isolando os queues, im-
pondo regras na conversação permiti-
da através dos contracts;

• Contracts, que é a lista de message


types que podem ser enviadas e rece-
bidas;

• Message types, tipos de mensagem


suportados e formatação que garante
a aceitação destas mensagens. Figura 2 – Criando uma message type

HABILITANDO O SERVICE BRO- Os tipos de message types são:


KER •
NONE – qual aceita qualquer dado em
O Service Broker vem desabilitado por padrão, qualquer formato no corpo da mensagem;
por não ser necessário à execução principal do S-
QL Server 2005. Através do SQL Server Manage- • EMPTY – força o corpo da mensagem a
ment Studio, insira o comando conforme Figura 1. não ter dado nenhum;
Utilizaremos como banco de dados o Adventure-
Works. Atente para as nomenclaturas, que são •
Codificando.net e-magazine
WELL_FORMED_XML – é permitido
case-sensitive. apenas um corpo de mensagem em formato
XML;
• VALID_XML WITH SCHEMA COL-
LECTION – é permitido apenas um cor-
po 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) retorna-
da, 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 conversati- Figura 5 – Criando dois services
on estarão completamente definidos.
CRIANDO CONVERSATIONS
CRIANDO MESSAGE QUEUES
A conversation criada na Figura 6 vai usar
Neste passo vamos criar duas queues: a os services e o contract criados anterior-
QueueCDMProdutoID e QueueCD- mente.
MResultado. CDM no nome é a abrevi-
ação de ContaDoMaterial, a fatura em
si. Desta forma estaremos criando a es-
trutura de armazenamento das messa-
ges, conforme a Figura 4.

Codificando.net e-magazine

Figura 6 : Criando uma conversation

ENVIANDO E RECEBENDO MEN-


SAGENS

Criamos, portanto toda a infra-


Figura 4 – Criando duas queues
estrutura necessária para nosso exemplo
CRIANDO SERVICES de Service Broker. Agora vamos finalmen-
te inserir mensagens na fila (messages no
Agora criaremos dois services os quais queue criado) utilizando o comando SEND

www.codificando.net Out / Nov - 2009 | 20


Implementando o Service Broker e-magazine

e remover elas usando o comando RE-


CEIVE 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 EnviarContaDoMate-
rialProduto, de acordo com a Figura 8. Figura 10: Consultando as queues novamente:
meio ...

Codificando.net e-magazine

Figura 8 : Consultando as queues


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

Veja os resultados na Figura 9, 10 e 11.


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, desen-
volvimento de sistemas e gerenciamento de TI na área ban-
cá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:

Codificando.net e-magazine
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

Figura 14 : Recebendo a mensagem: final da li-


nha.

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 a-
travé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 em nenhum momento em desenvolver


SAP prometidos, esta publicação con- em camadas. Porém, para se trabalhar
templa a criação de um Workaround para com versões mais recentes do VS, será
se trabalhar com o .NET SAP Connector necessário desenvolver as partes do
2.0 no Visual Studio 2005 ou Visual Stu- Proxy e RFCs do SAP em uma Class Li-
dio 2008. Infelizmente, o componente do brary, e então gerar uma DLL deste pro-
SAP para se conectar no VS é limitado à jeto no VS 2003 e importar essa DLL ge-
versão 2003, para isso, criamos uma al- rada no VS2005 / VS2008. Basicamente é
ternativa para se trabalhar com versões este o Workaround que existe para se tra-
mais atuais do Visual Studio. balhar com versões mais recentes do VS
utilizando o SAP.
Este artigo não vai entrar em detalhes de
como funciona a parte de Escrita ou de Vou iniciar a explicação, mostrando co-
Leitura de RFCs do SAP, se quiserem mo é a geração da DLL através da Class
acompanhar estes processos, foram cria- Library do Visual Studio 2003, passando
dos e publicados dois outros artigos so- para as referências das DLLs necessárias
bre estes assuntos. Eles podem ser aces- no VS2005 / VS2008, e finalizando com a
sados pelos links abaixo. criação da mesma aplicação de leitura do Codificando.net e-magazine
SAP criada anteriormente, mas utilizan-
Leitura: do as versões mais recentes do VS.
http://www.linhadecodigo.com.br/
Artigo.aspx?id=2343 A geração da DLL, consiste em criar um
novo projeto do tipo Class Library dentro
Escrita: da Solution e realizar toda a parte de in-
http://www.linhadecodigo.com.br/ clusão do Proxy (onde serão inseridas as
Artigo.aspx?id=2354 RFCs) dentro deste novo projeto. Veja a
Figura 1, a Solution Explorer com o pro-
Da forma que as aplicações foram cons- jeto de Class Library.
truídas nos artigos citados, a idéia era
apenas exemplificar as formas de traba-
lho com SAP Connector, não me apeguei

www.codificando.net Out / Nov - 2009 | 23


Workaround com o .NET SAP Connector 2.0 e-magazine

Figura 2: Solution Explorer do VS2008.

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
Figura 1: Solution Explorer do VS2003, com a referências para a nova aplicação fun-
Class Library e seus arquivos.
cionar, as referências são:
Após esta alteração simples no projeto
que havia sido criado anteriormente, 1. DLL da Class Library gerada. No
uma DLL referente à sua Class Library é exemplo, é chamada de
compilada e ficará na pasta de build do “interfaceSAP.dll”;
seu projeto. 2. DLL do SAP Connector 2.0, que
está na pasta de instalação do SAP
Agora que já existe a DLL que faz os Connector, geralmente fica dentro
“meios de campo” entre o . Net e o SAP, de “C:\Program Fi-
é necessário criar uma aplicação no les\SAP\SAP .NET Connector 2.0
VS2005 e/ou VS2008 para utilizar esta \SAP.Connector.dll”;
DLL e conseguir trabalhar com o SAP. 3. Referência do próprio .Net para
Vamos então, criar um projeto do “System.Web.Services”, que é atra-
VS2008 do tipo Windows Forms Appli- vés desta tecnologia que o .Net se Codificando.net e-magazine
cation, usarei o C# Express para mostrar conecta ao SAP usando o compo-
que com a versão Express do Visual Stu- nente do SAP Connector.
dio também é possível realizar esta tare-
fa. Um alerta interessante, é que a forma Veja a Figura 3 e 4, as referências do
que será realizado para o VS2008 pode projeto antes e depois de adicionar estas
ser utilizada para o VS2005 também, acima.
sem nenhuma mudança significativa. A
Figura 2 exibe o projeto criado no
VS2008.

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 Data-
Table.
private void acessarSAP()
{
try
{
lendoSAP proxy = new len-
doSAP("XXXXX");

BAY2_N2RV_RPCAMTable tabe-
laSAP = new BAY2_N2RV_RPCAMTable
();

proxy.Bay2_N2rv_Rfc_Pxp_Camph(ref
tabelaSAP);

Figura 3: Referências do projeto, antes da adi- DataTable dt = new


ção necessária. DataTable();
dt.Columns.Add("codigo");
dt.Columns.Add("nome");
foreach (BAY2_N2RV_RPCAM
linha in tabelaSAP)
{
DataRow dr = dt.NewRow
();
dr["codigo"] = li-
nha.Codca;
dr["nome"] = li-
nha.Descc;

dt.Rows.Add(dr);
}
dataGridView1.DataSource =
dt;
Codificando.net e-magazine
}
catch (Exception ex)
{
MessageBox.Show
(ex.Message);
}
}
Listagem 1: Código em C# do método acessarSAP.
Figura 4: Referências do projeto, depois das
adições necessárias.
A execução da aplicação com este código,
Agora que as referências necessárias fo- dá um retorno muito próximo do que foi
ram inclusas no projeto, vamos adicio- apresentado no artigo de leitura do SAP
nar um dataGridView no formulário e utilizando o VS2003.
provar que a solução funciona. No mé-
todo LOAD do formulário, adicionamos Veja a Figura 5, como ficou o resultado da
uma chamada para o método acessar- aplicação construída com C# 2008 Express.
SAP() que carregar os dados na grid.

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 traba-
lhar com o SAP, coisa que é muito co-
mum 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 Desen-
Figura 5: Aplicação desenhada com o Visual volvimento Web com .NET. Colaborador do Portal Linha
Studio 2008. de Código e da revista SQL Magazine, Líder do grupo de
usuários Codificando .NET, Líder dos Microsoft Student
Com a finalização deste artigo, fecha- Partners [MSP] de São Paulo e Microsoft Most Valuable
Professional [MVP] em SQL Server, possui
mos o ciclo de 3 artigos sobre o SAP
certificações MCP e MCTS em SQL Server 2005, é pales-
que havia prometido. Foram criados trante em eventos da Microsoft, Codificando .NET e
aplicações para exemplificar a Leitura e INETA BR, mantém o site: www.diegonogare.net.
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 cha-
mamos 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 Características
relatórios ditos locais seguem o modelo
de desenvolvimento e deploy dos rela- Os relatórios “local mode” caracterizam-
tórios desenvolvidos como o Microsoft se especialmente por:
Access e Crystal Reports, onde os relató-
rios são parte integrante da aplicação. ♦ A segurança é herdada da aplica-
ção que o hospeda.

Arquitetura ♦ Filtros, ordenação, agrupamento e Codificando.net e-magazine


Nesse modelo de relatórios, todo pro- funções de agregação estão dispo-
cessamento é realizado no cliente. A a- níveis.
plicação é responsável por obter os da-
dos proveniente de qualquer fonte de ♦ Possui formatação rica e inteligen-
dados, e o controle ReportViewer apre- te, com imagens, fontes e cores.
senta os relatórios. A figura abaixo a-
presenta a arquitetura dos relatórios Lo- ♦ Interatividade com bookmarks e
cal Mode. DocumentMap.

♦ Liberdade para interatividade com


o usuário final.

♦ Integração com o controle Report-


Viewer.

www.codificando.net Out / Nov - 2009 | 27


Explorando SQL Reporting Services 2005 – Parte II e-magazine

♦ DataSet como estrutura de dados. mos que seguir basicamente os seguintes


passos:
♦ Arquivos .RDLC (nenhuma ins-
trução de acesso e/ou conexão à ♦ Modelagem do repositório de da-
base de dados). dos local
⇒ DataSet – estrutura de dados
E seus elementos fundamentais corre- com integridade relacional
lacionam-se conforme a figura abaixo:
♦ Elaboração do layout e
“inteligência” do relatório
⇒ Header, Body, Footer

♦ Uso de patterns – dados agrupados,


tabular, matriz, colunas múltiplas,
gráficos.
⇒ Criação de parâmetros, forma-
tação condicional
Figura 2.2 – correlação dos elementos
♦ Recuperação dos dados, preenchi-
mento do dataset e bind com o rela-
Processo de criação tório

♦ APIs do ADO .NET, Stored Proce-


A partir dessa sessão começaremos a dures, T-SQL
implementar alguns relatórios exemplo,
para tal utilizaremos um banco de da- ♦ Controle ReportViewer
dos que controla pedidos de uma loja
de departamentos. O diagrama abaixo Template de aplicação
apresenta as tabelas e seus respectivos Codificando.net e-magazine
relacionamentos. Para nossos exemplos tomaremos uma
aplicação Windows Forms, como apre-
sentado na figura abaixo, atente para as
pastas DataSources e Reports, onde res-
pectivamente armazenaremos os DataSets
e os relatórios criados.

Figura 2.3 – modelo de dados utilizado em


nossos exemplos

Retornando ao processo de criação. Pa-


ra qualquer relatório implementado te-

www.codificando.net Out / Nov - 2009 | 28


Explorando SQL Reporting Services 2005 – Parte II e-magazine

Podemos criar objetos DataSets de di-


versas formas, utilizaremos aqui o wi-
zard 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 respecti-
vas categorias, quantidade em estoque
Figura 2.4 – template de aplicação
e valor unitário. Então modelaremos
um dataset com uma única tabela con-
Repositório de dados local - data- tendo esses campos como mostrado na
set figura 2.6. A figura 2.5 ilustra a criação
de um novo dataset através da inclusão
Relatórios são representações formatadas de um novo item (DataSet) ao projeto.
de um conjunto de registros provenientes
de uma consulta em um repositório de da-
dos. Para os relatórios criados na platafor-
ma do Reporting Services é necessário um
DataSet tipado com uma ou mais tabelas
que será a estrutura de dados volátil con-
tendo as informações dos relatórios, esse
dataSet será preenchido no aplicativo que
hospeda o relatório e será utilizado na sua
formatação. Figura 2.6 – datatable do dataset exemplo

Nota: Um DataSet é uma representação na


memória de um banco de dados relacional. Formatando os relatórios
Maiores informações consultar a página do
MSDN especifica sobre essa estrutura de Tipos e Estrutura do Relatório:
dados em: http://msdn2.microsoft.com/en- Codificando.net e-magazine
us/system.data.dataset.aspx. 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 a-
grupamento 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 suma-
rizados. A estrutura dos relatórios do
Figura 2.5 – criação de datasets
RS inclui três sessões como mostrado

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


A tabela a seguir descreve resumidamente
os itens da nossa caixa de ferramentas:
Header: indicado para incluir informa- Mais informações sobre os itens mais im-
ções estáticas referentes ao relatório tais portantes:
como título, data, logo da empresa e se
for o caso, alguns dos parâmetros infor-
mados pelo usuário. Item Descrição

Body: é a região dos detalhes do relató- Poiter Seleciona os itens do relatório.


rio, onde os dados provenientes das
consultas (armazenados no DataSet), Textbox Item mais utilizado da toolbox,
filtros e ordenação serão exibidos. exibe informações provenientes do
datasource ou mesmo textos está-
Footer: ideal para outras informações
ticos.
do relatório, tais como numero de pági-
na e informações de direitos autorais.
Line Desenha uma linha como separa-

Codificando.net e-magazine
Report itens dor de informações.

Parte fundamental da formatação dos Table Exibe detalhadamente as informa-


relatórios, os Report Items, disponíveis
ções do relatório em formato ta-
na Toolbox do Visual Studio, funcio-
nam como um canal entre o DataSource bular, além de disponibilizar ses-
e a estrutura do relatório. Os Report I- sões de cabeçalho e rodapé.
tens são simples objetos, parecidos com
os controles das aplicações Window e
Web Forms, e como tal, o grande segre- Matrix Exibe detalhadamente as informa-
do do bom uso desses itens é conhecer ções do relatório correlacionando
suas propriedades. A figura 2.8 apre-
linhas e colunas.
senta nossa caixa de ferramentas, onde
já utilizamos alguns textbox e um table Agrupa informações relacionadas.
para formatar as sessões header e body. Rectangle

www.codificando.net Out / Nov - 2009 | 30


Explorando SQL Reporting Services 2005 – Parte II e-magazine

Item Descrição te no Footer temos informações sumariza-


das dos dados do relatório. É possível ter
List Exibe detalhadamente as informa- mais de uma tabela em um relatório. É
ções do relatório, parecido com o muito importante dominar são as proprie-
table, no entanto sem tantos re- dades do componente Table (figura 2.9 a-
baixo), especialmente as tabs Groups, on-
cursos tais como as sessões de ca-
de é possível configurar diversos agrupa-
beçalho e rodapé. . mentos das informações e Filter, onde po-
demos estabelecer restrições aos dados vi-
Image Permite inserir imagens no relató- síveis aos usuários.
rio.

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 cons-


truir um relatório sem o Textbox, que é Subreport
sem dúvida o componente mais versátil
que temos à disposição, podendo ser Um relatório é considerado um subreport
utilizado para diversas utilidades, do quando inserido em outro relatório. O sub-
título do relatório no header, à exibição relatório funciona como um filho do relató-
de totalizadores, enfim, esse controle é rio que o hospeda (parent), tornando os Codificando.net e-magazine
usado para exibir textos estáticos, fazer sub-relatórios uma poderosa ferramenta
bind com data source, campos calcula- para, por exemplo, implementar o tão re-
dos e expressões. quisitado conceito master/detail, no entan-
to é preciso ter muita cautela na sua utili-
Table zação uma vez que temos perdas conside-
ráveis na performance do relatório.
É o melhor item para relatórios detalha-
dos. Cada tabela possui uma estrutura Chart
com sessões Header, Detail e Footer,
não confundir com as sessões homôni- O item Chart, é responsável pela apresen-
mas do próprio relatório. O Header é tação de informações numéricas em forma-
indicado para os nomes das colunas, no to de gráficos. As ferramentas de gráficos
Details, temos um conjunto de linhas foram inseridas nos relatórios do RS pela
provenientes do datasource e finalmen- empresa Dunda Software, estando à dispo-

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 2. Garanta que o idioma do relatório


– pizza, barra e colunas. esteja devidamente configurado.
3. Considere o uso de Expressions do ti-
Formatação po, Common Functions Text
(Format, FormatCurrency, FormatDa-
Um relatório não é capaz de atrair a a- teTime, FormatNumber e FormatPer-
tenção dos leitores se suas informações cent).
não forem bem formatadas, dados nu-
méricos, por exemplo, são muito me- Ainda com o intuito de tornar nossos rela-
lhor compreendidos se devidamente tórios atrativos aos usuários, outros atribu-
formatados conforme seu tipo – numé- tos das caixas de texto podem ser customi-
rico inteiro, decimal, moeda ou cientifi- zados tais como Fontes, Cor, Alinhamento
ca, por exemplo, outra informação dig- e Decoração, todos esses, além de outros
na de atenção na sua formatação são os atributos podem ser configurados na jane-
campos referentes à data e hora. No la de propriedades do Textbox como mos-
processo de criação dos relatórios a for- trado na figura 2.11.
matação é feita através de uma caixa de
dialogo na tab Format das proprieda-
des de uma caixa de texto, vide abaixo
– figura 2.10.

Codificando.net e-magazine

Figura 2.11 – Formatação texto

Figura 2.10 – Formatação texto E finalmente, dentro da formatação, eis um


recurso muito poderoso dos relatórios do
Dicas Importantes: RS que é a formatação condicional, onde
1. Certifique-se que o tipo do campo através do editor de Expressions, que utiliza
esteja devidamente bem definido um dialeto da linguagem Visual Basic, é
no DataTable, do contrário a for- possível criar instruções condicionais co-
matação simplesmente não fun- mo a descrita abaixo.
ciona, e o tipo default dos campos
é System.String. =IIf(Fields!

www.codificando.net Out / Nov - 2009 | 32


Explorando SQL Reporting Services 2005 – Parte II e-magazine

QT_ESTOQUE.Value<230,"Red","Blue" Filters), sendo essa funcionalidade, mais


) indicada para criação de relatórios do tipo
master/detail com subreports.
Parametrização
Consumindo o relatório
Os relatórios possuem um mecanismo Controle reportviewer
de parametrização, onde é possível pas-
sar informações a partir do cliente para Para interação dos relatórios com os clien-
o relatório em tempo de execução. A tes, temos o controle ReportViewer, dispo-
figura 2.12 ilustra a janela Report Para- nível no visual Studio, em duas versões u-
meters para criação dos parâmetros de ma para web e outra para Windows forms.
um relatório, onde, para acessar basta Com ele é possível disponibilizar para as
clicar com o botão direito fora das ses- aplicações um conjunto de funcionalidades
sões do relatório. 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ó-


Figura 2.12 – parâmetros
rio.

Codificando.net e-magazine
Os parâmetros aqui criados podem ser
♦ Zoom
utilizados para formatação condicional
ou em expressões. Ao contrário dos re-
O controle é capaz de processar e renderi-
latórios remote mode, esse modelo de re-
zar os relatórios independente do seu mo-
latórios não tem uma área para que o
delo, local ou remote. A figura abaixo exibe
usuário selecione ou digite o valor dos
o controle ReportViewer em ação renderi-
parâmetros, sendo responsabilidade do
zando um relatório.
cliente providenciar uma interface para
coleta dessas informações e gerar o con-
junto 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 pes-
quisa, ainda que tenhamos como apli-
car filtros (propriedade das tabelas, tab Figura 2.13 – reportviewer

www.codificando.net Out / Nov - 2009 | 33


Explorando SQL Reporting Services 2005 – Parte II e-magazine

Parte dos recursos do ReportViewer,


tais com, Zoom, botão Stop, os botões Eis um pseudocódigo utilizado em um cli-
de pesquisa, de exportação, impressão, ente de um relatório local mode.
dentre outras, podem ser desativados
string cnString =
na sua janela de propriedade, como "Database=<banco>;Server=<servidor
mostrado na figura abaixo. Outra pro- >;User Id=sa;PassWord=sa";
SqlConnection conReport = new
priedade importantíssima do ReportVi- SqlConnection(cnString);
ewer é seu ProcessingMode. SqlCommand cmdReport = new SqlCom-
mand();
DataSet dsReport = new WFormRe-
port.DataSources.ProdutosporCatego
ria();
conReport.Open();
SqlParameter[] parms = {new
SqlParameter("@idCategorias",
SqlDbType.VarChar,20)};
parms[0].Value = “1,2,3”;
cmdReport.CommandType = Command-
Type.StoredProcedure;
cmdReport.Connection = conReport;
foreach (SqlParameter parm in
Figura 2.14 – propriedades do reportviewer parms)
cmdReport.Parameters.Add
(parm);
cmdReport.CommandText =
Código cliente "getProdutosinCategorias";
SqlDataReader drReport = cmdRe-
Uma vez modelados, o relatório e seu port.ExecuteReader();
respectivo DataSet, chegou a hora de
dsReport.Tables[0].Load(drReport);
relacionar tudo, e como já dissemos to- drReport.Close();
do processamento é feito no cliente, da conReport.Close();
obtenção dos dados no repositório para reportView-
carga do dataset à renderização do rela- er1.LocalReport.ReportPath =
tório via controle ReportViewer. A figu- “ProdutosporCategoria.rdlc";
ReportDataSource rds = new Report-
Codificando.net e-magazine
ra 2.15 apresenta o fluxo padrão de um DataSource();
código cliente para utilização de relató- rds.Name =
"ProdutosporCategoria_ProdutosEsto
rios RS em client-mode. que";
rds.Value = dsReport.Tables[0];
reportView-
er1.LocalReport.DataSources.Clear
();
reportView-
er1.LocalReport.DataSources.Add
(rds);
reportViewer1.RefreshReport();

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 Arqui-
teto 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


Nos tempos do VB 6 e até mesmo no diversos frameworks e bibliotecas de de-
início da era .Net lá para 2002/2003 era senvolvimento, a própria Microsoft esti-
muito comum ouvir dizer de aplicações mula o site colocando suas bibliotecas e
“open source” desenvolvidas em JAVA aplicativos livres, como o ASP.NET AJAX
ou outra plataformas disponíveis para a e MVC.
comunidade... hoje em dia graças ao
site codeplex (www.codeplex.com) e Um ponto curioso é a baixíssima quantida-
outras iniciativas de comunidade con- de de projetos nacionais... não encontrei
seguimos encontrar aplicações com praticamente nada... Será que não temos
muita qualidade disponíveis para essa cultura? Eu mesmo, nunca pensei em
download gratuitamente, ou as vezes subir nada por lá, porém já deveria ter fei-
tão barato que podemos considerar gra- to isso.
tuito.
Hoje sempre que tenho a necessidade de
Para que vou perder o tempo desenvol- desenvolver algo passo por lá e na internet
vendo um fórum? Ou até mesmo um em geral e somente quando não encontro
blog? Dentro do codeplex temos solu- nada começa um projeto do zero.
ções completas e claro, com o código
fonte, com isso você será capaz de cus- Como diz o amigo Ramon Durães: “Não
tomizar a aplicação e deixar ela redon- tem que ser difícil”.
dinha com as necessidades do seu site.
[]´s
Um ponto muito interessante é que o Alexandre Tarifa
pessoal que desenvolve esse tipo de so-
lução tem pensado cada vez mais em

www.codificando.net Abril
Out // Maio
Nov -2009
2009 | 36