Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 11

Olá pessoal, continuamos nossa série de artigos criando aplicações simples em Windows Forms usando a linguagem C# e o banco de dados SQL Server.

Nesta parte iremos criar os códigos referentes aos métodos criados anteriormente da classe de Consulta. Após isso, criaremos também um novo formulário, que será o de Pesquisa das Consultas. Acompanhem:

Abra o DataSet de Consulta, para que modifiquemos o método Fill, do ConsultaTableAdapter. Vamos alterá-lo para que sejam retornadas apenas as consultas que estiverem ativas. Para isso, clique com o botão direito em cima do método Fill do ConsultaTableAdapter e clique em Configure. Altere a instrução SQL que aparece para a seguinte:

Nessa mesma tela, clique no botão Advanced Options e, na tela que aparece, desmarque as duas últimas opções, como mostra a imagem a seguir:

Desmarcando essas opções, não iremos ter vários parâmetros em nosso método, dessa forma estaremos evitando o uso de concorrência. Dê OK, clique em Next, Next na próxima tela também e Finish. Assim iremos retornar somente as consultas que estiverem ativas.

Agora vamos criar em nossa classe de Acesso a Dados o método Pesquisar, que será responsável por realizar todas as pesquisas. Então crie o método, como mostra abaixo:

PS: A partir de agora irei colocar em meus artigos desta série (como já faço com artigos de ASP.NET e SQL Server) o código em si e não mais prints do código, apenas com o intuito de não poluir com muitas imagens os artigos.


public DataTable Pesquisar()

{

try

{

//instancio o TableAdapter e o DataTable

ConsultaTableAdapter ta = new ConsultaTableAdapter();

dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();

//uso o método Fill do TableAdapter, passando como parâmetro o DataTable

ta.Fill(dt);

//retorno o DataTable preenchido

return dt;

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

A implementação dos outros métodos é parecida com a das outras classes de Acesso a Dados. Vamos criar as propriedades relativas aos campos do banco nesta classe como feito anteriormente, mais desta vez faremos de uma forma otimizada. Ao invés de criarmos as propriedades privadas e públicas, podemos criar a pública e já declarar direto o get e set, poupando assim código. Veja:


public int nCodConsulta { get; set; }

public int nCodMedico { get; set; }

public int nCodPaciente { get; set; }

public DateTime dDtConsulta { get; set; }

public DateTime dHrInicio { get; set; }

public DateTime dHrFim { get; set; }

public string sObservacao { get; set; }

public bool bAtivo { get; set; }

Lembrando que esse recurso está disponível a partir da versão 2008 do Visual Studio.

Vamos implementar o código do método Salvar, bem parecido com o método das outras classes:

public override bool Salvar(bool bInsert)

{

try

{

//instancio o TableAdapter

ConsultaTableAdapter ta = new ConsultaTableAdapter();

//crio uma variável auxiliar, que será retornada preenchida no fim do método

bool bSalvar = false;

//verifico, se estiver inserindo, minha variável bSalvar recebe o método Insert

//do TableAdapter, passando como parâmetro as propriedades criadas no começo da classe

if (bInsert)

{

bSalvar = (ta.Insert(nCodMedico, nCodPaciente, dDtConsulta,

dHrInicio, dHrFim, sObservacoes, true) > 0);

}

//senão, uso o método Update e passo a propriedade bAtivo como parâmetro do método

else

{

bSalvar = (ta.Update(nCodMedico, nCodPaciente, dDtConsulta, dHrInicio,

dHrFim, sObservacoes, bAtivo, nCodConsulta) > 0);

}

return bSalvar;

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Neste código, se o método for Insert, passo como parâmetro as propriedades criadas anteriormente e o valor true, como padrão, ou seja, sempre que for gravar, irá gravar a consulta com o status Ativo. Já no método Update, preciso passar a propriedade bAtivo, já que posso ter a situação do usuário estar querendo alterar o status de Ativo para Inativo, por isso devo passá-la.

O método Delete é bem simples, nem preciso usar a variável auxiliar. Veja:


public override bool Delete()

{

try

{

//instancio o TableAdapter

ConsultaTableAdapter ta = new ConsultaTableAdapter();

//retorno o método Delete passando a propriedade nCodConsulta como parâmetro

return (ta.Delete(nCodConsulta) > 0);

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Os próximos dois métodos PesquisaID serão iguais aos métodos das classes anteriores. Confira:


public override DataTable PesquisaID(int nCodGenerico)

{

try

{

//instancio o DataTable e o TableAdapter

dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();

ConsultaTableAdapter ta = new ConsultaTableAdapter();

//uso o método PesquisaID, passando como parâmetro o dt e a variável nCodGenerico

ta.PesquisaID(dt, nCodGenerico);

//retorno o DataTable preenchido

return dt;

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

public override DataRow PesquisaID()

{

try

{

//retorno apenas a primeira linha de minha consulta

return this.PesquisaID(nCodConsulta).Rows[0];

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Os métodos PesquisaNomePaciente e PesquisaNomeMedico serão também praticamente iguais em sua estrutura, só mudara que usarei os caracteres coringas (%) como filtro de pesquisa, ou seja, quando o usuário digitar por exemplo ton, será pesquisado todos os nomes que contenham essas letras.


public DataTable PesquisaNomePaciente(string sDsNomePaciente)

{

try

{

//instancio o DataTable e o TableAdapter

dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();

ConsultaTableAdapter ta = new ConsultaTableAdapter();

//uso o método PesquisaNomePaciente, passando como parâmetro o dt

//e os caracteres coringas, concatenados com a variável sDsNomePaciente

ta.PesquisaNomePaciente(dt, "%" + sDsNomePaciente + "%");

//retorno o DataTable preenchido

return dt;

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

public DataTable PesquisaNomeMedico(string sDsNomeMedico)

{

try

{

//instancio o DataTable e o TableAdapter

dsConsulta.ConsultaDataTable dt = new dsConsulta.ConsultaDataTable();

ConsultaTableAdapter ta = new ConsultaTableAdapter();

//uso o método PesquisaNomePaciente, passando como parâmetro o dt

//e os caracteres coringas, concatenados com a variável sDsNomeMedico

ta.PesquisaNomeMedico(dt, "%" + sDsNomeMedico + "%");

//retorno o DataTable preenchido

return dt;

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Pronto, nossa classe está implementada. Agora vamos criar nosso formulário de Pesquisa que, diferente dos outros, terá três tipos de pesquisas: pelo Código, pelo Nome do Médico e pelo Nome do Paciente.

Então, clique em Add > Windows Forms, na Solution Explorer, selecione o template InheritedForm, dê o nome de frmPesquisa a ele e clique em OK. Na tela que surge perguntando de qual form você irá herdar, escolha o frmBase.

Como já disse, esse formulário terá três tipos de pesquisas, só que como ele é herdado do formulário base, nos trouxe apenas os dois padrões, por Código e Descrição.

Precisamos então ir ao frmBase e alterar o modificador de acesso de alguns controles para public (repare no frmPesquisa que estão como private com um cadeado, não é possível movê-los ou redimensioná-los). Então, vá ao frmBase, altere a propriedade Modifiers do GroupBox, GridView e dos dois Buttons.

Após fazer isso, dê um Build Solution (F6). Agora vá ao frmPesquisa, adicione um RadioButton com o text Nome do Médico para que fique dessa forma:

Em nosso form precisamos sobrescrever o método Pesquisar, criado no formulário base. Para isso, faça o seguinte:


public override void Pesquisar()

{

try

{

//instancio a Classe e o DataTable

AcessoDadosConsulta acesso = new AcessoDadosConsulta();

DataTable dt = new DataTable();

//verifico qual RadioButton está checado, dependendo de qual for, chamo o método adequado

if (rbtCodigo.Checked)

{

dt = acesso.PesquisaID(int.Parse(txtPesquisa.Text));

}

else if (rbtDescricao.Checked)

{

dt = acesso.PesquisaNomePaciente("%" + txtPesquisa.Text + "%");

}

else if (rbtNomeMedico.Checked)

{

dt = acesso.PesquisaNomeMedico("%" + txtPesquisa.Text + "%");

}

//crio um novo método para carregar os itens no ListView

Carregar(dt);

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Como você pode ver acima, a diferença desse método com o do form frmPesquisaPaciente, por exemplo, é que não iremos usar o método CarregarItens, já que o mesmo usa apenas as 2 colunas do ListView e no nosso form usaremos mais do que isso. Então vamos criar o método que foi chamado acima (que terá como diferença o número de colunas apenas):


private void Carregar(DataTable dt)

{

try

{

//limpo os registros do ListView

lstPesquisa.Items.Clear();

//carrego os dados no ListView

foreach (DataRow dr in dt.Rows)

{

//para cada linha de meu DataTable, insiro uma linha no ListView

//instancio o ListViewItem, adiciono os itens e subitens, referentes

//aos campos que estou pesquisando em meu ListView

ListViewItem item = new ListViewItem();

item.Text = dr["IDCONSULTA"].ToString();

item.SubItems.Add(dr["NOMEPACIENTE"].ToString());

item.SubItems.Add(dr["NOMEMEDICO"].ToString());

item.SubItems.Add(dr["DATACONSULTA"].ToString());

item.SubItems.Add(dr["HORAINICIO"].ToString());

//aqui adiciono a varíavel instanciada item

//carregada com o item e subitem ao ListView

lstPesquisa.Items.Add(item);

}

}

catch (Exception ex)

{

throw new Exception(ex.Message.ToString());

}

}

Ok, agora temos que adicionar estas colunas a mais em nosso ListView. Antes disso, precisamos alterar o modificador de acesso das colunas que já existem para public. Então vá ao frmPesquisaBase e abra na SmartTag do ListView a opção Edit Columns.

Nela, altere a propriedade das colunas para public, como mostra a imagem:

OK, um Build Solution para atualizar o projeto e volte ao frmPesquisa.

Nele adicione três colunas, para que o ListView fique como na imagem a seguir:

Vamos testar o form. Antes de rodá-lo, abra o Form1.cs (o form principal) e altere o botão que chama as Consultas:


private void toolStripButton3_Click(object sender, EventArgs e)

{

//frmConsulta consulta = new frmConsulta();

//consulta.ShowDialog();

frmPesquisa pesquisa = new frmPesquisa();

pesquisa.ShowDialog();

}

Salve e compile o projeto. Clique no botão Consultas para ver o resultado:

Estou disponibilizando para download o que fizemos até esta parte do artigo. Dei uma revisada em todo o projeto, adicionando tratamento de erros nos métodos relevantes e assim deixando o código mais limpo. Para baixar o projeto, clique aqui.

Na próxima parte terminaremos nosso formulário aplicando algumas formatações e começaremos a criação do Cadastro de Consultas. Não perca!

Créditos à Luciano Pimenta, que fez as videoaulas e ao Portal Linha de Código, por onde pude baixá-las (mediante assinatura), estudá-las e posteriormente fazer este artigo.

Quaisquer dúvidas mandem emails para wellingtonbalbo@gmail.com ou deixem nos comentários deste artigo que responderei o mais breve possível.

Até o próximo artigo

5 comentários em “Cadastro de um Consultório em Windows Forms, com C# e SQL Server – Parte 11

  1. ta.Insert(IdConsulta1,IdMedico1,Idpaciente1,Data,Horainicio,Horafim,Observações,Ativo)

    Error 1 No overload for method ‘Insert’ takes ‘8’ arguments

    olá, wellington vc sabe o motivo deste erro? nao consigo resolver.

    vlw.

    Curtir

    1. Oi alenisio não so o wellington mais acho que posso ajudar….
      Da uma olhada na quantidade de campos que seu método ta recebendo e enviando pois parece que ta havendo um erro por ai

      T+…

      Curtir

Expresse sua opinião!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s