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

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (12)  (0)

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ção

Este 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


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 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
{
  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
  {
  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));
  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,");
  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=");
  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 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
  {
  //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)

  //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)
  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;
  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.

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 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;
  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() == "")
  {
  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();
  //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);
  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)
  {
  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;
  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();
  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() != "")
  {
  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)
  {
  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();
  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" +
  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();

  }

  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();
  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.

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

  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;
  }
  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();
  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);
  }
  }

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 +
  " 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;
  }

 
  }
  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");
  }
  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

 stamos próximos de encerrar a série de artigos, faltam agora a classe que representa a lógica de negócios dos Sinistros, você deve ter percebido que o botão Sinistros do formulário FrmApolice.cs está sem funcionalidade até agora. Também será criado os formulário para o controle de sinistros.

E para encerrar esses artigos, criaremos o formulário Principal da aplicação que permitirá através dos menus o acesso aos formulários criados, Esta é a parte mais fácil. :-).

Gostaria de deixar um agradecimento especial aos alunos da Faculdade Santa Lúcia de Sistemas de Informação de Mogi Mirim-SP pela colaboração e comentários oportunos.

Um grande abraço e obrigado pela paciência.

Marcos Roberto de Moraes.
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?