Guia prático para o desenvolvimento de Aplicações C# em Camadas

download Guia prático para o desenvolvimento de Aplicações C# em Camadas

If you can't read please download the document

Transcript of Guia prático para o desenvolvimento de Aplicações C# em Camadas

Guia prtico para o desenvolvimento de Aplicaes C# em Camadas
1 - IntroduoEste 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 que voc adquira habilidades para a construo ou manuteno de aplicaes mais complexas. Para alcanar esse objetivo, essa srie de artigos foi concebida como um guia passo-a-passo que abrange todas as etapas da implementao relacionadas ao desenvolvimento de uma aplicao .Net. Conforme voc for evoluindo nos mdulos, ir adquirir conhecimentos sobre: Comunicao entre as camadas; Vantagens do modelo de desenvolvimento em camadas; Controle de transaes do banco de dados com o ADO .Net; Construo de uma aplicao para Windows; Construo de uma aplicao para a Web; A importncia da segurana no desenvolvimento de aplicaes.A metodologia utilizada ser o desenvolvimento em trs camadas. Veremos a diferena entre: Camada de acesso dados ou Data Access Layer (DAL); Camada de regras de negcio ou Business Logic Layer (BLL); e Camada de interface do usurio ou User Interface (UI).

Na camada de interface com o usurio reutilizaremos as camadas DAL e BLL para criarmos dois projetos de interface para o usurio. Um projeto ser uma aplicao que rodar no Microsoft Windows e o outro ser uma aplicao para a Web.Esperamos que com esta srie de artigos voc esteja munido de conhecimentos prticos teis no seu dia-a-dia. Para os desenvolvedores de solues de TI esperamos que este material possa agregar dinamismo e eficincia na construo profissional de softwares.Para os professores esperamos que o guia passo-a-passo possa ser usado como exemplos prticos da utilizao de conceitos como: programao orientada a objetos, integridade referencial de banco de dados, uso de transaes via linguagem de programao C# .Net e implementao de algoritmos de segurana no desenvolvimento de aplicaes.Para os alunos e entusiastas da tecnologia Microsoft .Net desejamos que essa srie de artigos represente o incio de uma carreira profissional repleta de sucesso e realizaes.1.1) Requisitos Tcnicos: Quais softwares ns vamos utilizar?Esse projeto ser desenvolvido utilizando os softwares: Sistema Operacional: Microsoft Windows XP Professional; Banco de Dados: Microsoft SQL Server 2005; Microsoft Visual Studio 2005 Professional Edition.
2 Criando a infra-estrutura de Banco de dadosPara o nosso projeto vamos precisar de uma infra-estrutura simples de banco de dados com apenas trs tabelas: clientes, produtos e vendas.Se voc estiver utilizando o MS SQL Server 2005, poder abrir o Microsoft SQL Server Management Studio. Selecione o servidor de banco de dados e o usurio para realizar a conexo como a seguir:

Estabelecida a conexo, podemos criar um banco de dados para o nosso projeto.Para isso, clique com o boto direito sobre Databases e escolha a opo New Database...

Vamos dar o nome do nosso database de Loja. Deixe a configurao padro para o tamanho inicial dos arquivos de dados e Log. Clique em Ok para criar o database:

Aps clicar em Ok provavelmente precisaremos aguardar alguns segundos para que o MS SQL Server 2005 crie o banco de dados Loja.

Quando esta janela de ttulo New Database desaparecer, podemos verificar que o banco de dados Loja foi criado com sucesso conforme figura abaixo:

Agora que j temos o nosso banco de dados, vamos executar os scripts para criar as trs tabelas necessrias ao nosso projeto.

2.1) Criando a tabela de ClientesClicando com o boto direito sobre o database Loja, escolha a opo New Query:

Copie o script SQL abaixo e cole na janela de Query aberta.CREATE TABLE [CLIENTES] ([CODIGO] [int] IDENTITY (1, 1) NOT NULL ,[NOME] [varchar] (100) ,[EMAIL] [varchar] (100) ,[TELEFONE] [varchar] (80) ,CONSTRAINT [PK_CLIENTES] PRIMARY KEY CLUSTERED ([CODIGO]) ON [PRIMARY] ) ON [PRIMARY]GO

O cdigo dever ficar assim:

Para executar esse script e criar a tabela de Clientes, clique no boto Execute:Se a mensagem Command(s) completed successfully. for exibida, podemos expandir o database Loja e depois expandir Tables para vermos a tabela CLIENTES que acabamos de criar.

O campo Cdigo da nossa tabela de Clientes foi criado como Identity e Primary Key. O que significa isso?Bem, Primary key (chave primria) um campo que ser nico para cada registro da tabela, ou seja, s existir um campo com o cdigo igual a 1, s existir um campo com o cdigo igual a 2 etc. um campo que no admite valores repetidos. Se tentarmos incluir um valor na chave primria j existente na tabela, o MS SQL Server vai exibir uma mensagem de erro e no permitir essa incluso.A caracterstica Identity desse campo significa que ele ser gerenciado pelo MS SQL Server e ns no precisamos nos preocupar em inserir um valor inexistente na tabela para evitar a duplicidade. Na prtica isso quer dizer que ns nem precisamos mencionar esse campo nas operaes de insero pois o gerenciador de banco de dados que se encarrega de inserir uma chave primria vlida.Vamos inserir um registro na tabela de clientes com o comando a seguir. Podemos apagar o comando de Create table existente na janela do Management Studio e vamos colar o comando abaixo:insert into clientes(nome,email,telefone) values ("Carlos Camacho","[email protected]","(11) 9999-5555")Clique em Execute para executar o comando de insero:

Se a mensagem 1 row(s) affected for exibida, significa que o registro foi inserido com sucesso.

Execute o comando de seleo a seguir para visualizarmos o registro que acabamos de inserir na tabela de Clientes:Select * from clientes

Perceba que apesar de no mencionarmos o campo Codigo no comando de insert executado anteriormente, o MS SQL Server providenciou a insero desse valor automaticamente.Se executarmos outro comando de insert, o MS SQL Server vai gerar um cdigo diferente para inserir no campo Codigo do novo registro.Parabns! Acabamos de preparar a infra-estrutura do nosso projeto com a tabela de Clientes criada corretamente.2.2) Agora vamos executar o script para criar a tabela de produtos:O processo o mesmo. Apague o contedo da janela de query e cole o script abaixo.CREATE TABLE [PRODUTOS] ([CODIGO] [int] IDENTITY (1, 1) NOT NULL ,[NOME] [varchar] (100) ,[PRECO] decimal(10,2) ,[ESTOQUE] [int] ,CONSTRAINT [PK_PRODUTOS] PRIMARY KEY CLUSTERED ([CODIGO]) ON [PRIMARY] ) ON [PRIMARY]GOCom o script na janela de query, clique em Executar para criarmos a tabela de produtos.

Nesse instante voc deve estar pensando...U?! Depois que cliquei no Execute apareceu a mensagem Command(s) completed successfully. Mas a tabela PRODUTOS no apareceu em Tables... O que aconteceu?

Voc est certo(a)! Precisamos atualizar o Management Studio para ver a tabela recm-criada. Para isso, vamos clicar com o boto direito do mouse em Tables e escolher a opo Refresh:

Veja o Management Studio aps o Refresh:

Agora podemos ver a tabela de Produtos.Que tal inserirmos dois produtos nessa tabela?- Apague o cdigo da janela de query;- Copie o cdigo abaixo na janela de query e clique em Execute para a insero dos dois produtos.insert into produtos (nome, preco, estoque) values ("Computador Pentium Dual Core","1500.00","15")insert into produtos (nome, preco, estoque) values ("Impressora Deskjet HP","599.90","150")Vamos ver o resultado:

Na janela de mensagens podemos ver que os dois registros foram inseridos com sucesso.Utilize o comando select para consultar os produtos cadastrados.- Apague o contedo da janela de query;- Copie o comando abaixo e clique em Execute.select * from produtos

O resultado esse:

Ok, a nossa insero de produtos funcionou!Cadastramos 15 computadores Pentium Dual Core com o valor unitrio de R$ 1.500,00;E cadastramos tambm 150 impressoras Deskjet HP com o valor unitrio de R$ 599,90.A nossa tabela de Produtos est pronta. Agora s falta criarmos a tabela de Vendas!2.3) Vamos criar a tabela para armazenar as Vendas. - Apague o contedo da janela de query;- Copie o comando abaixo e clique em Execute.CREATE TABLE [VENDAS] ([CODIGO] [int] IDENTITY (1, 1) NOT NULL ,[DATA] [datetime],[QUANTIDADE] [int],[FATURADO] bit, [CODIGOCLIENTE] [int],[CODIGOPRODUTO] [int],CONSTRAINT [PK_VENDAS] PRIMARY KEY CLUSTERED ([CODIGO]) ON [PRIMARY],CONSTRAINT [FK_Codigo_Cliente] FOREIGN KEY ([CODIGOCLIENTE]) REFERENCES [Clientes] ([Codigo]),CONSTRAINT [FK_Codigo_Produto] FOREIGN KEY ([CODIGOPRODUTO]) REFERENCES [Produtos] ([Codigo])) ON [PRIMARY]GO

Vejamos o resultado:

D um Refresh clicando com o boto direito tem Tables para que a tabela de Vendas seja exibida:

A tabela de Vendas que acabamos de criar possui duas foreign keys (chaves estrangeiras). Essas duas chaves so os campos: CodigoCliente e CodigoProduto.Isso significa que quando um registro for inserido nesta tabela, o campo CodigoCliente includo dever existir na tabela de Clientes, assim como o campo CodigoProduto dever existir na tabela Produtos.

Se algum tentar incluir valores nestes campos que no existam nas tabelas citadas o Microsoft SQL Server vai informar a ocorrncia de um erro e no permitir a incluso.Esse mecanismo do sistema gerenciador de banco de dados existe para manter a integridade dos dados. Chamamos isso de integridade referencial.Uma regra que vamos usar no nosso projeto que ao realizar uma venda, atualizaremos o estoque do produto na tabela de Produtos. Faremos com que o estoque fique atualizado com a seguinte frmula:Estoque = Estoque Quantidade Vendida .Essa tarefa ser realizada juntamente com a tarefa de incluso da Venda na tabela de Vendas.Assim, para manter a integridade dos dados, precisaremos garantir que as duas coisas aconteam: 1) a incluso na tabela de Vendas; e 2) a atualizao do estoque na tabela de Produtos. Para isso usaremos uma Transao. Com a transao podemos garantir a execuo das duas tarefas. Se uma delas for bem sucedida e a outra falhar, a transao desfaz a primeira tarefa mantendo assim a integridade referencial. Em outras palavras, no exisitir na tabela de Vendas um registro que tenha o cdigo do produto vendido mas que o estoque deste produto na tabela de Produtos esteja desatualizado.Veremos isso com mais detalhes no prximo artigo chamado Camada de Acesso a Dados (Data Access Layer). Implementaremos as classes de acesso a dados e faremos esse controle transacional no mtodo Incluir da classe de Vendas.

Observaes:Para futura utilizao no nosso projeto, precisaremos guardar as seguintes informaes sobre o banco de dados: Nome do servidor de banco de dados que estamos usando; Nome do banco de dados onde as trs tabelas foram criadas; Nome do usurio e senha utilizados para acessar o banco de dados.Essa informao importante para a construo da nossa string de conexo ou connectionstring.A connectionstring ser usada para a conexo com o banco de dados atravs da aplicao que desenvolveremos neste projeto.Um bom site para consulta sobre a correta connectionstring que devemos utilizar o http://www.connectionstrigs.com/ Neste site existem dicas para criar connectionstrings para diferentes verses de bancos de dados.No meu caso, se eu fechar a janela de Query que estvamos usando, poderei ver o nome do servidor de banco de dados que estou usando:

O usurio e senha so aqueles que usei inicialmente para conectar no servidor de banco de dados antes de iniciar a criao do database Loja. Nome do Servidor: MAQ-607567\SQLEXPRESSNome do banco de dados: LojaUsurio: camachoSenha: camacho2008a3Assim, a minha connectionstring ficar assim:"server=MAQ-607567\SQLEXPRESS;database=Loja;user=camacho;pwd=camacho2008a3"A sua connectionstring vai depender dos nomes que voc usou para: - Criar o servidor de banco de dados; - Criar o banco de dados; - Criar usurio e senha que tero acesso ao banco de dados.
3 - Camada de Acesso a DadosEssa camada normalmente tambm chamada de DAL (Data Access Layer). Nessa camada vamos implementar os mtodos de insero, atualizao, excluso e listagem referentes a todas as tabelas existentes no nosso projeto.Essa uma tarefa simples, j que para criar cada classe usaremos os nomes dos campos da respectiva tabela existente no banco de dados.Voc se lembra do nosso desenho que representa as trs camadas? Aqui est ele:

Ns comeamos o desenvolvimento da aplicao da camada mais interna at a mais externa. Dessa forma, iniciaremos a implementao com a camada de acesso a dados (DAL).Dentro da camada DAL ns temos o projeto Modelos. Vamos criar esse projeto.No projeto chamado Modelos iremos implementar as classes: ClienteInformation.cs ProdutoInformation.cs e VendaInformation.cs necessrio criar uma classe para cada tabela do nosso projeto.A partir do menu Iniciar > Programas > Microsoft Visual Studio 2005, abra o Microsoft Visual Studio 2005.Clique no Menu File > New > Project...

Acompanhe as selees da janela New Project:

No tipo de projeto selecione Visual C#;No tipo de template selecione Class Library;No Nome do projeto digite Modelos;Na localizao do projeto digite C:\Loja;Deixe a opo Create directory for solution selecionada e clique em Ok para criar o projeto.

Abrindo o Windows Explorer, podemos ver que a pasta Loja foi criada no drive C:Dentro da pasta Loja foi criada a pasta do projeto Modelos.

Ok, agora vamos voltar para o MS Visual Studio.

Do lado direito vemos a rea do Solution Explorer.- Clique com o boto direito sobre o arquivo Class1.cs e escolha Rename para renomear a classe para ClienteInformation.cs;Ao renomear o arquivo da classe, perceba que o nome da classe muda automaticamente na janela de cdigo (public class ClienteInformation).- Na janela de cdigo esquerda, inclua o nome do nosso projeto (Loja) no namespace, de maneira que o namespace fique Loja.Modelos como na figura abaixo:

Vamos codificar a classe ClienteInformation. Para isso, copie e cole o cdigo abaixo entre as chaves da classe ClienteInformation: private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private string _email; public string Email { get { return _email; } set { _email = value; } } private string _telefone; public string Telefone { get { return _telefone; } set { _telefone = value; } }Na implementao da classe ClienteInformation vemos que estamos definindo campos e propriedades para cada campo da tabela de Clientes que criamos no banco de dados. Agora a codificao da classe ClienteInformation est completa como na listagem a seguir:

using System;using System.Collections.Generic;using System.Text;namespace Loja.Modelos{ public class ClienteInformation { private int _codigo; public int Codigo { get { return _codigo; } set { _codigo = value; } } private string _nome; public string Nome { get { return _nome; } set { _nome = value; } } private string _email; public string Email { get { return _email; } set { _email = value; } } private string _telefone; public string Telefone { get { return _telefone; } set { _telefone = value; } } }}

Vamos implementar a Classe ProdutoInformation.cs.Clique com o boto direito sobre o projeto Modelos e ento escolha Add. Em seguida escolha New Item... como na figura abaixo:

Na janela Add New Item, escolha o template Class e digite ProdutoInformation.cs no campo nome. Clique em Add para adicionar a nova classe ao projeto Modelos.

A nova classe ProdutoInformation.cs agora j esta criada:

Altere o namespace de modo que ele fique assim:namespace Loja.ModelosOk. Agora copie e cole o cdigo abaixo dentro da classe ProdutoInformation:private int _codigo;public int Codigo{get { return _codigo; }set { _codigo = value; }}private string _nome;public string Nome{get { return _nome; }set { _nome = value; }}private decimal _preco;public decimal Preco{get { return _preco; }set { _preco = value; }}private int _estoque;public int Estoque{get { return _estoque; }set { _estoque = value; }}O cdigo completo da nossa classe ProdutoInformation.cs ficar assim:using System;using System.Collections.Generic;using System.Text;namespace Loja.Modelos{public class ProdutoInformation{private int _codigo;public int Codigo{get { return _codigo; }set { _codigo = value; }}private string _nome;public string Nome{get { return _nome; }set { _nome = value; }}private decimal _preco;public decimal Preco{get { return _preco; }set { _preco = value; }}private int _estoque;public int Estoque{get { return _estoque; }set { _estoque = value; }}}}Muito bem! J implementamos as classes do projeto Modelo para a tabela de Clientes e para a tabela de Produtos. Agora vamos fazer o mesmo para a tabela de Vendas:

Clique com o boto direito sobre o projeto Modelos e ento escolha Add. Em seguida escolha New Item... como na figura abaixo:

Na janela Add New Item, escolha o template Class e digite VendaInformation.cs no campo nome. Clique em Add para adicionar a nova classe ao projeto Modelos.

A nova classe VendaInformation.cs agora j esta criada:

Altere o namespace de modo que ele fique assim:namespace Loja.ModelosOk. Agora copie e cole o cdigo abaixo dentro da classe VendaInformation:private int _codigo;public int Codigo{get { return _codigo; }set { _codigo = value; }}private DateTime _data;public DateTime Data{get { return _data; }set { _data = value; }}private int _quantidade;public int Quantidade{get { return _quantidade; }set { _quantidade = value; }}private bool _faturado;public bool Faturado{get { return _faturado; }set { _faturado = value; }}private int _codigoCliente;public int CodigoCliente{get { return _codigoCliente; }set { _codigoCliente = value; }}private int _codigoProduto;public int CodigoProduto{get { return _codigoProduto; }set { _codigoProduto = value; }}private string _nomeCliente;public string NomeCliente{get { return _nomeCliente; }set { _nomeCliente = value; }}O cdigo completo da nossa classe VendaInformation.cs ficar assim:using System;using System.Collections.Generic;using System.Text;namespace Loja.Modelos{public class VendaInformation{private int _codigo;public int Codigo{get { return _codigo; }set { _codigo = value; }}private DateTime _data;public DateTime Data{get { return _data; }set { _data = value; }}private int _quantidade;public int Quantidade{get { return _quantidade; }set { _quantidade = value; }}private bool _faturado;public bool Faturado{get { return _faturado; }set { _faturado = value; }}private int _codigoCliente;public int CodigoCliente{get { return _codigoCliente; }set { _codigoCliente = value; }}private int _codigoProduto;public int CodigoProduto{get { return _codigoProduto; }set { _codigoProduto = value; }}private string _nomeCliente;public string NomeCliente{get { return _nomeCliente; }set { _nomeCliente = value; }}}}Agora que implementamos no projeto Modelos as classes referentes a todas as tabelas contempladas no nosso projeto, vamos compilar o projeto atravs da opo Build.Para compilar o projeto vamos fazer o seguinte. No Solution Explorer, clique com o boto direito sobre o projeto Modelos e escolha a opo Build:

Se a compilao do nosso projeto for realizada com sucesso, aparecer a mensagem Build succeeded na barra de status do Microsoft Visual Studio:

No Windows Explorer, observe que na pasta do projeto Modelos foi criado um arquivo para cada classe que implementamos.

Quando compilamos o projeto com a opo Build, o MS Visual Studio criou o arquivo Modelos.dll.O arquivo Modelos.dll contm toda a informao que implementamos nas classes desse projeto e ele que ser usado no prximo projeto a ser implementado, que a Camada de Acesso a Dados ou DAL (Data Access Layer).

Aps terminar o projeto Modelos, muitos programadores costumam criar um Diagrama de Classes para ter uma viso melhor da sua arte. Vamos criar o Diagrama de Classes?

De volta ao Visual Studio, clique com o boto direito sobre o projeto Modelos e escolha Add > New Item...

Na janela Add New Item, escolha o template Class Diagram. Digite Modelos.cd no nome e clique em Add para criar o nosso diagrama de classes como a seguir.

O ambiente chamado Class Designer exibido.

Para a criao do diagrama vamos arrastar as classes ClienteInformation, ProdutoInformation e VendaInformation do Solution Explorer para o Class Designer (Arquivo Modelos.cd) como a seguir:

Com o Diagrama de Classes fica fcil a distino entre os campos e as propriedades que implementamos no nosso projeto.O asterisco ao lado do nome do diagrama Modelos.cd* indica que ele ainda no foi salvo. Digite + S para salvar o arquivo.Se olharmos para o nosso desenho das camadas, vamos verificar que o prximo passo implementar as classes da camada DAL. Faremos isso no prximo artigo.
Neste artigo vamos implementar as classes da Camada DAL (Data Access Layer).Criaremos as classes: ClientesDAL.cs ProdutosDAL.cs VendasDAL.cs Dados.csVoc ver que a classe ClientesDAL, por exemplo, conter os mtodos de incluso, alterao, excluso e consulta referentes a tabela de Clientes. O mesmo ocorrer para as classes ProdutosDAL e VendasDAL.Usaremos a classe Dados para armazenarmos a string de conexo com o banco de dados. Vamos comear?- Abra o Microsoft Visual Studio;- Abra o projeto Modelos que criamos no artigo anterior.- Vamos adicionar um novo projeto. No menu File do Visual Studio, clique em Add > New Project...

Na janela Add New Project:- Escolha Visual C# para o tipo de projeto;- Class Library para o template;- Digite DAL no campo nome;- Digite C:\Loja\DAL na localizao;- Clique em Ok para adicionar o novo projeto nossa Solution (soluo).Nota: Quando temos um conjunto de projetos reunidos para atender uma necessidade chamamos esse conjunto de Solution.

Muito bom! Agora o nosso projeto DAL foi adicionado nossa Solution:

O nome da nossa Solution est como Modelos porque o MS Visual Studio usa o nome do primeiro projeto criado.

No Solution Explorer, clique com o boto direito sobre a Solution Modelos e escolha a opo Rename. Renomeie a Solution para Loja.Depois que voc renomear a nossa Solution, ela ficar assim:

- No projeto DAL, Renomeie a classe Class1.cs para ClientesDAL.cs;- Altere o namespace para namespace Loja.DAL A nossa classe ClientesDAL ficar assim:

Voc se lembra quando comentamos que a nossa implementao aconteceria da camada mais interna para a mais externa do desenho do nosso projeto?[Modelos] DAL BLL User InterfaceEnto, o projeto Modelos o mais interno e o prximo a camada de acesso a dados DAL. Isso significa que o nosso projeto DAL poder usar tudo o que j foi construdo no projeto Modelos!

Em termos de programao, dizemos que o projeto DAL faz referncia ao projeto Modelos. Para que o nosso projeto DAL consiga ver o que j construmos no projeto Modelos, vamos criar essa referncia.- Abra a pasta References do projeto DAL para ver o que j existe como referncia sempre que criamos um novo projeto:

Precisamos incluir no projeto DAL uma referncia para o Modelos. Faa o seguinte:

- Clique com o boto direito na pasta References do projeto DAL e escolha Add Reference...

Na janela Add Reference que abrir, clique na aba Projects:

Veremos o nosso projeto Modelos. Clique sobre ele para selecion-lo e ento clique em Ok para criar a referncia.

Muito bom! Agora j podemos ver a referncia para o nosso projeto Modelos dentro do nosso projeto DAL como a seguir:

Para enxergar os Modelos dentro da nossa classe ClientesDAL vamos adicionar a clusula using como segue:

Aps digitarmos using Loja. (coloque o ponto aps digitar Loja) perceba que o MS Visual Studio j nos mostra as referncias disponveis. Com as setas de direo posicione a seleo em Modelos e d um ENTER para selecion-lo.

Aquele tracinho vermelho aps Loja.Modelos indica que h algo errado. o comando using que no foi fechado.

- Digite ponto-e-vrgula ( ; ) para fechar o comando using:

Para que tenhamos acesso as definies do namespace do MS SQL Server, vamos inserir mais uma clusula using para System.Data.SqlClient como a seguir:

Para o cdigo da classe ClientesDAL copie e cole o cdigo abaixo entre as chaves da classe:public void Incluir (ClienteInformation cliente){//conexaoSqlConnection cn = new SqlConnection();try {cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "insert into Clientes(nome,email,telefone) values (@nome,@email,@telefone); select @@IDENTITY;";cmd.Parameters.AddWithValue ("@nome", cliente.Nome );cmd.Parameters.AddWithValue("@email", cliente.Email);cmd.Parameters.AddWithValue("@telefone", cliente.Telefone);cn.Open();cliente.Codigo = Convert.ToInt32 (cmd.ExecuteScalar());}catch (SqlException ex) {throw new Exception ("Servidor SQL Erro:" + ex.Number);}catch (Exception ex) {throw new Exception (ex.Message);} finally {cn.Close();}}public void Alterar (ClienteInformation cliente){// conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;SqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandType = CommandType.Text;cmd.CommandText = "update Clientes set nome = @nome, email = @email, telefone = @telefone where codigo = @codigo;";cmd.Parameters.AddWithValue("@codigo", cliente.Codigo);cmd.Parameters.AddWithValue("@nome", cliente.Nome);cmd.Parameters.AddWithValue("@email", cliente.Email);cmd.Parameters.AddWithValue("@telefone", cliente.Telefone);cn.Open();cmd.ExecuteNonQuery();}catch (SqlException ex){throw new Exception("Servidor SQL Erro:" + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public void Excluir (int codigo) {//conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "delete from Clientes where codigo = " + codigo ;cn.Open();int resultado = cmd.ExecuteNonQuery();if (resultado!=1) {throw new Exception("No foi possvel excluir o cliente " + codigo);}}catch (SqlException ex){throw new Exception("Servidor SQL Erro:" + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public DataTable Listagem() {DataTable tabela = new DataTable();SqlDataAdapter da = new SqlDataAdapter("select * from clientes", Dados.StringDeConexao );da.Fill (tabela);return tabela;}

O cdigo completo da nossa classe ClientesDAL.cs ficar assim:using System;using System.Collections.Generic;using System.Text;using Loja.Modelos;using System.Data.SqlClient;namespace Loja.DAL{public class ClientesDAL{public void Incluir(ClienteInformation cliente){//conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "insert into Clientes(nome,email,telefone) values (@nome,@email,@telefone); select @@IDENTITY;";cmd.Parameters.AddWithValue("@nome", cliente.Nome);cmd.Parameters.AddWithValue("@email", cliente.Email);cmd.Parameters.AddWithValue("@telefone", cliente.Telefone);cn.Open();cliente.Codigo = Convert.ToInt32(cmd.ExecuteScalar());}catch (SqlException ex){throw new Exception("Servidor SQL Erro:" + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public void Alterar(ClienteInformation cliente){// conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;SqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandType = CommandType.Text;cmd.CommandText = "update Clientes set nome = @nome, email = @email, telefone = @telefone where codigo = @codigo;";cmd.Parameters.AddWithValue("@codigo", cliente.Codigo);cmd.Parameters.AddWithValue("@nome", cliente.Nome);cmd.Parameters.AddWithValue("@email", cliente.Email);cmd.Parameters.AddWithValue("@telefone", cliente.Telefone);cn.Open();cmd.ExecuteNonQuery();}catch (SqlException ex){throw new Exception("Servidor SQL Erro:" + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public void Excluir(int codigo){//conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "delete from Clientes where codigo = " + codigo;cn.Open();int resultado = cmd.ExecuteNonQuery();if (resultado != 1){throw new Exception("No foi possvel excluir o cliente " + codigo);}}catch (SqlException ex){throw new Exception("Servidor SQL Erro:" + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public DataTable Listagem(){DataTable tabela = new DataTable();SqlDataAdapter da = new SqlDataAdapter("select * from clientes", Dados.StringDeConexao);da.Fill(tabela);return tabela;}}}Sempre que terminamos de codificar uma classe, bom dar um Build no projeto para nos certificarmos de que est tudo certo. Vamos fazer isso no projeto DAL.- Clique com o boto direito sobre o projeto DAL e escolha Build:

Um erro foi encontrado. Tudo bem, isso no motivo para pnico. JPreste ateno na descrio do erro, est escrito que o nome DataTable que usamos como tipo do mtodo Listagem() no pode ser encontrado.Isso ocorreu porque o tipo DataTable est dentro do namespace System.Data e ns no demos um using nesse namespace. por isso que o MS Visual Studio no o encontrou no momento da compilao.Como resolvemos o problema?Vamos incluir a clusula using para esse namespace no comeo da classe:

Agora d um Build novamente no projeto DAL para verificarmos o resultado:

Agora temos 4 erros para corrigir? Hmm... Olhando para a descrio vemos que na verdade o mesmo erro que ocorreu em 4 linhas diferentes da classe.A descrio diz que o nome Dados no foi encontrado.E est certo, realmente ainda no codificamos a nossa classe Dados que armazenar a nossa string de conexo.Tudo bem, ento vamos codific-la agora.- Clique com o boto direito no projeto DAL e selecione Add > New Item...- Na janela que se abrir, vamos escolher o template Class e dar o nome de Dados.cs. Clique no boto Add para adicionar a nova classe ao projeto:

- No Solution Explorer, d um duplo clique na classe Dados.cs para abrir o cdigo.- Altere o namespace para Loja.DAL; - Copie e cole o cdigo entre as chaves da classe Dados:public static string StringDeConexao{get{Return "server=MAQ-607567\\SQLEXPRESS;database=Loja;user=camacho;pwd=camacho2008a3";}}Importante: O contedo que voc colocar entre as aspas do return dever ser a sua string de conexo. Os dados da sua string de conexo foram definidos no artigo 2 que trata da criao da infra-estrutura de banco de dados.

O cdigo completo da nossa classe Dados.cs ficar assim:using System;using System.Collections.Generic;using System.Text;namespace Loja.DAL{class Dados{public static string StringDeConexao{get{return "Use a sua string de conexo aqui.";}}}}Agora vamos dar um Build no projeto DAL novamente:

Muito bem! Podemos ver a frase Build succeeded na barra de status indicando que o nosso projeto foi compilado com sucesso.

Agora vamos implementar a classe ProdutosDAL.cs.- Clique com o boto direito no projeto DAL, Add > New Item...- Nomeie a classe como ProdutosDAL.cs e clique em Add:

- Copie e cole a listagem completa da classe ProdutosDAL.cs a seguir:using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;using System.Collections;using Loja.Modelos;namespace Loja.DAL{public class ProdutosDAL{public ArrayList ProdutosEmFalta(){SqlConnection cn = new SqlConnection(Dados.StringDeConexao);SqlCommand cmd = new SqlCommand("Select * from Produtos Where Estoque < 10", cn);cn.Open();SqlDataReader dr = cmd.ExecuteReader();ArrayList lista = new ArrayList();while (dr.Read()){ProdutoInformation produto = new ProdutoInformation();produto.Codigo = Convert.ToInt32(dr["codigo"]);produto.Nome = dr["nome"].ToString();produto.Estoque = Convert.ToInt32(dr["estoque"]);produto.Preco = Convert.ToDecimal(dr["preco"]);lista.Add(produto);}dr.Close();cn.Close();return lista;}public void Incluir(ProdutoInformation produto){//conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "insert into Produtos(nome,preco,estoque) values (@nome,@preco,@estoque); select @@IDENTITY;";cmd.Parameters.AddWithValue("@nome", produto.Nome);cmd.Parameters.AddWithValue("@preco", produto.Preco);cmd.Parameters.AddWithValue("@estoque", produto.Estoque);cn.Open();produto.Codigo = Convert.ToInt32(cmd.ExecuteScalar());}catch (SqlException ex){throw new Exception("Servidor SQL Erro: " + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public void Alterar(ProdutoInformation produto){//conexaoSqlConnection cn = new SqlConnection();try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd = new SqlCommand();cmd.Connection = cn;cmd.CommandText = "AlterarProduto";cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.AddWithValue("@codigo", produto.Codigo);cmd.Parameters.AddWithValue("@nome", produto.Nome);cmd.Parameters.AddWithValue("@preco", produto.Preco);cmd.Parameters.AddWithValue("@estoque", produto.Estoque);cmd.Parameters.Add("@valorEstoque", SqlDbType.Int);cmd.Parameters["@valorEstoque"].Direction = ParameterDirection.Output;cn.Open();cmd.ExecuteNonQuery();decimal valorEstoque = Convert.ToDecimal(cmd.Parameters["@valorEstoque"]);if (valorEstoque < 500){throw new Exception("Ateno! Valor baixo no estoque");}}catch (SqlException ex){throw new Exception("Servidor SQL Erro: " + ex.Number);}catch (Exception ex){throw new Exception(ex.Message);}finally{cn.Close();}}public void Excluir(int codigo){}public DataTable Listagem(){DataTable tabela = new DataTable();SqlDataAdapter da = new SqlDataAdapter("select * from produtos", Dados.StringDeConexao);da.Fill(tabela);return tabela;}}}

Agora vamos implementar a classe VendasDAL.cs.- Clique com o boto direito no projeto DAL, Add > New Item...- Nomeie a classe como VendasDAL.cs e clique em Add:

- Copie e cole a listagem completa da classe VendasDAL.cs a seguir:using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;using Loja.Modelos;using Loja.DAL;namespace Loja.DAL{public class VendasDAL{public DataTable ListaDeProdutos{get{SqlConnection cn = new SqlConnection();cn.ConnectionString = Dados.StringDeConexao;cn.Open();SqlDataAdapter da = new SqlDataAdapter("select * from produtos", cn);DataTable dt = new DataTable();da.Fill(dt);cn.Close();return dt;}}//Propriedade que retorna uma Lista de Clientespublic DataTable ListaDeClientes{get{SqlConnection cn = new SqlConnection();cn.ConnectionString = Dados.StringDeConexao;cn.Open();SqlDataAdapter da = new SqlDataAdapter("select * from clientes", cn);DataTable dt = new DataTable();da.Fill(dt);cn.Close();return dt;}}public void Incluir(VendaInformation venda){//conexaoSqlConnection cn = new SqlConnection();SqlTransaction t = null;try{cn.ConnectionString = Dados.StringDeConexao;//commandSqlCommand cmd1 = new SqlCommand();cmd1.Connection = cn;cmd1.CommandText = @"insert into vendas(CodigoCliente, CodigoProduto,Data,Quantidade,Faturado)VALUES (@CodigoCliente, @CodigoProduto,@Data,@Quantidade,@Faturado);select @@IDENTITY;";SqlCommand cmd2 = new SqlCommand();cmd2.Connection = cn;cmd2.CommandText = @"Update ProdutosSet Estoque = Estoque - @Quantidade Where Codigo=@CodigoProduto";cn.Open();t = cn.BeginTransaction(IsolationLevel.Serializable);//defaultcmd1.Transaction = t;cmd2.Transaction = t;cmd1.Parameters.AddWithValue("@codigocliente", venda.CodigoCliente);cmd1.Parameters.AddWithValue("@codigoproduto", venda.CodigoProduto);cmd1.Parameters.AddWithValue("@data", venda.Data);cmd1.Parameters.AddWithValue("@quantidade", venda.Quantidade);cmd1.Parameters.AddWithValue("@faturado", venda.Faturado);cmd2.Parameters.AddWithValue("@quantidade", venda.Quantidade);cmd2.Parameters.AddWithValue("@codigoproduto", venda.CodigoProduto);venda.Codigo = Convert.ToInt32(cmd1.ExecuteScalar());cmd2.ExecuteNonQuery();t.Commit();}catch (Exception ex){t.Rollback();throw new Exception("Servidor no Servidor:" + ex.Message);}finally{cn.Close();}}}}

- Agora, clicando com o boto direito do mouse sobre o projeto DAL, d um Build para compilar o projeto:

A frase so rodap indica que a compilao foi realizada com sucesso.Parabns! Acabamos de implementar todas as classes do nosso projeto DAL Camada de Acesso Dados.Vou comentar brevemente alguns pontos interessantes sobre as classes que implementamos neste artigo. No mtodo Inserir da classe VendasDAL estamos usando uma transao. A insera de uma venda s vai ocorrer se dois comandos forem concludos com sucesso: a insero na tabela de vendas e a atualizao do estoque do produto. Quando criamos a nossa classe Dados usamos a palavra static. Com isso ns no precisamos instanciar um objeto para ter acesso a propriedade StringDeConexao. Se voc precisar criar uma propriedade deste tipo no VB .Net, pode usar a sintaxe: Public Shared ReadOnly Property

Se voc abrir o projeto DAL no Windows Explorer, poder verificar que na pasta de DLLs do projeto existem dois arquivos com a extenso DLL. Um do prprio projeto DAL e outro para a referncia que fizemos ao projeto Modelos.

Compare isso com o nosso modelo em camadas a seguir:[Modelos] DAL BLL User InterfaceNo prximo artigo onde implementaremos a camada BLL (regras de negcio), teremos na pasta do projeto BLL trs arquivos dll. Assim podemos distinguir claramente as nossas camadas pois nesta soluo elas estaro separadas em arquivos.A idia aproveitarmos o cdigo desenvolvido nas camadas anteriores. Mais adiante veremos que quando for necessrio fazer manuteno na camada de regras de negcio, por exemplo, precisaremos abrir e atualizar apenas o projeto BLL.
5 BLL Camada de Regras de Negcio.Neste artigo vamos implementar as classes da Camada BLL (Business Logic Layer).Criaremos as classes: ClientesBLL.cs ProdutosBLL.cs VendasBLL.csAs regras de negcio definem como o seu negcio funciona. Essas regras podem abranger diversos assuntos como suas polticas, interesses, objetivos, compromissos ticos e sociais, obrigaes contratuais, decises estratgicas, leis e regulamentaes, entre outros.No nosso projeto Loja vamos definir como regras de negcio:1) Regras para a incluso de clientes:1.1) O nome do cliente obrigatrio;1.2) O e-mail do cliente ser armazenado em letras minsculas;2) Regras para a incluso de produtos:2.1) O nome do produto obrigatrio;2.2) O preo no pode ser um valor negativo;2.3) O estoque no pode ser um valor negativo;

- Abra o Microsoft Visual Studio;- Clique em File > Open > Project/Solution...- Na janela Open Project, selecione o arquivo da nossa Solution (C:\Loja\Modelos\Loja.sln) e clique em Open para abrir a soluo:

Neste ponto do projeto temos implementados os projetos Modelos e DAL:

Vamos adicionar o projeto BLL soluo.- Clique com o boto direito na Solution Loja e escolha Add > New Project...

- Na janela Add New Project vamos informar os seguintes dados: Project type: Visual C# Template: Class Library Name: BLL Location: C:\Loja\BLL- Clique em Ok para adicionar o projeto.

O projeto BLL ser criado:

Analisando o nosso modelo em camadas abaixo:[Modelos] DAL BLL User InterfacePodemos ver que a camada BLL aproveita os projetos Modelos e DAL. Sendo assim, a primeira coisa que faremos no nosso projeto BLL ser adicionar esses dois projetos como referncia.

- Clique com o boto direito na pasta References do projeto BLL e escolha Add Reference...- Na janela Add Reference, clique na aba Projects;- Mantenha a tecla pressionada e clique sobre os projetos DAL e Modelos para selecionlos;- Clique em Ok para adicionar as referncias.

Podemos verificar as referncias que acabamos de adicionar ao projeto BLL:

Vamos renomear a classe Class1.cs para ClientesBLL.cs.- Clique com o boto direito sobre a classe Class1.cs, escolha a opo Rename e renomeie a classe para ClientesBLL.cs:

Copie e cole o seguinte cdigo para a classe ClientesBLL.cs:using System;using System.Data;using Loja.Modelos;using Loja.DAL;namespace Loja.BLL{ public class ClientesBLL { public void Incluir(ClienteInformation cliente) { //O nome do cliente obrigatrio if (cliente.Nome.Trim().Length == 0) { throw new Exception("O nome do cliente obrigatrio"); } //E-mail sempre em letras minsculas cliente.Email = cliente.Email.ToLower(); //Se tudo est Ok, chama a rotina de insero. ClientesDAL obj = new ClientesDAL(); obj.Incluir(cliente); } public void Alterar(ClienteInformation cliente) { ClientesDAL obj = new ClientesDAL(); obj.Alterar(cliente); } public void Excluir(int codigo) { if (codigo < 1) { throw new Exception("Selecione um cliente antes de exclu-lo."); } ClientesDAL obj = new ClientesDAL(); obj.Excluir(codigo); } public DataTable Listagem() { ClientesDAL obj = new ClientesDAL(); return obj.Listagem(); } }}

- D um Build no projeto BLL para confirmar a inexistncia de erros na codificao:

Agora vamos criar a classe ProdutosBLL.cs.

- Adicione uma nova classe ao projeto BLL nomeando-a como ProdutosBLL.cs:

Copie e cole o seguinte cdigo para a classe ProdutosBLL.cs:using System;using System.Data;using System.Collections.Generic;using System.Text;using System.Collections;using Loja.Modelos;using Loja.DAL;namespace Loja.BLL{ public class ProdutosBLL { public ArrayList ProdutosEmFalta() { ProdutosDAL obj = new ProdutosDAL(); return obj.ProdutosEmFalta(); } public void Incluir(ProdutoInformation produto) { // Nome do produto obrigatrio if (produto.Nome.Trim().Length == 0) { throw new Exception("O nome do produto obrigatrio."); } // O preo do produto no pode ser negativo if (produto.Preco < 0) { throw new Exception("Preo do produto no pode ser negativo."); } // O estoque do produto no pode ser negativo if (produto.Estoque < 0) { throw new Exception("Estoque do produto no pode ser negativo."); } //Se tudo estiver ok, chama a rotina de gravao ProdutosDAL obj = new ProdutosDAL(); obj.Incluir(produto); } public void Alterar(ProdutoInformation produto) { ProdutosDAL obj = new ProdutosDAL(); obj.Alterar(produto); } public void Excluir(int codigo) { ProdutosDAL obj = new ProdutosDAL(); obj.Excluir(codigo); } public DataTable Listagem() { ProdutosDAL obj = new ProdutosDAL(); return obj.Listagem(); } }}

- D um Build no projeto BLL para confirmar a inexistncia de erros na codificao:

Agora vamos implementar a classe VendasBLL.cs.

- Adicione uma nova classe ao projeto BLL nomeando-a como VendasBLL.cs:

Copie e cole o seguinte cdigo para a classe VendasBLL.cs:using System;using System.Collections.Generic;using System.Text;using System.Data;using Loja.DAL;using Loja.Modelos;namespace Loja.BLL{ public class VendasBLL { //Este um campo privado para armazenar uma instncia da classe DAL. private VendasDAL objDAL; //Esse o construtor da classe VendasBLL public VendasBLL() { objDAL = new VendasDAL(); } public DataTable ListaDeProdutos { get { return objDAL.ListaDeProdutos; } } public DataTable ListaDeClientes { get { return objDAL.ListaDeClientes; } } public void Incluir(VendaInformation venda) { objDAL.Incluir(venda); } }}- D um Build no projeto BLL para confirmar a inexistncia de erros na codificao:

Parabns! Finalizamos a implementao da camada BLL Regras de negcio.

Se voc abrir o projeto BLL no Windows Explorer, poder verificar que na pasta de DLLs do projeto existem trs arquivos com a extenso DLL. Um do prprio projeto BLL e outros para as referncias que fizemos aos projetos Modelos e DAL.

Compare isso com o nosso modelo em camadas a seguir: [Modelos] DAL , BLL e User Interface Vemos que a prxima camada a ser implementada a interface com o usurio. No prximo artigo vamos construir um aplicativo para Microsoft Windows (tambm chamado de Desktop application) que vai utilizar todas as camadas j desenvolvidas.

6 Criando a interface com o usurio Formulrio de ClientesNeste artigo vamos iniciar a implementao da camada de interface do usurio construindo um aplicativo para Microsoft Windows. Vamos criar o Formulrio de Clientes utilizando todas as camadas j desenvolvidas nos artigos anteriores. [Modelos] DAL BLL User Interface- Abra o Microsoft Visual Studio;- Clique em File > Open > Project/Solution...- Na janela Open Project, selecione o arquivo da nossa Solution (C:\Loja\Modelos\Loja.sln) e clique em Open para abrir a soluo.Neste momento temos implementados os projetos Modelos, DAL e BLL:

Vamos adicionar um projeto de user interface para Windows chamado UIWindows.- Clique com o boto direito na Solution Loja e escolha Add > New Project...

- Na janela Add New Project vamos informar os seguintes dados: Project type: Visual C# Template: Windows Application Name: UIWindows Location: C:\LojaUIWindows- Clique em Ok para adicionar o projeto.

O aplicativo para Windows UIWindows ser criado:

A primeira coisa a ser feita adicionar os projetos que usaremos como referncia.Olhando para o nosso modelo de camadas abaixo:[Modelos] DAL BLL User InterfaceVerificamos que preciso adicionar referncia aos projetos Modelos, DAL e BLL. Vamos fazer isso agora.- Clique com o boto direito na pasta References do projeto BLL e escolha Add Reference...- Na janela Add Reference, clique na aba Projects;- Mantenha a tecla pressionada e clique sobre os projetos DAL, Modelos e BLL para selecionlos;- Clique em Ok para adicionar as referncias.

Podemos verificar as referncias que acabamos de adicionar ao projeto UIWindows:

No nosso formulrio principal, vamos criar um menu para que o usurio possa acessar os demais formulrios da aplicao.Vamos exibir a Toolbox (caixa de ferramentas) que contm o menu que precisaremos incluir.

Para exibir a Toolbox voc pode:1) Utilizar a combinao de teclas + + X ou2) Utilizar o menu View > Toolbox- Na Toolbox, abra o item Menus & Toolbars;- Para criar o nosso menu, arraste o componente MenuStrip para o formulrio Form1.

Ao soltar o MenuStrip dentro do formulrio Form1, um menu vazio foi criado.

- Clique na rea com a indicao Type here e digite Menu;

Veja que reas se abrem ao lado e abaixo no caso de querermos incluir mais itens no menu:

- Insira os itens de menu Clientes, Produtos, Vendas, Produtos em Falta e Sair como na figura abaixo:Dica: Use o hfen ( ) para criar os traos de diviso que voc est vendo na figura.

- D um duplo clique com o boto esquerdo do mouse sobre o item Sair do Menu para codificarmos o que deve acontecer quando o usurio selecionar essa opo.- Dentro do mtodo do item de menu Sair que se abrir, insira o seguinte cdigo:Application.Exit();Dessa forma, sempre que o usurio clicar na opo Sair a aplicao ser encerrada.- Acrescente tambm o nome do projeto Loja no namespace como a seguir:

- Agora vamos para o modo de Design para visualizar o formulrio novamente. Para ir para o modo de design utilize a aba [Design] do Form1 ou o boto View Design do Solution Explorer como indicado a seguir:

No modo de Design, o componente de Menu que est selecionado. Por esse motivo, na janela de propriedades (Properties) no canto inferior direito do MS Visual Studio, so as propriedades do objeto de Menu que esto sendo exibidas.Agora ns queremos alterar uma propriedade do objeto Form1. Para selecion-lo e fazer com que as propriedades do formulrio Form1 sejam exibidas na janela de propriedades, clique na barra de ttulos ou em qualquer rea do formulrio Form1 fora do objeto Menu conforme destacado abaixo:- Clique em uma rea do formulrio Form1 para alterarmos uma de suas propriedades.Dica: Se a janela de propriedades no estiver visvel, pressione para exib-la.

- Na janela de propriedades do Form1, altere a propriedade IsMdiContainer para True;

Isso significa que este formulrio ser o Menu Principal da nossa aplicao. Essa alterao indica que todos os formulrios chamados pelo Form1 sero abertos dentro dele, e no em uma nova janela.Assim, se fecharmos o formulrio to Menu Principal todos os formulrios que estiverem abertos dentro da aplicao (exemplo: formulrio de clientes, formulrio de produtos) tambm sero fechados.

Agora vamos alterar o nome da nossa aplicao de Form1 para Loja .Net- Na janela de propriedades do Form1, altere a propriedade Text para Loja .Net.

Isso altera automaticamente o nome do formulario exibido na barra de ttulos.

Para testarmos tudo o que j desenvolvemos at agora vamos criar 4 formulrios. So eles: Clientes; Produtos; Vendas; Produtos em Falta.

6.1) Criando o formulrio de Clientes- Clique com o boto direito sobre o projeto UIWindows e escolha Add > Windows Form...

- Na janela Add New Item, selecione o template Windows Form e nomeie o novo formulrio como ClientesForm.cs- Clique em Add para adicionar o formulrio.

(- Certifique-se de que o namespace esteja como Loja.UIWindows tanto em ClientesForm.cs quanto em ClientesForm.Designer.cs; Colocar using Loja.BLL; no codebehind ClientesForm.cs)

- Na janela de propriedades do formulrio ClientesForm, defina as propriedades como abaixo:Size: 448; 512- A partir do menu Common Controls da Toolbox, arraste quatro objetos do tipo Label para o formulrio ClientesForm.- Defina as propriedades dos 4 labels como a seguir:Name: codigoLabel

Location: 16;32

Text: Cdigo:

Name: nomeLabel

Location: 16;64

Text: Nome:

Name: emailLabel

Location: 16;96

Text: E-mail:

Name: telefoneLabel

Location: 16;128

Text: Telefone:

Neste momento, nosso formulrio de clientes estar com esta aparncia:

- A partir do menu Common Controls da Toolbox, arraste quatro objetos do tipo TextBox para o formulrio ClientesForm.- Defina as propriedades dos 4 TextBox como a seguir:Name: codigoTextBox

Enable: False

Location: 110;29

ReadOnly: True

Size: 70;20

Name: nomeTextBox

Location: 110;61

Size: 200;20

Name: emailTextBox

Location: 110;93

Size: 200;20

Name: telefoneTextBox

Location: 110;125

Size: 200;20

Nosso formulrio de clientes agora est com essa aparncia:

- A partir do menu Common Controls da Toolbox, arraste cinco objetos do tipo Button para o formulrio ClientesForm.- Defina as propriedades dos 5 Button como a seguir:Name: limparButton

Location: 110;159

Size: 75;23

Text: Limpar

Name: incluirButton

Location: 191;159

Size: 75;23

Text: Incluir

Name: alterarButton

Location: 272;159

Size: 75;23

Text: Alterar

Name: excluirButton

Location: 353;159

Size: 75;23

Text: Excluir

Name: lerButton

Anchor: Bottom, Right

Location: 353; 447

Size: 75;23

Text: Ler

- A partir do menu Data da Toolbox, arraste um objeto do tipo DataGridView para o formulrio ClientesForm.- Defina as propriedades do DataGridView como a seguir:Name: clientesDataGridView

Anchor: Top, Bottom, Left, Right

Location: 24; 208

Size: 408; 233

Agora nosso formulrio de clientes est assim:

Muito bem! O design, ou seja, a parte grfica do nosso formulrio de clientes est finalizada. Agora precisamos programar as aes que desejamos que acontea quando o usurio abrir esse formulrio e interagir clicando nos botes. Vamos l?!- Para ver o cdigo-fonte (tambm chamado de code behind) clique com o boto direito sobre o formulrio ClientesForm no Solution Explorer e escolha a opo View Code.Aps o mtodo ClientesForm_Load() vamos criar o mtodo AtualizaGrid(). No AtualizaGrid faremos a comunicao com a camada de regras de negcio (BLL) para que possamos preencher os valores dos objetos Textbox.

Dentro do mtodo ClientesForm_Load(), que chamado toda vez que o formulrio de clientes carregado em memria, vamos fazer uma chamada para o mtodo AtualizaGrid() e tambm posicionaremos o cursor no primeiro campo do formulrio.- Copie e cole o trecho de cdigo para o code behind do formulrio ClientesForm:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;namespace Loja.UIWindows{ public partial class ClientesForm : Form { public ClientesForm() { InitializeComponent(); } public void AtualizaGrid() { // Comunicao com a Camada BLL ClientesBLL obj = new ClientesBLL(); clientesDataGridView.DataSource = obj.Listagem(); // Atualizando os objetos TextBox codigoTextBox.Text = clientesDataGridView[0, clientesDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = clientesDataGridView[1, clientesDataGridView.CurrentRow.Index].Value.ToString(); emailTextBox.Text = clientesDataGridView[2, clientesDataGridView.CurrentRow.Index].Value.ToString(); telefoneTextBox.Text = clientesDataGridView[3, clientesDataGridView.CurrentRow.Index].Value.ToString(); } private void ClientesForm_Load(object sender, EventArgs e) { AtualizaGrid(); nomeTextBox.Focus(); } }}

Para testarmos se essa exibio inicial dos dados dos clientes est funcionando, precisamos criar uma chamada para este formulrio a partir do menu principal.- Abra o Form1 em modo de design e clique sobre o Menu para que possamos ver as opes existentes:

- D um duplo clique sobre a opo Clientes para codificarmos a chamada para o formulrio correspondente.- O MS Visual Studio abrir o cdigo do formulrio com o cursor dentro do mtodo que ser executado quando o usurio clicar no item Clientes do Menu. Dentro deste mtodo (chamado clientesToolStripMenuItem_Click) digite o seguinte cdigo:ClientesForm obj = new ClientesForm();obj.MdiParent = this;obj.Show();A listagem completa do nosso code behind Form1.cs ficou assim:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Loja.UIWindows{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void sairToolStripMenuItem_Click_1(object sender, EventArgs e) { Application.Exit(); } private void clientesToolStripMenuItem_Click(object sender, EventArgs e) { ClientesForm obj = new ClientesForm(); obj.MdiParent = this; obj.Show(); } }}- D um Start Debugging clicando na seta verde da barra de botes conforme indicado abaixo. Essa opo compila o projeto e, se tudo estiver certo, j executa a nossa aplicao exibindo o menu principal.


Observaes: Se a aplicao no abrir, clique com o boto direito sobre o projeto UIWindows e selecione a opo Set as StartUp Project. Com isso estamos indicando que, na nossa soluo, o projeto UIWindows ser o primeiro a ser executado.

- Na aplicao Loja .Net em execuo, escolha Menu > Clientes:

Podemos ver que a carga inicial de dados funcionou conforme o esperado.Agora vamos codificar as funcionalidades dos botes do formulrio de clientes.- D um duplo clique no boto Limpar para codificarmos o evento click;- Dentro do evento clique do boto Limpar, copie e cole o cdigo abaixo: codigoTextBox.Text = ""; nomeTextBox.Text = ""; emailTextBox.Text = ""; telefoneTextBox.Text = "";

- D um duplo clique no boto Incluir para codificarmos o evento click;- Dentro do evento clique do boto Incluir, copie e cole o cdigo abaixo: try { ClienteInformation cliente = new ClienteInformation(); cliente.Nome = nomeTextBox.Text; cliente.Email = emailTextBox.Text; cliente.Telefone = telefoneTextBox.Text; ClientesBLL obj = new ClientesBLL(); obj.Incluir(cliente); MessageBox.Show("O cliente foi includo com sucesso!"); codigoTextBox.Text = Convert.ToString(cliente.Codigo); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); }- D um duplo clique no boto Alterar para codificarmos o evento click;- Dentro do evento clique do boto Alterar, copie e cole o cdigo abaixo: if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um cliente deve ser selecionado para alterao."); } else try { ClienteInformation cliente = new ClienteInformation(); cliente.Codigo = int.Parse(codigoTextBox.Text); cliente.Nome = nomeTextBox.Text; cliente.Email = emailTextBox.Text; cliente.Telefone = telefoneTextBox.Text; ClientesBLL obj = new ClientesBLL(); obj.Alterar(cliente); MessageBox.Show("O cliente foi alterado com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); }

- D um duplo clique no boto Excluir para codificarmos o evento click;- Dentro do evento clique do boto Excluir, copie e cole o cdigo abaixo: if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um cliente deve ser selecionado antes da excluso."); } else try { int codigo = Convert.ToInt32(codigoTextBox.Text); ClientesBLL obj = new ClientesBLL(); obj.Excluir(codigo); MessageBox.Show("O cliente foi excludo com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show(ex.Message); }- D um duplo clique no boto Ler para codificarmos o evento click;- Dentro do evento clique do boto Ler, copie e cole o cdigo abaixo: AtualizaGrid();

- Clique sobre o dataGridView;- Na janela de propriedades, clique no cone que tem um relmpago ( ) para exibir a lista de eventos;- D um duplo clique no evento CellClick para inserirmos o cdigo para esse evento:

- Dentro do evento CellClick, copie e cole o cdigo abaixo: // Atualizando os objetos TextBox codigoTextBox.Text = clientesDataGridView[0, clientesDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = clientesDataGridView[1, clientesDataGridView.CurrentRow.Index].Value.ToString(); emailTextBox.Text = clientesDataGridView[2, clientesDataGridView.CurrentRow.Index].Value.ToString(); telefoneTextBox.Text = clientesDataGridView[3, clientesDataGridView.CurrentRow.Index].Value.ToString();- O code behind completo do nosso ClientesForm.cs ficou assim:/** File...: ClientesForm.cs* Author.: Carlos Camacho - www.camachojunior.com.br* Content: Formulrio de Clientes* Subject: Guia prtico para o desenvolvimento de Aplicaes C# em Camadas*/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;using Loja.DAL;using Loja.Modelos;namespace Loja.UIWindows{ public partial class ClientesForm : Form { public ClientesForm() { InitializeComponent(); } public void AtualizaGrid() { // Comunicao com a Camada BLL ClientesBLL obj = new ClientesBLL(); clientesDataGridView.DataSource = obj.Listagem(); // Atualizando os objetos TextBox codigoTextBox.Text = clientesDataGridView[0, clientesDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = clientesDataGridView[1, clientesDataGridView.CurrentRow.Index].Value.ToString(); emailTextBox.Text = clientesDataGridView[2, clientesDataGridView.CurrentRow.Index].Value.ToString(); telefoneTextBox.Text = clientesDataGridView[3, clientesDataGridView.CurrentRow.Index].Value.ToString(); } private void ClientesForm_Load(object sender, EventArgs e) { AtualizaGrid(); nomeTextBox.Focus(); } private void limparButton_Click(object sender, EventArgs e) { codigoTextBox.Text = ""; nomeTextBox.Text = ""; emailTextBox.Text = ""; telefoneTextBox.Text = ""; } private void incluirButton_Click(object sender, EventArgs e) { try { ClienteInformation cliente = new ClienteInformation(); cliente.Nome = nomeTextBox.Text; cliente.Email = emailTextBox.Text; cliente.Telefone = telefoneTextBox.Text; ClientesBLL obj = new ClientesBLL(); obj.Incluir(cliente); MessageBox.Show("O cliente foi includo com sucesso!"); codigoTextBox.Text = Convert.ToString(cliente.Codigo); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } } private void alterarButton_Click(object sender, EventArgs e) { if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um cliente deve ser selecionado para alterao."); } else try { ClienteInformation cliente = new ClienteInformation(); cliente.Codigo = int.Parse(codigoTextBox.Text); cliente.Nome = nomeTextBox.Text; cliente.Email = emailTextBox.Text; cliente.Telefone = telefoneTextBox.Text; ClientesBLL obj = new ClientesBLL(); obj.Alterar(cliente); MessageBox.Show("O cliente foi alterado com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } } private void excluirButton_Click(object sender, EventArgs e) { if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um cliente deve ser selecionado antes da excluso."); } else try { int codigo = Convert.ToInt32(codigoTextBox.Text); ClientesBLL obj = new ClientesBLL(); obj.Excluir(codigo); MessageBox.Show("O cliente foi excludo com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void lerButton_Click(object sender, EventArgs e) { AtualizaGrid(); } private void clientesDataGridView_CellClick(object sender, DataGridViewCellEventArgs e) { // Atualizando os objetos TextBox codigoTextBox.Text = clientesDataGridView[0, clientesDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = clientesDataGridView[1, clientesDataGridView.CurrentRow.Index].Value.ToString(); emailTextBox.Text = clientesDataGridView[2, clientesDataGridView.CurrentRow.Index].Value.ToString(); telefoneTextBox.Text = clientesDataGridView[3, clientesDataGridView.CurrentRow.Index].Value.ToString(); } }}Parabns! Voc acabou de implementar o Formulrio de Clientes do nosso projeto Loja .Net. Agora s executar o projeto, acessar o Formulrio de Clientes e testar todas as funcionalidades que voc implementou.No prximo artigo vamos implementar o Formulrio de Produtos.
7 User Interface Formulrio de ProdutosNeste artigo vamos criar o Formulrio de Produtos do nosso projeto.- Abra o Microsoft Visual Studio;- Clique em File > Open > Project/Solution...- Na janela Open Project, selecione o arquivo da nossa Solution (C:\Loja\Modelos\Loja.sln) e clique em Open para abrir a soluo.Vamos adicionar um formulrio chamado ProdutosForm.cs.- Clique com o boto direito no projeto UIWindows e escolha Add > Windows Form...

- Na janela Add New Item vamos informar os seguintes dados: Template: Windows Form Name: ProdutosForm

- Clique em Add para adicionar o formulrio.

Ser exibido o formulrio ProdutosForm:

- Altere a propriedade Size para 448; 512Como as interfaces so semelhantes, vamos copiar os objetos do formulrio de clientes para o formulrio de produtos.

- Abra o formulrio ClientesForm no modo de design e digite + para selecionar todos os objetos;

- Digite + para copiar os objetos para a rea de transferncia;

- Abra o formulrio ProdutosForm em modo de design e digite + para colar os objetos.

- No objeto emailLabel altere os valores das seguintes propriedades: Name: precoLabel

Text: Preo:

- No objeto emailTextBox altere a propriedade Name para precoTextBox- No objeto telefoneLabel altere os valores das seguintes propriedades:Name: estoqueTextBox

Text: Estoque:

- No objeto telefoneTextBox altere a propriedade Name para estoqueTextBox- No objeto clientesDataGridView altere a propriedade Name para produtosDataGridView

Neste momento, nosso formulrio de produtos estar com esta aparncia:

Aqui tambm vamos criar o mtodo AtualizaGrid() para fazer a comunicao com a camada de regras de negcio com o objetivo de preencher o objeto DataGridView com a lista de produtos existentes.Dentro do mtodo ProdutosForm_Load() vamos fazer uma chamada para o mtodo AtualizaGrid() e tambm posicionaremos o cursor no primeiro campo do formulrio.- Copie e cole o trecho de cdigo para o code behind do formulrio ProdutosForm:/** File...: ProdutosForm.cs* Author.: Carlos Camacho - www.camachojunior.com.br* Content: Formulrio de Produtos* Subject: Guia prtico para o desenvolvimento de Aplicaes C# em Camadas*/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;using Loja.DAL;using Loja.Modelos;namespace Loja.UIWindows{ public partial class ProdutosForm : Form { public ProdutosForm() { InitializeComponent(); } public void AtualizaGrid() { // Comunicao com a Camada BLL ProdutosBLL obj = new ProdutosBLL(); produtosDataGridView.DataSource = obj.Listagem(); // Atualizando os objetos TextBox codigoTextBox.Text = produtosDataGridView[0, produtosDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = produtosDataGridView[1, produtosDataGridView.CurrentRow.Index].Value.ToString(); precoTextBox.Text = produtosDataGridView[2, produtosDataGridView.CurrentRow.Index].Value.ToString(); estoqueTextBox.Text = produtosDataGridView[3, produtosDataGridView.CurrentRow.Index].Value.ToString(); } private void ProdutosForm_Load(object sender, EventArgs e) { AtualizaGrid(); nomeTextBox.Focus(); } }}Agora vamos codificar as funcionalidades dos botes do formulrio de produtos.- D um duplo clique no boto Limpar para codificarmos o evento click;- Copie e cole o cdigo abaixo: codigoTextBox.Text = ""; nomeTextBox.Text = ""; precoTextBox.Text = ""; estoqueTextBox.Text = "";- D um duplo clique no boto Incluir para codificarmos o evento click;- Copie e cole o cdigo abaixo: try { ProdutoInformation produto = new ProdutoInformation(); produto.Nome = nomeTextBox.Text; produto.Preco = Convert.ToDecimal(precoTextBox.Text); produto.Estoque = Convert.ToInt32(estoqueTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Incluir(produto); MessageBox.Show("O produto foi includo com sucesso!"); codigoTextBox.Text = Convert.ToString(produto.Codigo); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } AtualizaGrid();- D um duplo clique no boto Alterar para codificarmos o evento click;- Copie e cole o cdigo abaixo: if (codigoTextBox.Text == "") { MessageBox.Show("Um produto precisa ser selecionado para alterao."); } else try { ProdutoInformation produto = new ProdutoInformation(); produto.Codigo = int.Parse(codigoTextBox.Text); produto.Nome = nomeTextBox.Text; produto.Preco = Convert.ToDecimal(precoTextBox.Text); produto.Estoque = Convert.ToInt32(estoqueTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Alterar(produto); MessageBox.Show("O produto foi atualizado com sucesso!"); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } AtualizaGrid();- D um duplo clique no boto Excluir para codificarmos o evento click;- Copie e cole o cdigo abaixo: if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um produto deve ser selecionado antes da excluso."); } else try { int codigo = Convert.ToInt32(codigoTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Excluir(codigo); MessageBox.Show("O produto foi excludo com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show(ex.Message); } AtualizaGrid();- D um duplo clique no boto Ler para codificarmos o evento click;- Copie e cole o cdigo abaixo: AtualizaGrid();- Clique sobre o dataGridView;- Na janela de propriedades, clique no cone que tem um relmpago para exibir a lista de eventos;- D um duplo clique no evento CellClick para inserirmos o cdigo para esse evento:- Dentro do evento CellClick, copie e cole o cdigo abaixo: // Atualizando os objetos TextBox codigoTextBox.Text = produtosDataGridView[0, produtosDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = produtosDataGridView[1, produtosDataGridView.CurrentRow.Index].Value.ToString(); precoTextBox.Text = produtosDataGridView[2, produtosDataGridView.CurrentRow.Index].Value.ToString(); estoqueTextBox.Text = produtosDataGridView[3, produtosDataGridView.CurrentRow.Index].Value.ToString();- O code behind completo do nosso ProdutosForm.cs ficou assim:/** File...: ProdutosForm.cs* Author.: Carlos Camacho - www.camachojunior.com.br* Content: Formulrio de Produtos* Subject: Guia prtico para o desenvolvimento de Aplicaes C# em Camadas*/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;using Loja.DAL;using Loja.Modelos;namespace Loja.UIWindows{ public partial class ProdutosForm : Form { public ProdutosForm() { InitializeComponent(); } public void AtualizaGrid() { // Comunicao com a Camada BLL ProdutosBLL obj = new ProdutosBLL(); produtosDataGridView.DataSource = obj.Listagem(); // Atualizando os objetos TextBox codigoTextBox.Text = produtosDataGridView[0, produtosDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = produtosDataGridView[1, produtosDataGridView.CurrentRow.Index].Value.ToString(); precoTextBox.Text = produtosDataGridView[2, produtosDataGridView.CurrentRow.Index].Value.ToString(); estoqueTextBox.Text = produtosDataGridView[3, produtosDataGridView.CurrentRow.Index].Value.ToString(); } private void ProdutosForm_Load(object sender, EventArgs e) { AtualizaGrid(); nomeTextBox.Focus(); } private void limparButton_Click(object sender, EventArgs e) { codigoTextBox.Text = ""; nomeTextBox.Text = ""; precoTextBox.Text = ""; estoqueTextBox.Text = ""; } private void incluirButton_Click(object sender, EventArgs e) { try { ProdutoInformation produto = new ProdutoInformation(); produto.Nome = nomeTextBox.Text; produto.Preco = Convert.ToDecimal(precoTextBox.Text); produto.Estoque = Convert.ToInt32(estoqueTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Incluir(produto); MessageBox.Show("O produto foi includo com sucesso!"); codigoTextBox.Text = Convert.ToString(produto.Codigo); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } AtualizaGrid(); } private void alterarButton_Click(object sender, EventArgs e) { if (codigoTextBox.Text == "") { MessageBox.Show("Um produto precisa ser selecionado para alterao."); } else try { ProdutoInformation produto = new ProdutoInformation(); produto.Codigo = int.Parse(codigoTextBox.Text); produto.Nome = nomeTextBox.Text; produto.Preco = Convert.ToDecimal(precoTextBox.Text); produto.Estoque = Convert.ToInt32(estoqueTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Alterar(produto); MessageBox.Show("O produto foi atualizado com sucesso!"); } catch (Exception ex) { MessageBox.Show("Erro: " + ex.Message); } AtualizaGrid(); } private void excluirButton_Click(object sender, EventArgs e) { if (codigoTextBox.Text.Length == 0) { MessageBox.Show("Um produto deve ser selecionado antes da excluso."); } else try { int codigo = Convert.ToInt32(codigoTextBox.Text); ProdutosBLL obj = new ProdutosBLL(); obj.Excluir(codigo); MessageBox.Show("O produto foi excludo com sucesso!"); AtualizaGrid(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void lerButton_Click(object sender, EventArgs e) { AtualizaGrid(); } private void produtosDataGridView_CellClick(object sender, DataGridViewCellEventArgs e) { // Atualizando os objetos TextBox codigoTextBox.Text = produtosDataGridView[0, produtosDataGridView.CurrentRow.Index].Value.ToString(); nomeTextBox.Text = produtosDataGridView[1, produtosDataGridView.CurrentRow.Index].Value.ToString(); precoTextBox.Text = produtosDataGridView[2, produtosDataGridView.CurrentRow.Index].Value.ToString(); estoqueTextBox.Text = produtosDataGridView[3, produtosDataGridView.CurrentRow.Index].Value.ToString(); } }}- Abra o formulrio principal Form1 no modo de design e d um duplo clique na opo produtos do menu para codificarmos a chamada para este formulrio com o cdigo abaixo: ProdutosForm obj = new ProdutosForm(); obj.MdiParent = this; obj.Show();Acabamos de implementar o Formulrio de Produtos do nosso projeto Loja .Net.Execute o projeto e teste as funcionalidades que implementamos neste artigo.No prximo artigo vamos implementar o formulrio de Vendas.

8 User Interface Formulrio de VendasNeste artigo vamos criar o Formulrio de Vendas do nosso projeto.- Abra o Microsoft Visual Studio;- Clique em File > Open > Project/Solution...- Na janela Open Project, selecione o arquivo da nossa Solution (C:\Loja\Modelos\Loja.sln) e clique em Open para abrir a soluo.Vamos adicionar um formulrio chamado VendasForm.cs.- Clique com o boto direito no projeto UIWindows e escolha Add > Windows Form...

- Na janela Add New Item vamos informar os seguintes dados: Template: Windows Form Name: VendasForm

- Clique em Add para adicionar o formulrio.

Ser exibido o formulrio VendasForm:

- Altere a propriedade Size para 470; 200Vamos criar 7 objetos neste formulrio. Estes objetos podem ser arrastados para o formulrio a partir da Common Controls da Toolbox.- Arraste e solte 3 objetos do tipo Label para o nosso formulrio de vendas e configure-os com as seguintes caractersticas:Name: clienteLabel

Text: Cliente:

Location: 35; 37

Name: produtoLabel

Text: Produto:

Location: 35; 64

Name: quantidadeLabel

Text: Quantidade:

Location: 35; 95

- Arraste e solte 2 objetos do tipo combobox para o nosso formulrio de vendas e defina as seguintes propriedades:Name: clienteComboBox

DisplayMember: Nome

DropDownStyle: DropDownList

DropDownWidth: 300

Location: 106; 34

Size: 300; 21

ValueMember: Codigo

Name: produtoComboBox

DisplayMember: Nome

DropDownStyle: DropDownList

DropDownWidth: 300

Location: 106; 64

Size: 300; 21

ValueMember: Codigo

- Arraste e solte um objeto do tipo TextBox e defina as seguintes propriedades:Name: quantidadeTextBox

Location: 106; 95

Size: 66; 20

Text: 1

- Arraste e solte um objeto do tipo Button e defina as seguintes propriedades:Name: incluirVendaButton

Location: 106; 128

Size: 171; 23

Text: Realizar a Venda

Neste momento, nosso formulrio de vendas estar com esta aparncia:

Vamos carregar dados nos dois objetos combobox sempre que o formulrio de vendas for carregado. - D um duplo clique em uma rea livre do formulrio para exibir o mtodo VendasForm_Load(). - Copie e cole o cdigo abaixo: VendasBLL obj = new VendasBLL(); clienteComboBox.DataSource = obj.ListaDeClientes; produtoComboBox = obj.ListaDeProdutos;Observao: Devemos usar using Loja.BLL;using Loja.DAL;using Loja.Modelos;no incio do code behind do VendasForm.cs - No modo de design do VendasForm, d um duplo clique no boto Realizar a Venda;- Copie e cole o cdigo abaixo: try { VendaInformation venda = new VendaInformation(); venda.Quantidade = int.Parse(quantidadeTextBox.Text); venda.CodigoCliente = (int)clienteComboBox.SelectedValue; venda.CodigoProduto = (int)produtoComboBox.SelectedValue; venda.Data = DateTime.Now; venda.Faturado = false; VendasBLL obj = new VendasBLL(); obj.Incluir(venda); MessageBox.Show("A venda foi realizada com sucesso!"); } catch (Exception ex) { MessageBox.Show(ex.Message); }O code behind completo do nosso VendasForm.cs ficou assim:/** File...: VendasForm.cs* Author.: Carlos Camacho - www.camachojunior.com.br* Content: Formulrio de Vendas* Subject: Guia prtico para o desenvolvimento de Aplicaes C# em Camadas*/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;using Loja.DAL;using Loja.Modelos;namespace Loja.UIWindows{ public partial class VendasForm : Form { public VendasForm() { InitializeComponent(); } private void VendasForm_Load(object sender, EventArgs e) { VendasBLL obj = new VendasBLL(); clienteComboBox.DataSource = obj.ListaDeClientes; produtoComboBox.DataSource = obj.ListaDeProdutos; } private void incluirVendaButton_Click(object sender, EventArgs e) { try { VendaInformation venda = new VendaInformation(); venda.Quantidade = int.Parse(quantidadeTextBox.Text); venda.CodigoCliente = (int)clienteComboBox.SelectedValue; venda.CodigoProduto = (int)produtoComboBox.SelectedValue; venda.Data = DateTime.Now; venda.Faturado = false; VendasBLL obj = new VendasBLL(); obj.Incluir(venda); MessageBox.Show("A venda foi realizada com sucesso!"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }}- Abra o formulrio principal Form1 no modo de design e d um duplo clique na opo Vendas do menu para codificarmos a chamada para este formulrio com o cdigo abaixo: VendasForm obj = new VendasForm(); obj.MdiParent = this; obj.Show(); Acabamos de implementar o Formulrio de Vendas do nosso projeto Loja .Net.Execute o projeto e teste as funcionalidades que implementamos neste artigo.Perceba que a quantidade de produtos adquirida por um cliente na venda dever se refletir automaticamente na quantidade de produtos em estoque. Aps realizar uma venda, abra o formulrio de produtos e veja que o estoque foi devidamente atualizado.No prximo e ltimo artigo desta srie vamos implementar o formulrio de Produtos em Falta.
9 User Interface Formulrio de Produtos em Falta (FINAL)Este o ltimo artigo da srie Guia Prtico para o desenvolvimento de Aplicaes C# em Camadas. Nele vamos criar o Formulrio de Produtos em Falta.- Abra o Microsoft Visual Studio;- Clique em File > Open > Project/Solution...- Na janela Open Project, selecione o arquivo da nossa Solution (C:\Loja\Modelos\Loja.sln) e clique em Open para abrir a soluo.Vamos adicionar um formulrio chamado ProdutosEmFaltaForm.cs.- Clique com o boto direito no projeto UIWindows e escolha Add > Windows Form...

- Na janela Add New Item vamos informar os seguintes dados:Template: Windows FormName: ProdutosEmFaltaForm

- Clique em Add para adicionar o formulrio.

Ser exibido o formulrio ProdutosemFaltaForm:

- Altere a propriedade Size para 510; 310Vamos criar 1 label e 1 DataGridView. - Arraste e solte 1 Label para o nosso formulrio de produtos em falta e configure-o com as seguintes caractersticas:Name: produtosEmFaltaLabel

Location: 9; 21

Text: Relatrio de Produtos em Falta:

- Arraste e solte um objeto do tipo DataGridView e defina as seguintes propriedades:Name: produtosEmFaltaDataGridView

Anchor: Top, Bottom, Left, Right

Location: 12; 58

Size: 474; 206

Neste momento, nosso formulrio de produtos em falta estar com esta aparncia:

Vamos carregar a relao de produtos em falta sempre que o formulrio for carregado. - D um duplo clique em uma rea livre do formulrio para exibir o mtodo ProdutosEmFaltaForm_Load(). - Copie e cole o cdigo abaixo:ProdutosBLL produto = new ProdutosBLL();produtosEmFaltaDataGridView.DataSource = produto.ProdutosEmFalta();No se esquea de usar using Loja.BLL;using Loja.DAL;using Loja.Modelos;no incio do code behind do ProdutosEmFaltaForm.cs

O code behind completo do nosso ProdutosEmFaltaForm.cs ficou assim:/** File...: ProdutosEmFaltaForm.cs* Author.: Carlos Camacho - www.camachojunior.com.br* Content: Formulrio de Vendas* Subject: Guia prtico para o desenvolvimento de Aplicaes C# em Camadas*/using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Loja.BLL;using Loja.DAL;using Loja.Modelos;namespace Loja.UIWindows{public partial class ProdutosEmFaltaForm : Form{public ProdutosEmFaltaForm(){InitializeComponent();}private void ProdutosEmFaltaForm_Load(object sender, EventArgs e){ProdutosBLL produto = new ProdutosBLL();produtosEmFaltaDataGridView.DataSource = produto.ProdutosEmFalta();}}}- Compile o projeto para nos certificarmos de que tudo foi implementado corretamente.

Se ocorrer o erro no suitable method found to override como na imagem acima, corrija o namespace do cdigo colocando Loja. Antes do nome do projeto UIWindows.- Compile o projeto novamente para ter certeza de que tudo est ok.Agora vamos fazer a chamada para este formulrio a partir do menu principal do projeto Loja .Net.- Abra o formulrio principal Form1 no modo de design e d um duplo clique na opo Produtos em Falta do menu para codificarmos a chamada para este formulrio com o cdigo abaixo:ProdutosEmFaltaForm obj = new ProdutosEmFaltaForm();obj.MdiParent = this;obj.Show();Acabamos de implementar o Formulrio de Produtos em Falta do nosso projeto Loja .Net.Execute o projeto e teste as funcionalidades que implementamos neste artigo.Realize vendas at que um determinado produto fique com menos de 10 unidades em estoque. Esse produto dever aparecer no relatrio de produtos em falta.

Testando as Regras de NegcioNa camada BLL implementamos algumas regras de negcio. Tente incluir um cliente com o campo nome em branco e voc receber o alerta a seguir:

Aps clicar em OK, a incluso no permitida e voc estar de volta ao formulrio de incluso.Outra regra implcita que colocamos, ou seja, no est visvel ao usurio, que o campo e-mail armazenado em letras minsculas. Experimente incluir um cliente escrevendo o e-mail em letras maisculas e voc ver que a nossa camada BLL se encarregar de armazenar esse campo em letras minsculas.Se voc estiver com o cursor numa linha do DataGridView que no tenha registro e clicar no boto Excluir, receber o aviso:

Um alerta semelhante ser exibido ao clicar no boto Alterar, pois definimos como regra que um registro precisa estar selecionado para realizarmos estas operaes.Mesmo que uma informao seja fornecida, implementamos algumas especificaes que devem ser respeitadas no nosso projeto. Por exemplo, se tentarmos cadastrar um valor negativo no preo de um produto, receberemos o aviso:

Dessa forma, vemos que a nossa camada de regras de negcio vai alm da tarefa de manter a integridade dos dados, evitando o armazenamento de campos em branco. Ela tambm nos permite garantir que as regras especificadas para o projeto sejam respeitadas, como no exemplo da incluso do preo do produto que no pode ser um nmero negativo.Estrutura de ArquivosNa pasta C:\Loja\UIWindows\UIWindows\bin\Debug voc encontrar os arquivos: Modelos.dll DAL.dll BLL.dll UIWindows.exeOs arquivos Modelos.dll e DAL.dll referem-se a camada de Banco de dados;O arquivo BLL.dll refere-se a camada de regras de negcio;E o arquivo UIWindows.exe a interface com o usurio que roda no MS-Windows.Dicas:1) Se voc copiar somente esses 4 arquivos em qualquer pasta do microcomputador de um usurio, bastar ele executar o aplicativo UIWindows.exe para iniciar o sistema Loja.Net e utilizar todas as funcionalidades.2) Se voc precisar desenvolver uma interface para a Web, por exemplo, poder reutilizar as camadas de Banco de dados e de regras de negcio sem a necessidade de qualquer alterao.Vantagens do modelo de desenvolvimento em CamadasAgora imagine que voc o Gerente de Projeto do sistema Loja .Net e recebe o seguinte e-mail de um de seus clientes:

Prezado Sr.Como usurio do Sistema Loja .Net desenvolvido pela sua empresa, informo que precisamos que o Sr. nos envie uma atualizao para atender as nossas novas necessidades.Nossa empresa est em contnuo crescimento e em breve contrataremos uma empresa de Call Center que oferecer promoes especiais aos nossos clientes. Dessa forma, precisamos fazer com que no seja permitido o cadastramento de clientes sem o nmero de telefone, pois essa informao ser muito importante para o nosso sucesso.Por favor nos notifique assim que a nova verso do sistema estiver disponvel para testes.Atenciosamente,Carlos CamachoAnalista de SistemasBanco Nossa Caixa S.A.Departamento de Tecnologia da [email protected] Algumas 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 BLL.- Depois que voc realizar as atualizaes do Sistema, precisar disponibilizar os 4 arquivos que compem o sistema para o cliente?No, s voc enviar o arquivo referente a camada que foi atualizada. Neste caso, bastaria enviar o arquivo BLL.dll com instrues para que o cliente substitua o arquivo atual por este novo arquivo para realizar a atualizao do sistema.

ConclusesNesta 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, adquirindo conhecimentos sobre: Comunicao entre as camadas; Vantagens do modelo de desenvolvimento em camadas; Controle de transaes do banco de dados com o ADO .Net; Construo de uma aplicao para Windows.Implementou tambm as trs camadas: Camada de acesso dados ou Data Access Layer (DAL); Camada de regras de negcio ou Business Logic Layer (BLL); e Camada de interface do usurio ou User Interface (UI). Voc adquiriu habilidades na construo de aplicativos capazes de reaproveitar a camada de acesso dados e a camada de regras de negcio. Se por um acaso voc estiver trabalhando em um projeto complexo, com uma grande infra-estrutura de banco de dados e diversos formulrios, certamente se sentir seguro nas suas atribuies. Se voc for o responsvel pela manuteno do sistema, seja para a alterao ou criao de novos formulrios, ter confiana no seu trabalho pois entende como as camadas se relacionam e tem know-how no processo de criao dos objetos mais comuns de um formulrio.