Você está na página 1de 108

Guia prtico para o desenvolvimento de Aplicaes C# em Camadas

1 - Introduo Este o primeiro de uma srie de artigos onde vamos demonstrar passo-a-passo a construo de uma aplicao .Net utilizando o conceito de desenvolvimento em camadas. Nosso objetivo permitir voc praticar o desenvolvimento de uma aplicao real em .Net para ue voc ad uira !abilidades para a construo ou manuteno de aplica"es mais comple#as. $ara alcanar esse objetivo% essa srie de artigos &oi concebida como um guia passo-a-passo ue abrange todas as etapas da implementao relacionadas ao desenvolvimento de uma aplicao .Net. 'on&orme voc &or evoluindo nos m(dulos% ir) ad uirir con!ecimentos sobre* + 'omunicao entre as camadas, + -antagens do modelo de desenvolvimento em camadas, + 'ontrole de transa"es do banco de dados com o ./0 .Net, + 'onstruo de uma aplicao para 1indo2s, + 'onstruo de uma aplicao para a 1eb, + . import3ncia da segurana no desenvolvimento de aplica"es. . metodologia utilizada ser) o desenvolvimento em trs camadas. -eremos a di&erena entre* + 'amada de acesso dados ou /ata .ccess 4a5er 6/.47, + 'amada de regras de neg(cio ou 8usiness 4ogic 4a5er 68447, e + 'amada de inter&ace do usu)rio ou 9ser Inter&ace 69I7.

Na camada de inter&ace com o usu)rio reutilizaremos as camadas /.4 e 844 para criarmos dois projetos de inter&ace para o usu)rio. 9m projeto ser) uma aplicao ue rodar) no :icroso&t 1indo2s e o outro ser) uma aplicao para a 1eb. Esperamos ue com esta srie de artigos voc esteja munido de con!ecimentos pr)ticos ;teis no seu dia-a-dia. $ara os desenvolvedores de solu"es de <I esperamos ue este material possa agregar dinamismo e e&icincia na construo pro&issional de so&t2ares. $ara os pro&essores esperamos ue o guia passo-a-passo possa ser usado como e#emplos pr)ticos da utilizao de conceitos como* programao orientada a objetos% integridade re&erencial de banco de dados% uso de transa"es via linguagem de programao '= .Net e implementao de algoritmos de segurana no desenvolvimento de aplica"es. $ara os alunos e entusiastas da tecnologia :icroso&t .Net desejamos ue essa srie de artigos represente o in>cio de uma carreira pro&issional repleta de sucesso e realiza"es. 1.17 ?e uisitos <cnicos* @uais so&t2ares n(s vamos utilizarA Esse projeto ser) desenvolvido utilizando os so&t2ares* + Bistema 0peracional* :icroso&t 1indo2s C$ $ro&essional,

+ 8anco de /ados* :icroso&t B@4 Berver DEEF, + :icroso&t -isual Btudio DEEF $ro&essional Edition. 2 Criando a infra-estrutura de Banco de dados $ara o nosso projeto vamos precisar de uma in&ra-estrutura simples de banco de dados com apenas trs tabelas* clientes% produtos e vendas. Be voc estiver utilizando o :B B@4 Berver DEEF% poder) abrir o :icroso&t B@4 Berver :anagement Btudio. Belecione o servidor de banco de dados e o usu)rio para realizar a cone#o como a seguir*

Estabelecida a cone#o% podemos criar um banco de dados para o nosso projeto. $ara isso% cli ue com o boto direito sobre /atabases e escol!a a opo GNew Data ase!!!H

-amos dar o nome do nosso database de "o#a. /ei#e a con&igurao padro para o taman!o inicial dos ar uivos de dados e 4og. 'li ue em $%

para criar o database*

.p(s clicar em 0I provavelmente precisaremos aguardar alguns segundos para ue o :B B@4 Berver DEEF crie o banco de dados 4oja. @uando esta janela de t>tulo New Database desaparecer% podemos veri&icar ue o banco de dados 4oja &oi criado com sucesso con&orme &igura abai#o*

.gora ue j) temos o nosso banco de dados% vamos e#ecutar os scripts para criar as trs tabelas necess)rias ao nosso projeto. 2!&' Criando a ta ela de Clientes 'licando com o boto direito sobre o database 4oja% escol!a a opo New (uer)*

'opie o script B@4 abai#o e cole na janela de @uer5 aberta. '?E.<E <.84E J'4IEN<EBK 6 J'0/IL0K JintK I/EN<I<M 61% 17 N0< N944 % JN0:EK Jvarc!arK 61EE7 % JE:.I4K Jvarc!arK 61EE7 % J<E4EN0NEK Jvarc!arK 6OE7 % '0NB<?.IN< J$PQ'4IEN<EBK $?I:.?M PEM '49B<E?E/ 6 J'0/IL0K 7 0N J$?I:.?MK 7 0N J$?I:.?MK L0 0 c(digo dever) &icar assim*

$ara e#ecutar esse script e criar a tabela de 'lientes% cli ue no boto *+ecute* Be a mensagem GCommand(s) completed successfully.H &or e#ibida% podemos e#pandir o database Loja e depois e#pandir Tables para vermos a tabela '4IEN<EB ue acabamos de criar.

0 campo Cdigo da nossa tabela de 'lientes &oi criado como Identity e P ima y !ey. 0 ue

signi&ica issoA 8em% P ima y "ey 6c!ave prim)ria7 um campo ue ser) ;nico para cada registro da tabela% ou seja% s( e#istir) um campo com o c(digo igual a 1% s( e#istir) um campo com o c(digo igual a D etc. R um campo ue no admite valores repetidos. Be tentarmos incluir um valor na c!ave prim)ria j) e#istente na tabela% o :B B@4 Berver vai e#ibir uma mensagem de erro e no permitir) essa incluso. . caracter>stica Identity desse campo signi&ica ue ele ser) gerenciado pelo :B B@4 Berver e n(s no precisamos nos preocupar em inserir um valor ine#istente na tabela para evitar a duplicidade. Na pr)tica isso uer dizer ue n(s nem precisamos mencionar esse campo nas opera"es de insero pois o gerenciador de banco de dados ue se encarrega de inserir uma c!ave prim)ria v)lida. -amos inserir um registro na tabela de clientes com o comando a seguir. $odemos apagar o comando de 'reate table e#istente na janela do :anagement Btudio e vamos colar o comando abai#o* insert into clientes6nome%email%tele&one7 values 6S'arlos 'amac!oS%ScQolavoT!otmail.comS%S6117 UUUU-FFFFS7 'li ue em *+ecute para e#ecutar o comando de insero*

Be a mensagem G# ow(s) affectedH &or e#ibida% signi&ica ue o registro &oi inserido com sucesso. E#ecute o comando de seleo a seguir para visualizarmos o registro ue acabamos de inserir na tabela de 'lientes* Belect V &rom clientes

$erceba ue apesar de no mencionarmos o campo Codigo no comando de inse t e#ecutado anteriormente% o :B B@4 Berver providenciou a insero desse valor automaticamente. Be e#ecutarmos outro comando de inse t% o :B B@4 Berver vai gerar um c(digo di&erente para inserir no campo Codigo do novo registro. $arabnsW .cabamos de preparar a in&ra-estrutura do nosso projeto com a tabela de 'lientes criada corretamente. D.D7 .gora vamos e#ecutar o script para criar a tabela de produtos* 0 processo o mesmo. .pague o conte;do da janela de uer5 e cole o script abai#o. '?E.<E <.84E J$?0/9<0BK 6 J'0/IL0K JintK I/EN<I<M 61% 17 N0< N944 % JN0:EK Jvarc!arK 61EE7 % J$?E'0K decimal61E%D7 % JEB<0@9EK JintK % '0NB<?.IN< J$PQ$?0/9<0BK $?I:.?M PEM '49B<E?E/ 6

J'0/IL0K 7 0N J$?I:.?MK 7 0N J$?I:.?MK L0 'om o script na janela de uer5% cli ue em *+ecutar para criarmos a tabela de produtos.

Nesse instante voc deve estar pensando... 9AW /epois ue cli uei no *+ecute apareceu a mensagem GCommand(s) completed successfully.H :as a tabela $?0/9<0B no apareceu em <ables... 0 ue aconteceuA -oc est) certo6a7W $recisamos atualizar o :anagement Btudio para ver a tabela recm-criada. $ara isso% vamos clicar com o boto direito do mouse em <ables e escol!er a opo ,efres-*

-eja o :anagement Btudio ap(s o ?e&res!*

.gora podemos ver a tabela de $rodutos. @ue tal inserirmos dois produtos nessa tabelaA - .pague o c(digo da janela de uer5, - 'opie o c(digo abai#o na janela de uer5 e cli ue em *+ecute para a insero dos dois produtos. insert into produtos 6nome% preco% esto ue7 values 6S'omputador $entium /ual 'oreS%S1FEE.EES%S1FS7 insert into produtos 6nome% preco% esto ue7 values 6SImpressora /esIjet X$S%SFUU.UES%S1FES7 -amos ver o resultado*

Na janela de mensagens podemos ver ue os dois registros &oram inseridos com sucesso. 9tilize o comando select para consultar os produtos cadastrados. - .pague o conte;do da janela de uer5, - 'opie o comando abai#o e cli ue em *+ecute. select V &rom produtos 0 resultado esse*

0I% a nossa insero de produtos &uncionouW

'adastramos 1F computadores $entium /ual 'ore com o valor unit)rio de ?Y 1.FEE%EE, E cadastramos tambm 1FE impressoras /esIjet X$ com o valor unit)rio de ?Y FUU%UE. . nossa tabela de $rodutos est) pronta. .gora s( &alta criarmos a tabela de -endasW D.Z7 -amos criar a tabela para armazenar as -endas. - .pague o conte;do da janela de uer5, - 'opie o comando abai#o e cli ue em *+ecute. '?E.<E <.84E J-EN/.BK 6 J'0/IL0K JintK I/EN<I<M 61% 17 N0< N944 % J/.<.K JdatetimeK% J@9.N<I/./EK JintK% JN.<9?./0K bit% J'0/IL0'4IEN<EK JintK% J'0/IL0$?0/9<0K JintK% '0NB<?.IN< J$PQ-EN/.BK $?I:.?M PEM '49B<E?E/ 6 J'0/IL0K 7 0N J$?I:.?MK% '0NB<?.IN< JNPQ'odigoQ'lienteK N0?EILN PEM 6 J'0/IL0'4IEN<EK 7 ?ENE?EN'EB J'lientesK 6 J'odigoK 7% '0NB<?.IN< JNPQ'odigoQ$rodutoK N0?EILN PEM 6 J'0/IL0$?0/9<0K 7 ?ENE?EN'EB J$rodutosK 6 J'odigoK 7 7 0N J$?I:.?MK L0 -ejamos o resultado*

/ um ?e&res! clicando com o boto direito tem <ables para ue a tabela de -endas seja e#ibida*

. tabela de -endas ue acabamos de criar possui duas fo eign "eys 6c!aves estrangeiras7. Essas duas c!aves so os campos* CodigoCliente e CodigoP oduto. Isso signi&ica ue uando um registro &or inserido nesta tabela% o campo CodigoCliente inclu>do dever) e#istir na tabela de 'lientes% assim como o campo CodigoP oduto dever) e#istir na tabela $rodutos. Be algum tentar incluir valores nestes campos ue no e#istam nas tabelas citadas o :icroso&t B@4 Berver vai in&ormar a ocorrncia de um erro e no permitir) a incluso. Esse mecanismo do sistema gerenciador de banco de dados e#iste para manter a integridade dos dados. '!amamos isso de integ idade efe encial. 9ma regra ue vamos usar no nosso projeto ue ao realizar uma venda% atualizaremos o esto ue do produto na tabela de $rodutos. Naremos com ue o esto ue &i ue atualizado com a seguinte &(rmula* *sto.ue / *sto.ue (uantidade 0endida ! Essa tare&a ser) realizada juntamente com a tare&a de incluso da -enda na tabela de -endas. .ssim% para manter a integridade dos dados% precisaremos garantir ue as duas coisas aconteam* 17 a incluso na tabela de -endas, e D7 a atualizao do esto ue na tabela de $rodutos. $ara isso usaremos uma T ansa$%o. 'om a transao podemos garantir a e#ecuo das duas tare&as. Be uma delas &or bem sucedida e a outra &al!ar% a transao des&az a primeira tare&a mantendo assim a integridade re&erencial.

Em outras palavras% no e#isitir) na tabela de -endas um registro ue ten!a o c(digo do produto vendido mas ue o esto ue deste produto na tabela de $rodutos esteja desatualizado. -eremos isso com mais detal!es no pr(#imo artigo c!amado G'amada de .cesso a /ados 6/ata .ccess 4a5er7H. Implementaremos as classes de acesso a dados e &aremos esse controle transacional no mtodo Incluir da classe de -endas. 0bserva"es* $ara &utura utilizao no nosso projeto% precisaremos guardar as seguintes in&orma"es sobre o banco de dados* + Nome do servidor de banco de dados ue estamos usando, + Nome do banco de dados onde as trs tabelas &oram criadas, + Nome do usu)rio e sen!a utilizados para acessar o banco de dados. Essa in&ormao importante para a construo da nossa string de cone#o ou connectionst ing. . connectionst ing ser) usada para a cone#o com o banco de dados atravs da aplicao ue desenvolveremos neste projeto. 9m bom site para consulta sobre a correta connectionst ing ue devemos utilizar o !ttp*[[222.connectionstrigs.com[ Neste site e#istem dicas para criar connectionst ings para di&erentes vers"es de bancos de dados. No meu caso% se eu &ec!ar a janela de @uer5 ue est)vamos usando% poderei ver o nome do servidor de banco de dados ue estou usando*

0 usu)rio e sen!a so a ueles ue usei inicialmente para conectar no servidor de banco de dados antes de iniciar a criao do database 4oja. Nome do Bervidor* &'()*+,-*,./(L01P20// Nome do banco de dados* Loja 9su)rio* camac3o Ben!a* camac3o4++5a6 .ssim% a min!a connectionst ing &icar) assim*

Sserver\:.@-]E^F]^_B@4EC$?EBB,database\4oja,user\camac!o,p2d\camac!oDEEOaZS . sua connectionst ing vai depender dos nomes ue voc usou para* + - 'riar o servidor de banco de dados, + - 'riar o banco de dados, + - 'riar usu)rio e sen!a ue tero acesso ao banco de dados. Z - 'amada de .cesso a /ados Essa camada normalmente tambm c!amada de /.4 6/ata .ccess 4a5er7. Nessa camada vamos implementar os mtodos de insero% atualizao% e#cluso e listagem re&erentes a todas as tabelas e#istentes no nosso projeto. Essa uma tare&a simples% j) ue para criar cada classe usaremos os nomes dos campos da respectiva tabela e#istente no banco de dados. -oc se lembra do nosso desen!o ue representa as trs camadasA . ui est) ele*

N(s comeamos o desenvolvimento da aplicao da camada mais interna at a mais e#terna. /essa &orma% iniciaremos a implementao com a camada de acesso a dados 6/.47. /entro da camada /.4 n(s temos o projeto 1odelos. -amos criar esse projeto. No projeto c!amado 1odelos iremos implementar as classes* + 'lienteIn&ormation.cs + $rodutoIn&ormation.cs e + -endaIn&ormation.cs R necess)rio criar uma classe para cada tabela do nosso projeto. . partir do menu Iniciar ` $rogramas ` :icroso&t -isual Btudio DEEF% abra o 1icrosoft 0isual 2tudio 2334. 'li ue no :enu Nile ` Ne2 ` 5ro#ect!!!

.compan!e as sele"es da janela New P oject*

No tipo de projeto selecione 0isual C#, No tipo de template selecione Class "i rar), No Nome do projeto digite 1odelos, Na localizao do projeto digite C67"o#a, /ei#e a opo GC eate di ecto y fo solutionH selecionada e cli ue em $% para criar o projeto. .brindo o 1indo2s E#plorer% podemos ver ue a pasta "o#a &oi criada no drive '* /entro da pasta 4oja &oi criada a pasta do projeto 1odelos.

0I% agora vamos voltar para o :B -isual Btudio. /o lado direito vemos a )rea do Bolution E#plorer. - 'li ue com o boto direito sobre o ar uivo Class#.cs e escol!a ,ename para renomear a classe para Cliente8nformation!cs, .o renomear o ar uivo da classe% perceba ue o nome da classe muda automaticamente na janela de c(digo 6public class 'lienteIn&ormation7. - Na janela de c(digo es uerda% inclua o nome do nosso projeto 64oja7 no namespace% de maneira ue o namespace &i ue "o#a!1odelos como na &igura abai#o*

-amos codi&icar a classe ClienteInfo mation. $ara isso% copie e cole o c(digo abai#o entre as c!aves da classe ClienteInfo mation* private int Qcodigo, public int 'odigo a get a return Qcodigo, b set a Qcodigo \ value, b b private string Qnome, public string Nome a get a return Qnome, b set a Qnome \ value, b b private string Qemail, public string Email a get a return Qemail, b set a Qemail \ value, b b private string Qtele&one, public string <ele&one a get a return Qtele&one, b set a Qtele&one \ value, b b Na implementao da classe ClienteInfo mation vemos ue estamos de&inindo campos e

propriedades para cada campo da tabela de 'lientes ue criamos no banco de dados. .gora a codi&icao da classe 'lienteIn&ormation est) completa como na listagem a seguir* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, namespace 4oja.:odelos a public class 'lienteIn&ormation a private int Qcodigo, public int 'odigo a get a return Qcodigo, b set a Qcodigo \ value, b b private string Qnome, public string Nome a get a return Qnome, b set a Qnome \ value, b b private string Qemail, public string Email a get a return Qemail, b set a Qemail \ value, b b private string Qtele&one, public string <ele&one a get a return Qtele&one, b set a Qtele&one \ value, b b b b

-amos implementar a 'lasse P odutoInfo mation.cs. 'li ue com o boto direito sobre o projeto 1odelos e ento escol!a Add. Em seguida escol!a New 8tem!!! como na &igura abai#o*

Na janela .dd Ne2 Item% escol!a o template Class e digite 5roduto8nformation!cs no campo nome. 'li ue em Add para adicionar a nova classe ao projeto :odelos.

. nova classe $rodutoIn&ormation.cs agora j) esta criada*

.ltere o namespace de modo ue ele &i ue assim* namespace 4oja.:odelos 0I. .gora copie e cole o c(digo abai#o dentro da classe P odutoInfo mation* private int Qcodigo, public int 'odigo a get a return Qcodigo, b set a Qcodigo \ value, b b private string Qnome, public string Nome a get a return Qnome, b set a Qnome \ value, b b private decimal Qpreco, public decimal $reco a get a return Qpreco, b set a Qpreco \ value, b

b private int Qesto ue, public int Esto ue a get a return Qesto ue, b set a Qesto ue \ value, b b 0 c(digo completo da nossa classe $rodutoIn&ormation.cs &icar) assim* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, namespace 4oja.:odelos a public class $rodutoIn&ormation a private int Qcodigo, public int 'odigo a get a return Qcodigo, b set a Qcodigo \ value, b b private string Qnome, public string Nome a get a return Qnome, b set a Qnome \ value, b b private decimal Qpreco, public decimal $reco a get a return Qpreco, b set a Qpreco \ value, b b private int Qesto ue, public int Esto ue a get a return Qesto ue, b

set a Qesto ue \ value, b b b b :uito bemW c) implementamos as classes do projeto :odelo para a tabela de 'lientes e para a tabela de $rodutos. .gora vamos &azer o mesmo para a tabela de -endas* 'li ue com o boto direito sobre o projeto 1odelos e ento escol!a Add. Em seguida escol!a New 8tem!!! como na &igura abai#o*

Na janela .dd Ne2 Item% escol!a o template Class e digite 0enda8nformation!cs no campo nome. 'li ue em Add para adicionar a nova classe ao projeto :odelos.

. nova classe -endaIn&ormation.cs agora j) esta criada*

.ltere o namespace de modo ue ele &i ue assim* namespace 4oja.:odelos 0I. .gora copie e cole o c(digo abai#o dentro da classe 7endaInfo mation* private int Qcodigo, public int 'odigo a get a return Qcodigo, b set a Qcodigo \ value, b b private /ate<ime Qdata, public /ate<ime /ata a get a return Qdata, b set a Qdata \ value, b b private int Q uantidade, public int @uantidade a get a return Q uantidade, b

set a Q uantidade \ value, b b private bool Q&aturado, public bool Naturado a get a return Q&aturado, b set a Q&aturado \ value, b b private int Qcodigo'liente, public int 'odigo'liente a get a return Qcodigo'liente, b set a Qcodigo'liente \ value, b b private int Qcodigo$roduto, public int 'odigo$roduto a get a return Qcodigo$roduto, b set a Qcodigo$roduto \ value, b b private string Qnome'liente, public string Nome'liente a get a return Qnome'liente, b set a Qnome'liente \ value, b b 0 c(digo completo da nossa classe -endaIn&ormation.cs &icar) assim* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, namespace 4oja.:odelos a public class -endaIn&ormation a private int Qcodigo, public int 'odigo a

get a return Qcodigo, b set a Qcodigo \ value, b b private /ate<ime Qdata, public /ate<ime /ata a get a return Qdata, b set a Qdata \ value, b b private int Q uantidade, public int @uantidade a get a return Q uantidade, b set a Q uantidade \ value, b b private bool Q&aturado, public bool Naturado a get a return Q&aturado, b set a Q&aturado \ value, b b private int Qcodigo'liente, public int 'odigo'liente a get a return Qcodigo'liente, b set a Qcodigo'liente \ value, b b private int Qcodigo$roduto, public int 'odigo$roduto a get a return Qcodigo$roduto, b set a Qcodigo$roduto \ value, b b private string Qnome'liente, public string Nome'liente a get a return Qnome'liente, b

set a Qnome'liente \ value, b b b b .gora ue implementamos no projeto :odelos as classes re&erentes a todas as tabelas contempladas no nosso projeto% vamos compilar o projeto atravs da opo 8uild. $ara compilar o projeto vamos &azer o seguinte. No Bolution E#plorer% cli ue com o boto direito sobre o projeto 1odelos e escol!a a opo Build*

Be a compilao do nosso projeto &or realizada com sucesso% aparecer) a mensagem G8uild succeededH na barra de status do :icroso&t -isual Btudio*

No 1indo2s E#plorer% observe ue na pasta do projeto :odelos &oi criado um ar uivo para cada classe ue implementamos.

@uando compilamos o projeto com a opo 8uild% o :B -isual Btudio criou o ar uivo :odelos.dll. 0 ar uivo :odelos.dll contm toda a in&ormao ue implementamos nas classes desse projeto e ele ue ser) usado no pr(#imo projeto a ser implementado% ue a 'amada de .cesso a /ados ou /.4 6/ata .ccess 4a5er7.

.p(s terminar o projeto :odelos% muitos programadores costumam criar um Diag ama de Classes para ter uma viso mel!or da sua arte. -amos criar o /iagrama de 'lassesA /e volta ao -isual Btudio% cli ue com o boto direito sobre o projeto 1odelos e escol!a Add ` New 8tem!!!

Na janela .dd Ne2 Item% escol!a o template Class Dia9ram. /igite 1odelos!cd no nome e cli ue em Add para criar o nosso diagrama de classes como a seguir.

0 ambiente c!amado Class Designe e#ibido.

$ara a criao do diagrama vamos arrastar as classes ClienteInfo mation% P odutoInfo mation e 7endaInfo mation do Bolution E#plorer para o 'lass /esigner 6.r uivo :odelos.cd7 como a seguir*

'om o /iagrama de 'lasses &ica &)cil a distino entre os campos e as propriedades ue implementamos no nosso projeto. 0 asterisco ao lado do nome do diagrama 1odelos!cd: indica ue ele ainda no &oi salvo. /igite ;Ctrl< = 2 para salvar o ar uivo. Be ol!armos para o nosso desen!o das camadas% vamos veri&icar ue o pr(#imo passo implementar as classes da camada /.4. Naremos isso no pr(#imo artigo. Neste artigo vamos implementar as classes da 'amada /.4 6/ata .ccess 4a5er7. 'riaremos as classes* + 'lientes/.4.cs + $rodutos/.4.cs + -endas/.4.cs + /ados.cs -oc ver) ue a classe 'lientes/.4% por e#emplo% conter) os mtodos de incluso% alterao% e#cluso e consulta re&erentes a tabela de 'lientes. 0 mesmo ocorrer) para as classes $rodutos/.4 e -endas/.4. 9saremos a classe /ados para armazenarmos a string de cone#o com o banco de dados. -amos comearA - .bra o :icroso&t -isual Btudio,

- .bra o projeto :odelos ue criamos no artigo anterior. - -amos adicionar um novo projeto. No menu >ile do -isual Btudio% cli ue em Add ` New 5ro#ect!!!

Na janela .dd Ne2 $roject* - Escol!a 0isual C# para o tipo de projeto, - Class "i rar) para o template, - /igite DA" no campo nome, - /igite C67"o#a7DA" na localizao, - 'li ue em $% para adicionar o novo projeto nossa /olution 6soluo7. Nota* @uando temos um conjunto de projetos reunidos para atender uma necessidade c!amamos esse conjunto de /olution.

:uito bomW .gora o nosso projeto /.4 &oi adicionado nossa Bolution*

0 nome da nossa Bolution est) como :odelos por ue o :B -isual Btudio usa o nome do primeiro projeto criado. No Bolution E#plorer% cli ue com o boto direito sobre a Bolution d:odelose e escol!a a opo ,ename. ?enomeie a Bolution para "o#a. /epois ue voc renomear a nossa Bolution% ela &icar) assim*

- No projeto /.4% ?enomeie a classe Class&!cs para ClientesDA"!cs, - .ltere o namespace para namespace 4oja./.4 . nossa classe 'lientes/.4 &icar) assim*

-oc se lembra uando comentamos ue a nossa implementao aconteceria da camada mais interna para a mais e#terna do desen!o do nosso projetoA J:odelosK /.4 f 844 f 9ser Inter&ace Ento% o projeto :odelos o mais interno e o pr(#imo a camada de acesso a dados /.4. Isso signi&ica ue o nosso projeto /.4 poder) usar tudo o ue j) &oi constru>do no projeto :odelosW Em termos de programao% dizemos ue o projeto /.4 &az re&erncia ao projeto :odelos. $ara ue o nosso projeto /.4 consiga ver o ue j) constru>mos no projeto :odelos% vamos criar essa re&erncia. - .bra a pasta ?e&erences do projeto /.4 para ver o ue j) e#iste como re&erncia sempre ue criamos um novo projeto*

$recisamos incluir no projeto /.4 uma re&erncia para o :odelos. Naa o seguinte* - 'li ue com o boto direito na pasta ?e&erences do projeto /.4 e escol!a Add ,eference!!!

Na janela 'dd 2efe ence ue abrir)% cli ue na aba 5ro#ects*

-eremos o nosso projeto :odelos. 'li ue sobre ele para selecion)-lo e ento cli ue em $% para criar a re&erncia.

:uito bomW .gora j) podemos ver a re&erncia para o nosso projeto :odelos dentro do nosso projeto /.4 como a seguir*

$ara en#ergar os :odelos dentro da nossa classe 'lientes/.4 vamos adicionar a cl)usula using como segue*

.p(s digitarmos using "o#a! 6colo ue o ponto ap(s digitar 4oja7 perceba ue o :B -isual Btudio j) nos mostra as re&erncias dispon>veis. 'om as setas de direo posicione a seleo em 1odelos e d um *N?*, para selecion)-lo.

. uele tracin!o vermel!o ap(s 4oja.:odelos indica ue !) algo errado. R o comando using ue no &oi &ec!ado. - /igite ponto-e-v>rgula 6 @ 7 para &ec!ar o comando using*

$ara ue ten!amos acesso as de&ini"es do namespace do :B B@4 Berver% vamos inserir mais uma cl)usula using para 2)stem!Data!2.lClient como a seguir*

$ara o c(digo da classe 'lientes/.4 copie e cole o c(digo abai#o entre as c!aves da classe* public void Incluir 6'lienteIn&ormation cliente7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ Sinsert into 'lientes6nome%email%tele&one7 values 6Tnome%Temail%Ttele&one7, select TTI/EN<I<M,S, cmd.$arameters..dd1it!-alue 6STnomeS% cliente.Nome 7, cmd.$arameters..dd1it!-alue6STemailS% cliente.Email7, cmd.$arameters..dd1it!-alue6STtele&oneS% cliente.<ele&one7,

cn.0pen67, cliente.'odigo \ 'onvert.<oIntZD 6cmd.E#ecuteBcalar677, b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception 6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception 6e#.:essage7, b &inall5 a cn.'lose67, b b public void .lterar 6'lienteIn&ormation cliente7 a [[ cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<5pe \ 'ommand<5pe.<e#t, cmd.'ommand<e#t \ Supdate 'lientes set nome \ Tnome% email \ Temail% tele&one \ Ttele&one 2!ere codigo \ Tcodigo,S, cmd.$arameters..dd1it!-alue6STcodigoS% cliente.'odigo7, cmd.$arameters..dd1it!-alue6STnomeS% cliente.Nome7, cmd.$arameters..dd1it!-alue6STemailS% cliente.Email7, cmd.$arameters..dd1it!-alue6STtele&oneS% cliente.<ele&one7, cn.0pen67, cmd.E#ecuteNon@uer567, b catc! 6B lE#ception e#7 a

t!ro2 ne2 E#ception6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5 a cn.'lose67, b b public void E#cluir 6int codigo7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ Sdelete &rom 'lientes 2!ere codigo \ S g codigo , cn.0pen67, int resultado \ cmd.E#ecuteNon@uer567, i& 6resultadoW\17 a t!ro2 ne2 E#ception6SNo &oi poss>vel e#cluir o cliente S g codigo7, b b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5

a cn.'lose67, b b public /ata<able 4istagem67 a /ata<able tabela \ ne2 /ata<able67, B l/ata.dapter da \ ne2 B l/ata.dapter6Sselect V &rom clientesS% /ados.Btring/e'one#ao 7, da.Nill 6tabela7, return tabela, b 0 c(digo completo da nossa classe 'lientes/.4.cs &icar) assim* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, using 4oja.:odelos, using B5stem./ata.B l'lient, namespace 4oja./.4 a public class 'lientes/.4 a public void Incluir6'lienteIn&ormation cliente7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ Sinsert into 'lientes6nome%email%tele&one7 values 6Tnome%Temail%Ttele&one7, select TTI/EN<I<M,S, cmd.$arameters..dd1it!-alue6STnomeS% cliente.Nome7, cmd.$arameters..dd1it!-alue6STemailS% cliente.Email7, cmd.$arameters..dd1it!-alue6STtele&oneS% cliente.<ele&one7,

cn.0pen67, cliente.'odigo \ 'onvert.<oIntZD6cmd.E#ecuteBcalar677, b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5 a cn.'lose67, b b public void .lterar6'lienteIn&ormation cliente7 a [[ cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<5pe \ 'ommand<5pe.<e#t, cmd.'ommand<e#t \ Supdate 'lientes set nome \ Tnome% email \ Temail% tele&one \ Ttele&one 2!ere codigo \ Tcodigo,S, cmd.$arameters..dd1it!-alue6STcodigoS% cliente.'odigo7, cmd.$arameters..dd1it!-alue6STnomeS% cliente.Nome7, cmd.$arameters..dd1it!-alue6STemailS% cliente.Email7, cmd.$arameters..dd1it!-alue6STtele&oneS% cliente.<ele&one7, cn.0pen67, cmd.E#ecuteNon@uer567, b catc! 6B lE#ception e#7 a

t!ro2 ne2 E#ception6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5 a cn.'lose67, b b public void E#cluir6int codigo7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ Sdelete &rom 'lientes 2!ere codigo \ S g codigo, cn.0pen67, int resultado \ cmd.E#ecuteNon@uer567, i& 6resultado W\ 17 a t!ro2 ne2 E#ception6SNo &oi poss>vel e#cluir o cliente S g codigo7, b b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception6SBervidor B@4 Erro*S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b

&inall5 a cn.'lose67, b b public /ata<able 4istagem67 a /ata<able tabela \ ne2 /ata<able67, B l/ata.dapter da \ ne2 B l/ata.dapter6Sselect V &rom clientesS% /ados.Btring/e'one#ao7, da.Nill6tabela7, return tabela, b b b Bempre ue terminamos de codi&icar uma classe% bom dar um 8uild no projeto para nos certi&icarmos de ue est) tudo certo. -amos &azer isso no projeto /.4. - 'li ue com o boto direito sobre o projeto /.4 e escol!a Build*

9m erro &oi encontrado. <udo bem% isso no motivo para p3nico. c $reste ateno na descrio do erro% est) escrito ue o nome d/ata<ablee ue usamos como tipo do mtodo 4istagem67 no pode ser encontrado. Isso ocorreu por ue o tipo DataTable est) dentro do namespace /ystem.Data e n(s no demos um using nesse namespace. R por isso ue o :B -isual Btudio no o encontrou no momento da compilao. 'omo resolvemos o problemaA -amos incluir a cl)usula using para esse namespace no comeo da classe*

.gora d um Build novamente no projeto /.4 para veri&icarmos o resultado*

.gora temos h erros para corrigirA Xmm... 0l!ando para a descrio vemos ue na verdade o mesmo erro ue ocorreu em h lin!as di&erentes da classe. . descrio diz ue o nome /ados no &oi encontrado. E est) certo% realmente ainda no codi&icamos a nossa classe /ados ue armazenar) a nossa string de cone#o. <udo bem% ento vamos codi&ic)-la agora.

- 'li ue com o boto direito no projeto /.4 e selecione Add ` New 8tem!!! - Na janela ue se abrir)% vamos escol!er o template Class e dar o nome de Dados!cs. 'li ue no boto Add para adicionar a nova classe ao projeto*

- No Bolution E#plorer% d um duplo cli.ue na classe Dados!cs para abrir o c(digo. - .ltere o namespace para "o#a!DA", - 'opie e cole o c(digo entre as c!aves da classe /ados* public static string Btring/e'one#ao a get a ?eturn Sserver\:.@]E^F]^__B@4EC$?EBB,database\4oja,user\camac!o,p2d\camac!oDEEOaZS, b b 8mportante6 0 conte;do ue voc colocar entre as aspas do return dever) ser a sua string de cone#o. 0s dados da sua string de cone#o &oram de&inidos no artigo D ue trata da criao da in&ra-estrutura de banco de dados.

0 c(digo completo da nossa classe /ados.cs &icar) assim* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, namespace 4oja./.4 a class /ados a public static string Btring/e'one#ao a get a return S9se a sua string de cone#o a ui.S, b b

b b .gora vamos dar um 8uild no projeto /.4 novamente*

:uito bemW $odemos ver a &rase G8uild succeededH na barra de status indicando ue o nosso projeto &oi compilado com sucesso. .gora vamos implementar a classe $rodutos/.4.cs. - 'li ue com o boto direito no projeto /.4% Add ` New 8tem!!! - Nomeie a classe como 5rodutosDA"!cs e cli ue em Add*

- 'opie e cole a listagem completa da classe $rodutos/.4.cs a seguir* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, using B5stem./ata, using B5stem./ata.B l'lient, using B5stem.'ollections, using 4oja.:odelos, namespace 4oja./.4 a public class $rodutos/.4 a public .rra54ist $rodutosEmNalta67 a B l'onnection cn \ ne2 B l'onnection6/ados.Btring/e'one#ao7, B l'ommand cmd \ ne2 B l'ommand6SBelect V &rom $rodutos 1!ere Esto ue i 1ES% cn7, cn.0pen67, B l/ata?eader dr \ cmd.E#ecute?eader67, .rra54ist lista \ ne2 .rra54ist67, 2!ile 6dr.?ead677 a $rodutoIn&ormation produto \ ne2 $rodutoIn&ormation67, produto.'odigo \ 'onvert.<oIntZD6drJScodigoSK7, produto.Nome \ drJSnomeSK.<oBtring67,

produto.Esto ue \ 'onvert.<oIntZD6drJSesto ueSK7, produto.$reco \ 'onvert.<o/ecimal6drJSprecoSK7, lista..dd6produto7, b dr.'lose67, cn.'lose67, return lista, b public void Incluir6$rodutoIn&ormation produto7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ Sinsert into $rodutos6nome%preco%esto ue7 values 6Tnome%Tpreco%Testo ue7, select TTI/EN<I<M,S, cmd.$arameters..dd1it!-alue6STnomeS% produto.Nome7, cmd.$arameters..dd1it!-alue6STprecoS% produto.$reco7, cmd.$arameters..dd1it!-alue6STesto ueS% produto.Esto ue7, cn.0pen67, produto.'odigo \ 'onvert.<oIntZD6cmd.E#ecuteBcalar677, b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception6SBervidor B@4 Erro* S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5 a cn.'lose67,

b b public void .lterar6$rodutoIn&ormation produto7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd \ ne2 B l'ommand67, cmd.'onnection \ cn, cmd.'ommand<e#t \ S.lterar$rodutoS, cmd.'ommand<5pe \ 'ommand<5pe.Btored$rocedure, cmd.$arameters..dd1it!-alue6STcodigoS% produto.'odigo7, cmd.$arameters..dd1it!-alue6STnomeS% produto.Nome7, cmd.$arameters..dd1it!-alue6STprecoS% produto.$reco7, cmd.$arameters..dd1it!-alue6STesto ueS% produto.Esto ue7, cmd.$arameters..dd6STvalorEsto ueS% B l/b<5pe.Int7, cmd.$arametersJSTvalorEsto ueSK./irection \ $arameter/irection.0utput, cn.0pen67, cmd.E#ecuteNon@uer567, decimal valorEsto ue \ 'onvert.<o/ecimal6cmd.$arametersJSTvalorEsto ueSK7, i& 6valorEsto ue i FEE7 a t!ro2 ne2 E#ception6S.tenoW -alor bai#o no esto ueS7, b b catc! 6B lE#ception e#7 a t!ro2 ne2 E#ception6SBervidor B@4 Erro* S g e#.Number7, b catc! 6E#ception e#7 a t!ro2 ne2 E#ception6e#.:essage7, b &inall5

a cn.'lose67, b b public void E#cluir6int codigo7 a b public /ata<able 4istagem67 a /ata<able tabela \ ne2 /ata<able67, B l/ata.dapter da \ ne2 B l/ata.dapter6Sselect V &rom produtosS% /ados.Btring/e'one#ao7, da.Nill6tabela7, return tabela, b b b .gora vamos implementar a classe -endas/.4.cs. - 'li ue com o boto direito no projeto /.4% Add ` New 8tem!!! - Nomeie a classe como 0endasDA"!cs e cli ue em Add*

- 'opie e cole a listagem completa da classe -endas/.4.cs a seguir* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, using B5stem./ata, using B5stem./ata.B l'lient, using 4oja.:odelos, using 4oja./.4, namespace 4oja./.4 a public class -endas/.4 a public /ata<able 4ista/e$rodutos a get

a B l'onnection cn \ ne2 B l'onnection67, cn.'onnectionBtring \ /ados.Btring/e'one#ao, cn.0pen67, B l/ata.dapter da \ ne2 B l/ata.dapter6Sselect V &rom produtosS% cn7, /ata<able dt \ ne2 /ata<able67, da.Nill6dt7, cn.'lose67, return dt, b b [[$ropriedade ue retorna uma 4ista de 'lientes public /ata<able 4ista/e'lientes a get a B l'onnection cn \ ne2 B l'onnection67, cn.'onnectionBtring \ /ados.Btring/e'one#ao, cn.0pen67, B l/ata.dapter da \ ne2 B l/ata.dapter6Sselect V &rom clientesS% cn7, /ata<able dt \ ne2 /ata<able67, da.Nill6dt7, cn.'lose67, return dt, b b public void Incluir6-endaIn&ormation venda7 a [[cone#ao B l'onnection cn \ ne2 B l'onnection67, B l<ransaction t \ null, tr5 a cn.'onnectionBtring \ /ados.Btring/e'one#ao, [[command B l'ommand cmd1 \ ne2 B l'ommand67, cmd1.'onnection \ cn,

cmd1.'ommand<e#t \ TSinsert into vendas 6'odigo'liente% 'odigo$roduto% /ata% @uantidade% Naturado7 -.49EB 6T'odigo'liente% T'odigo$roduto% T/ata% T@uantidade% TNaturado7,select TTI/EN<I<M,S, B l'ommand cmdD \ ne2 B l'ommand67, cmdD.'onnection \ cn, cmdD.'ommand<e#t \ TS9pdate $rodutos Bet Esto ue \ Esto ue - T@uantidade 1!ere 'odigo\T'odigo$rodutoS, cn.0pen67, t \ cn.8egin<ransaction6Isolation4evel.Berializable7,[[de&ault cmd1.<ransaction \ t, cmdD.<ransaction \ t, cmd1.$arameters..dd1it!-alue6STcodigoclienteS% venda.'odigo'liente7, cmd1.$arameters..dd1it!-alue6STcodigoprodutoS% venda.'odigo$roduto7, cmd1.$arameters..dd1it!-alue6STdataS% venda./ata7, cmd1.$arameters..dd1it!-alue6ST uantidadeS% venda.@uantidade7, cmd1.$arameters..dd1it!-alue6ST&aturadoS% venda.Naturado7, cmdD.$arameters..dd1it!-alue6ST uantidadeS% venda.@uantidade7, cmdD.$arameters..dd1it!-alue6STcodigoprodutoS% venda.'odigo$roduto7, venda.'odigo \ 'onvert.<oIntZD6cmd1.E#ecuteBcalar677, cmdD.E#ecuteNon@uer567, t.'ommit67, b catc! 6E#ception e#7 a t.?ollbacI67, t!ro2 ne2 E#ception6SBervidor no Bervidor*S g e#.:essage7, b

&inall5 a cn.'lose67, b b b b - .gora% clicando com o boto direito do mouse sobre o projeto /.4% d um Build para compilar o projeto*

. &rase so rodap indica ue a compilao &oi realizada com sucesso. $arabnsW .cabamos de implementar todas as classes do nosso projeto /.4 j 'amada de .cesso /ados. -ou comentar brevemente alguns pontos interessantes sobre as classes ue implementamos neste artigo. + No mtodo Inserir da classe -endas/.4 estamos usando uma transao. . insera" de uma venda s( vai ocorrer se dois comandos &orem conclu>dos com sucesso* a insero na tabela de vendas e a atualizao do esto ue do produto. + @uando criamos a nossa classe /ados usamos a palavra static. 'om isso n(s no precisamos instanciar um objeto para ter acesso a propriedade /t ingDeCone9ao. Be voc precisar criar uma propriedade deste tipo no -8 .Net% pode usar a sinta#e* Public /3a ed 2ead:nly P ope ty + Be voc abrir o projeto /.4 no 1indo2s E#plorer% poder) veri&icar ue na pasta de /44s do projeto e#istem dois ar uivos com a e#tenso /44. 9m do pr(prio projeto /.4 e outro para a re&erncia ue &izemos ao projeto :odelos.

'ompare isso com o nosso modelo em camadas a seguir* J:odelosK /.4 f 844 f 9ser Inter&ace

No pr(#imo artigo onde implementaremos a camada 844 6regras de neg(cio7% teremos na pasta do projeto 844 trs ar uivos dll. .ssim podemos distinguir claramente as nossas camadas pois nesta soluo elas estaro separadas em ar uivos. . idia aproveitarmos o c(digo desenvolvido nas camadas anteriores. :ais adiante veremos ue uando &or necess)rio &azer manuteno na camada de regras de neg(cio% por e#emplo% precisaremos abrir e atualizar apenas o projeto 844. F j844 j 'amada de ?egras de Neg(cio. Neste artigo vamos implementar as classes da 'amada 844 68usiness 4ogic 4a5er7. 'riaremos as classes* + 'lientes844.cs + $rodutos844.cs + -endas844.cs .s regras de neg(cio de&inem como o seu neg(cio &unciona. Essas regras podem abranger diversos assuntos como suas pol>ticas% interesses% objetivos% compromissos ticos e sociais% obriga"es contratuais% decis"es estratgicas% leis e regulamenta"es% entre outros. No nosso projeto 4oja vamos de&inir como regras de neg(cio* 17 ?egras para a incluso de clientes* 1.17 0 nome do cliente obrigat(rio, 1.D7 0 e-mail do cliente ser) armazenado em letras min;sculas, D7 ?egras para a incluso de produtos* D.17 0 nome do produto obrigat(rio, D.D7 0 preo no pode ser um valor negativo, D.Z7 0 esto ue no pode ser um valor negativo, - .bra o :icroso&t -isual Btudio, - 'li ue em >ile ` $pen ` 5ro#ectA2olution!!! - Na janela :pen P oject% selecione o ar uivo da nossa Bolution 6C67"o#a71odelos7"o#a!sln7 e cli ue em $pen para abrir a soluo*

Neste ponto do projeto temos implementados os projetos :odelos e /.4*

-amos adicionar o projeto 844 soluo. - 'li ue com o boto direito na Bolution 4oja e escol!a Add ` New 5ro#ect!!! - Na janela G.dd Ne2 $rojectH vamos in&ormar os seguintes dados* $roject t5pe* 0isual C#

<emplate* Class "i rar) Name* B"" 4ocation* C67"o#a7B"" - 'li ue em $% para adicionar o projeto.

0 projeto 844 ser) criado*

.nalisando o nosso modelo em camadas abai#o* J:odelosK /.4 f 844 f 9ser Inter&ace $odemos ver ue a camada 844 aproveita os projetos :odelos e /.4. Bendo assim% a primeira coisa ue &aremos no nosso projeto 844 ser) adicionar esses dois projetos como re&erncia. - 'li ue com o boto direito na pasta ?e&erences do projeto 844 e escol!a Add ,eference!!! - Na janela G.dd ?e&erenceH% cli ue na aba 5ro#ects, - :anten!a a tecla i'<?4` pressionada e cli ue sobre os projetos /.4 e :odelos para selecion)los, - 'li ue em $% para adicionar as re&erncias.

$odemos veri&icar as re&erncias ue acabamos de adicionar ao projeto 844*

-amos renomear a classe 'lass1.cs para 'lientes844.cs. - 'li ue com o boto direito sobre a classe 'lass1.cs% escol!a a opo ,ename e renomeie a classe para ClientesB""!cs*

'opie e cole o seguinte c(digo para a classe 'lientes844.cs* using B5stem, using B5stem./ata, using 4oja.:odelos, using 4oja./.4, namespace 4oja.844 a public class 'lientes844 a public void Incluir6'lienteIn&ormation cliente7 a [[0 nome do cliente obrigat(rio i& 6cliente.Nome.<rim67.4engt! \\ E7 a t!ro2 ne2 E#ception6S0 nome do cliente obrigat(rioS7, b

[[E-mail sempre em letras min;sculas cliente.Email \ cliente.Email.<o4o2er67, [[Be tudo est) 0I% c!ama a rotina de insero. 'lientes/.4 obj \ ne2 'lientes/.467, obj.Incluir6cliente7, b public void .lterar6'lienteIn&ormation cliente7 a 'lientes/.4 obj \ ne2 'lientes/.467, obj..lterar6cliente7, b public void E#cluir6int codigo7 a i& 6codigo i 17 a t!ro2 ne2 E#ception6SBelecione um cliente antes de e#clu>-lo.S7, b 'lientes/.4 obj \ ne2 'lientes/.467, obj.E#cluir6codigo7, b public /ata<able 4istagem67 a 'lientes/.4 obj \ ne2 'lientes/.467, return obj.4istagem67, b b b - / um Build no projeto 844 para con&irmar a ine#istncia de erros na codi&icao*

.gora vamos criar a classe $rodutos844.cs. - .dicione uma nova classe ao projeto 844 nomeando-a como 5rodutosB""!cs*

'opie e cole o seguinte c(digo para a classe $rodutos844.cs* using B5stem, using B5stem./ata, using B5stem.'ollections.Leneric, using B5stem.<e#t, using B5stem.'ollections, using 4oja.:odelos, using 4oja./.4, namespace 4oja.844 a public class $rodutos844 a public .rra54ist $rodutosEmNalta67 a $rodutos/.4 obj \ ne2 $rodutos/.467,

return obj.$rodutosEmNalta67, b public void Incluir6$rodutoIn&ormation produto7 a [[ Nome do produto obrigat(rio i& 6produto.Nome.<rim67.4engt! \\ E7 a t!ro2 ne2 E#ception6S0 nome do produto obrigat(rio.S7, b [[ 0 preo do produto no pode ser negativo i& 6produto.$reco i E7 a t!ro2 ne2 E#ception6S$reo do produto no pode ser negativo.S7, b [[ 0 esto ue do produto no pode ser negativo i& 6produto.Esto ue i E7 a t!ro2 ne2 E#ception6SEsto ue do produto no pode ser negativo.S7, b [[Be tudo estiver oI% c!ama a rotina de gravao $rodutos/.4 obj \ ne2 $rodutos/.467, obj.Incluir6produto7, b public void .lterar6$rodutoIn&ormation produto7 a $rodutos/.4 obj \ ne2 $rodutos/.467, obj..lterar6produto7, b public void E#cluir6int codigo7 a $rodutos/.4 obj \ ne2 $rodutos/.467, obj.E#cluir6codigo7, b public /ata<able 4istagem67 a $rodutos/.4 obj \ ne2 $rodutos/.467, return obj.4istagem67,

b b b - / um Build no projeto 844 para con&irmar a ine#istncia de erros na codi&icao*

.gora vamos implementar a classe -endas844.cs. - .dicione uma nova classe ao projeto 844 nomeando-a como 0endasB""!cs*

'opie e cole o seguinte c(digo para a classe -endas844.cs* using B5stem, using B5stem.'ollections.Leneric, using B5stem.<e#t, using B5stem./ata, using 4oja./.4, using 4oja.:odelos, namespace 4oja.844 a public class -endas844 a

[[Este um campo privado para armazenar uma inst3ncia da classe /.4. private -endas/.4 obj/.4, [[Esse o construtor da classe -endas844 public -endas84467 a obj/.4 \ ne2 -endas/.467, b public /ata<able 4ista/e$rodutos a get a return obj/.4.4ista/e$rodutos, b b public /ata<able 4ista/e'lientes a get a return obj/.4.4ista/e'lientes, b b public void Incluir6-endaIn&ormation venda7 a obj/.4.Incluir6venda7, b b b - / um Build no projeto 844 para con&irmar a ine#istncia de erros na codi&icao*

$arabnsW Ninalizamos a implementao da camada 844 j ?egras de neg(cio. Be voc abrir o projeto 844 no 1indo2s E#plorer% poder) veri&icar ue na pasta de /44s do projeto e#istem trs ar uivos com a e#tenso /44. 9m do pr(prio projeto 844 e outros para as re&erncias ue &izemos aos projetos :odelos e /.4.

'ompare isso com o nosso modelo em camadas a seguir* J:odelosK /.4 % 844 e 9ser Inter&ace -emos ue a pr(#ima camada a ser implementada a inter&ace com o usu)rio. No pr(#imo artigo vamos construir um aplicativo para :icroso&t 1indo2s 6tambm c!amado de Des"top application7 ue vai utilizar todas as camadas j) desenvolvidas.

] j 'riando a inter&ace com o usu)rio j Normul)rio de 'lientes Neste artigo vamos iniciar a implementao da camada de inter&ace do usu)rio construindo um aplicativo para :icroso&t 1indo2s. -amos criar o Normul)rio de 'lientes utilizando todas as camadas j) desenvolvidas nos artigos anteriores. J:odelosK /.4 f 844 f 9ser Inter&ace - .bra o :icroso&t -isual Btudio, - 'li ue em >ile ` $pen ` 5ro#ectA2olution!!! - Na janela :pen P oject% selecione o ar uivo da nossa Bolution 6C67"o#a71odelos7"o#a!sln7 e cli ue em $pen para abrir a soluo. Neste momento temos implementados os projetos :odelos% /.4 e 844*

-amos adicionar um projeto de use inte face para 1indo2s c!amado 9I1indo2s. - 'li ue com o boto direito na Bolution 4oja e escol!a Add ` New 5ro#ect!!! - Na janela G.dd Ne2 $rojectH vamos in&ormar os seguintes dados* $roject t5pe* 0isual C# <emplate* Bindows Application Name* C8Bindows 4ocation* C67"o#aC8Bindows - 'li ue em $% para adicionar o projeto.

0 aplicativo para 1indo2s 9I1indo2s ser) criado*

. primeira coisa a ser &eita adicionar os projetos ue usaremos como re&erncia. 0l!ando para o nosso modelo de camadas abai#o* J:odelosK /.4 f 844 f 9ser Inter&ace -eri&icamos ue preciso adicionar re&erncia aos projetos :odelos% /.4 e 844. -amos &azer isso agora. - 'li ue com o boto direito na pasta ?e&erences do projeto 844 e escol!a Add ,eference!!! - Na janela G.dd ?e&erenceH% cli ue na aba 5ro#ects, - :anten!a a tecla i'<?4` pressionada e cli ue sobre os projetos /.4% :odelos e 844 para selecion)los, - 'li ue em $% para adicionar as re&erncias.

$odemos veri&icar as re&erncias ue acabamos de adicionar ao projeto 9I1indo2s*

No nosso &ormul)rio principal% vamos criar um menu para ue o usu)rio possa acessar os demais &ormul)rios da aplicao. -amos e#ibir a ?ool o+ 6cai#a de &erramentas7 ue contm o menu ue precisaremos incluir. $ara e#ibir a <oolbo# voc pode* 17 9tilizar a combinao de teclas ;Ctrl< g ;Alt< g D ou D7 9tilizar o menu 0iew ` ?ool o+ - Na <oolbo#% abra o item G&enus ; Toolba sH, - $ara criar o nosso menu% arraste o componente 1enu2trip para o &ormul)rio >orm&.

.o soltar o &enu/t ip dentro do &ormul)rio Norm1% um Gmenu vazioH &oi criado.

- 'li ue na )rea com a indicao G<5pe !ereH e digite G1enuH, -eja ue )reas se abrem ao lado e abai#o no caso de uerermos incluir mais itens no menu*

- Insira os itens de menu 'lientes% $rodutos% -endas% $rodutos em Nalta e Bair como na &igura abai#o* Dica6 9se o !>&en 6G j G7 para criar os traos de diviso ue voc est) vendo na &igura.

- / um duplo cli ue com o boto es uerdo do mouse sobre o item 2air do :enu para codi&icarmos o ue deve acontecer uando o usu)rio selecionar essa opo. - /entro do mtodo do item de menu Bair ue se abrir)% insira o seguinte c(digo* .pplication.E#it67, /essa &orma% sempre ue o usu)rio clicar na opo Bair a aplicao ser) encerrada. - .crescente tambm o nome do projeto "o#a no namespace como a seguir*

- .gora vamos para o modo de /esign para visualizar o &ormul)rio novamente. $ara ir para o modo de design utilize a aba J/esignK do <o m# ou o boto G7iew DesignH do Bolution E#plorer como indicado a seguir*

No modo de /esign% o componente de :enu ue est) selecionado. $or esse motivo% na janela de propriedades 6P ope ties7 no canto in&erior direito do :B -isual Btudio% so as propriedades do objeto de :enu ue esto sendo e#ibidas. .gora n(s ueremos alterar uma propriedade do objeto <o m#. $ara selecion)-lo e &azer com ue as propriedades do &ormul)rio <o m# sejam e#ibidas na janela de propriedades% cli ue na barra de t>tulos ou em ual uer )rea do &ormul)rio <o m# &ora do objeto :enu con&orme destacado abai#o* - Cli.ue em uma rea do formulrio >orm& para alterarmos uma de suas propriedades. Dica6 Be a janela de propriedades no estiver vis>vel% pressione iNh` para e#ib>-la.

- Na janela de propriedades do >orm&% altere a propriedade 8s1diContainer para ?rue,

Isso signi&ica ue este &ormul)rio ser) o :enu $rincipal da nossa aplicao. Essa alterao indica ue todos os &ormul)rios c!amados pelo <o m# sero abertos dentro dele% e no em uma nova janela. .ssim% se &ec!armos o &ormul)rio to :enu $rincipal todos os &ormul)rios ue estiverem abertos dentro da aplicao 6e#emplo* &ormul)rio de clientes% &ormul)rio de produtos7 tambm sero &ec!ados. .gora vamos alterar o nome da nossa aplicao de <o m# para G"o#a !NetH - Na janela de propriedades do <o m#% altere a propriedade ?e+t para G"o#a !NetH.

Isso altera automaticamente o nome do &ormulario e#ibido na barra de t>tulos.

$ara testarmos tudo o ue j) desenvolvemos at agora vamos criar h &ormul)rios. Bo eles* + 'lientes, + $rodutos, + -endas, + $rodutos em Nalta. ].17 'riando o &ormul)rio de 'lientes - 'li ue com o boto direito sobre o projeto C8Bindows e escol!a Add ` Bindows >orm!!!

- Na janela G'dd New ItemH% selecione o template Bindows >orm e nomeie o novo &ormul)rio como Clientes>orm!cs - 'li ue em Add para adicionar o &ormul)rio.

6- 'erti&i ue-se de ue o namespace esteja como 4oja.9I1indo2s tanto em 'lientesNorm.cs uanto em 'lientesNorm./esigner.cs, 'olocar using 4oja.844, no codebe!ind 'lientesNorm.cs7 - Na janela de propriedades do &ormul)rio Clientes>orm% de&ina as propriedades como abai#o* Bize* EEF@ 4&2 - . partir do menu G'ommon 'ontrolsH da <oolbo#% arraste uatro objetos do tipo "a el para o &ormul)rio Clientes>orm. - /e&ina as propriedades dos h labels como a seguir* Name* codi9o"a el 4ocation* &G@H2 <e#t* CIdi9o6

Name* nome"a el 4ocation* &G@GE <e#t* Nome6 Name* email"a el 4ocation* &G@JG <e#t* *-mail6 Name* telefone"a el 4ocation* &G@&2F <e#t* ?elefone6

Neste momento% nosso &ormul)rio de clientes estar) com esta aparncia*

- . partir do menu G'ommon 'ontrolsH da <oolbo#% arraste uatro objetos do tipo ?e+tBo+ para o &ormul)rio Clientes>orm. - /e&ina as propriedades dos h <e#t8o# como a seguir* Name* codi9o?e+tBo+ Enable* >alse 4ocation* &&3@2J ?ead0nl5* ?rue Bize* K3@23 Name* nome?e+tBo+ 4ocation* &&3@G& Bize* 233@23 Name* email?e+tBo+ 4ocation* &&3@JH Bize* 233@23

Name* telefone?e+tBo+ 4ocation* &&3@&24 Bize* 233@23 Nosso &ormul)rio de clientes agora est) com essa aparncia*

- . partir do menu G'ommon 'ontrolsH da <oolbo#% arraste cinco objetos do tipo Button para o &ormul)rio Clientes>orm. - /e&ina as propriedades dos F 8utton como a seguir* Name* limparButton 4ocation* &&3@&4J Bize* K4@2H <e#t* "impar Name* incluirButton 4ocation* &J&@&4J Bize* K4@2H <e#t* 8ncluir Name* alterarButton

4ocation* 2K2@&4J Bize* K4@2H <e#t* Alterar Name* e+cluirButton 4ocation* H4H@&4J Bize* K4@2H <e#t* *+cluir Name* lerButton .nc!or* BottomL ,i9-t 4ocation* H4H@ EEK Bize* K4@2H <e#t* "er - . partir do menu G/ataH da <oolbo#% arraste um objeto do tipo DataGrid0iew para o &ormul)rio Clientes>orm. - /e&ina as propriedades do /ataLrid-ie2 como a seguir* Name* clientesDataGrid0iew .nc!or* ?opL BottomL "eftL ,i9-t 4ocation* 2E@ 23F Bize* E3F@ 2HH

.gora nosso &ormul)rio de clientes est) assim*

:uito bemW 0 design% ou seja% a parte gr)&ica do nosso &ormul)rio de clientes est) &inalizada. .gora precisamos programar as a"es ue desejamos ue acontea uando o usu)rio abrir esse &ormul)rio e interagir clicando nos bot"es. -amos l)AW - $ara ver o c(digo-&onte 6tambm c!amado de code be3ind7 cli ue com o boto direito sobre o &ormul)rio Clientes>orm no Bolution E#plorer e escol!a a opo G0iew CodeH. .p(s o mtodo 'lientesNormQ4oad67 vamos criar o mtodo .tualizaLrid67. No .tualizaLrid &aremos a comunicao com a camada de regras de neg(cio 68447 para ue possamos preenc!er os valores dos objetos <e#tbo#. /entro do mtodo 'lientesNormQ4oad67% ue c!amado toda vez ue o &ormul)rio de clientes carregado em mem(ria% vamos &azer uma c!amada para o mtodo .tualizaLrid67 e tambm posicionaremos o cursor no primeiro campo do &ormul)rio. - 'opie e cole o trec!o de c(digo para o code be!ind do &ormul)rio 'lientesNorm* using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing, using B5stem.<e#t,

using B5stem.1indo2s.Norms, using 4oja.844, namespace 4oja.9I1indo2s a public partial class 'lientesNorm * Norm a public 'lientesNorm67 a Initialize'omponent67, b public void .tualizaLrid67 a [[ 'omunicao com a 'amada 844 'lientes844 obj \ ne2 'lientes84467, clientes/ataLrid-ie2./ataBource \ obj.4istagem67, [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ clientes/ataLrid-ie2JE% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ clientes/ataLrid-ie2J1% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, email<e#t8o#.<e#t \ clientes/ataLrid-ie2JD% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, tele&one<e#t8o#.<e#t \ clientes/ataLrid-ie2JZ% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b private void 'lientesNormQ4oad6object sender% Event.rgs e7 a .tualizaLrid67, nome<e#t8o#.Nocus67, b b b $ara testarmos se essa e#ibio inicial dos dados dos clientes est) &uncionando% precisamos criar uma c!amada para este &ormul)rio a partir do menu principal. - A ra o >orm& em modo de design e cli.ue so re o 1enu para ue possamos ver as op"es e#istentes*

- / um duplo cli.ue sobre a opo Clientes para codi&icarmos a c!amada para o &ormul)rio correspondente. - 0 :B -isual Btudio abrir) o c(digo do &ormul)rio com o cursor dentro do mtodo ue ser) e#ecutado uando o usu)rio clicar no item 'lientes do :enu. /entro deste mtodo 6c!amado clientesTool/t ip&enuItem=Clic"7 digite o seguinte c(digo* 'lientesNorm obj \ ne2 'lientesNorm67, obj.:di$arent \ t!is, obj.B!o267, . listagem completa do nosso code be!ind Norm1.cs &icou assim* using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing, using B5stem.<e#t, using B5stem.1indo2s.Norms, namespace 4oja.9I1indo2s a public partial class Norm1 * Norm a public Norm167 a Initialize'omponent67, b private void sair<oolBtrip:enuItemQ'licIQ16object sender% Event.rgs e7

a .pplication.E#it67, b private void clientes<oolBtrip:enuItemQ'licI6object sender% Event.rgs e7 a 'lientesNorm obj \ ne2 'lientesNorm67, obj.:di$arent \ t!is, obj.B!o267, b b b - / um GStart DebuggingH clicando na seta verde da barra de bot"es con&orme indicado abai#o. Essa opo compila o projeto e% se tudo estiver certo% j) e#ecuta a nossa aplicao e#ibindo o menu principal.

0bserva"es* Be a aplicao no abrir% cli ue com o boto direito sobre o projeto C8Bindows e selecione a opo G2et as 2tartCp 5ro#ectH. 'om isso estamos indicando ue% na nossa soluo% o projeto 9I1indo2s ser) o primeiro a ser e#ecutado. - Na aplicao 4oja .Net em e#ecuo% escol!a 1enu ` Clientes*

$odemos ver ue a carga inicial de dados &uncionou con&orme o esperado. .gora vamos codi&icar as &uncionalidades dos bot"es do &ormul)rio de clientes. - / um duplo cli.ue no otMo "impar para codi&icarmos o evento clicI, - /entro do evento cli ue do boto 4impar% copie e cole o c(digo abai#o* codigo<e#t8o#.<e#t \ SS, nome<e#t8o#.<e#t \ SS, email<e#t8o#.<e#t \ SS, tele&one<e#t8o#.<e#t \ SS, - / um duplo cli.ue no otMo 8ncluir para codi&icarmos o evento clicI, - /entro do evento cli ue do boto Incluir% copie e cole o c(digo abai#o* tr5 a 'lienteIn&ormation cliente \ ne2 'lienteIn&ormation67, cliente.Nome \ nome<e#t8o#.<e#t,

cliente.Email \ email<e#t8o#.<e#t, cliente.<ele&one \ tele&one<e#t8o#.<e#t, 'lientes844 obj \ ne2 'lientes84467, obj.Incluir6cliente7, :essage8o#.B!o26S0 cliente &oi inclu>do com sucessoWS7, codigo<e#t8o#.<e#t \ 'onvert.<oBtring6cliente.'odigo7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b - / um duplo cli.ue no otMo Alterar para codi&icarmos o evento clicI, - /entro do evento cli ue do boto .lterar% copie e cole o c(digo abai#o* i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m cliente deve ser selecionado para alterao.S7, b else tr5 a 'lienteIn&ormation cliente \ ne2 'lienteIn&ormation67, cliente.'odigo \ int.$arse6codigo<e#t8o#.<e#t7, cliente.Nome \ nome<e#t8o#.<e#t, cliente.Email \ email<e#t8o#.<e#t, cliente.<ele&one \ tele&one<e#t8o#.<e#t, 'lientes844 obj \ ne2 'lientes84467, obj..lterar6cliente7, :essage8o#.B!o26S0 cliente &oi alterado com sucessoWS7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b - / um duplo cli.ue no otMo *+cluir para codi&icarmos o evento clicI,

- /entro do evento cli ue do boto E#cluir% copie e cole o c(digo abai#o* i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m cliente deve ser selecionado antes da e#cluso.S7, b else tr5 a int codigo \ 'onvert.<oIntZD6codigo<e#t8o#.<e#t7, 'lientes844 obj \ ne2 'lientes84467, obj.E#cluir6codigo7, :essage8o#.B!o26S0 cliente &oi e#clu>do com sucessoWS7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b - / um duplo cli.ue no otMo "er para codi&icarmos o evento clicI, - /entro do evento cli ue do boto 4er% copie e cole o c(digo abai#o* .tualizaLrid67, - 'li ue sobre o dataLrid-ie2, - Na janela de propriedades% cli ue no >cone ue tem um rel3mpago 6 eventos, 7 para e#ibir a lista de

- / um duplo cli ue no evento CellClic% para inserirmos o c(digo para esse evento*

- /entro do evento CellClic%% copie e cole o c(digo abai#o* [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ clientes/ataLrid-ie2JE% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ clientes/ataLrid-ie2J1% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, email<e#t8o#.<e#t \ clientes/ataLrid-ie2JD% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, tele&one<e#t8o#.<e#t \ clientes/ataLrid-ie2JZ% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, - 0 code be!ind completo do nosso 'lientesNorm.cs &icou assim* [V V Nile...* 'lientesNorm.cs V .ut!or.* 'arlos 'amac!o - 222.camac!ojunior.com.br V 'ontent* Normul)rio de 'lientes V Bubject* Luia pr)tico para o desenvolvimento de .plica"es '= em 'amadas V[ using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing, using B5stem.<e#t, using B5stem.1indo2s.Norms, using 4oja.844, using 4oja./.4,

using 4oja.:odelos, namespace 4oja.9I1indo2s a public partial class 'lientesNorm * Norm a public 'lientesNorm67 a Initialize'omponent67, b public void .tualizaLrid67 a [[ 'omunicao com a 'amada 844 'lientes844 obj \ ne2 'lientes84467, clientes/ataLrid-ie2./ataBource \ obj.4istagem67, [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ clientes/ataLrid-ie2JE% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ clientes/ataLrid-ie2J1% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, email<e#t8o#.<e#t \ clientes/ataLrid-ie2JD% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, tele&one<e#t8o#.<e#t \ clientes/ataLrid-ie2JZ% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b private void 'lientesNormQ4oad6object sender% Event.rgs e7 a .tualizaLrid67, nome<e#t8o#.Nocus67, b private void limpar8uttonQ'licI6object sender% Event.rgs e7 a codigo<e#t8o#.<e#t \ SS, nome<e#t8o#.<e#t \ SS, email<e#t8o#.<e#t \ SS, tele&one<e#t8o#.<e#t \ SS, b private void incluir8uttonQ'licI6object sender% Event.rgs e7

a tr5 a 'lienteIn&ormation cliente \ ne2 'lienteIn&ormation67, cliente.Nome \ nome<e#t8o#.<e#t, cliente.Email \ email<e#t8o#.<e#t, cliente.<ele&one \ tele&one<e#t8o#.<e#t, 'lientes844 obj \ ne2 'lientes84467, obj.Incluir6cliente7, :essage8o#.B!o26S0 cliente &oi inclu>do com sucessoWS7, codigo<e#t8o#.<e#t \ 'onvert.<oBtring6cliente.'odigo7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b b private void alterar8uttonQ'licI6object sender% Event.rgs e7 a i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m cliente deve ser selecionado para alterao.S7, b else tr5 a 'lienteIn&ormation cliente \ ne2 'lienteIn&ormation67, cliente.'odigo \ int.$arse6codigo<e#t8o#.<e#t7, cliente.Nome \ nome<e#t8o#.<e#t, cliente.Email \ email<e#t8o#.<e#t, cliente.<ele&one \ tele&one<e#t8o#.<e#t, 'lientes844 obj \ ne2 'lientes84467, obj..lterar6cliente7, :essage8o#.B!o26S0 cliente &oi alterado com sucessoWS7, .tualizaLrid67, b

catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b b private void e#cluir8uttonQ'licI6object sender% Event.rgs e7 a i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m cliente deve ser selecionado antes da e#cluso.S7, b else tr5 a int codigo \ 'onvert.<oIntZD6codigo<e#t8o#.<e#t7, 'lientes844 obj \ ne2 'lientes84467, obj.E#cluir6codigo7, :essage8o#.B!o26S0 cliente &oi e#clu>do com sucessoWS7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b b private void ler8uttonQ'licI6object sender% Event.rgs e7 a .tualizaLrid67, b private void clientes/ataLrid-ie2Q'ell'licI6object sender% /ataLrid-ie2'ellEvent.rgs e7 a [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ clientes/ataLrid-ie2JE% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ clientes/ataLrid-ie2J1% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67,

email<e#t8o#.<e#t \ clientes/ataLrid-ie2JD% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, tele&one<e#t8o#.<e#t \ clientes/ataLrid-ie2JZ% clientes/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b b b $arabnsW -oc acabou de implementar o Normul)rio de 'lientes do nosso projeto 4oja .Net. .gora s( e#ecutar o projeto% acessar o Normul)rio de 'lientes e testar todas as &uncionalidades ue voc implementou. No pr(#imo artigo vamos implementar o Normul)rio de $rodutos. ^ j 9ser Inter&ace j Normul)rio de $rodutos Neste artigo vamos criar o Normul)rio de $rodutos do nosso projeto. - .bra o :icroso&t -isual Btudio, - 'li ue em >ile ` $pen ` 5ro#ectA2olution!!! - Na janela :pen P oject% selecione o ar uivo da nossa Bolution 6C67"o#a71odelos7"o#a!sln7 e cli ue em $pen para abrir a soluo. -amos adicionar um &ormul)rio c!amado $rodutosNorm.cs. - 'li ue com o boto direito no projeto 9I1indo2s e escol!a Add ` Bindows >orm!!! - Na janela G.dd Ne2 ItemH vamos in&ormar os seguintes dados* <emplate* Bindows >orm Name* 5rodutos>orm

- 'li ue em Add para adicionar o &ormul)rio. Ber) e#ibido o &ormul)rio $rodutosNorm*

- .ltere a propriedade 2iNe para EEF@ 4&2 'omo as inter&aces so semel!antes% vamos copiar os objetos do &ormul)rio de clientes para o &ormul)rio de produtos. - .bra o &ormul)rio Clientes>orm no modo de design e digite ;Ctrl< g ;A< para selecionar todos os objetos,

- /igite ;Ctrl< g ;C< para copiar os objetos para a )rea de trans&erncia, - .bra o &ormul)rio 5rodutos>orm em modo de design e digite ;Ctrl< g ;0< para colar os objetos.

- No objeto email"a el altere os valores das seguintes propriedades* Name* preco"a el <e#t* 5reo6 - No objeto email?e+tBo+ altere a propriedade Name para preco?e+tBo+ - No objeto tele&one4abel altere os valores das seguintes propriedades* Name* esto.ue?e+tBo+ <e#t* *sto.ue6 - No objeto telefone?e+tBo+ altere a propriedade Name para esto.ue?e+tBo+ - No objeto clientesDataGrid0iew altere a propriedade Name para produtosDataGrid0iew Neste momento% nosso &ormul)rio de produtos estar) com esta aparncia*

. ui tambm vamos criar o mtodo .tualizaLrid67 para &azer a comunicao com a camada de regras de neg(cio com o objetivo de preenc!er o objeto /ataLrid-ie2 com a lista de produtos e#istentes. /entro do mtodo $rodutosNormQ4oad67 vamos &azer uma c!amada para o mtodo .tualizaLrid67 e tambm posicionaremos o cursor no primeiro campo do &ormul)rio. - 'opie e cole o trec!o de c(digo para o code be!ind do &ormul)rio $rodutosNorm* [V V Nile...* $rodutosNorm.cs V .ut!or.* 'arlos 'amac!o - 222.camac!ojunior.com.br V 'ontent* Normul)rio de $rodutos V Bubject* Luia pr)tico para o desenvolvimento de .plica"es '= em 'amadas V[ using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing,

using B5stem.<e#t, using B5stem.1indo2s.Norms, using 4oja.844, using 4oja./.4, using 4oja.:odelos, namespace 4oja.9I1indo2s a public partial class $rodutosNorm * Norm a public $rodutosNorm67 a Initialize'omponent67, b public void .tualizaLrid67 a [[ 'omunicao com a 'amada 844 $rodutos844 obj \ ne2 $rodutos84467, produtos/ataLrid-ie2./ataBource \ obj.4istagem67, [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ produtos/ataLrid-ie2JE% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ produtos/ataLrid-ie2J1% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, preco<e#t8o#.<e#t \ produtos/ataLrid-ie2JD% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, esto ue<e#t8o#.<e#t \ produtos/ataLrid-ie2JZ% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b private void $rodutosNormQ4oad6object sender% Event.rgs e7 a .tualizaLrid67, nome<e#t8o#.Nocus67, b b b .gora vamos codi&icar as &uncionalidades dos bot"es do &ormul)rio de produtos. - / um duplo cli.ue no otMo "impar para codi&icarmos o evento clicI, - 'opie e cole o c(digo abai#o*

codigo<e#t8o#.<e#t \ SS, nome<e#t8o#.<e#t \ SS, preco<e#t8o#.<e#t \ SS, esto ue<e#t8o#.<e#t \ SS, - / um duplo cli.ue no boto 8ncluir para codi&icarmos o evento clicI, - 'opie e cole o c(digo abai#o* tr5 a $rodutoIn&ormation produto \ ne2 $rodutoIn&ormation67, produto.Nome \ nome<e#t8o#.<e#t, produto.$reco \ 'onvert.<o/ecimal6preco<e#t8o#.<e#t7, produto.Esto ue \ 'onvert.<oIntZD6esto ue<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467, obj.Incluir6produto7, :essage8o#.B!o26S0 produto &oi inclu>do com sucessoWS7, codigo<e#t8o#.<e#t \ 'onvert.<oBtring6produto.'odigo7, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b .tualizaLrid67, - / um duplo cli.ue no otMo Alterar para codi&icarmos o evento clicI, - 'opie e cole o c(digo abai#o* i& 6codigo<e#t8o#.<e#t \\ SS7 a :essage8o#.B!o26S9m produto precisa ser selecionado para alterao.S7, b else tr5 a $rodutoIn&ormation produto \ ne2 $rodutoIn&ormation67, produto.'odigo \ int.$arse6codigo<e#t8o#.<e#t7, produto.Nome \ nome<e#t8o#.<e#t, produto.$reco \ 'onvert.<o/ecimal6preco<e#t8o#.<e#t7, produto.Esto ue \ 'onvert.<oIntZD6esto ue<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467,

obj..lterar6produto7, :essage8o#.B!o26S0 produto &oi atualizado com sucessoWS7, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b .tualizaLrid67, - / um duplo cli.ue no otMo *+cluir para codi&icarmos o evento clicI, - 'opie e cole o c(digo abai#o* i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m produto deve ser selecionado antes da e#cluso.S7, b else tr5 a int codigo \ 'onvert.<oIntZD6codigo<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467, obj.E#cluir6codigo7, :essage8o#.B!o26S0 produto &oi e#clu>do com sucessoWS7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b .tualizaLrid67, - / um duplo cli.ue no otMo "er para codi&icarmos o evento clicI, - 'opie e cole o c(digo abai#o* .tualizaLrid67, - 'li ue sobre o dataLrid-ie2, - Na janela de propriedades% cli ue no >cone ue tem um rel3mpago para e#ibir a lista de eventos, - / um duplo cli ue no evento CellClic% para inserirmos o c(digo para esse evento* - /entro do evento CellClic%% copie e cole o c(digo abai#o* [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ produtos/ataLrid-ie2JE%

produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ produtos/ataLrid-ie2J1% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, preco<e#t8o#.<e#t \ produtos/ataLrid-ie2JD% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, esto ue<e#t8o#.<e#t \ produtos/ataLrid-ie2JZ% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, - 0 code be!ind completo do nosso $rodutosNorm.cs &icou assim* [V V Nile...* $rodutosNorm.cs V .ut!or.* 'arlos 'amac!o - 222.camac!ojunior.com.br V 'ontent* Normul)rio de $rodutos V Bubject* Luia pr)tico para o desenvolvimento de .plica"es '= em 'amadas V[ using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing, using B5stem.<e#t, using B5stem.1indo2s.Norms, using 4oja.844, using 4oja./.4, using 4oja.:odelos, namespace 4oja.9I1indo2s a public partial class $rodutosNorm * Norm a public $rodutosNorm67 a Initialize'omponent67, b public void .tualizaLrid67 a [[ 'omunicao com a 'amada 844 $rodutos844 obj \ ne2 $rodutos84467, produtos/ataLrid-ie2./ataBource \ obj.4istagem67, [[ .tualizando os objetos <e#t8o#

codigo<e#t8o#.<e#t \ produtos/ataLrid-ie2JE% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ produtos/ataLrid-ie2J1% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, preco<e#t8o#.<e#t \ produtos/ataLrid-ie2JD% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, esto ue<e#t8o#.<e#t \ produtos/ataLrid-ie2JZ% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b private void $rodutosNormQ4oad6object sender% Event.rgs e7 a .tualizaLrid67, nome<e#t8o#.Nocus67, b private void limpar8uttonQ'licI6object sender% Event.rgs e7 a codigo<e#t8o#.<e#t \ SS, nome<e#t8o#.<e#t \ SS, preco<e#t8o#.<e#t \ SS, esto ue<e#t8o#.<e#t \ SS, b private void incluir8uttonQ'licI6object sender% Event.rgs e7 a tr5 a $rodutoIn&ormation produto \ ne2 $rodutoIn&ormation67, produto.Nome \ nome<e#t8o#.<e#t, produto.$reco \ 'onvert.<o/ecimal6preco<e#t8o#.<e#t7, produto.Esto ue \ 'onvert.<oIntZD6esto ue<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467, obj.Incluir6produto7, :essage8o#.B!o26S0 produto &oi inclu>do com sucessoWS7, codigo<e#t8o#.<e#t \ 'onvert.<oBtring6produto.'odigo7, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b

.tualizaLrid67, b private void alterar8uttonQ'licI6object sender% Event.rgs e7 a i& 6codigo<e#t8o#.<e#t \\ SS7 a :essage8o#.B!o26S9m produto precisa ser selecionado para alterao.S7, b else tr5 a $rodutoIn&ormation produto \ ne2 $rodutoIn&ormation67, produto.'odigo \ int.$arse6codigo<e#t8o#.<e#t7, produto.Nome \ nome<e#t8o#.<e#t, produto.$reco \ 'onvert.<o/ecimal6preco<e#t8o#.<e#t7, produto.Esto ue \ 'onvert.<oIntZD6esto ue<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467, obj..lterar6produto7, :essage8o#.B!o26S0 produto &oi atualizado com sucessoWS7, b catc! 6E#ception e#7 a :essage8o#.B!o26SErro* S g e#.:essage7, b .tualizaLrid67, b private void e#cluir8uttonQ'licI6object sender% Event.rgs e7 a i& 6codigo<e#t8o#.<e#t.4engt! \\ E7 a :essage8o#.B!o26S9m produto deve ser selecionado antes da e#cluso.S7, b else tr5 a

int codigo \ 'onvert.<oIntZD6codigo<e#t8o#.<e#t7, $rodutos844 obj \ ne2 $rodutos84467, obj.E#cluir6codigo7, :essage8o#.B!o26S0 produto &oi e#clu>do com sucessoWS7, .tualizaLrid67, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b b private void ler8uttonQ'licI6object sender% Event.rgs e7 a .tualizaLrid67, b private void produtos/ataLrid-ie2Q'ell'licI6object sender% /ataLrid-ie2'ellEvent.rgs e7 a [[ .tualizando os objetos <e#t8o# codigo<e#t8o#.<e#t \ produtos/ataLrid-ie2JE% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, nome<e#t8o#.<e#t \ produtos/ataLrid-ie2J1% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, preco<e#t8o#.<e#t \ produtos/ataLrid-ie2JD% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, esto ue<e#t8o#.<e#t \ produtos/ataLrid-ie2JZ% produtos/ataLrid-ie2.'urrent?o2.Inde#K.-alue.<oBtring67, b b b - .bra o &ormul)rio principal Norm1 no modo de design e d um duplo cli ue na opo produtos do menu para codi&icarmos a c!amada para este &ormul)rio com o c(digo abai#o* $rodutosNorm obj \ ne2 $rodutosNorm67, obj.:di$arent \ t!is, obj.B!o267, .cabamos de implementar o Normul)rio de $rodutos do nosso projeto 4oja .Net. E#ecute o projeto e teste as &uncionalidades ue implementamos neste artigo. No pr(#imo artigo vamos implementar o &ormul)rio de -endas.

O j 9ser Inter&ace j Normul)rio de -endas Neste artigo vamos criar o Normul)rio de -endas do nosso projeto. - .bra o :icroso&t -isual Btudio, - 'li ue em >ile ` $pen ` 5ro#ectA2olution!!! - Na janela :pen P oject% selecione o ar uivo da nossa Bolution 6C67"o#a71odelos7"o#a!sln7 e cli ue em $pen para abrir a soluo. -amos adicionar um &ormul)rio c!amado -endasNorm.cs. - 'li ue com o boto direito no projeto 9I1indo2s e escol!a Add ` Bindows >orm!!! - Na janela G.dd Ne2 ItemH vamos in&ormar os seguintes dados* <emplate* Bindows >orm Name* 0endas>orm

- 'li ue em Add para adicionar o &ormul)rio. Ber) e#ibido o &ormul)rio -endasNorm*

- .ltere a propriedade 2iNe para EK3@ 233 -amos criar ^ objetos neste &ormul)rio. Estes objetos podem ser arrastados para o &ormul)rio a partir da G'ommon 'ontrolsH da <oolbo#. - .rraste e solte Z objetos do tipo 4abel para o nosso &ormul)rio de vendas e con&igure-os com as seguintes caracter>sticas* Name* cliente"a el

<e#t* Cliente6 4ocation* H4@ HK Name* produto"a el <e#t* 5roduto6 4ocation* H4@ GE Name* .uantidade"a el <e#t* (uantidade6 4ocation* H4@ J4

- .rraste e solte D objetos do tipo combobo# para o nosso &ormul)rio de vendas e de&ina as seguintes propriedades* Name* clienteCom oBo+ /ispla5:ember* Nome /rop/o2nBt5le* DropDown"ist /rop/o2n1idt!* H33 4ocation* &3G@ HE Bize* H33@ 2& -alue:ember* Codi9o Name* produtoCom oBo+ /ispla5:ember* Nome /rop/o2nBt5le* DropDown"ist /rop/o2n1idt!* H33 4ocation* &3G@ GE Bize* H33@ 2& -alue:ember* Codi9o

- .rraste e solte um objeto do tipo <e#t8o# e de&ina as seguintes propriedades* Name* .uantidade?e+tBo+ 4ocation* &3G@ J4 Bize* GG@ 23 <e#t* & - .rraste e solte um objeto do tipo 8utton e de&ina as seguintes propriedades* Name* incluir0endaButton 4ocation* &3G@ &2F Bize* &K&@ 2H <e#t* ,ealiNar a 0enda

Neste momento% nosso &ormul)rio de vendas estar) com esta aparncia*

-amos carregar dados nos dois objetos combobo# sempre ue o &ormul)rio de vendas &or carregado. - / um duplo cli ue em uma )rea livre do &ormul)rio para e#ibir o mtodo -endasNormQ4oad67. - 'opie e cole o c(digo abai#o* -endas844 obj \ ne2 -endas84467, cliente'ombo8o#./ataBource \ obj.4ista/e'lientes, produto'ombo8o# \ obj.4ista/e$rodutos, 0bservao* /evemos usar using 4oja.844,

using 4oja./.4, using 4oja.:odelos, no in>cio do code be!ind do -endasNorm.cs - No modo de design do -endasNorm% d um duplo cli ue no boto G?ealizar a -endaH, - 'opie e cole o c(digo abai#o* tr5 a -endaIn&ormation venda \ ne2 -endaIn&ormation67, venda.@uantidade \ int.$arse6 uantidade<e#t8o#.<e#t7, venda.'odigo'liente \ 6int7cliente'ombo8o#.Belected-alue, venda.'odigo$roduto \ 6int7produto'ombo8o#.Belected-alue, venda./ata \ /ate<ime.No2, venda.Naturado \ &alse, -endas844 obj \ ne2 -endas84467, obj.Incluir6venda7, :essage8o#.B!o26S. venda &oi realizada com sucessoWS7, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b 0 code be!ind completo do nosso -endasNorm.cs &icou assim* [V V Nile...* -endasNorm.cs V .ut!or.* 'arlos 'amac!o - 222.camac!ojunior.com.br V 'ontent* Normul)rio de -endas V Bubject* Luia pr)tico para o desenvolvimento de .plica"es '= em 'amadas V[ using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing, using B5stem.<e#t, using B5stem.1indo2s.Norms, using 4oja.844, using 4oja./.4,

using 4oja.:odelos, namespace 4oja.9I1indo2s a public partial class -endasNorm * Norm a public -endasNorm67 a Initialize'omponent67, b private void -endasNormQ4oad6object sender% Event.rgs e7 a -endas844 obj \ ne2 -endas84467, cliente'ombo8o#./ataBource \ obj.4ista/e'lientes, produto'ombo8o#./ataBource \ obj.4ista/e$rodutos, b private void incluir-enda8uttonQ'licI6object sender% Event.rgs e7 a tr5 a -endaIn&ormation venda \ ne2 -endaIn&ormation67, venda.@uantidade \ int.$arse6 uantidade<e#t8o#.<e#t7, venda.'odigo'liente \ 6int7cliente'ombo8o#.Belected-alue, venda.'odigo$roduto \ 6int7produto'ombo8o#.Belected-alue, venda./ata \ /ate<ime.No2, venda.Naturado \ &alse, -endas844 obj \ ne2 -endas84467, obj.Incluir6venda7, :essage8o#.B!o26S. venda &oi realizada com sucessoWS7, b catc! 6E#ception e#7 a :essage8o#.B!o26e#.:essage7, b b b b - .bra o &ormul)rio principal Norm1 no modo de design e d um duplo cli ue na opo -endas do

menu para codi&icarmos a c!amada para este &ormul)rio com o c(digo abai#o* -endasNorm obj \ ne2 -endasNorm67, obj.:di$arent \ t!is, obj.B!o267, .cabamos de implementar o Normul)rio de -endas do nosso projeto 4oja .Net. E#ecute o projeto e teste as &uncionalidades ue implementamos neste artigo. $erceba ue a uantidade de produtos ad uirida por um cliente na venda dever) se re&letir automaticamente na uantidade de produtos em esto ue. .p(s realizar uma venda% abra o &ormul)rio de produtos e veja ue o esto ue &oi devidamente atualizado. No pr(#imo e ;ltimo artigo desta srie vamos implementar o &ormul)rio de $rodutos em Nalta. U j 9ser Inter&ace j Normul)rio de $rodutos em Nalta 6NIN.47 Este o ;ltimo artigo da srie Luia $r)tico para o desenvolvimento de .plica"es '= em 'amadas. Nele vamos criar o Normul)rio de $rodutos em Nalta. - .bra o :icroso&t -isual Btudio, - 'li ue em >ile ` $pen ` 5ro#ectA2olution!!! - Na janela :pen P oject% selecione o ar uivo da nossa Bolution 6C67"o#a71odelos7"o#a!sln7 e cli ue em $pen para abrir a soluo. -amos adicionar um &ormul)rio c!amado $rodutosEmNaltaNorm.cs. - 'li ue com o boto direito no projeto 9I1indo2s e escol!a Add ` Bindows >orm!!! - Na janela G.dd Ne2 ItemH vamos in&ormar os seguintes dados* <emplate* Bindows >orm Name* 5rodutos*m>alta>orm

- 'li ue em Add para adicionar o &ormul)rio. Ber) e#ibido o &ormul)rio $rodutosemNaltaNorm*

- .ltere a propriedade 2iNe para 4&3@ H&3 -amos criar 1 label e 1 /ataLrid-ie2. - .rraste e solte 1 4abel para o nosso &ormul)rio de produtos em &alta e con&igure-o com as seguintes caracter>sticas* Name* produtos*m>alta"a el 4ocation* J@ 2& <e#t* ,elatIrio de 5rodutos em >alta6

- .rraste e solte um objeto do tipo /ataLrid-ie2 e de&ina as seguintes propriedades* Name* produtos*m>altaDataGrid0iew .nc!or* ?opL BottomL "eftL ,i9-t 4ocation* &2@ 4F Bize* EKE@ 23G

Neste momento% nosso &ormul)rio de produtos em &alta estar) com esta aparncia*

-amos carregar a relao de produtos em &alta sempre ue o &ormul)rio &or carregado. - / um duplo cli ue em uma )rea livre do &ormul)rio para e#ibir o mtodo $rodutosEmNaltaNormQ4oad67. - 'opie e cole o c(digo abai#o* $rodutos844 produto \ ne2 $rodutos84467, produtosEmNalta/ataLrid-ie2./ataBource \ produto.$rodutosEmNalta67, No se es uea de usar using 4oja.844, using 4oja./.4, using 4oja.:odelos, no in>cio do code be!ind do $rodutosEmNaltaNorm.cs 0 code be!ind completo do nosso $rodutosEmNaltaNorm.cs &icou assim* [V V Nile...* $rodutosEmNaltaNorm.cs V .ut!or.* 'arlos 'amac!o - 222.camac!ojunior.com.br V 'ontent* Normul)rio de -endas V Bubject* Luia pr)tico para o desenvolvimento de .plica"es '= em 'amadas V[ using B5stem, using B5stem.'ollections.Leneric, using B5stem.'omponent:odel, using B5stem./ata, using B5stem./ra2ing,

using B5stem.<e#t, using B5stem.1indo2s.Norms, using 4oja.844, using 4oja./.4, using 4oja.:odelos, namespace 4oja.9I1indo2s a public partial class $rodutosEmNaltaNorm * Norm a public $rodutosEmNaltaNorm67 a Initialize'omponent67, b private void $rodutosEmNaltaNormQ4oad6object sender% Event.rgs e7 a $rodutos844 produto \ ne2 $rodutos84467, produtosEmNalta/ataLrid-ie2./ataBource \ produto.$rodutosEmNalta67, b b b - 'ompile o projeto para nos certi&icarmos de ue tudo &oi implementado corretamente.

Be ocorrer o erro Gno suitable met3od found to o>e ideH como na imagem acima% corrija o namespace do c(digo colocando G"o#a!H .ntes do nome do projeto 9I1indo2s. - 'ompile o projeto novamente para ter certeza de ue tudo est) oI. .gora vamos &azer a c!amada para este &ormul)rio a partir do menu principal do projeto 4oja .Net. - .bra o &ormul)rio principal Norm1 no modo de design e d um duplo cli ue na opo $rodutos em Nalta do menu para codi&icarmos a c!amada para este &ormul)rio com o c(digo abai#o* $rodutosEmNaltaNorm obj \ ne2 $rodutosEmNaltaNorm67, obj.:di$arent \ t!is, obj.B!o267, .cabamos de implementar o Normul)rio de $rodutos em Nalta do nosso projeto 4oja .Net. E#ecute o projeto e teste as &uncionalidades ue implementamos neste artigo. ?ealize vendas at ue um determinado produto &i ue com menos de 1E unidades em esto ue. Esse produto dever) aparecer no relat(rio de produtos em &alta. ?estando as ,e9ras de Ne9Icio

Na camada 844 implementamos algumas regras de neg(cio. <ente incluir um cliente com o campo nome em branco e voc receber) o alerta a seguir*

.p(s clicar em 0P% a incluso no permitida e voc estar) de volta ao &ormul)rio de incluso. 0utra regra implOcita ue colocamos% ou seja% no est) vis>vel ao usu)rio% ue o campo e-mail armazenado em letras min;sculas. E#perimente incluir um cliente escrevendo o e-mail em letras mai;sculas e voc ver) ue a nossa camada 844 se encarregar) de armazenar esse campo em letras min;sculas. Be voc estiver com o cursor numa lin!a do /ataLrid-ie2 ue no ten!a registro e clicar no boto E#cluir% receber) o aviso*

9m alerta semel!ante ser) e#ibido ao clicar no boto .lterar% pois de&inimos como regra ue um registro precisa estar selecionado para realizarmos estas opera"es. :esmo ue uma in&ormao seja &ornecida% implementamos algumas especi&ica"es ue devem ser respeitadas no nosso projeto. $or e#emplo% se tentarmos cadastrar um valor negativo no preo de um produto% receberemos o aviso*

/essa &orma% vemos ue a nossa camada de regras de neg(cio vai alm da tare&a de manter a integridade dos dados% evitando o armazenamento de campos em branco. Ela tambm nos permite garantir ue as regras especi&icadas para o projeto sejam respeitadas% como no e#emplo da incluso do preo do produto ue no pode ser um n;mero negativo. *strutura de Ar.uivos Na pasta '*_4oja_9I1indo2s_9I1indo2s_bin_/ebug voc encontrar) os ar uivos* + :odelos.dll + /.4.dll + 844.dll + 9I1indo2s.e#e 0s ar uivos :odelos.dll e /.4.dll re&erem-se a camada de 8anco de dados, 0 ar uivo 844.dll re&ere-se a camada de regras de neg(cio, E o ar uivo 9I1indo2s.e#e a inter&ace com o usu)rio ue roda no :B-1indo2s. /icas* 17 Be voc copiar somente esses h ar uivos em ual uer pasta do microcomputador de um usu)rio% bastar) ele e#ecutar o aplicativo 9I1indo2s.e#e para iniciar o sistema 4oja.Net e utilizar todas as &uncionalidades. D7 Be voc precisar desenvolver uma inter&ace para a 1eb% por e#emplo% poder) reutilizar as camadas de 8anco de dados e de regras de neg(cio sem a necessidade de ual uer alterao. 0anta9ens do modelo de desenvolvimento em Camadas .gora imagine ue voc o Lerente de $rojeto do sistema 4oja .Net e recebe o seguinte e-mail de um de seus clientes*

$rezado Br. 'omo usu)rio do Bistema 4oja .Net desenvolvido pela sua empresa% in&ormo ue precisamos ue o Br. nos envie uma atualizao para atender as nossas novas necessidades. Nossa empresa est) em cont>nuo crescimento e em breve contrataremos uma empresa de 'all 'enter ue o&erecer) promo"es especiais aos nossos clientes. /essa &orma% precisamos &azer com ue no seja permitido o cadastramento de clientes sem o n;mero de tele&one% pois essa in&ormao ser) muito importante para o nosso sucesso. $or &avor nos noti&i ue assim ue a nova verso do sistema estiver dispon>vel para testes. .tenciosamente% Carlos Camac-o .nalista de Bistemas 8anco Nossa 'ai#a B... /epartamento de <ecnologia da In&ormao carlos.camac!oTnossacai#a.com.br .lgumas perguntas* - Qual camada do Sistema Loja .Net voc vai precisar alterar para atender a solicitao do cliente? Isso mesmo% voc vai precisar alterar somente a camada 844. - Depois que voc reali ar as atuali a!es do Sistema" precisar# disponibili ar os $ arquivos que comp!em o sistema para o cliente? No% s( voc enviar o ar uivo re&erente a camada ue &oi atualizada. Neste caso% bastaria enviar o ar uivo 844.dll com instru"es para ue o cliente substitua o ar uivo atual por este novo ar uivo para realizar a atualizao do sistema. Concluses Nesta srie de artigos vimos como construir uma aplicao .Net utilizando o conceito de desenvolvimento em camadas. Neste projeto voc teve a oportunidade de praticar todas as etapas da implementao do desenvolvimento de uma aplicao .Net% ad uirindo con!ecimentos sobre* + 'omunicao entre as camadas, + -antagens do modelo de desenvolvimento em camadas, + 'ontrole de transa"es do banco de dados com o ./0 .Net, + 'onstruo de uma aplicao para 1indo2s. Implementou tambm as trs camadas* + 'amada de acesso dados ou /ata .ccess 4a5er 6/.47, + 'amada de regras de neg(cio ou 8usiness 4ogic 4a5er 68447, e + 'amada de inter&ace do usu)rio ou 9ser Inter&ace 69I7. -oc ad uiriu !abilidades na construo de aplicativos capazes de reaproveitar a camada de acesso dados e a camada de regras de neg(cio. Be por um acaso voc estiver trabal!ando em um projeto

comple#o% com uma grande in&ra-estrutura de banco de dados e diversos &ormul)rios% certamente se sentir) seguro nas suas atribui"es. Be voc &or o respons)vel pela manuteno do sistema% seja para a alterao ou criao de novos &ormul)rios% ter) con&iana no seu trabal!o pois entende como as camadas se relacionam e tem Ino2-!o2 no processo de criao dos objetos mais comuns de um &ormul)rio.