Desenvolvimento - C#

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

Na 11ª parte dessa série de artigos criaremos os códigos referentes aos métodos criados na parte 10, da classe de Consulta. Após isso, criaremos um novo formulário, que será o de Pesquisa das Consultas.

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 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:

Descrição: AdvancedOptionsChanged.JPG

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

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.