Desenvolvimento - C#

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

Nesta 12ª parte vamos fazer algumas alterações em nosso DataSet para que o formulário de Pesquisas, criado na parte 11 funcione corretamente. Vamos também começar a criação do Cadastro de Consultas implementando os métodos necessários para que o mesmo funcione.

por Wellington Balbo de Camargo



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 fazer algumas alterações em nosso DataSet para que nosso formulário de Pesquisas, criado anteriormente funcione corretamente e começar a criação do Cadastro de Consultas implementando os métodos necessários para que o mesmo funcione. Acompanhem:

Como dito anteriormente, antes de criarmos o Cadastro de Consultas, devemos realizar algumas alterações em nosso DataSet para que nosso formulário de Pesquisas criado na parte anterior funcione.

Se ao executarmos o formulário de Pesquisas e tentarmos realizar uma pesquisa, será disparado o seguinte erro:

Este erro acontece porque em nossos métodos de Pesquisa do TableAdapter de Consulta do nosso DataSet estamos retornando mais campos do que temos em nosso TableAdapter:

Como você pode perceber pela imagem acima, estamos tentando retornar o Nome do Médico e o Nome do Paciente que estão em outras tabelas, por isso está dando este erro de constraint. Se deixarmos assim, podem dar outros erros, como na hora da inserção de um novo registro neste TableAdapter, já que os valores Nome do Médico e Nome do Paciente não pertencem a este TableAdapter.

Para resolvermos isso, vamos criar um TableAdapter exclusivo para as Pesquisas.

Clique com o botão direito em cima do método PesquisaID, do TableAdapter de Consultas e clique em Configure. Copie a query que aparece, pois vamos usá-la no TableAdapter que iremos criar.

Crie o TableAdapter usando a mesma string de conexão que os outros. Cole a query que você copiou, clique em Advanced Options e desmarque as três opções, já que nossa query será apenas para consulta:

Na próxima tela desmarque a opção Return a DataTable e na opção Fill a DataTable dê o nome de PesquisaID, clique em Next e Finish. Irá aparecer os campos de consulta em nosso TableAdapter.

Faça o mesmo com os métodos PesquisaNomeMedico e PesquisaNomePaciente do TableAdapter de Consultas, ou seja, copie a query deles, crie métodos em nosso novo TableAdapter e cole essas query’s. O resultado final de nosso TableAdapter será este:

Apenas clique com o botão direito em cima da coluna IDCONSULTA e clique em Delete Key para excluirmos a chave primária, já que, como já dissemos, usaremos este TableAdapter apenas para pesquisas.

Podemos concluir que, para cadastros o uso do TableAdapter é excelente (neste tipo de exemplo simples), já para consultas devemos analisar bem a situação. Se fizermos uma consulta que contenha mais colunas que o nosso TableAdapter (como nesse exemplo), devemos criar outro TableAdapter, específico para isso.

Exclua os métodos que copiamos, do TableAdapter de Consultas e dê um Build Solution (F6) em sua aplicação, teremos alguns erros na classe de Acesso a Dados, pois devemos alterar nosso DataTable e o TableAdapter, de Consultas para Pesquisas.

Voltando ao DataSet, vamos adicionar uma nova query no TableAdapter Consultas, que nos retornará todas as pesquisas. A diferença é que esta query irá nos retornar as consultas que estiverem ativas, ou seja, com o status Ativo = 1.

Agora volte a classe de Acesso a Dados e altere o método Pesquisar para o seguinte:

public DataTable Pesquisar()

{

try

{

//instancio o TableAdapter e o DataTable

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

PesquisasTableAdapter ta = new PesquisasTableAdapter();

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

ta.Pesquisar(dt);

//retorno o DataTable preenchido

return dt;

}

catch (Exception ex)

{

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

}

}

Somente trocamos o DataTable e TableAdapter, como feito nos outros métodos, e chamamos o método Pesquisar, que acabamos de criar. Compile a aplicação, clique em Consultas, teste o formulário e você verá que agora está funcionando corretamente:

Para deixarmos 100% nosso formulário, vamos formatar nossos campos de Data e Hora usando um recurso importante de formatação do .NET, que é o string.Format (mais sobre manipulação de strings em C# aqui).

Vá ao frmPesquisa.cs e, no método Carregar, use o string.Format para que o campo DATACONSULTA exiba somente a data no formato dd/MM/yyyy e o campo HORAINICIO exiba a hora no formato HH:mm, como o código abaixo nos mostra:

item.SubItems.Add(string.Format("{0:dd/MM/yyyy}", dr["DATACONSULTA"]));

item.SubItems.Add(string.Format("{0:HH:mm}", dr["HORAINICIO"]));

Perceba que tirei o ToString() do final dos campos, já que o string.Format espera um objeto (onde está meu dr[“DATACONSULTA”] por exemplo) e se eu passar o ToString() ele reconhece como um simples texto e não aplica a formatação correta no campo.

Salve e compile para ver o resultado:

Pronto, formulário finalizado. Agora sim vamos criar o Cadastro de Consultas.

Podemos perceber em nosso TableAdapter de Pesquisas que temos o Nome do Medico e o Nome do Paciente, ou seja, nossa tabela de Consultas tem chaves estrangeiras, referente as tabelas Medico e Paciente. Em nosso form não podemos colocar textboxes para o usuário digitar o nome do Médico e do Paciente, muito menos os respectivos ID’s deles, já que, não temos a garantia de que o usuário irá digitar o nome ou ID correto.

Dessa forma como podemos ter a certeza que o cadastro de uma consulta será vinculada a um Médico e a um Paciente? Por meio de consultas auxiliares, ou seja, a partir de nosso form de Cadastro de Consultas o usuário irá escolher o nome ou código do Médico e fará o mesmo com o Paciente. Assim iremos reaproveitar as telas de Pesquisa que já temos, eliminando o trabalho de criar duas telas novas com novos controles e tudo mais.

Com essa idéia em mente, vamos criar um novo form. Vá na Solution Explorer (CTRL + W + S), clique com o botão direito na solução e clique em Add > New Item. Escolha a categoria Windows Form, o template Inherited Form (que indica que nosso form será herdado de outro) e dê o nome a ele de frmConsultaHerdado. Na tela que aparece para selecionar o formulário que herdaremos, escolha o frmBase e clique em OK.

Adicione alguns labels, textboxes e buttons, para que seu form fique como o da imagem a seguir:

Os ID’s e propriedades dos controles são:

Labels – lblNomePaciente, lblNomeMedico, lblDtConsulta, lblHrInicio, lblHrFim e lblObservacoes.

Textboxes – txtNomePaciente, txtNomeMedico, estes dois com a propriedade ReadOnly = True (que indica que nossos textboxes serão somente leitura) e com texto em negrito, e txtObservacoes, este último com a propriedade Multiline para True.

Datetimepicker – dtConsulta, dtHrInicio e dtHrFim. Altere também a propriedade Custom Format do dtConsulta para dd/MM/yyyy e altere a propriedade Format para Custom. Faça o mesmo com os outros datetimepicker, colocando no Custom Format o valor HH:mm.

Buttons – btnConsultarPaciente e btnConsultarMedico. Por enquanto deixaremos com este texto btn, depois alteraremos para uma imagem para demonstrar ao usuário que esses botões servirão para pesquisar os pacientes e médicos.

No formulário base temos uma variável pública, que é visível em todo o formulário que herda deste form, responsável por armazenar um código genérico. Assim, em nossos cadastros de Paciente e de Médico quando fazemos a gravação dos dados usamos esta variável para receber o ID da gravação. Em nosso cadastro de consulta, temos que fazer o mesmo, criar duas variáveis que serão responsáveis por armazenar os códigos de Paciente e de Médico.

Ela será preenchida no momento em que clicarmos nos botões que criamos, pesquisarmos pelo Paciente e/ou Médico, o selecionarmos na pesquisa, clicarmos em OK e voltarmos ao nosso form. Nesse momento nossas variáveis receberão os códigos respectivos de cada formulário.

Por enquanto vá à página de códigos de nosso form e declare as variáveis responsáveis por receber estes códigos:

public int _nCodPaciente;

public int _nCodMedico;

Agora volte ao formulário e dê dois cliques nos botões para chamar o evento Click dos mesmos. Neles, faça o seguinte código para chamar os formulários responsáveis por pesquisar Paciente e Médico, respectivamente:

private void btnConsultarPaciente_Click(object sender, EventArgs e)

{

frmPesquisaPaciente frmPesquisaPaciente = new frmPesquisaPaciente();

if (frmPesquisaPaciente.ShowDialog() == DialogResult.OK)

{

if (frmPesquisaPaciente.sCdCodigo != string.Empty)

{

_nCodPaciente = int.Parse(frmPesquisaPaciente.sCdCodigo);

}

}

}

private void btnConsultarMedico_Click(object sender, EventArgs e)

{

frmPesquisaMedico frmPesquisaMedico = new frmPesquisaMedico();

if (frmPesquisaMedico.ShowDialog() == DialogResult.OK)

{

if (frmPesquisaMedico.sCdCodigo != string.Empty)

{

_nCodMedico = int.Parse(frmPesquisaMedico.sCdCodigo);

}

}

}

Percebam que estes códigos são iguais aos do botão Localizar dos forms de cadastro de Paciente e Médico. Assim nossas variáveis serão preenchidas com os códigos vindos do registro pesquisado pelo usuário nos forms.

Dessa forma estamos reaproveitando código e melhorando o desempenho de nossa aplicação, pois não precisamos criar novas telas para fazer isso.

Vamos testar nosso form agora. Vá ao formulário principal de Consultas, dê dois cliques no botão Consultas e altere o código do mesmo para o de baixo:

private void toolStripButton3_Click(object sender, EventArgs e)

{

frmConsultaHerdado frmConsulta = new frmConsultaHerdado();

frmConsulta.ShowDialog();

}

Salve e compile. Clique no botão Consultas para que nosso form se abra. Agora clique em Novo e clique em um dos botões que criamos para ver que será aberto o form de Pesquisa.

Selecione um registro e clique em OK, voltaremos ao nosso form, mais nosso textbox não será preenchido com o registro selecionado, pois falta implementarmos o método que pesquisará o Médico e o Paciente. Seguindo essa linha de reaproveitamento de código, usaremos os métodos já criados em nossa classe de Acesso a Dados.

Estou disponibilizando para download o que fizemos até esta parte. Para baixar, clique aqui.

Na próxima parte vamos preencher os textboxes com o Paciente e o Médico escolhido pelo usuário, faremos outras configurações em nosso form e vamos os métodos de Salvar, Excluir, Localizar e o Carregar Valores. 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

Wellington Balbo de Camargo

Wellington Balbo de Camargo - Desenvolvedor Web/Desktop em .NET, com pouco mais de 1 ano de experiência na área. Cursando o 4º Semestre de Análise de Sistemas, atualmente estuda para melhorar os conhecimentos em SQL Server e ASP.NET, buscando em um futuro próximo as certificações Microsoft nessas áreas. Mantém um blog com dicas e artigos para iniciantes em .NET no endereço http://programandodotnet.wordpress.com e nas horas vagas procura ajudar e aprender com o pessoal do Fórum daMSDN. Atualmente é editor de artigos da Linha de Código.