csharp

128
Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 1 - Exemplo prático Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#. Cenário: Desenvolvimento de um Sistema de Controle de Apólices de Seguros. Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET. No último artigo será postado o código completo. Desenvolvendo uma aplicação Multicamadas para Windows em C# Parte 1) Camada de Dados. Introdução Os aplicativos multicamadas dividem a funcionalidade em várias camadas separadas por agrupamentos lógicos onde estão as suas funcionalidades. Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#. Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET. A Programação Orientada a Objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos. Neste exemplo, as camadas estarão dispostas no mesmo computador, mas os conceitos e funcionalidades aqui descrios poderão ser utilizadas de forma igual em ambientes distribuídos. Estrura em três camadas: A Figura 1 - Camadas da Aplicação apresenta a estrutura básica de um aplicativo exemplo que será desenvolvido em C# com a base de dados em SQL Server. 1

Upload: alan-le-senechal

Post on 05-Aug-2015

59 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Csharp

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 1 - Exemplo prático

Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#. Cenário: Desenvolvimento de um Sistema de Controle de Apólices de Seguros. Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET. No último artigo será postado o código completo.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 1) Camada de Dados.

Introdução Os aplicativos multicamadas dividem a funcionalidade em várias camadas separadas por agrupamentos lógicos onde estão as suas funcionalidades. Esse artigo é o primeiro de uma série, as quais apresentam um exemplo prático e simples abordando o desenvolvimento em multicamadas em C#. Estes artigos atendem a solicitação de vários leitores que pediram um exemplo do desenvolvimento em C# ao terem acompanhado a série anterior do desenvolvimento de uma aplicação para disk-pizza feita em VB.NET. A Programação Orientada a Objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos. Neste exemplo, as camadas estarão dispostas no mesmo computador, mas os conceitos e funcionalidades aqui descrios poderão ser utilizadas de forma igual em ambientes distribuídos.

Estrura em três camadas: A Figura 1 - Camadas da Aplicação apresenta a estrutura básica de um aplicativo exemplo que será desenvolvido em C# com a base de dados em SQL Server.

1

Page 2: Csharp

<!--[if !vml]--><!--[endif]-->

Figura 1 - Camadas da Aplicação

Camada de Dados: Também conhecida como camada de informações, responsável por manter os dados pertencentes ao aplicativo. Essa camada normalmente armazena dados em um sistema gerenciador de banco de dados relacional (SGBDR) (Deitel et al 2002). No exemplo que é apresentado será utilizado o SQL Server 2005, nada impede que o leitor utilize outro, desde que adapte as strings de conexão e declarações de objetos na linguagem. É recomendável porém, que seja utilizado o SQL Server 2005 ou o SQL Server 2005 Express Edition.

Camada Intermediária: A camada intermediária implementa a lógica de negócio e a lógica do controlador. Essa camada atua como intermediário entre os dados da camada de apresentação e os clientes do aplicativo. A lógica do controlador processa os pedidos do cliente e recupera do banco de dados. A lógica de negócios representam os métodos correspondentes as regras do negócio e garante que os dados sejam confiáveis, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados aos usuários. Exemplos:

<!--[if !supportLists]-->· <!--[endif]-->Antes de gravar os dados de um cliente no banco de dados, na camada lógica de negócios, poderia haver uma regrar para checar se a data de nascimento do cliente por exemplo não é maior que a data atual.

2

Page 3: Csharp

<!--[if !supportLists]-->· <!--[endif]-->Se os campos obrigatórios foram preenchidos com dados válidos, etc..., Ou seja, as regras de negócio dizem como os usuários/clientes podem e não podem acessar dados do aplicativo e como os aplicativos processam os dados. (Deitel et al, 2002).

Camada de Apresentação: Também conhecida como camada de interface com o usuário ou camada superior, que no caso do exemplo que será apresentado são os formulários tipo Windows, se fosse uma aplicação para Web seriam os navegadores. A camada de apresentação interage com a camada intermediária para fazer pedidos e recuperar dados da camada de dados. Então, a camada do cliente exibe para o usuário os dados recuperados pela camada intermediária. Cenário

Sistema de Controle de Apólices de Seguros de Veículos Este visto no Diagrama de ER representa um modelo simplificado de um sistema de controle de apólices de seguro para veículos automotores. Ao examinar a Figura 2 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006) percebe-se: a) Que um cliente para ser cliente efetivamente precisa possuir no mínimo uma apólice, podendo ter mais carros segurados, no entanto uma apólice pertence de forma exclusiva a um cliente. b) Que uma apólice pode ser paga em várias parcelas. Que uma apólice refere-se a um veículo de um modelo determinado. E que esse mesmo modelo de veículo pode estar segurado em outra apólice de outro cliente. c) Que um sinistro pertece a uma única apólice. Mas esta apólice pode ter uma ou mais sinistros ocorridos. Que o sinistro cadastrado pode ser de um tipo ou mais e representar vários danos. Nota: Para fins didáticos este modelo está simplificado, faltam campos, poderíamos aplicar mais regras de normalização, como por exemplo a marca do veículo poderia estar em uma tabela separada e assim por diante. Porém isso foge ao escopo do objetivo principal que é o aprendizado do desenvolvimento em camadas.

Diagrama de Entidade Relacionamento A Figura 2 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006) representa o Digrama de ER explicado anteriormente.

3

Page 4: Csharp

Figura 2 -Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006)

Objetivo do primeiro artigo: Preparar a camada de dados, a qual será acessada pelos métodos da classe intermediária que representam a lógica do controlador, no caso do exemplo apresentado.

Mão na Massa Inicie o Sql Server 2005 crie um banco de dados chamado seguros, Abra uma janela New Query e execute o script abaixo para a criação das tabelas já com os relacionamentos, se assim o desejar. Caso contrário, se desejar criar manualmente consulte o artigo anterior que escrevi sobre a camada de dados. No Link:

4

Page 5: Csharp

http://www.devmedia.com.br/articles/viewcomp.asp?comp=6504 Scripts para criação das tabelas. Nota: Não esqueça de criar o banco com o nome seguros, para facilitar o desenvolvimento do aplicativo nos próximos artigos.

USE SEGUROS

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbCliente]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbCliente](

[idCli] [int] NOT NULL,

[nomeCli] [nvarchar](50) NOT NULL,

[enderecoCli] [nvarchar](50) NULL,

[foneCli] [nvarchar](20) NULL,

[faxCli] [nvarchar](20) NULL,

[obsCli] [nvarchar](max) NULL,

CONSTRAINT [PK_tbCliente] PRIMARY KEY CLUSTERED

(

[idCli] ASC5

Page 6: Csharp

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbDano]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbDano](

[idDano] [int] NOT NULL,

[descDano] [nvarchar](50) NULL,

CONSTRAINT [PK_tbDano] PRIMARY KEY CLUSTERED

(

[idDano] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

6

Page 7: Csharp

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbTipo]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbTipo](

[idTipo] [int] NOT NULL,

[descTipo] [nvarchar](30) NULL,

CONSTRAINT [PK_tbTipo] PRIMARY KEY CLUSTERED

(

[idTipo] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

7

Page 8: Csharp

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbModelo]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbModelo](

[idModelo] [int] NOT NULL,

[descModelo] [nvarchar](50) NOT NULL,

[descMarca] [nvarchar](50) NOT NULL,

CONSTRAINT [PK_tbModelo] PRIMARY KEY CLUSTERED

(

[idModelo] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

8

Page 9: Csharp

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbApolice]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbApolice](

[idApolice] [nvarchar](8) NOT NULL,

[idCli] [int] NOT NULL,

[kmVeiApolice] [int] NOT NULL,

[numApolice] [int] NOT NULL,

[dataApolice] [datetime] NULL,

[dataValApolice] [datetime] NULL,

[valorApolice] [float] NULL,

[idModelo] [int] NULL,

[sinistroApolice] [bit] NULL,

[idSinistro] [int] NULL,

CONSTRAINT [PK_tbVeiculoSegurado] PRIMARY KEY CLUSTERED

(

[idApolice] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

END

9

Page 10: Csharp

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbParcela]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbParcela](

[nroParc] [int] NOT NULL,

[idApolice] [nvarchar](8) NOT NULL,

[dataVenParcela] [datetime] NOT NULL,

[valParcela] [float] NOT NULL,

[quitadaParcela] [bit] NULL,

[quitadaData] [datetime] NULL,

CONSTRAINT [PK_tbParcela] PRIMARY KEY CLUSTERED

(

[nroParc] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

10

Page 11: Csharp

END

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tbSinistro]') AND type in (N'U'))

BEGIN

CREATE TABLE [dbo].[tbSinistro](

[idSinistro] [int] NOT NULL,

[dataSinistro] [datetime] NOT NULL,

[descSinistro] [nvarchar](50) NOT NULL,

[idTipo] [int] NOT NULL,

[idDano] [int] NOT NULL,

CONSTRAINT [PK_tbSinistro] PRIMARY KEY CLUSTERED

(

[idSinistro] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

11

Page 12: Csharp

END

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbCliente]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH CHECK ADD CONSTRAINT [FK_tbApolice_tbCliente] FOREIGN KEY([idCli])

REFERENCES [dbo].[tbCliente] ([idCli])

GO

ALTER TABLE [dbo].[tbApolice] CHECK CONSTRAINT [FK_tbApolice_tbCliente]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbModelo]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH CHECK ADD CONSTRAINT [FK_tbApolice_tbModelo] FOREIGN KEY([idModelo])

REFERENCES [dbo].[tbModelo] ([idModelo])

GO

ALTER TABLE [dbo].[tbApolice] CHECK CONSTRAINT [FK_tbApolice_tbModelo]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbApolice_tbSinistro]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbApolice]'))

ALTER TABLE [dbo].[tbApolice] WITH NOCHECK ADD CONSTRAINT [FK_tbApolice_tbSinistro] FOREIGN KEY([idSinistro])

REFERENCES [dbo].[tbSinistro] ([idSinistro])

GO

12

Page 13: Csharp

ALTER TABLE [dbo].[tbApolice] NOCHECK CONSTRAINT [FK_tbApolice_tbSinistro]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbParcela_tbApolice]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbParcela]'))

ALTER TABLE [dbo].[tbParcela] WITH CHECK ADD CONSTRAINT [FK_tbParcela_tbApolice] FOREIGN KEY([idApolice])

REFERENCES [dbo].[tbApolice] ([idApolice])

GO

ALTER TABLE [dbo].[tbParcela] CHECK CONSTRAINT [FK_tbParcela_tbApolice]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbSinistro_tbDano]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbSinistro]'))

ALTER TABLE [dbo].[tbSinistro] WITH CHECK ADD CONSTRAINT [FK_tbSinistro_tbDano] FOREIGN KEY([idDano])

REFERENCES [dbo].[tbDano] ([idDano])

GO

ALTER TABLE [dbo].[tbSinistro] CHECK CONSTRAINT [FK_tbSinistro_tbDano]

GO

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tbSinistro_tbTipo]') AND parent_object_id = OBJECT_ID(N'[dbo].[tbSinistro]'))

ALTER TABLE [dbo].[tbSinistro] WITH CHECK ADD CONSTRAINT [FK_tbSinistro_tbTipo] FOREIGN KEY([idTipo])

REFERENCES [dbo].[tbTipo] ([idTipo])

GO

13

Page 14: Csharp

ALTER TABLE [dbo].[tbSinistro] CHECK CONSTRAINT [FK_tbSinistro_tbTipo] Se tiver dúvidas em como executar esse script, siga os procedimentos abaixo indicados: 1) Na janela do Microsoft SQL Server Management Studio, clique com o botão direito do mouse sobre Databases, escolha New Database...

Figura 3 - New Database... 2) Na janela New Database, digite o nome do banco de dados, seguros e em seguida clique em OK.

Figura 4 - New Database: seguros

3) Na janela do Object Explorer, clique com o botão direito do mouse sobre o banco de dados criado (seguros) e escolha new query.

14

Page 15: Csharp

Figura 5 - Object Explorer - New Query 4) Na janela query, copie script desse artigo e cole nessa janela. Em seguida clique no botão execute.

Figura 6 - Janela Query e Botão Execute5) Expanda no Object Explorer [+] o banco de dados seguro e clique sobre Database Diagram com o botão direito. Responda afirmativamente a caixa de diálogo para criar um novo diagrama.

15

Page 16: Csharp

Figura 7 - Novo Diagrama do Banco de Dados 6) Adicione todas as tabelas, para que fique parecido com a Figura 1 - Sistema Controle de Apólices de Seguro - Baseado em (Guedes, 2006).

Conclusão Nesse artigo que é o primeiro de uma série artigos os quais apresentam um exemplo prático e simples de um sistema de controle de apólices de seguro, abordando o desenvolvimento em camadas em C#.

Nota do Autor: Em breve, disponibilizarei o segundo artigo, pois como as aulas estão retornando aqui na Faculdade o tempo está curto, nem parece que o dia tem 24 hoas. Bom, vida de professor é assim, preparar aulas e depois mais aulas. J

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 2 - Exemplo prático [Camada Intermediária]

A camada intermediária implementa a lógica de negócio e a lógica do controlador. Essa camada atua como intermediário entre os dados da camada de apresentação e os clientes do aplicativo. A lógica do controlador processa os pedidos do cliente e recupera do banco de dados.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 2 )Camada Intermediária: Lógica do Controlador

16

Page 17: Csharp

Introdução Este artigo é o segundo de uma série de sete artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#, sabemos que a programação orientada a objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos. No artigo anterior foi apresentado um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as respectivas tabelas e o mapeamento Entidade Relacionamento entre elas. Neste artigo será apresentada a classes da camada “2 – Camada Intermediaria” que representa a lógica do controlador, classe essa que faz a interface entre a lógica de negócio e os dados no banco de dados.

Figura 1 - Observe Camada 2.1 Os métodos da lógica do controlador devem assegurar a confiabilidade dos dados antes que o servidor de Banco de Dados atualize ou exiba as informações ao cliente do aplicativo (camada de apresentação). Sabe-se que de acordo com as necessidades atuais das empresas e alterações constantes na legislação e evidentemente nos aplicativos, o modelo de desenvolvimento em várias camadas, com a utilização de classes com finalidades específicas, facilitam a atualização das aplicações e também permitem o reuso do código.

2 – Camada Intermediaria Vamos começar organizando o projeto proposto. Para isso abra inicie um novo projeto em Visual C# - Windows Application, veja Figura 2 - New Project. Dê o nome para esse projeto de Seguros_OO e clique em OK.

17

Page 18: Csharp

Figura 2 - New Project

Para que possa ser organizado e visualizado o código nas diferentes camadas, adicione a este projeto duas novas pastas chamadas: “Camada Intermediaria” e “Camada Apresentacao”. Expanda a pasta “Camada Intermediaria” e crie duas novas pastas chamadas respectivamente Logica Controlador e Logica Negocios. Para criar, clique com o botão direito do mouse sobre a solução, selecione Add New Folder. Dê os nomes conforme acima, ao final você terá:

18

Page 19: Csharp

Figura 3 - Pastas

Vamos adicionar a primeira classe, que será responsável pelo controle dos dados. Essa classe fará parte da Lógica do Controlador.Chamaremos essa classe de “clsDados.vb”. 1) Clique com o botão direito sobre “Logica Controlador” e selecione Add .. Class .. Dê o nome de “clsDados.cs” para essa classe. Conforme figura.

Figura 4 - Classe clsDados.cs

19

Page 20: Csharp

Vamos ao código da Classe de Dados, “clsDados.cs”. Classe genérica que é utilizada para fazer a interface entre as classes contidas na lógica de negócios e a camada de dados. Nela pode-se realizar as operações básicas de banco de dados, como: inclusão, alteração, consulta e exclusão. Revisando: A orientação a objetos usa classes para encapsular variáveis de instância (dados) e métodos (comportamentos).

Estrutura da classe: clsDados

2) Digitar o código abaixo na classe “clsDados.cs”.Dê um duplo clique sobre o nome do arquivo e digite. Se preferir, é claro, copie.using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient; namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ class clsDados { // Adapte a string de acordo com sua conexão.

20

Page 21: Csharp

string conexao = "Data Source=(local);Initial Catalog=seguros;Integrated Security=True"; //Classe para Abrir o Banco de Dados private SqlConnection AbrirBanco() { SqlConnection cn = new SqlConnection(conexao); cn.Open(); return cn; } //Classe para Fechar o Banco de Dados public void FecharBanco(SqlConnection cn) { if (cn.State==ConnectionState.Open) cn.Close(); } //Classe para execução de comando public void ExecutarComando(string strQuery) { SqlConnection cn = new SqlConnection(); try { cn = AbrirBanco(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = strQuery.ToString(); cmd.CommandType = CommandType.Text; cmd.Connection = cn; cmd.ExecuteNonQuery(); } catch (Exception ex) { throw ex; } finally { FecharBanco(cn); } } //Classe que retorna um objeto DataSet public DataSet RetornarDataSet(string strQuery) { SqlConnection cn = new SqlConnection();

21

Page 22: Csharp

try { cn = AbrirBanco(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = strQuery.ToString(); cmd.CommandType = CommandType.Text; cmd.Connection = cn; cmd.ExecuteNonQuery(); /* Declarado um dataadapter e um dataset passar o comando para o da (SqlDataAdapter) e carregar o dataset com resultado da busca */ SqlDataAdapter da = new SqlDataAdapter(); DataSet ds = new DataSet(); da.SelectCommand= cmd; da.Fill(ds); return ds; } catch (Exception ex) { throw ex; } finally { FecharBanco(cn); } } //Classe para retornar um DataReader() public SqlDataReader RetornarDataReader(string strQuery) { SqlConnection cn = new SqlConnection(); try { cn = AbrirBanco(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = strQuery.ToString(); cmd.CommandType = CommandType.Text; cmd.Connection = cn; return cmd.ExecuteReader(); } catch (Exception ex) { throw ex;

22

Page 23: Csharp

} finally { FecharBanco(cn); } } //Classe para retornar um Id Numérico public int RetornarIdNumerico(string strQuery) { SqlConnection cn = new SqlConnection(); try { cn = AbrirBanco(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = strQuery.ToString(); cmd.CommandType = CommandType.Text; cmd.Connection = cn; SqlDataReader dr = cmd.ExecuteReader(); int codigo; if (dr.Read()) codigo = Convert.ToInt16(dr[0]) + 1; else codigo = 1; return codigo; } catch (Exception ex) { throw ex; } finally { FecharBanco(cn); } } }}

Conclusão PAREI AQUI ... kkkkkkkkkkkkkkkkkkkkkkk

23

Page 24: Csharp

Nesse artigo foi apresentado a classe da camada “2 – Camada Intermediaria” que representa a lógica do controlador, classe essa que faz a interface entre a lógica de negócio e os dados no banco de dados. No próximo artigo será apresentado as classes que compõem a lógica de negócio, classes que possuem uma interface com a apresentada agora.

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 3 - Exemplo prático [Lógica de Negócios]

Neste terceiro artigo serão apresentadas as classes que compõe a regra de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 3 )Camada Intermediária: Lógica de Negócios Introdução Este artigo é o terceiro de uma série de artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#. No primeiro artigo foi apresentado um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as respectivas tabelas e o mapeamento Entidade Relacionamento entre elas. No segundo artigo dessa série foi apresentada a classes da camada “2 – Camada Intermediaria” que representa a lógica do controlador, classe essa que faz a interface entre a lógica de negócio e os dados no banco de dados.

24

Page 25: Csharp

Figura SEQ Figura \* ARABIC 1 - Lógica de Negócios Neste terceiro artigo serão apresentadas as classes que compõe a regra de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo. A lógica de negócios na camada 2 apresentada impõe as regras de negócio e garantem a confiabilidade dos dados, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados para os usuários (negociação feita nessa camadas, pela classe que representa a lógica do controlador). As regras de negócio dizem como os clientes podem e não podem acessar os dados do aplicativo e como os aplicativos processam esses dados.

2 – Camada Intermediaria: Lógica de Negócios A primeira classe que será apresentada é a classe clnClientes.cs, nesta classe serão definidos os campos membros, atributos/propriedades e métodos. Como boa prática de programação as variáveis de instância da classe estarão definida como PRIVATE, sendo acessíveis apenas dentro da própria classe pelas propriedades que utilizaremos através de seus métodos de acesso para exibir ou ler os dados. (Métodos Get e Set).

Mão na Massa: 1) Com o aplicativo aberto Seguros_OO, dê um clique com o botão direito do mouse sobre a pasta [Logica Negocios], selecione a opção ADD à New Item e Adicione uma nova classe, com o nome “clnClientes.cs”.

25

Page 26: Csharp

Figura 2 – Classe Clientes Nota do Autor: Procurei comentar ao máximo esta classe, para que facilite o entendimento, no entanto, caso algo não fique claro, podem-me escrever, sempre coloco o meu e-mail no final dos artigos. Nessa camada você poderia implementar algumas regras que ao longo dos artigos não vou definir, pois o objetivo aqui é não complicar o entendimento. Mas fique a vontade para incluir regras nessa camada, tais como checagem dos dados, consistência de valores. Antes de digitar o código, a classe clnClientes.cs a figura abaixo mostra como ela está definida:

26

Page 27: Csharp

Figura SEQ Figura \* ARABIC 3 - Detalhes da Classe clnClientes.cs Pronto agora é só digitar, ou copiar, se assim o preferir: using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient; namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ public class clnClientes { //1 - Campos privados a classe private int idCli;

27

Page 28: Csharp

private string nomeCli; private string enderecoCli; private string foneCli; private string faxCli; private string obsCli; //2 - propriedades, acesso aos campos privados public int IdCli { get { return idCli; } set { idCli = value; } } public string NomeCli { get { return nomeCli; } set { nomeCli = value; } } public string EnderecoCli { get { return enderecoCli; } set { enderecoCli = value; } } public string FoneCli { get { return foneCli; } set { foneCli = value; } } public string FaxCli { get { return faxCli; } set { faxCli = value; } } public string ObsCli { get { return obsCli; } set { obsCli = value; } } //3 - métodos da classe de Negócios (clnCliente.cs) //3.1 Buscar dados do cliente cujo codigo foi especificado public void Buscar()

28

Page 29: Csharp

{ string csql; csql = "Select * From tbCliente where idCli=" + IdCli; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idCli = Convert.ToInt16(dados.GetValue(0)); nomeCli = Convert.ToString(dados.GetValue(1)); enderecoCli = Convert.ToString(dados.GetValue(2)); foneCli = Convert.ToString(dados.GetValue(3)); faxCli = Convert.ToString(dados.GetValue(4)); obsCli = Convert.ToString(dados.GetValue(5)); } } //3.2 Buscar o próximo Id Numerico para //inclusao de um novo cliente. public int BuscarId() { string csql; csql = "Select Top 1 (IdCli) From TbCliente order by IdCli desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado=seguros.RetornarIdNumerico(csql); return IdBuscado; } //3.3 Método para incluir um novo cliente no //Banco de dados public void Gravar() { StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbCliente"); csql.Append("("); csql.Append("idCli,"); csql.Append("nomeCli,"); csql.Append("enderecoCli,"); csql.Append("foneCli,"); csql.Append("faxCli,");

29

Page 30: Csharp

csql.Append("obsCli) Values("); csql.Append(idCli); csql.Append(",'" + nomeCli +"',"); csql.Append("'" + enderecoCli + "',"); csql.Append("'" + foneCli + "',"); csql.Append("'" + faxCli + "',"); csql.Append("'" + obsCli + "')"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.4 Método para atualizar (alterar um registro) public void Atualizar() { StringBuilder csql = new StringBuilder(); csql.Append("Update tbCliente "); csql.Append("set idCli="); csql.Append(IdCli); csql.Append(", nomeCli='"); csql.Append(nomeCli); csql.Append("', enderecoCli='"); csql.Append(enderecoCli); csql.Append("', foneCli='"); csql.Append(foneCli); csql.Append("', faxCli='"); csql.Append(faxCli); csql.Append("', obsCli='"); csql.Append(obsCli); csql.Append("' where idCli="); csql.Append(IdCli); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.5 Método para excluir um cliente do //Banco de dados public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbCliente "); csql.Append(" where idCli="); csql.Append(IdCli);

30

Page 31: Csharp

clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } }}

Conclusão Nesse terceiro artigo foi apresentada a primeira classe que compõe a regras de negócios do Sistema de Controle de Apólices de Seguro proposto. Como já apresentado a lógica de negócios na camada 2 impõe as regras de negócio e garantem a confiabilidade dos dados, antes que o aplicativo servidor atualize o banco de dados ou apresente os dados para os usuários (acesso aos dados: tarefa da classe clnDados.cs – lógica do controlador). Ao final dessa série de artigos, disponibilizarei o código dessa aplicação exemplo. No entando fica como desafio ao leitor, criar as demais classes básicas que compões a lógica de negócios. No próximo artigo será apresentado a camada de apresentação, onde serão criados o formulário para cadastro de dados do cliente e o formulário de pesquisa genérico que poderá ser utilizado em toda a aplicação. Nota Importante: Neste exemplo não separamos as camadas em projetos diferentes dentro de uma solução. Usamos apenas pastas (folders) para isso. Nada impede que você adote essa prática, projetos maiores ficam de forma melhor organizados com esse procedimento. A única coisa é que não pode-se esquecer de colocar as referências aos projetos em uso. Ex: o projeto que conteriam as regras de negócio teriam que ter uma referencia adicionada ao projeto do controlador, e assim por diante.

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 4 - Exemplo prático [Camada de Apresentação]

Neste quarto artigo será apresentado a camada de apresentação, onde criaremos um formulário para cadastro de dados dos clientes e um formulário de pesquisa genérico que poderá ser reutilizado em toda a aplicação.

Desenvolvendo uma aplicação Multicamadas para Windows em C# Parte 4 )

Camada Intermediária: Lógica de Negócios

31

Page 32: Csharp

Introdução Este artigo é o quarto de uma série de artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#, sabemos que a programação orientada a objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos. Aproveitando o comentário do amigo Queiroz “Como o seu objetivo é abstrair algumas operações com o banco de dados um nome que mais relacionado à persistência ficaria melhor” sobre os artigos anteriores, diga-se por sinal que comentário foi bem oportuno; é importante destacar que as camadas nos dizem como agrupar os componentes já o modelo MVC apresenta a forma de interação entre essas. O nome dado a segunda camada (Intermediária) acredito que esteja bem adequado, no entanto a lógica do controlador, deve ser vista como a parte da camada que contém as classes com o conhecimento necessário sobre como persistir objetos no banco de dados, como usei o referencial teórico apresentado no artigo 1 (Deitel et al, 2002) esta persistência encontra-se apresentada como “lógica do controlador”, tradução técnica feita também na versão brasileira do Livro “Como programar C#”. É importante que o leitor não confunda estes conceitos. Aqui no próprio devmedia, os amigos podem encontrar artigos interessantes demonstrando na prática os conceitos de MVC que em projetos maiores é uma boa prática a realização do mapeamento entre os objetos de domínio com o banco de dados. O leitor pode conhecer mais sobre esse mapeamento utilizando por exemplo o Nhibernate, aqui no portal com as vídeo aulas do Rodrigo. Link abaixo:

http://www.devmedia.com.br/articles/viewcomp.asp?comp=7341&hl=

Revisando No primeiro artigo foi apresentado um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as respectivas tabelas e o mapeamento Entidade Relacionamento entre elas. No segundo artigo dessa série foi apresentada a classes da camada “2 – Camada Intermediaria” que representa a lógica do controlador, classe essa que faz a interface entre a lógica de negócio e os dados no banco de dados. No terceiro artigo foi apresentada a classe clnClientes.cs que compõe as regras de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo. É importante também destacar que o leitor pode acrescentar, como já foi dito, comportamentos a esta classe, coisa que aqui por questão de didática deixei de incluir.

Este Artigo Neste quarto artigo será apresentado a camada de apresentação, onde criaremos um formulário para cadastro de dados dos clientes e um formulário de pesquisa genérico que poderá ser reutilizado em toda a aplicação.

32

Page 33: Csharp

Lembrando que ao ao final dessa série de artigos, disponibilizarei o código dessa aplicação exemplo. Espero que vocês tenham enfrentado o desafio do artigo anterior.

Figura 1 - Camadas da Aplicação

3 – Camada de Apresentação A camada de apresetação ou camada do cliente ou ainda camada superior é a interface com o usuário, que neste caso são as janelas Winforms do nosso aplicativo exemplo. A camada do cliente interage com a camada intermediária para fazer pedidos e recuperar dados da camada de dados. Então, a camada de apresentação exibe para o usuário os dados recuperados pela camada intermediária. Esta divisão em camadas certamente deixa o código com uma leitura e controle mais fácil. Pois as regras estão em uma camada isolada. Supondo que nossa aplicação fosse cliente de uma aplicação Web Service em um servidor numa intranet, as regras poderiam estar nas classes desse único servidor facilitando assim a manutenção, pois caso o código venha a ser alterado, não é necessário compilar as alterações nas máquinas clientes. Um bom trabalho poupado.

Cenário: Criaremos nesse momento o primeiro formulário, que servirá de interface com os dados do cliente. Onde o usuário poderá, incluir, alterar, excluir e pesquisar por um determinado cliente. Nota, lembre-se que a idéia é criar um formulário para pesquisa genérico que venha a servir em outros tipos de pesquisa, como por exemplo: apólices de seguro ou parcelas do cliente.

33

Page 34: Csharp

Mão na Massa: 1) Com o aplicativo aberto Seguros_OO, você deve ter um formulário Form1 na janela do solution explorer, arraste-o para dentro da Camada de Apresentação, pasta [Camada Apresentacao].

Figura 2 – Form1.cs

Caso você não tenha esse formulário, clique com o botão direito do mouse sobre a camada de apresentação e adicione um novo formulário. Renomeie esse formulário para FrmClientes.cs

34

Page 35: Csharp

Figura 3 - Formulário renoemado. 2) Crie uma interface arrastando os objetos para a tela conforme abaixo e definindo o nome dos controles como apresentado em azul:

35

Page 36: Csharp

Figura 4 - Cadastro de Clientes 3) Altere as propriedades de todos os botões exceto (btnProcurar e btnSair), como abaixo:

Controle Propriedade ValorbtnIncluir Enabled falsebtnAtualizar Enabled falsebtnExcluir Enabled falsebtnCancelar Enabled false

O formulário deve funcionar desta forma:

• Quando for carregado o foco deve estar no primeiro campo o controle txtidCli• Quando o usuário sair desse controle, faremos uma busca no Banco de Dados para retornar o código

digitado, caso não tenha o código será habilitado a opção de incluir e caso contrário será habilitado o botão atualizar.

36

Page 37: Csharp

4) Selecione o controle txtidCli e na janela de eventos, veja Figura 5 - Janela para seleciona evento, e escolha o evento leave (para conhecedores do VB – lostfocus), dê um duplo clique nele e adicione o código abaixo:

Figura 5 - Janela para selecionar evento 5) Código do evento Leave: private void txtIdCli_Leave(object sender, EventArgs e) { int vidCli=0; if (txtIdCli.Text.Trim() != "") { vidCli = int.Parse(txtIdCli.Text); } clnClientes cliente = new clnClientes(); cliente.IdCli = vidCli; cliente.Buscar(); if (cliente.NomeCli == null) { //preparando para inclusao LimparTxt(groupBox1); txtIdCli.Text = ""; txtIdCli.Enabled = false; btnIncluir.Enabled = true;

37

Page 38: Csharp

btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtIdCli.Enabled = false; txtIdCli.Text = Convert.ToString(cliente.IdCli); txtnomeCli.Text = Convert.ToString(cliente.NomeCli); txtenderecoCli.Text = Convert.ToString(cliente.EnderecoCli); txtfoneCli.Text = Convert.ToString(cliente.FoneCli); txtfaxCli.Text = Convert.ToString(cliente.FaxCli); txtobsCli.Text = Convert.ToString(cliente.ObsCli); btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } } É necessário que você indique o local de armazenamento das classes nas declarações de using. Neste caso indique: ...using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios; No código anterior observe as linhas destacadas em negrito e itálico nos blocos if e else. Invoca-se um método chamado LimparTxt passando como parâmetro o objeto do tipo GroupBox chamado groupBox1. A idéia é que quando o código for invocado ele “limpe” todas as caixas de textos que estão dentro do groupBox. 6) Acrescente o código a seguir, logo acima ou abaixo do método anterior. //Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } }

38

Page 39: Csharp

7) Na lista abaixo código encontra-se o código do botão incluir. Observe como este código é limpo. Lembre-se que as regras para gravação do cliente poderiam ter sido criadas na classe clnCliente no método Gravar ou nos métodos de escrita Set daquela classe. private void btnIncluir_Click(object sender, EventArgs e) { try { clnClientes cliente = new clnClientes(); //Dispara o método para buscar o IdCli cliente.IdCli = cliente.BuscarId(); cliente.NomeCli = txtnomeCli.Text; cliente.EnderecoCli = txtenderecoCli.Text; cliente.FoneCli = txtfoneCli.Text; cliente.FaxCli = txtfaxCli.Text; cliente.ObsCli = txtobsCli.Text; cliente.Gravar(); string mensagem = "Registro Cliente: " + cliente.IdCli + "\nNome: " + cliente.NomeCli + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtIdCli.Enabled = true; txtIdCli.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } } 8) Abaixo o código do botão atualizar. private void btnAtualizar_Click(object sender, EventArgs e) { try {

39

Page 40: Csharp

clnClientes cliente = new clnClientes(); cliente.IdCli = int.Parse(txtIdCli.Text); cliente.NomeCli = txtnomeCli.Text; cliente.EnderecoCli = txtenderecoCli.Text; cliente.FoneCli = txtfoneCli.Text; cliente.FaxCli = txtfaxCli.Text; cliente.ObsCli = txtobsCli.Text; cliente.Atualizar(); string mensagem = "Registro Cliente: " + cliente.IdCli + "\nNome: " + cliente.NomeCli + "\nAlterado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtIdCli.Enabled = true; txtIdCli.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } 9) Abaixo o código do botão Excluir. private void btnExcluir_Click(object sender, EventArgs e) { string pergunta; pergunta = "Deseja excluir o cliente: \n" + txtIdCli.Text + ": " + txtnomeCli.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { clnClientes cliente = new clnClientes(); cliente.IdCli = int.Parse(txtIdCli.Text); cliente.NomeCli = txtnomeCli.Text; cliente.Excluir();

40

Page 41: Csharp

string mensagem = "Registro Cliente: " + cliente.IdCli + "\nNome: " + cliente.NomeCli + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtIdCli.Enabled = true; txtIdCli.Focus(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); } } 10) Abaixo o código do botão cancelar. private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtIdCli.Enabled = true; txtIdCli.Focus(); } Neste momento não será colocado código para o botão procurar. Retornaremos a este ponto em breve. 11) Abaixo código do último botão, o botão sair. A finalidade é apenas sair do formulário atual e não da aplicação, uma vez que esse não será o formulário principal deste nosso sistema exemplo. private void btnSair_Click(object sender, EventArgs e) { this.Close(); }

41

Page 42: Csharp

Bom, agora que já está pronto o formulário: cadastro de clientes, o próximo passo é criar um formulário genérico de consulta. Este formulário servirá para pesquisa em todas as tabelas do banco. 12) Agora, adicione um novo formulário a essa aplicação e renomei-o com o nome FrmPesquisa.cs, coloque (ou crie) esse formulário dentro da pasta [Camada Apresentacao].

Figura 6 - Solution Explorer (FrmPesquisa.cs)

Quem acompanhou a série de artigos do desenvolvimento em camada para o Visual Basic, deve se lembrar deste formulário. A idéia aqui é a mesma, só que em Csharp. Mas vale a pena relembrar. 13) Arraste para o formulário FrmConsulta os seguintes objetos 02 groupboxs, 03 labels, 02 combobox, 01 textbox, 01 button e 01 datagrid. Conforme abaixo:

42

Page 43: Csharp

Figura 7 - Formulário FrmPesquisa.cs

14) Altere as propriedades dos objetos do formulário conforme quadro:

43

Page 44: Csharp

Objeto Propriedade ValorComboBox1 NAME

DROPDOWNSTYLEcmbCampoDropDownList

ComboBox2 NAMEDROPDOWNSTYLE

cmbParamDropDownList

TextBox1 NAME TxtBuscaButton1 NAME btnFiltrarDataGridView1 NAME Dgv1Os controles do tipo GroupBox não precisam alterar a propriedade NAME.

15) Agora vamos retornar ao formulário FrmClientes, para adicionar o código que responde ao evento click no botão procurar. No entanto declare a biblioteca com o keyword using antes....using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios;using Seguros_OO.Camada_Apresentacao; 16) Agora sim. Vamos ao código do botão procurar: private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados dos clientes"; f.Tag = "tbCliente"; //nome da tabela (macete) :) f.ShowDialog(); } 17) Alterne agora para o formulário FrmPesquisa e declare as bibliotecas necessárias para instanciamento das classes (namespace). using Seguros_OO.Camada_Intermediaria.Logica_Negocios; 18) Neste momento adicione o código para o evento Load do formulário “FrmPesquisa”.

private void FrmPesquisa_Load(object sender, EventArgs e) {

44

Page 45: Csharp

string csql = "Select * From " + this.Tag.ToString(); clsDados geral = new clsDados(); DataSet ds = geral.RetornarDataSet(csql); dgv1.DataSource = ds.Tables[0]; ds.Tables[0].Columns[0].ColumnName.ToString(); cmbCampo.Items.Clear(); for (int i = 0; i < ds.Tables[0].Columns.Count; i++)

cmbCampo.Items.Add(ds.Tables[0].Columns[i].ColumnName.ToString()); } O método acima é disparado quando o formulário é carregado, Inicialmente declaramos uma string chamada csql com a cláusula select, cujo objetivo é buscar no banco de dados todos os campos da tabela indicada na propriedade Tag do formulário corrente. Veja que essa propriedade foi carregada com o nome da tabela indica no item 16, destacado como “macete”. Desta forma este formulário pode ser reaproveitado em qualquer chamada a partir de outros formulário, desde que você indique na hora do instancimento do formulário o nome da tabela desejada. Uma boa idéia é para você é melhorar mais tarde o funcionamento deste formulário. Ainda nesse código através de uma estrutura de repetição for, percorremos todas as colunas (campos) da tabela em questão e adicionamos o seu nome (nome do campo) ao controle cmbCampo. Agora vamos adicionar um código, para que quando o usuário escolha um campo no controle cmbCampo, seja preechido o cmbParam com os tipos de busca possível para o tipo de campo selecionado, ou seja, se o usuário escolher um campo tipo “string” o campo cmbParam deve ter as opções tipo: “começando com”, “terminando em”, “igual a”, “tem a palavra”, e se for int deve der opções do tipo: “>”, “<”, etc. 19) Código do cmbCampo (quando o usuário escolher um campo); private void cmbCampo_SelectedIndexChanged(object sender, EventArgs e) { int indiceCampo = cmbCampo.SelectedIndex; string tipocampo = this.dgv1.Columns[indiceCampo].ValueType.ToString(); if(tipocampo.Trim()=="System.Int32") { cmbParam.Items.Clear(); cmbParam.Items.Add("="); cmbParam.Items.Add(">"); cmbParam.Items.Add(">="); cmbParam.Items.Add("<"); cmbParam.Items.Add("<="); cmbParam.Items.Add("<>"); }

45

Page 46: Csharp

else if (tipocampo.Trim() == "System.String") { cmbParam.Items.Clear(); cmbParam.Items.Add("="); cmbParam.Items.Add("Começa com"); cmbParam.Items.Add("Termina em"); cmbParam.Items.Add("Tem a palavra"); } else { MessageBox.Show("Implemente Código para outros tipos"); } } OBS do Autor: Veja que não implementei para todos os tipos de dados, apenas para os tipos mais comuns. Int e string, fica para você implementar para os demais tipos usados. 20) Para finalizar o conteúdo desse artigo, vamos ao código que responderá ao evento click do Botão filtrar. private void btnFiltrar_Click(object sender, EventArgs e) { string campo = cmbCampo.Text; string parametro = cmbParam.Text; string valor = txtBusca.Text; int indiceCampo = cmbCampo.SelectedIndex; string tipocampo = this.dgv1.Columns[indiceCampo].ValueType.ToString(); //Para tipos String if(tipocampo=="System.String") { if(parametro=="Tem a palavra") { parametro= "Like "; valor = "'%" + valor + "%'"; } else if(parametro=="=") { parametro= "="; valor = "'" + valor + "'"; } else if(parametro=="Começa com") { parametro= "Like ";

46

Page 47: Csharp

valor = "'" + valor + "%'"; } else if (parametro=="Termina em") { parametro = "Like "; valor = "'%" + valor + "'"; } } //Para tipos int não são necessário ajustes. string csql = "Select * from " + this.Tag.ToString() + " where " + campo + " " + parametro + " " + valor; clsDados busca = new clsDados(); DataSet ds = busca.RetornarDataSet(csql); this.dgv1.DataSource = ds.Tables[0]; } Note que esse formulário de pesquisa poderá ser utilizado por qualquer formulário de cadastro, sem alterações. Você pode melhorar o código com o tratamento para os outros tipos de dados como data e hora por exemplo.

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 5 - Exemplo prático [Classes Auxiliares]

Nesse artigo vamos criar a lógica de negócios e a respectiva camada de apresentação para as informações auxiliares da apólice. Nessa ordem: Dano, Tipo de Sinistro, e Modelos de Carros.

Desenvolvendo uma aplicação Multicamadas para Windows em C# (Parte 5)

Introdução Este artigo é o quinto de uma série de sete artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#, sabemos que a programação orientada a objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos.

Revisão No primeiro artigo foi apresentado um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as respectivas tabelas e o mapeamento Entidade Relacionamento entre elas.

47

Page 48: Csharp

No segundo artigo dessa série foi apresentada a classe da camada “2 – Camada Intermediaria” que representa a lógica do controlador (persistir dados), classe essa que fez a interface entre a lógica de negócio e os dados no banco de dados. No terceiro artigo foi apresentada a classe clnClientes.cs que possui as regras de negócios do Sistema de Controle de Apólices de Seguro proposto desde o primeiro artigo. No quarto foi apresentado a camada de apresentação, onde foram criados os formulários para cadastro de dados de clientes e o formulário de pesquisa genérico que será utilizado em toda a aplicação. Nesse quinto artigo estudaremos mais sobre o Projeto de Apólice de Seguros, de forma geral.

Iniciando o Estudo: Observe a Figura 1 - Diagrama ER Numerado.

Figura 1 - Diagrama ER Numerado A tabela de apólices é sem dúvida a mais importante do Sistema e para que possa ser feito o cadastro de uma nova apólice inicialmente temos que possuir dados nas tabelas de clientes (tbCliente) [não numerada pois nos artigos anteriores implementamos a funcionalidade para a mesma] temos que ter os dados já cadastrados na

48

Page 49: Csharp

tabela de modelo de carros (tbModelo) [6] e a partir da apólice cadastrada gerar as parcelas [5] para o pagamento por parte do cliente.Já em relação aos sinistros ocorridos [2] para que possa ser cadastrado, inicialmente temos que ter também a apólice cadastrada [1] e previamente cadastrados os tipos de danos que podem ocorrer [3] e os tipos de sinistros já cadastrados. Nesse artigo vamos criar a lógica de negócios e a respectiva camada de apresentação para as informações auxiliares da apólice. Nessa ordem: Dano, Tipo de Sinistro, e Modelos de Carros.

Mão na Massa: 1) Com o aplicativo aberto adicione três novas classes chamadas respectivamente: clnDanos.cs, clnTipos.cs, clnModelos.cs, conforme figura:

Figura 2 - Outras Classes

2) Agora adicione na Pasta [Camada Apresentacao] três novos formulários com os nomes respectivamente: FrmDanos.cs, FrmTipos.cs e FrmModelos.cs.

49

Page 50: Csharp

Figura 3 - Outros Formulários

Vamos montar a interface com o usuário nesses três formulários, para tanto acrescente os controles e modifique os nomes conforme solicitado: 3) Alterne para o formulário FrmDados e crie essa interface, dê o nome para os controles em azul.

Figura 4 - FrmDanos.csObs: Como boa prática utilize os mesmo padrão de nomes para os botões de comando. 4) Alterne para o formulário FrmTipos e crie essa interface, dê o nome para os controles em azul.

50

Page 51: Csharp

<!--[if !vml]-->Figura 5 - FrmTipos.cs

5) Alterne para o formulário FrmModelos e crie essa interface, dê o nome para os controles em azul.

Figura 6 – FrmModelos

Lógica de Negócios das classes criadas Como a lógica é idêntica a apresentada nos artigos anteriores. Aqui será apresentado apenas o código de cada classe. Acredita-se ser desnecessário o detalhamento, pois é considerado que o leitor tenha feito a aplicação até o presente. Abaixo classe: clnDados até com as declaração dos namespaces. Copie e cole o código. Mas não deixe de analisá-lo novamente.

51

Page 52: Csharp

using System;using System.Collections.Generic;using System.Text;using System.Data;namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ class clnDanos { //1 - Campos privados a classe private int idDano; private string descDano; //2 - propriedades, acesso aos campos privados public int IdDano { get { return idDano; } set { idDano = value; } } public string DescDano { get { return descDano; } set { descDano = value; } } //3 - métodos da classe de Negócios (clnDanos.cs) //3.1 Buscar dados de danos cujo codigo foi especificado public void Buscar() { string csql; csql = "Select * From tbDano where idDano=" + IdDano; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idDano = Convert.ToInt16(dados.GetValue(0)); descDano = Convert.ToString(dados.GetValue(1)); } } //3.2 Buscar o próximo Id Numerico para //inclusao de um novo tipo de dano.

52

Page 53: Csharp

public int BuscarId() { string csql; csql = "Select Top 1 (idDano) From tbDano order by idDano desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado = seguros.RetornarIdNumerico(csql); return IdBuscado; } //3.3 Método para incluir um novo tipo de dano no //Banco de dados public void Gravar() { StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbDano"); csql.Append("("); csql.Append("idDano,"); csql.Append("descDano) Values("); csql.Append(idDano); csql.Append(",'" + descDano + "')"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.4 Método para atualizar (alterar um registro) public void Atualizar() { StringBuilder csql = new StringBuilder(); csql.Append("Update tbDano "); csql.Append("set idDano="); csql.Append(idDano); csql.Append(", descDano='"); csql.Append(descDano); csql.Append("' where idDano="); csql.Append(IdDano); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.5 Método para excluir um dano do //Banco de dados public void Excluir() {

53

Page 54: Csharp

StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbDano "); csql.Append(" where idDano="); csql.Append(IdDano); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.6 Método Buscar todos os Danos public DataSet BuscarTodos() { string csql; csql = "Select * From tbDano order by descDano"; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); return ds; } }}

Abaixo classe: clnTipos using System;using System.Collections.Generic;using System.Text;using System.Data; namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ class clnTipos { //1 - Campos privados a classe private int idTipo; private string descTipo; //2 - propriedades, acesso aos campos privados public int IdTipo { get { return idTipo; }

54

Page 55: Csharp

set { idTipo = value; } } public string DescTipo { get { return descTipo; } set { descTipo = value; } } //3 - métodos da classe de Negócios (clnTipos.cs) //3.1 Buscar dados de tipos cujo codigo foi especificado public void Buscar() { string csql; csql = "Select * From tbTipo where idTipo=" + IdTipo; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idTipo = Convert.ToInt16(dados.GetValue(0)); descTipo = Convert.ToString(dados.GetValue(1)); } } //3.2 Buscar o próximo Id Numerico para //inclusao de um novo tipo. public int BuscarId() { string csql; csql = "Select Top 1 (idTipo) From tbTipo order by idTipo desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado = seguros.RetornarIdNumerico(csql); return IdBuscado; } //3.3 Método para incluir um novo tipo no //Banco de dados public void Gravar()

55

Page 56: Csharp

{ StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbTipo"); csql.Append("("); csql.Append("idTipo,"); csql.Append("descTipo) Values("); csql.Append(idTipo); csql.Append(",'" + descTipo + "')"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.4 Método para atualizar (alterar um registro) public void Atualizar() { StringBuilder csql = new StringBuilder(); csql.Append("Update tbTipo "); csql.Append("set idTipo="); csql.Append(idTipo); csql.Append(", descTipo='"); csql.Append(descTipo); csql.Append("' where idTipo="); csql.Append(idTipo); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.5 Método para excluir um tipo do //Banco de dados public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbTipo "); csql.Append(" where idTipo="); csql.Append(idTipo); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.6 Método Buscar todos os Tipos public DataSet BuscarTodos() {

56

Page 57: Csharp

string csql; csql = "Select * From tbTipo order by descTipo"; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); return ds; } }} Abaixo classe: clnModelos using System;using System.Collections.Generic;using System.Text;using System.Data; namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ class clnModelos { //1 - Campos privados a classe private int idModelo; private string descModelo; private string descMarca; //2 - propriedades, acesso aos campos privados public int IdModelo { get { return idModelo; } set { idModelo = value; } } public string DescModelo { get { return descModelo; } set { descModelo = value; } } public string DescMarca { get { return descMarca; }

57

Page 58: Csharp

set { descMarca = value; } } //3 - métodos da classe de Negócios (clnModelos.cs) //3.1 Buscar dados de Modelos cujo codigo foi especificado public void Buscar() { string csql; csql = "Select * From tbModelo where idModelo=" + IdModelo; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idModelo = Convert.ToInt16(dados.GetValue(0)); descModelo = Convert.ToString(dados.GetValue(1)); descMarca = Convert.ToString(dados.GetValue(2)); } } //3.2 Buscar o próximo Id Numerico para //inclusao de um novo modelo. public int BuscarId() { string csql; csql = "Select Top 1 (idModelo) From tbModelo order by idModelo desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado = seguros.RetornarIdNumerico(csql); return IdBuscado; } //3.3 Método para incluir um novo modelo no //Banco de dados public void Gravar() { StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbModelo"); csql.Append("("); csql.Append("idModelo,");

58

Page 59: Csharp

csql.Append("descModelo,"); csql.Append("descMarca) Values("); csql.Append(idModelo); csql.Append(",'" + descModelo + "'"); csql.Append(",'" + descMarca + "')"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.4 Método para atualizar (alterar um registro) public void Atualizar() { StringBuilder csql = new StringBuilder(); csql.Append("Update tbModelo "); csql.Append("set idModelo="); csql.Append(idModelo); csql.Append(", descModelo='"); csql.Append(descModelo); csql.Append("', descMarca='"); csql.Append(descMarca); csql.Append("' where idModelo="); csql.Append(idModelo); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.5 Método para excluir um dano do //Banco de dados public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbModelo "); csql.Append(" where idModelo="); csql.Append(idModelo); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } }}

59

Page 60: Csharp

Camada de Apresentação Bom. Vamos agora a camada de apresentação. Seria interessante, você copiar os código para dentro de cada evento (um a um) ou se copiar o código do formulário não se esqueça de instanciar os eventos na inicialização do formulário. Siga minha dica depois confira com o código aqui colocado.

Formulário: FrmDanos Abaixo código completo com todos os eventos e métodos declarados: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios; namespace Seguros_OO.Camada_Apresentacao{ public partial class FrmDanos : Form { public FrmDanos() { InitializeComponent(); } //Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } } private void btnIncluir_Click(object sender, EventArgs e) {

60

Page 61: Csharp

try { clnDanos dano = new clnDanos(); //Dispara o método para buscar o IdDano dano.IdDano = dano.BuscarId(); dano.DescDano = txtdescDano.Text; dano.Gravar(); string mensagem = "Registro Dano: " + dano.IdDano + "\nDescrição: " + dano.DescDano + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtidDano.Enabled = true; txtidDano.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } } private void btnAtualizar_Click(object sender, EventArgs e) { try { clnDanos dano = new clnDanos(); dano.IdDano = int.Parse(txtidDano.Text); dano.DescDano = txtdescDano.Text; string mensagem = "Registro Dano: " + dano.IdDano + "\nNome: " + dano.DescDano + "\nAlterado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false;

61

Page 62: Csharp

btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidDano.Enabled = true; txtidDano.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } } private void btnExcluir_Click(object sender, EventArgs e) { string pergunta; pergunta = "Deseja excluir o dado: \n" + txtidDano.Text + ": " + txtdescDano.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { clnDanos dano = new clnDanos(); dano.IdDano = int.Parse(txtidDano.Text); dano.DescDano = txtdescDano.Text; dano.Excluir(); string mensagem = "Registro Dano: " + dano.IdDano + "\nDescrição: " + dano.DescDano + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidDano.Enabled = true; txtidDano.Focus(); }

62

Page 63: Csharp

else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidDano.Enabled = true; txtidDano.Focus(); } private void btnSair_Click(object sender, EventArgs e) { this.Close(); } private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta Tipos de Danos"; f.Tag = "tbDano"; //nome da tabela (macete) :) f.ShowDialog(); } private void txtidDano_Leave(object sender, EventArgs e) { int vidDano = 0; if (txtidDano.Text.Trim() != "") { vidDano = int.Parse(txtidDano.Text); } clnDanos dano = new clnDanos();

63

Page 64: Csharp

dano.IdDano = vidDano; dano.Buscar(); if (dano.DescDano == null) { //preparando para inclusao LimparTxt(groupBox1); txtidDano.Text = ""; txtidDano.Enabled = false; btnIncluir.Enabled = true; btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtidDano.Enabled = false; txtidDano.Text = Convert.ToString(dano.IdDano); txtdescDano.Text = Convert.ToString(dano.DescDano); btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } } }}

Formulário: FrmTipos Abaixo código completo com todos os eventos e métodos declarados:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios; namespace Seguros_OO.Camada_Apresentacao{

64

Page 65: Csharp

public partial class FrmTipos : Form { public FrmTipos() { InitializeComponent(); } //Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } } private void btnIncluir_Click(object sender, EventArgs e) { try { clnTipos tipo = new clnTipos(); //Dispara o método para buscar o IdTipo tipo.IdTipo = tipo.BuscarId(); tipo.DescTipo = txtdescTipo.Text; tipo.Gravar(); string mensagem = "Registro Tipo: " + tipo.IdTipo + "\nDescrição: " + tipo.DescTipo + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtidTipo.Enabled = true; txtidTipo.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); }

65

Page 66: Csharp

} private void btnAtualizar_Click(object sender, EventArgs e) { try { clnTipos tipo = new clnTipos(); tipo.IdTipo = int.Parse(txtidTipo.Text); tipo.DescTipo = txtdescTipo.Text; string mensagem = "Registro Dano: " + tipo.IdTipo + "\nNome: " + tipo.DescTipo + "\nAlterado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidTipo.Enabled = true; txtidTipo.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } } private void btnExcluir_Click(object sender, EventArgs e) { string pergunta; pergunta = "Deseja excluir o tipo: \n" + txtidTipo.Text + ": " + txtdescTipo.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) {

66

Page 67: Csharp

clnTipos tipo = new clnTipos(); tipo.IdTipo = int.Parse(txtidTipo.Text); tipo.DescTipo = txtdescTipo.Text; tipo.Excluir(); string mensagem = "Registro Tipo: " + tipo.IdTipo + "\nDescrição: " + tipo.DescTipo + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidTipo.Enabled = true; txtidTipo.Focus(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidTipo.Enabled = true; txtidTipo.Focus(); } private void btnSair_Click(object sender, EventArgs e) { this.Close(); }

67

Page 68: Csharp

private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta de Tipos de Sinistros"; f.Tag = "tbTipo"; //nome da tabela (macete) :) f.ShowDialog(); } private void txtidTipo_Leave(object sender, EventArgs e) { int vidtipo = 0; if (txtidTipo.Text.Trim() != "") { vidtipo = int.Parse(txtidTipo.Text); } clnTipos tipo = new clnTipos(); tipo.IdTipo = vidtipo; tipo.Buscar(); if (tipo.DescTipo == null) { //preparando para inclusao LimparTxt(groupBox1); txtidTipo.Text = ""; txtidTipo.Enabled = false; btnIncluir.Enabled = true; btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtidTipo.Enabled = false; txtidTipo.Text = Convert.ToString(tipo.IdTipo); txtdescTipo.Text = Convert.ToString(tipo.DescTipo); btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } }

68

Page 69: Csharp

}}

Formulário: FrmModelos Abaixo código completo com todos os eventos e métodos declarados:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios; namespace Seguros_OO.Camada_Apresentacao{ public partial class FrmModelos : Form { public FrmModelos() { InitializeComponent(); } //Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } } private void txtidModelo_Leave(object sender, EventArgs e) { int vidmodelo = 0; if (txtidModelo.Text.Trim() != "") { vidmodelo = int.Parse(txtidModelo.Text); } clnModelos modelo= new clnModelos(); modelo.IdModelo = vidmodelo;

69

Page 70: Csharp

modelo.Buscar(); if (modelo.DescModelo == null) { //preparando para inclusao LimparTxt(groupBox1); txtidModelo.Text = ""; txtidModelo.Enabled = false; btnIncluir.Enabled = true; btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtidModelo.Enabled = false; txtidModelo.Text = Convert.ToString(modelo.IdModelo); txtdescModelo.Text = Convert.ToString(modelo.DescModelo); txtdescMarca.Text = Convert.ToString(modelo.DescMarca); btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } } private void btnIncluir_Click(object sender, EventArgs e) { try { clnModelos modelo = new clnModelos(); //Dispara o método para buscar o idModelo modelo.IdModelo = modelo.BuscarId(); modelo.DescModelo = txtdescModelo.Text; modelo.DescMarca = txtdescMarca.Text; modelo.Gravar(); string mensagem = "Registro Modelo: " + modelo.IdModelo + "\nDescrição: " + modelo.DescModelo + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);

70

Page 71: Csharp

LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtidModelo.Enabled = true; txtidModelo.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } } private void btnAtualizar_Click(object sender, EventArgs e) { try { clnModelos modelo = new clnModelos(); modelo.IdModelo = int.Parse(txtidModelo.Text); modelo.DescModelo= txtdescModelo.Text; modelo.DescMarca = txtdescMarca.Text; modelo.Atualizar(); string mensagem = "Registro Modelo: " + modelo.IdModelo + "\nNome: " + modelo.DescModelo + "\nAlterado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidModelo.Enabled = true; txtidModelo.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } }

71

Page 72: Csharp

private void btnExcluir_Click(object sender, EventArgs e) { try { string pergunta; pergunta = "Deseja excluir o modelo: \n" + txtidModelo.Text + ": " + txtdescModelo.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { clnModelos modelo = new clnModelos(); modelo.IdModelo = int.Parse(txtidModelo.Text); modelo.DescModelo = txtdescModelo.Text; modelo.Excluir(); string mensagem = "Registro Dano: " + modelo.IdModelo + "\nDescrição: " + modelo.DescModelo + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidModelo.Enabled = true; txtidModelo.Focus(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch(Exception ex) { MessageBox.Show("Não foi possível excluir, aconteceu " + " o seguinte erro: "+ ex.Message.ToString());

72

Page 73: Csharp

} } private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidModelo.Enabled = true; txtidModelo.Focus(); } private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta Tipos de Danos"; f.Tag = "tbModelo"; //nome da tabela (macete) :) f.ShowDialog(); } private void btnSair_Click(object sender, EventArgs e) { this.Close(); } }}

Conclusão Como vimos. A tabela de apólices é considerada a mais importante do Sistema e para que possa ser feito o cadastro de uma nova apólice, precisamos de alguns dados auxiliares. Estes dados poderão ser cadastrados a partir das classes que representam a lógica de negócios e a respectiva camada de apresentação criadas durante este artigo. Respectivamente: Dano, Tipo de Sinistro, e Modelos de Carros. Gostaria de lembrar a todos que faltam apenas dois artigos, e ao final colocarei disponível o código, para que possíveis erros cometidos durante as partes mão na massa não venham a prejudicá-lo.

73

Page 74: Csharp

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 6 - Exemplo prático [Outras Classes]

Neste artigo vamos criar as classes que representam a lógica de negócios e a respectiva camada de apresentação para as informações sobre a apólice e parcelas, nesta mesma ordem, ou seja, serão adicionadas as classes: clnApolices.cs e clnParcelas, veja Figura 2 - Classes Adicionadas.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte 6)

IntroduçãoEste artigo é o sexto de uma série de artigos que apresentam um exemplo prático e simples abordando o desenvolvimento em camadas em C#, sabemos que a programação orientada a objetos (POO) possibilita uma abordagem simples para a utilização de dados usando objetos.

No último artigo, criamos as classes de negócio: clnDanos, clnTipo e clnModelos.

Observe a Figura 1 - Diagrama ER Numerado.

Figura 1 - Diagrama ER Numerado

74

Page 75: Csharp

Relembrando:

A tabela de apólices é sem dúvida a mais importante do Sistema e para que possa ser feito o cadastro de uma nova apólice inicialmente temos que possuir dados nas tabelas de clientes (tbCliente), não está numerada pois nos artigos anteriores implementamos sua funcionalidade, precisamos ter os dados já cadastrados na tabela de modelo de carros (tbModelo) [6] e a partir da apólice, gerar as parcelas [5] para o pagamento por parte do cliente.

Já em relação aos sinistros ocorridos [2] para que possa ser cadastrado, inicialmente temos que ter a apólice cadastrada [1] e também termos previamente cadastrados os tipos de danos [3] e os tipos de sinistros.

Neste artigo vamos criar as classes que representam a lógica de negócios e a respectiva camada de apresentação para as informações sobre a apólice e parcelas, nesta mesma ordem, ou seja, serão adicionadas as classes: clnApolices.cs e clnParcelas, veja Figura 2 - Classes Adicionadas.

Mão na Massa:

1) Com o aplicativo aberto adicione duas novas classes chamadas respectivamente: clnApolices.cs, clnParcelas.cs, conforme abaixo:

Figura 2 - Classes Adicionadas

Vamos iniciar o detalhamento da classe clnApolices, que representa a lógica de negócios sobre as apólices de seguros no sistema. A classe é composta pelos campos privados, propriedades de acesso e funções ilustradas na

75

Page 76: Csharp

Figura 3 - Classe: clnApolices.cs.

Figura 3 - Classe: clnApolices.cs

2) Abaixo código completo da classe clnApolices.cs

using System;using System.Collections.Generic;using System.Text;using System.Data;

namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios

76

Page 77: Csharp

{ public class clnApolices { //1 - Campos privados a classe private int idApolice; private int idCli; private int kmVeiApolice; private string numApolice; private DateTime dataApolice; private DateTime dataValApolice; private float valorApolice; private int idModelo; private bool sinistroApolice; private int idSinistro;

//2 - propriedades, acesso aos campos privados public int IdApolice { get { return idApolice; } set { idApolice = value; } } public int IdCli { get { return idCli; } set { idCli = value; } } public int KmVeiApolice { get { return kmVeiApolice; } set { kmVeiApolice = value; } } public string NumApolice { get { return numApolice; } set { numApolice = value; } } public DateTime DataApolice { get { return dataApolice; } set { dataApolice = value; } } public DateTime DataValApolice

77

Page 78: Csharp

{ get { return dataValApolice; } set { dataValApolice = value; } } public int IdModelo { get { return idModelo; } set { idModelo = value; } } public float ValorApolice { get { return valorApolice; } set { valorApolice = value; } } public bool SinistroApolice { get { return sinistroApolice; } set { sinistroApolice = value; } } public int IdSinistro { get { return idSinistro; } set { idSinistro = value; } }

//3 - métodos da classe de Negócios (clnApolices.cs)

//3.1 Buscar dados da apolice cujo codigo foi especificado public void Buscar() { string csql; csql = "Select * From tbApolice where idApolice=" + idApolice; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idApolice = Convert.ToInt32(dados.GetValue(0)); idCli = Convert.ToInt32(dados.GetValue(1)); kmVeiApolice = Convert.ToInt32(dados.GetValue(2));

78

Page 79: Csharp

numApolice = Convert.ToString(dados.GetValue(3)); dataApolice = Convert.ToDateTime(dados.GetValue(4)); dataValApolice = Convert.ToDateTime(dados.GetValue(5)); valorApolice = float.Parse(dados.GetValue(6).ToString()); idModelo = Convert.ToInt32(dados.GetValue(7)); sinistroApolice = Convert.ToBoolean(dados.GetValue(8)); idSinistro = Convert.ToInt32(dados.GetValue(9)); } }

//3.2 Buscar o próximo Id Numerico para //inclusao de um nova apólice. public int BuscarId() { string csql; csql = "Select Top 1 (idApolice) From tbApolice order by idApolice desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado = seguros.RetornarIdNumerico(csql); return IdBuscado; }

//3.3 Método para incluir uma nova apolice no //Banco de dados public void Gravar() { StringBuilder csql = new StringBuilder(); //tratando float e datas: string floatvalor = Convert.ToString(valorApolice).Replace(",", "."); string vDataApolice = dataApolice.ToString("MM/dd/yyyy"); string vDataValApolice = dataValApolice.ToString("MM/dd/yyyy");

csql.Append("Insert into tbApolice"); csql.Append("("); csql.Append("idApolice,"); csql.Append("idCli,"); csql.Append("kmVeiApolice,"); csql.Append("numApolice,"); csql.Append("dataApolice,"); csql.Append("dataValApolice,"); csql.Append("valorApolice,"); csql.Append("idModelo,");

79

Page 80: Csharp

csql.Append("sinistroApolice,"); csql.Append("idSinistro) Values("); csql.Append(idApolice); csql.Append("," + idCli + ","); csql.Append(kmVeiApolice + ","); csql.Append("'" + numApolice + "',"); csql.Append("'" + vDataApolice + "',"); csql.Append("'" + vDataValApolice + "',"); csql.Append("'" + floatvalor + "',"); csql.Append(idModelo + ","); csql.Append("'" + sinistroApolice + "',"); csql.Append(idSinistro + ")"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.4 Método para atualizar (alterar um registro) public void Atualizar() { string vValorApolice = Convert.ToString(valorApolice).Replace(",", "."); string vDataApolice = dataApolice.ToString("MM/dd/yyyy"); string vDataValApolice = dataValApolice.ToString("MM/dd/yyyy");

StringBuilder csql = new StringBuilder(); csql.Append("Update tbApolice "); csql.Append("set idApolice="); csql.Append(idApolice); csql.Append(", idcli="); csql.Append(idCli); csql.Append(", kmVeiApolice="); csql.Append(kmVeiApolice); csql.Append(", numApolice='"); csql.Append(numApolice); csql.Append("', dataApolice='"); csql.Append(vDataApolice); csql.Append("', dataValApolice='"); csql.Append(vDataValApolice); csql.Append("', valorApolice='"); csql.Append(vValorApolice); csql.Append("', idModelo="); csql.Append(idModelo); csql.Append(", idSinistro=");

80

Page 81: Csharp

csql.Append(idSinistro); csql.Append(" where idApolice="); csql.Append(idApolice); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.5 Método para excluir um cliente do //Banco de dados public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbApolice "); csql.Append(" where idApolice="); csql.Append(idApolice); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } }}3) Agora, vamos montar a classe que representa a lógica de negócios do controle de parcelas pagas e a pagar do Sistema de Apólices de Seguros. Esta classe possui métodos diferentes dos implementados até o momento que vale a pena ressaltar. Primeiro vamos conhecer a estrutura da classe clnParcelas, logo em seguida serão

81

Page 82: Csharp

explicadas as novidades nesta classe. Veja na Figura 4 - Classe: clnParcelas.cs.

Figura 4 - Classe: clnParcelas.cs

4) Código completo da classe acima representada.

using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.SqlClient;

namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ public class clnParcelas

82

Page 83: Csharp

{ //1 - Campos privados a classe private int nroParcela; private int idApolice; private DateTime dataVenParcela; private float valParcela; private bool quitadaParcela; private DateTime quitadaData;

//2 - propriedades, acesso aos campos privados public int NroParcela { get { return nroParcela; } set { nroParcela = value; } } public int IdApolice { get { return idApolice; } set { idApolice = value; } } public DateTime DataVenParcela { get { return dataVenParcela; } set { dataVenParcela = value; } } public float ValParcela { get { return valParcela; } set { valParcela = value; } } public bool QuitadaParcela { get { return quitadaParcela; } set { quitadaParcela = value; } } public DateTime QuitadaData { get { return quitadaData; } set { quitadaData = value; } }

//3 - métodos da classe de Negócios (clnParcelas.cs)83

Page 84: Csharp

//3.1 Buscar dados da Parcela da Apolice cujo codigo foi especificado public DataSet Buscar() { string csql; //note que aqui estamos filtrando pelo número idApolice csql = "Select * From tbParcela where idApolice=" + idApolice; DataSet ds; clsDados seguros = new clsDados(); //Essa Busca retorna um objeto dataset //que vai preencer o grid de parcelas ds = seguros.RetornarDataSet(csql); return ds; }

//3.2 Método para incluir uma parcela public void Gravar() { string floatvalor = Convert.ToString(valParcela).Replace(",", "."); string vDataVenParcela = dataVenParcela.ToString("MM/dd/yyyy"); string vQuidataData = quitadaData.ToString("MM/dd/yyyy"); if (vQuidataData.Trim() == "01/01/0001") vQuidataData = ""; StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbParcela"); csql.Append("("); csql.Append("nroParc,"); csql.Append("idApolice,"); csql.Append("dataVenParcela,"); csql.Append("valParcela,"); csql.Append("quitadaParcela,"); csql.Append("quitadaData) Values("); csql.Append(nroParcela); csql.Append("," + idApolice + ","); csql.Append("'" + vDataVenParcela + "',"); csql.Append("'" + floatvalor + "',"); csql.Append("'" + quitadaParcela + "',"); csql.Append("'" + vQuidataData + "')"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.3 Método para atualizar (alterar um registro)84

Page 85: Csharp

public void Atualizar() { string vQuidataData = quitadaData.ToString("MM/dd/yyyy"); string vdataVenParcela = dataVenParcela.ToString("MM/dd/yyyy"); StringBuilder csql = new StringBuilder(); csql.Append("Update tbParcela "); csql.Append("set nroParc="); csql.Append(nroParcela); csql.Append(", idApolice="); csql.Append(idApolice); csql.Append(", dataVenParcela='"); csql.Append(vdataVenParcela); csql.Append("', valParcela='"); csql.Append(valParcela.ToString().Replace(",",".")); csql.Append("', quitadaParcela='"); csql.Append(quitadaParcela); csql.Append("', quitadaData='"); csql.Append(vQuidataData); csql.Append("' where (idApolice="); csql.Append(idApolice); csql.Append(" and nroParc="); csql.Append(nroParcela); csql.Append(")"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.4 Método para excluir uma parcela public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbParcela "); csql.Append(" where nr0Pac="); csql.Append(nroParcela + " and "); csql.Append(" idApolice=" + idApolice); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } //3.5 Novo Método para Busca Específica de Parcela public void BuscarParcEspec() { string csql;

85

Page 86: Csharp

csql = "Select * From tbParcela where idApolice=" + idApolice + " and nroParc=" + nroParcela; DataSet ds; clsDados seguros = new clsDados(); ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; nroParcela = Convert.ToInt32(dados.GetValue(0)); idApolice = Convert.ToInt32(dados.GetValue(1)); dataVenParcela = Convert.ToDateTime(dados.GetValue(2)); valParcela = float.Parse(dados.GetValue(3).ToString()); quitadaParcela = Convert.ToBoolean(dados.GetValue(4)); quitadaData = Convert.ToDateTime(dados.GetValue(5)); } } }}

Camada de Apresentação

5) Uma vez montadas as classes, vamos alternar para a camada de apresentação e acrescentar dois novos formulários tipo Winforms, chamados respectivamente: FrmApolices.cs e FrmParcelas.cs, veja Figura 5 - Novos Formulários.

86

Page 87: Csharp

Figura 5 - Novos Formulários.

6) O primeiro formulário FrmApolices.cs deve possuir sua aparência conforme mostra a Figura 6 - Manutenção de Apólices.

Figura 6 - Manutenção de Apólices

Explicando o funcionamento do Formulário de Manutenção de Apólices.

Nesta tela o usuário poderá incluir novas apólices, consultar apólices existentes, excluir e alterar dados das apólices. Funcionalidades estas, que já foram explicadas nos artigos anteriores. Apesar disso, como este formulário pode ser considerado como um dos principais da aplicação, iremos comentar o código na seqüência da execução das ações por parte do usuário do sistema.

Detalhando:

Quando o formulário for carregado ficarão apenas habilitados os botões Procurar, Parcelas, Sair e Ver 87

Page 88: Csharp

Sinistro. Então modifique as propriedades enabled dos outros botões para false.

Quando o usuário digitar o Código da Apólice no Sistema, no momento em que o campo perder o foco, será executado uma busca no sistema que trará os dados de apólice cadastrado ou apresentará a indicação que indica um número automático para a nova apólice.

1) Abaixo o código que representa esse procedimento, txtidApolice_Leave(...):

private void txtidApolice_Leave(object sender, EventArgs e) { int vidApolice=0; if (txtidApolice.Text.Trim() != "") { vidApolice = int.Parse(txtidApolice.Text); } clnApolices apolice = new clnApolices(); apolice.IdApolice = vidApolice; apolice.Buscar(); if (apolice.IdCli == 0) { //preparando para inclusao LimparTxt(groupBox1); txtidApolice.Text = ""; txtidApolice.Enabled = false; btnIncluir.Enabled = true; btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtidApolice.Enabled = false; txtidApolice.Text = Convert.ToString(apolice.IdApolice); txtidCli.Text = Convert.ToString(apolice.IdCli); txtkmVeiApolice.Text = Convert.ToString(apolice.KmVeiApolice); txtnumApolice.Text = Convert.ToString(apolice.NumApolice); txtdataApolice.Text = apolice.DataApolice.ToShortDateString(); txtdataValApolice.Text = apolice.DataValApolice.ToShortDateString(); txtvalorApolice.Text = Convert.ToString(apolice.ValorApolice); txtidModelo.Text = Convert.ToString(apolice.IdModelo); if (apolice.SinistroApolice == true) optSim.Checked = true;

88

Page 89: Csharp

else optNao.Checked = true; txtidSinistro.Text = Convert.ToString(apolice.IdSinistro);

btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } }

O próximo código que é explicado agora, trata da busca do dado: nome na tabela: clientes, assim que for digitado um código para este. Quando ocorre uma mudança (TextChanged) na caixa de texto txtidCli é instanciado um objeto cliente e feito a procura do nome, retornando-o para o label lblnomeCli ou deixando este vazio.

2) Código do evento TextChanged do txtidCli abaixo:

private void txtidCli_TextChanged(object sender, EventArgs e) { clnClientes cliente = new clnClientes(); if (txtidCli.Text.Trim() == "") { lblnomeCli.Text = ""; return; } cliente.IdCli = int.Parse(txtidCli.Text); cliente.Buscar(); if (cliente.NomeCli != null) lblnomeCli.Text = cliente.NomeCli; else lblnomeCli.Text = ""; }

Da mesma forma ocorre quando a caixa de texto txtidModelo é alterada.

3) Abaixo código TextChanged da caixa de texto txtidModelo.

private void txtidModelo_TextChanged(object sender, EventArgs e) { clnModelos modelo = new clnModelos(); if (txtidModelo.Text.Trim() == "") {

89

Page 90: Csharp

lbldescModelo.Text = ""; return; } modelo.IdModelo = int.Parse(txtidModelo.Text); modelo.Buscar(); if (modelo.DescModelo != null) lbldescModelo.Text = modelo.DescModelo; else lbldescModelo.Text = ""; }

Você deve ter percebido os botões com este texto “[...]”. Estes botões tem como finalidade chamar o formulário de pesquisa genérico que criamos (artigos anteriores) passando o nome da tabela na propriedade tag, que já foi também explicado.

4) Abaixo código do evento Click no botão btnBuscaCli.

private void btnBuscaCli_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados dos clientes"; f.Tag = "tbCliente"; //nome da tabela (macete) :) f.ShowDialog(); }

5) Abaixo código do evento Click no botão btnBuscaMod.

private void btnBuscaMod_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados de Modelos Cadastrados"; f.Tag = "tbModelo"; //nome da tabela (macete) :) f.ShowDialog(); }

6) Abaixo código do botão btnIncluir. Evento click.

private void btnIncluir_Click(object sender, EventArgs e) { try { clnApolices apolice = new clnApolices();

90

Page 91: Csharp

//Dispara o método para buscar o idApolice apolice.IdApolice = apolice.BuscarId(); apolice.IdCli = int.Parse(txtidCli.Text); apolice.KmVeiApolice = int.Parse(txtkmVeiApolice.Text); apolice.NumApolice = txtnumApolice.Text; apolice.DataApolice =Convert.ToDateTime(txtdataApolice.Text); apolice.DataValApolice = Convert.ToDateTime(txtdataValApolice.Text); apolice.ValorApolice = float.Parse(txtvalorApolice.Text); apolice.IdModelo = int.Parse(txtidModelo.Text); if (optSim.Checked == true) apolice.SinistroApolice = true; if (optNao.Checked == true) apolice.SinistroApolice = false; if (txtidSinistro.Text.Trim()!="") apolice.IdSinistro = int.Parse(txtidSinistro.Text); apolice.Gravar(); string mensagem = "Registro Apólice: " + apolice.IdApolice + "\nNome: " + lblnomeCli.Text + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); }

}

7) Abaixo código do botão btnAtualizar. Evento click.

private void btnAtualizar_Click(object sender, EventArgs e) { try { clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text);

91

Page 92: Csharp

apolice.IdCli = int.Parse(txtidCli.Text); apolice.KmVeiApolice = int.Parse(txtkmVeiApolice.Text); apolice.NumApolice = txtnumApolice.Text; apolice.DataApolice = DateTime.Parse(txtdataApolice.Text); apolice.DataValApolice = DateTime.Parse(txtdataValApolice.Text); apolice.ValorApolice = float.Parse(txtvalorApolice.Text); apolice.IdModelo = int.Parse(txtidModelo.Text); if (optSim.Checked == true) apolice.SinistroApolice = true; else apolice.SinistroApolice = false; if (txtidSinistro.Text.Trim() != "") apolice.IdSinistro = int.Parse(txtidSinistro.Text); apolice.Atualizar(); string mensagem = "Registro Apólice: " + apolice.IdApolice + "\nApolice: " + apolice.NumApolice + "\nNome: " + lblnomeCli.Text + "\nAlterada com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } }

8) Abaixo código do botão btnExcluir. Evento click.

private void btnExcluir_Click(object sender, EventArgs e) {

92

Page 93: Csharp

string pergunta; pergunta = "Deseja excluir a apolice de: \n" + lblnomeCli.Text + " N Registro: " + txtidApolice.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Excluir(); string mensagem = "Registro Apólice de: " + lblnomeCli.Text + "\nN registro: " + apolice.IdApolice + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); }

}

9) Abaixo código do botão btnCancelar. Evento click.

private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false;

93

Page 94: Csharp

btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); }

10) Abaixo código do botão btnSair. Evento click.

private void btnSair_Click(object sender, EventArgs e) { this.Close(); }

11) Abaixo código do botão btnProcurar. Evento click.

private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados de Apolices"; f.Tag = "tbApolice"; //nome da tabela (macete) :) f.ShowDialog(); }

Já o evento do botão btnParcelas, merece alguns comentários. Primeiramente é instanciado uma variável objeto que chamamos de parcela, a qual recebe o número da apólice digitada pelo usuário na caixa de texto txtidApolice. É instanciado um novo formulário e passado alguns valores para objetos pertencentes ao formulário, que ainda criaremos, que é o FrmParcelas.cs. Importante: você só terá acesso aos objetos do formulário instanciados se o modificador de acesso estiver como público, ou seja, a propriedade Modifiers de cada objeto deve estar como Public no formulário FrmParcelas.

12) Abaixo código do evento click desse botão.

private void btnParcelas_Click(object sender, EventArgs e) { clnApolices apolice = new clnApolices(); if (txtidApolice.Text == "") { MessageBox.Show("Selecione uma Apólice"); return; } apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar();

94

Page 95: Csharp

FrmParcelas f = new FrmParcelas(); f.txtdataApolice.Text = apolice.DataApolice.ToShortDateString(); f.txtidApolice.Text = Convert.ToString(apolice.IdApolice); f.txtnomeCli.Text = Convert.ToString(lblnomeCli.Text); f.ShowDialog(); }

Bom, terminamos o formulário FrmApolices.cs. Antes de continuarmos, vou deixar o código completo aqui para facilitar, caso você queira copiá-lo todo. Lembre-se depois de instanciar os eventos, caso contrário dá erro.

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios;

namespace Seguros_OO.Camada_Apresentacao{ public partial class FrmApolices : Form { public FrmApolices() { InitializeComponent(); }

//Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } }

private void txtidApolice_Leave(object sender, EventArgs e) { int vidApolice=0; if (txtidApolice.Text.Trim() != "")

95

Page 96: Csharp

{ vidApolice = int.Parse(txtidApolice.Text); } clnApolices apolice = new clnApolices(); apolice.IdApolice = vidApolice; apolice.Buscar(); if (apolice.IdCli == 0) { //preparando para inclusao LimparTxt(groupBox1); txtidApolice.Text = ""; txtidApolice.Enabled = false; btnIncluir.Enabled = true; btnCancelar.Enabled = true; } else { //preparando para alteracao LimparTxt(groupBox1); txtidApolice.Enabled = false; txtidApolice.Text = Convert.ToString(apolice.IdApolice); txtidCli.Text = Convert.ToString(apolice.IdCli); txtkmVeiApolice.Text = Convert.ToString(apolice.KmVeiApolice); txtnumApolice.Text = Convert.ToString(apolice.NumApolice); txtdataApolice.Text = apolice.DataApolice.ToShortDateString(); txtdataValApolice.Text = apolice.DataValApolice.ToShortDateString(); txtvalorApolice.Text = Convert.ToString(apolice.ValorApolice); txtidModelo.Text = Convert.ToString(apolice.IdModelo); if (apolice.SinistroApolice == true) optSim.Checked = true; else optNao.Checked = true; txtidSinistro.Text = Convert.ToString(apolice.IdSinistro);

btnAtualizar.Enabled = true; btnCancelar.Enabled = true; btnExcluir.Enabled = true; } }

private void btnIncluir_Click(object sender, EventArgs e) {

96

Page 97: Csharp

try { clnApolices apolice = new clnApolices(); //Dispara o método para buscar o idApolice apolice.IdApolice = apolice.BuscarId(); apolice.IdCli = int.Parse(txtidCli.Text); apolice.KmVeiApolice = int.Parse(txtkmVeiApolice.Text); apolice.NumApolice = txtnumApolice.Text; apolice.DataApolice =Convert.ToDateTime(txtdataApolice.Text); apolice.DataValApolice = Convert.ToDateTime(txtdataValApolice.Text); apolice.ValorApolice = float.Parse(txtvalorApolice.Text); apolice.IdModelo = int.Parse(txtidModelo.Text); if (optSim.Checked == true) apolice.SinistroApolice = true; if (optNao.Checked == true) apolice.SinistroApolice = false; if (txtidSinistro.Text.Trim()!="") apolice.IdSinistro = int.Parse(txtidSinistro.Text); apolice.Gravar(); string mensagem = "Registro Apólice: " + apolice.IdApolice + "\nNome: " + lblnomeCli.Text + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnIncluir.Enabled = false; btnCancelar.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); }

}

private void btnAtualizar_Click(object sender, EventArgs e) { try { clnApolices apolice = new clnApolices();

97

Page 98: Csharp

apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.IdCli = int.Parse(txtidCli.Text); apolice.KmVeiApolice = int.Parse(txtkmVeiApolice.Text); apolice.NumApolice = txtnumApolice.Text; apolice.DataApolice = DateTime.Parse(txtdataApolice.Text); apolice.DataValApolice = DateTime.Parse(txtdataValApolice.Text); apolice.ValorApolice = float.Parse(txtvalorApolice.Text); apolice.IdModelo = int.Parse(txtidModelo.Text); if (optSim.Checked == true) apolice.SinistroApolice = true; else apolice.SinistroApolice = false; if (txtidSinistro.Text.Trim() != "") apolice.IdSinistro = int.Parse(txtidSinistro.Text); apolice.Atualizar(); string mensagem = "Registro Apólice: " + apolice.IdApolice + "\nApolice: " + apolice.NumApolice + "\nNome: " + lblnomeCli.Text + "\nAlterada com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); }

}

private void btnExcluir_Click(object sender, EventArgs e) { string pergunta; pergunta = "Deseja excluir a apolice de: \n" +

98

Page 99: Csharp

lblnomeCli.Text + " N Registro: " + txtidApolice.Text + " ?"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Excluir(); string mensagem = "Registro Apólice de: " + lblnomeCli.Text + "\nN registro: " + apolice.IdApolice + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); LimparTxt(groupBox1); btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); }

}

private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox1); btnIncluir.Enabled = false; btnAtualizar.Enabled = false; btnCancelar.Enabled = false; btnExcluir.Enabled = false; txtidApolice.Enabled = true; txtidApolice.Focus();

99

Page 100: Csharp

}

private void btnSair_Click(object sender, EventArgs e) { this.Close(); }

private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados de Apolices"; f.Tag = "tbApolice"; //nome da tabela (macete) :) f.ShowDialog(); }

private void txtidCli_TextChanged(object sender, EventArgs e) { clnClientes cliente = new clnClientes(); if (txtidCli.Text.Trim() == "") { lblnomeCli.Text = ""; return; } cliente.IdCli = int.Parse(txtidCli.Text); cliente.Buscar(); if (cliente.NomeCli != null) lblnomeCli.Text = cliente.NomeCli; else lblnomeCli.Text = ""; }

private void btnBuscaCli_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados dos clientes"; f.Tag = "tbCliente"; //nome da tabela (macete) :) f.ShowDialog(); }

private void btnBuscaMod_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa();

100

Page 101: Csharp

f.Text = "Consulta dados de Modelos Cadastrados"; f.Tag = "tbModelo"; //nome da tabela (macete) :) f.ShowDialog(); }

private void txtidModelo_TextChanged(object sender, EventArgs e) { clnModelos modelo = new clnModelos(); if (txtidModelo.Text.Trim() == "") { lbldescModelo.Text = ""; return; } modelo.IdModelo = int.Parse(txtidModelo.Text); modelo.Buscar(); if (modelo.DescModelo != null) lbldescModelo.Text = modelo.DescModelo; else lbldescModelo.Text = ""; }

private void btnParcelas_Click(object sender, EventArgs e) { clnApolices apolice = new clnApolices(); if (txtidApolice.Text == "") { MessageBox.Show("Selecione uma Apólice"); return; } apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar(); FrmParcelas f = new FrmParcelas(); f.txtdataApolice.Text = apolice.DataApolice.ToShortDateString(); f.txtidApolice.Text = Convert.ToString(apolice.IdApolice); f.txtnomeCli.Text = Convert.ToString(lblnomeCli.Text); f.ShowDialog(); } }}

Explicando o funcionamento do Formulário de Manutenção de Parcelas.101

Page 102: Csharp

1) O segundo formulário, deste artigo, é o FrmParcelas.cs, que deve possuir a aparência conforme mostra a Figura 7 - Manutenção de Parcelas.

Figura 7 - Manutenção de Parcelas

2) Altere as propriedades enabled dos controles txtparcquit, dtDataQuit e btnOk, para false, ou seja, esses controles estarão desabilitados, a não ser que trate-se de uma quitação de parcelas. Fato que ocorrerá quando o usuário clicar no botão btnQuitar.

O formulário será carregado quando o usuário clicar no botão Parcelas do formulário FrmApolices.cs.

Ao ser carregado, ele recebe os valores passados através do outro form, como também vimos anteriormente. Estes valores recebidos, são tratados logo no evento Load do formulário.

3) Abaixo o código do evento Load do FrmParcelas.cs

102

Page 103: Csharp

private void FrmParcelas_Load(object sender, EventArgs e) { clnParcelas parcela = new clnParcelas(); parcela.IdApolice = int.Parse(txtidApolice.Text); this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; int cont = this.dgParcelas.Rows.Count; if (cont == 0) { btnGerar.Enabled = true; btnQuitar.Enabled = false; } else { btnGerar.Enabled = false; btnQuitar.Enabled = true; txtnumGerar.Enabled = false; txtValorParcela.Enabled = false; txtVcto.Enabled = false; }

O Bloco if acima (cont==0), será executado quando não houver parcelas ainda cadastradas para a apólice recuperada. Tratamos os botões gerar e quitar respectivamente para ambos os casos, ou seja, se não houver parcelas cadastradas o botão gerar será habilitado e o quitar desabilitado, caso contrário, ocorre o oposto.

baixo o código para gerar parcelas.

4) Evento click do botão btnGerar.

private void btnGerar_Click(object sender, EventArgs e) { clnParcelas parcela = new clnParcelas(); int numParcGerar = int.Parse(txtnumGerar.Text); if ((numParcGerar <= 0) || (numParcGerar > 12)) { MessageBox.Show("Número de parcelas entre 1 e 12"); return; } if(float.Parse(txtValorParcela.Text.Replace(",",".")) <= 0) { MessageBox.Show("Valor de Parcela Inválido"); return; }

103

Page 104: Csharp

try { DateTime data = Convert.ToDateTime(txtVcto.Text); string Mensagem; Mensagem = "Serão geradas " + txtnumGerar.Text + " parcelas, com a primeira data de vencimento " + "em " + data.ToShortDateString(); MessageBox.Show(Mensagem); //gerando parcelas. int i = 0; for (i = 0; i < numParcGerar; i++) { parcela.NroParcela = i + 1; parcela.IdApolice = int.Parse(txtidApolice.Text); parcela.DataVenParcela = data; data = data.AddDays(30); parcela.ValParcela = float.Parse(txtValorParcela.Text); parcela.Gravar(); } this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; }

catch (Exception ex) { MessageBox.Show("Ocorreu o erro: " + ex.Message); } }Alguns comentários sobre esse evento. Inicialmente instanciamos a parcela. Verificamos se o número de parcelas está dentro da faixa possível entre 1 e o número de parcelas que existir. E também verificamos se já não está quitada. Se as condições para gerar as parcelas forem atendidas, o bloco for é responsável pela inserção de novas parcelas na tbParcela. E mais abaixo a propriedade DataSource do dgParcelas é atualizada com as parcelas geradas sendo assim exibidas no grid.

5) Agora vamos ao código que responderá ao evento click no botão btnQuitar.

private void btnQuitar_Click(object sender, EventArgs e) { this.txtparcquit.Enabled = true; this.dtDataQuit.Enabled = true; this.dtDataQuit.Value= DateTime.Now; btnOk.Enabled = true; this.txtparcquit.Focus();

104

Page 105: Csharp

this.btnQuitar.Enabled = false; }

Esse código é simples, apenas habilita os controles acima do grid para a digitação do número da parcela a quitar e a data respectiva da quitação.

6) Agora o código que executa o lançamento de quitação de parcelas manualmente pelo usuário. Evento click do botão btnOk.

private void btnOk_Click(object sender, EventArgs e) { try { int vnumParc = int.Parse(txtparcquit.Text); if (vnumParc > dgParcelas.Rows.Count || vnumParc<=0) { MessageBox.Show("Parcela Inválida"); return; } clnParcelas parcela = new clnParcelas(); parcela.IdApolice = int.Parse(txtidApolice.Text); parcela.NroParcela = vnumParc; parcela.BuscarParcEspec(); if (parcela.QuitadaParcela == true) { MessageBox.Show("Parcela já quitada"); return; } parcela.QuitadaParcela = true; parcela.QuitadaData = dtDataQuit.Value; parcela.Atualizar(); //atualiza o grid this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; this.txtparcquit.Enabled = false; this.dtDataQuit.Enabled = false; btnOk.Enabled = false; this.btnQuitar.Enabled = true; MessageBox.Show("Quitação Registrada"); } catch (Exception ex) { MessageBox.Show("Ocorreu o erro: " + ex.Message);

105

Page 106: Csharp

} }

Abaixo todo o código desse formulário:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios;

namespace Seguros_OO.Camada_Apresentacao{ public partial class FrmParcelas : Form { public FrmParcelas() { InitializeComponent(); } private void btnGerar_Click(object sender, EventArgs e) { clnParcelas parcela = new clnParcelas(); int numParcGerar = int.Parse(txtnumGerar.Text); if ((numParcGerar <= 0) || (numParcGerar > 12)) { MessageBox.Show("Número de parcelas entre 1 e 12"); return; } if(float.Parse(txtValorParcela.Text.Replace(",",".")) <= 0) { MessageBox.Show("Valor de Parcela Inválido"); return; } try { DateTime data = Convert.ToDateTime(txtVcto.Text); string Mensagem; Mensagem = "Serão geradas " + txtnumGerar.Text +

106

Page 107: Csharp

" parcelas, com a primeira data de vencimento " + "em " + data.ToShortDateString(); MessageBox.Show(Mensagem); //gerando parcelas. int i = 0; for (i = 0; i < numParcGerar; i++) { parcela.NroParcela = i + 1; parcela.IdApolice = int.Parse(txtidApolice.Text); parcela.DataVenParcela = data; data = data.AddDays(30); parcela.ValParcela = float.Parse(txtValorParcela.Text); parcela.Gravar(); } this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; }

catch (Exception ex) { MessageBox.Show("Ocorreu o erro: " + ex.Message); } }

private void FrmParcelas_Load(object sender, EventArgs e) { clnParcelas parcela = new clnParcelas(); parcela.IdApolice = int.Parse(txtidApolice.Text); this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; int cont = this.dgParcelas.Rows.Count; if (cont == 0) { btnGerar.Enabled = true; btnQuitar.Enabled = false; } else { btnGerar.Enabled = false; btnQuitar.Enabled = true; txtnumGerar.Enabled = false; txtValorParcela.Enabled = false; txtVcto.Enabled = false; }

107

Page 108: Csharp

} private void btnQuitar_Click(object sender, EventArgs e) { this.txtparcquit.Enabled = true; this.dtDataQuit.Enabled = true; this.dtDataQuit.Value= DateTime.Now; btnOk.Enabled = true; this.txtparcquit.Focus(); this.btnQuitar.Enabled = false; } private void btnOk_Click(object sender, EventArgs e) { try { int vnumParc = int.Parse(txtparcquit.Text); if (vnumParc > dgParcelas.Rows.Count || vnumParc<=0) { MessageBox.Show("Parcela Inválida"); return; } clnParcelas parcela = new clnParcelas(); parcela.IdApolice = int.Parse(txtidApolice.Text); parcela.NroParcela = vnumParc; parcela.BuscarParcEspec(); if (parcela.QuitadaParcela == true) { MessageBox.Show("Parcela já quitada"); return; } parcela.QuitadaParcela = true; parcela.QuitadaData = dtDataQuit.Value; parcela.Atualizar(); //atualiza o grid this.dgParcelas.DataSource = parcela.Buscar().Tables[0]; this.txtparcquit.Enabled = false; this.dtDataQuit.Enabled = false; btnOk.Enabled = false; this.btnQuitar.Enabled = true; MessageBox.Show("Quitação Registrada"); }

108

Page 109: Csharp

catch (Exception ex) { MessageBox.Show("Ocorreu o erro: " + ex.Message); } } }}

Conclusão:

Nesse artigo criamos as classes que representam a lógica de negócios e a respectiva camada de apresentação para as informações sobre a apólice e parcelas, nesta mesma ordem, ou seja, foram adicionadas as novas classes: clnApolices.cs e clnParcelas e criados dois novos formulários o FrmApolices.cs e o FrmParcelas.cs

Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte FINAL - Exemplo prático

Neste último artigo vamos criar a classe que representa a lógica de negócio e a respectiva camada de apresentação para as informações sobre sinistros, ou seja, será adicionada a classe: clnSinistros.

Desenvolvendo uma aplicação Multicamadas para Windows em C#

Parte Final)

Introdução

Bom. :-) Saudações aos amigos que chegaram até aqui. Agradeço aos que adicionaram os meus artigos como seus favoritos, pois me motivaram a escrever mais. Gostaria de fazer apenas um pequeno esclarecimento antes de iniciar esta última parte.

Gosto de escrever e não tenho intenção em cobrar por meus artigos aqui no devmedia, não tenho nada contra aos posts pagos, ao contrátio, acho importante que as pessoas recebam pelo trabalho que fazem. Porém o meu objetivo é compartilhar conhecimento, trocar experiências e aprender com os demais colegas de profissão que comungam da mesma idéia. Sempre compro posts dos meus autores favoritos. Mas acho que em parte limitam essa minha intenção. O importante é que mais pessoas comecem a escrever e descobrir o quanto esta comunidade colabora com suas dúvidas e principalmente críticas construtivas. Isto só contribui para os meus conhecimentos e aprendizado de todos. Feito a observação. Vamos a parte final.

109

Page 110: Csharp

Este artigo é o último de uma série de sete artigos que apresentaram ao longo deste úmtimo mês um exemplo prático e simples abordando o desenvolvimento em camadas em C#.

No artigo passado, número seis, criamos as classes de negócio que clnApolices e clnParcelas, além dos formulários que compõem a camada de apresentação.

Veja novamente a Figura 1 - Diagrama ER Numerado.

Figura 1 - Diagrama ER Numerado

Relembrando:

A tabela de apólices é sem dúvida a mais importante do Sistema e para que possa ser feito o cadastro de uma nova apólice inicialmente temos que possuir dados nas tabelas de clientes (tbCliente), não está numerada pois nos artigos anteriores implementamos sua funcionalidade. Precisamos ter os dados já cadastrados na tabela de

110

Page 111: Csharp

modelo de carros (tbModelo) [6] e a partir da apólice gerar as parcelas [5] para o pagamento por parte do cliente.

Já em relação aos sinistros ocorridos [2] para que possa ser cadastrado, inicialmente temos que ter a apólice cadastrada [1] e termos também previamente cadastrados os tipos de danos [3] e os tipos de sinistros já cadastrados.

Neste último artigo vamos criar a classe que representa a lógica de negócio e a respectiva camada de apresentação para as informações sobre sinistros, ou seja, será adicionada a classe: clnSinistros.

Também adicionaremos um formulário de splash e um formulário principal na camada de apresentação.

Mão na Massa:

1) Com o aplicativo aberto adicione uma nova classe chamada clnSinistros.cs.

2) Abaixo código da classe clnSinistro.cs, se você tem acompanhado os artigos, não há funcionalidades difirentes das já implementadas.

using System;using System.Collections.Generic;using System.Text;using System.Data;

namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios{ public class clnSinistros { //1 - Campos privados a classe

111

Page 112: Csharp

private int idSinistro; private DateTime dataSinistro; private int idTipo; private int idDano; private string descSinistro;

//2 - propriedades, acesso aos campos privados public int IdSinistro { get { return idSinistro; } set { idSinistro = value; } } public DateTime DataSinistro { get { return dataSinistro; } set { dataSinistro = value; } } public int IdTipo { get { return idTipo; } set { idTipo = value; } } public int IdDano { get { return idDano; } set { idDano = value; } } public string DescSinistro { get { return descSinistro; } set { descSinistro = value; } } //3 - métodos da classe de Negócios (clnSinistro.cs)

//3.1 Buscar dados cujo codigo foi especificado public void Buscar() { string csql; csql = "Select * From tbSinistro where idSinistro=" + idSinistro; DataSet ds; clsDados seguros = new clsDados();

112

Page 113: Csharp

ds = seguros.RetornarDataSet(csql); if (ds.Tables[0].Rows.Count > 0) { Array dados = ds.Tables[0].Rows[0].ItemArray; idSinistro = Convert.ToInt16(dados.GetValue(0)); dataSinistro = Convert.ToDateTime(dados.GetValue(1)); descSinistro = Convert.ToString(dados.GetValue(2)); idTipo = Convert.ToInt16(dados.GetValue(3)); idDano = Convert.ToInt16(dados.GetValue(4)); } }

//3.2 Buscar o próximo Id Numerico para //inclusao de um novo sinistro. public int BuscarId() { string csql; csql = "Select Top 1 (idSinistro) From tbSinistro order by idSinistro desc"; int IdBuscado; clsDados seguros = new clsDados(); IdBuscado = seguros.RetornarIdNumerico(csql); return IdBuscado; }

//3.3 Método para incluir um novo sinistro no //Banco de dados public void Gravar() { string vdatasinistro = dataSinistro.ToString("MM/dd/yyyy"); StringBuilder csql = new StringBuilder(); csql.Append("Insert into tbSinistro"); csql.Append("("); csql.Append("idSinistro,"); csql.Append("dataSinistro,"); csql.Append("descSinistro,"); csql.Append("idTipo,"); csql.Append("idDano"); csql.Append(") Values("); csql.Append(idSinistro); csql.Append(",'" + vdatasinistro + "',"); csql.Append("'" + descSinistro + "',"); csql.Append(idTipo + ",");

113

Page 114: Csharp

csql.Append(idDano + ")"); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.4 Método para atualizar (alterar um registro) public void Atualizar() { string vdatasinistro = dataSinistro.ToString("MM/dd/yyyy"); StringBuilder csql = new StringBuilder(); csql.Append("Update tbSinistro "); csql.Append("set idSinistro="); csql.Append(idSinistro); csql.Append(", dataSinistro='"); csql.Append(vdatasinistro); csql.Append("', descSinistro='"); csql.Append(descSinistro); csql.Append("', idTipo="); csql.Append(idTipo); csql.Append(", idDano="); csql.Append(idDano); csql.Append(" where idSinistro="); csql.Append(idSinistro); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); }

//3.5 Método para excluir um cliente do //Banco de dados public void Excluir() { StringBuilder csql = new StringBuilder(); csql.Append("Delete From tbSinistro "); csql.Append(" where idSinistro="); csql.Append(idSinistro); clsDados seguros = new clsDados(); seguros.ExecutarComando(csql.ToString()); } }}

3 ) Agora, alterne para a camada de apresentação, inclua um novo formulário com o nome FrmSinistro.cs. 114

Page 115: Csharp

Figura 2 - FrmSinistros.cs

4) Acrescente os controles no formulário e altere as propriedades conforme figura:

115

Page 116: Csharp

Figura 3 - Formulários (FrmSinistros)

5) Altere as propriedades de todos os botões para enabled = false.

6) Declare os namespace. Conforme abaixo:using System;using System.Collections.Generic;using System.ComponentModel;

116

Page 117: Csharp

using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Seguros_OO.Camada_Intermediaria.Logica_Negocios;

7) Inclua o método para limpar as caixas de textos.

//Método público para limpar caixas de texto public void LimparTxt(Control controles) { foreach (Control ctl in controles.Controls) { if (ctl is TextBox) ctl.Text = ""; } }

8) Acrescente um método publico sem retorno (void) chamado cancelar( ).

private void cancelar() { groupBox2.Enabled = false; groupBox1.Enabled = true; txtidApolice.Text = ""; txtidApolice.Enabled = true; txtidApolice.Focus(); btnAtualizar.Enabled = false; btnIncluir.Enabled = false; btnExcluir.Enabled = false; btnCancelar.Enabled = false; }

9) Evento para o formulário Load, assim que o formulário for carregado, realizaremos duas tarefas. Instanciamos o objeto dadosDanos a partir da classe clnDanos( ) e o objeto dadosTipo a partir da classe clnTipos. Disparamos o método BuscarTodos( ) com a finalidade de “amarrar” os combos, ou seja, o usuário terá no campo visual o conteúdo do campo descDano e descTipo respectivamente, mas o valor di item são os dipostos na propriedade DisplayMember de cada uma. Abaixo código comentado.

Private void FrmSinistros_Load(object sender, EventArgs e) { clnDanos dadosDanos = new clnDanos(); clnTipos dadosTipo = new clnTipos();

117

Page 118: Csharp

DataSet dsDanos = dadosDanos.BuscarTodos(); DataSet dsTipos = dadosTipo.BuscarTodos(); //amarrando os combos. //Exibindos descrições porém atrelamos o código //para gravação. cmbTipoDano.DataSource = dsDanos.Tables[0]; cmbTipoDano.DisplayMember = “descDano”; cmbTipoDano.ValueMember= “idDano”; cmbTipoSinistro.DataSource = dsTipos.Tables[0]; cmbTipoSinistro.DisplayMember = “descTipo”; cmbTipoSinistro.ValueMember = “idTipo”; }

10) Evento TexChanged do campo txtidApolice. Ao alterar o contéudo do campo, instanciamos o objeto apolice a partir da classe clnApolices( ) e o objeto cliente a partir da classe clnClientes. A finalidade do código é preencher os campos do tipo label.

private void txtidApolice_TextChanged(object sender, EventArgs e) { clnApolices apolice = new clnApolices(); if (txtidApolice.Text.Trim() == "") { lblnomeCli.Text = ""; lbldescModelo.Text = ""; return; } apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar(); clnClientes cliente = new clnClientes(); cliente.IdCli = apolice.IdCli; cliente.Buscar(); lblnomeCli.Text = cliente.NomeCli; clnModelos modelo = new clnModelos(); modelo.IdModelo = apolice.IdModelo; modelo.Buscar(); lbldescModelo.Text = modelo.DescModelo; if (lblnomeCli.Text == "") btnSinistro.Enabled = false; else btnSinistro.Enabled = true; }

118

Page 119: Csharp

11) Evento click do botão btnBuscar.

private void btnBuscar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta dados das Apólices"; f.Tag = "tbApolice"; //nome da tabela (macete) :) f.ShowDialog(); }

12) Evento click do botão btnSinistro.

private void btnSinistro_Click(object sender, EventArgs e) { groupBox2.Enabled = true; clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar(); if (apolice.IdSinistro != 0) { MessageBox.Show("Cliente já possui apólice, \n" + "Você só poderá alterar esses dados", "Aviso"); clnSinistros sinistro = new clnSinistros(); sinistro.IdSinistro = apolice.IdSinistro; sinistro.Buscar(); txtidSinistro.Text = Convert.ToString(sinistro.IdSinistro); txtdataSinistro.Text = sinistro.DataSinistro.ToString("dd/MM/yyyy"); txtdescSinistro.Text = sinistro.DescSinistro; clnDanos dano = new clnDanos(); dano.IdDano = sinistro.IdDano; dano.Buscar(); cmbTipoDano.Text = dano.DescDano; clnTipos tipo = new clnTipos(); tipo.IdTipo = sinistro.IdTipo; tipo.Buscar(); cmbTipoSinistro.Text = tipo.DescTipo; txtidSinistro.Enabled = false; txtdataSinistro.Focus(); btnAtualizar.Enabled = true; btnIncluir.Enabled = false; btnExcluir.Enabled = true; btnCancelar.Enabled = true;

119

Page 120: Csharp

} else { txtidSinistro.Text = ""; txtdataSinistro.Text = ""; txtdescSinistro.Text = ""; txtidSinistro.Enabled = false; txtdataSinistro.Focus(); btnAtualizar.Enabled = false; btnIncluir.Enabled = true; btnExcluir.Enabled = false; btnCancelar.Enabled = true; } groupBox1.Enabled = false; }

No código acima, vamos por parte. A primeira coisa que fizemos foi habilitar o groupbox2, conteiner onde se encontram os controles do cadastro de sinistros. Em seguida instanciamos um objeto apolice a partir da classe clnApolices( ), com a finalidade de verificar se houve sinistro para a apólice em questão. Se o valor do campo idSinistro for diferente de zero, indica que o cliente já possui apólice, sendo assim informamos ao mesmo que essa apólice só pode ser alterada, na verdade ela pode ser excluída, mas isso, não nos cabe orientá-lo (usuário do sistema). Instanciamos o objeto dano e o objeto tipo para alimentar os campos combo com a descrição do sinistro localizado. O restante do código já está bastante explorado.

13) Evento click do botão incluir.

private void btnIncluir_Click(object sender, EventArgs e) { try { clnSinistros sinistro = new clnSinistros(); sinistro.IdSinistro = sinistro.BuscarId(); sinistro.DataSinistro = Convert.ToDateTime(txtdataSinistro.Text); sinistro.DescSinistro = txtdescSinistro.Text; sinistro.IdTipo = Convert.ToInt16(cmbTipoSinistro.SelectedValue); sinistro.IdDano = Convert.ToInt16(cmbTipoDano.SelectedValue); sinistro.Gravar(); //atualizar a tabela de apólice com o número do sinistro //e checar a apolice para sinistrada. clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar();

120

Page 121: Csharp

apolice.SinistroApolice = true; apolice.IdSinistro = sinistro.IdSinistro; apolice.Atualizar(); //mostra mensagem string mensagem = "Sinistro: " + sinistro.IdSinistro + "\nCliente: " + lblnomeCli.Text + "\nGravado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information); //chamar metodo cancelar (apenas desabilita os botões) cancelar(); LimparTxt(groupBox2); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); } }

No código acima, também atualizamos a tabela de apólices com as informações da ocorrência de sinistro. Mais tarde alteraremos o código do botão btnVer no formulário de apólices que abrirá o formulário de sinistro para que possa ser verificado os dados do sinistro.

14) Evento do botão Atualizar.

private void btnAtualizar_Click(object sender, EventArgs e) { try { clnSinistros sinistro = new clnSinistros(); sinistro.IdSinistro= int.Parse(txtidSinistro.Text); sinistro.DataSinistro = Convert.ToDateTime(txtdataSinistro.Text); sinistro.DescSinistro = txtdescSinistro.Text; sinistro.IdTipo = Convert.ToInt16(cmbTipoSinistro.SelectedValue); sinistro.IdDano = Convert.ToInt16(cmbTipoDano.SelectedValue); sinistro.Atualizar(); string mensagem = "Registro Sinsitro: " + sinistro.IdSinistro + "\nNome: " + lblnomeCli.Text + "\nAlterado com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK,

121

Page 122: Csharp

MessageBoxIcon.Information); LimparTxt(groupBox2); cancelar(); } catch (Exception ex) { MessageBox.Show("Aconteu o erro: " + ex.Message, "Erro"); }}

15) Evento do botão excluir.

private void btnExcluir_Click(object sender, EventArgs e) { string pergunta; pergunta = "Deseja excluir o Sinistro: " + txtidSinistro.Text + ", do cliente: " + lblnomeCli.Text + "\ndo Cadastro Atual. ?" + "\n\n\nLembre-se essa ação deverá ocorrer " + "\nsomente em caso de ESTORNO"; int ret = Convert.ToInt16(MessageBox.Show(pergunta, "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question)); if (ret == 6) { //primeiro devemos fazer a atualização na //tabela de apolice. clnApolices apolice = new clnApolices(); apolice.IdApolice = int.Parse(txtidApolice.Text); apolice.Buscar(); apolice.SinistroApolice = false; apolice.IdSinistro = 0; apolice.Atualizar(); //agora excluir da tabela de sinistro clnSinistros sinistro = new clnSinistros(); sinistro.IdSinistro = int.Parse(txtidSinistro.Text); sinistro.Excluir(); string mensagem = "Registro Sinistro: " + sinistro.IdSinistro + "\nNome: " + lblnomeCli.Text + "\nExcluído com sucesso"; MessageBox.Show(mensagem, "Sucesso", MessageBoxButtons.OK,

122

Page 123: Csharp

MessageBoxIcon.Information); LimparTxt(groupBox2); cancelar(); } else { MessageBox.Show("Operação Cancelada", "Cancelada", MessageBoxButtons.OK, MessageBoxIcon.Information); } }

No código do evento excluir também atualizamos a tabela de apólices alterando os campos sinistroApolice para falso, indicando que não houve sinistro. Esta função deverá ser realizada no caso de estorno. Não é nossa intenção implementar outras regras para exclusão de sinistros, mas em um caso real, com certeza teria que ser ampliada estes conjunto de regras.

16) Evento do botão cancelar.

private void btnCancelar_Click(object sender, EventArgs e) { LimparTxt(groupBox2); cancelar(); }

17) Evento do botão procurar.

private void btnProcurar_Click(object sender, EventArgs e) { FrmPesquisa f = new FrmPesquisa(); f.Text = "Consulta Sinistros"; f.Tag = "tbSinistro"; //nome da tabela (macete) :) f.ShowDialog(); }

18) Evento do botão sair

private void btnSair_Click(object sender, EventArgs e) { this.Close(); }

123

Page 124: Csharp

19) Altere a propriedade modifiers do controle txtidApolice para public.

20) Agora alterne para o formulário de Apólices (FrmApolices.cs) para que possamos codificar o botão btnVer. Abaixo o código para o evento click do botão.

private void btnVer_Click(object sender, EventArgs e) { FrmSinistros f = new FrmSinistros(); f.txtidApolice.Text = this.txtidApolice.Text; f.ShowDialog(); txtidApolice_Leave(sender, e); //método deve ser public }

Camada de Apresentação: Finalizando

A intenção aqui não é criar formulários cheios de detalhes, pelo contrário serão simples apenas para finalizar o nosso exemplo. Você poderá melhorá-los assim como todo o projeto.

FrmSplash.

) Adicione na Camada de Apresentação um novo Formulário do tipo splash chamado FrmSplash. Clique com o botão direito do mouse sobre o nome do projeto e escolha ADD >> New Item >> WindowsForm dê o nome FrmSplash.cs.

2) Altere as propriedades do formulário FrmSplash conforme abaixo:

• FormBorderStyle = none;• Size = 553; 379

3) Coloque um controle picture e acrescente uma imagem de fundo com o tamanho acima.

124

Page 125: Csharp

Figura 4 - FrmSplash.cs

4) Adicione agora os seguintes controles:

• 01 progressbar;• 01 timer.

Figura 5 - Controles Adicionados

125

Page 126: Csharp

Aqui, depois adicionaremos o código.

5 ) Agora acrescente um novo formulário chamado FrmPrincipal. Esse formulário deverá conter um menu conforme a figura.

Figura 6 - FrmPrincipal.cs

6) Altere a propriedade WindowState do formulário para Maximized.

Funcionamento:

Colocaremos o nosso projeto para ser iniciado pelo formulário de splash, e em três segundo será disparado o formulário principal, para que possamos acessar os formulários anteriormente criados.

1) Para isso no Solution Explorer dê um duplo clique no arquivo Program.cs para acessar essa classe e faça a alteração conforme abaixo:

126

Page 127: Csharp

2) Agora alterne para o formulário FrmSplash, defina a propriedade enabled do timer para true. Em seguida coloque o código abaixo para o evento.

private void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value >= 100) { timer1.Enabled = false; FrmPrincipal f = new FrmPrincipal(); this.Hide(); f.ShowDialog(); this.Close(); } else { progressBar1.Value += 10; } }

3) Assim que a barra de progressão ter o seu valor maior ou igual a 100, o formulário é oculto (hide), disparamos o formulário principal, e quando este for fechado a aplicação será encerrada.

Para finalizar essa aplicação, basta acrescentar os códigos nos menus para chamar os formulários que criamos. Altere a propriedade IsMdiConteiner do FrmPrincipal para true, assim podemos acessar os formulários internos dentro do form principal. Veja a aparência até o momento.

127

Page 128: Csharp

Vou incluir a funcionalidade para chamar o cadastro de clientes. As demais, é só você seguir este exemplo:

private void clientesToolStripMenuItem_Click(object sender, EventArgs e) { FrmClientes f = new FrmClientes(); //indicamos que a janela pai é o form atual f.MdiParent = this; //Carregamos o formuladio dentro do form pai. f.Show(); }

128