Fabrício Desbessel
Delphiano de coração
Colégio
 Downloads | Mapa do Site | 1 visitante on-line 


 Login
   
    
 Lembrar de mim
Esqueceu sua senha?

 MENU
 :: Inicial
 :: Currículo
 :: Lições
 :: Contato
 :: Delphi
 :: Publicações
 :: Livros
 :: Lattes
 :: Projetos

 Buscar no site
  

 Ajuda...


 Clube Delphi


 Busca Google

  
 Delphi - Tela de Consultas Personalizáveis
Um grande dilema do desenvolvedor de sistemas e a criação de telas de pesquisas. Muitas vezes optamos por pesquisar pelos índices primários das tabelas e na maioria das vezes o cliente opta por pesquisar por outro campo. O pior é que temos que lembrar que o cliente sempre tem razão e se ele escolher, até pesquisar por data, temos que deixar esta opção disponível...

          Pense nesta idéia: Ter uma tela onde, o cliente escolhe por qual campo a consulta será ordenada, pesquisada e se necessário filtrada.

          Também poderemos oferecer a opção de impressão desta consulta.

          Olha só: Se, por exemplo, temos uma tabela chamada “Clientes” e esta tabela possuí 9 campos. Com isto podemos oferecer 9 maneiras diferentes de ordenação da consulta. E se pensarmos no filtro ainda são mais 9 maneiras.

          Já pensou: “Um único relatório ligado a esta consulta se transforma em 18”. O que você, desenvolvedor, prefere? Fazer um relatório ou 18?

          Neste artigo veremos como criar uma tela de pesquisa para um cadastro de clientes. A estrutura física da tabela de clientes está demonstrada na figura abaixo:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Design de Tela

Bem para montarmos esta tela precisamos dos seguintes componentes:

1-     RadioGroup com todas opções de ordenação (Campos da Tabela);

2-     Um filtro com 2 Edits e um botão;

3-     Uma Pesquisa Incremental com um Edit;

4-     Uma Grade para visualizar os Dados

5-     Um Botão de Abrir;

6-     Um Botão para Imprimir;

7-     Componentes para acesso a dados (Query e DataSource);

8-     Também podemos ter um botão fechar;

9-     Uma DBGrid.

Pegue estes componentes e configure suas propriedades como segue:

1 - Da paleta Standart, pegue o componente RadioGroup.
Altera a propriedade Name para rgpOpcoes e o Caption para Ordenação:
Na propriedade Items escreva os nomes de todos os campos da tabela a qual a pesquisa se refere .Se precisar, altere a propriedade Colums para distribuir melhor os itens.

2 - Da paleta Standart, pegue 2 componentes GroupBox. Altere o Caption do primeiro para Filtro e do segundo para Pesquisa Incremental.

3 - Da paleta Standart, pegue 2 componentes Label e coloque dentro do GroupBox Filtro. Altere o Caption do primeiro para Inicial: e do segundo para Final:.

4 – Da paleta Standart, pegue 2 componentes Edit e coloque dentro do GroupBox Filtro. Altere seus names para edtInicial e edtFinal, respectivamente. Deixe a propriedade Text dois 2 vazio.

5 – Da paleta Additional, pegue o componente SpeedButton e altere a propriedade Glyph colocando um figura de sua preferência. Eu sugiro a Retry.bmp

6 – Da paleta Standart, pegue o componente Edit e coloque dentro do GroupBox Pesquisa Incremental. Altere a propriedade Name para edtPesquisa e apague o Text.

7 – Da paleta Additional, pegue 3 componentes BitBtn. Para o primeiro defina a propriedade Name para btnAbrir e o Caption para &Abrir. No segundo o Name para btnImprimir e o Caption para &Imprimir. No terceiro o Name para btnFechar e o Caption para &Fechar. É interessante mudar a propriedade Hint para esclarecer a função de cada botão. Se fizer isto não esqueça de colocar TRUE na propriedade ShowHint.

8 – Da paleta BDE, pegue o componente Query. Altere a propriedade DataBaseName para o Alias que você usa ou o diretório onde estão as tabelas. Mude a propriedade Name para Consulta. Na propriedade SQL coloque Select * from Clientes. Mude a propriedade Active para True. Este componentes pode ser trocado por outra forma de acesso à dados.

9 – Da paleta DataAccess, pegue o componente DataSource. Altere a propriedade Name para dsConsulta e a propriedade DataSet para Consulta.

10 – Da paleta Data Controls, pegue o componente DBGrid e altere a propriedade DataSource para dsConsulta. Você também pode alterar as propriedades das colunas da grade, para tanto clique 2 vezes sobre a mesma.e no Editor de Colunas clique no botão Add All Fields. Feito isto, você pode agora selecionar a coluna e personalizar, mudando cor, alinhamento, etc.

11 – Para finalizar o design da tela, selecione a Query Consulta e altere a propriedade Active para FALSE. Não precisamos deixar true porque vamos ativar a consulta quando o usuário escolher a forma de ordenação.

Veja como deve ficar o layout:

Clique para ver em tamanho real

 

 

 

 

 

 

 

 

 

Após o design da tela podemos começar a dar funcionalidade fazendo sua codificação.

1 – OnClick do RadioGroup (rgpOpcoes):

Consulta.Close;
Consulta.sql.Clear;
Consulta.sql.Add('Select Codigo, Nome, CPF, DataNasci, Fone, Endereco, Cep, Cidade, UF');
Consulta.sql.Add('From Clientes');

If RgpOpcoes.ItemIndex = 0 Then
  Consulta.sql.Add('Order by Nome');
If RgpOpcoes.ItemIndex = 1 Then
  Consulta.sql.Add('Order by Codigo');
If rgpOpcoes.ItemIndex = 2 Then
  Consulta.sql.Add('Order by CPF');
If rgpOpcoes.ItemIndex = 3 Then
  Consulta.sql.Add('Order by DataNasci');
If rgpOpcoes.ItemIndex = 4 Then
  Consulta.sql.Add('Order by Fone');
If rgpOpcoes.ItemIndex = 5 Then
  Consulta.sql.Add('Order by Endereco');
If rgpOpcoes.ItemIndex = 6 Then
  Consulta.sql.Add('Order by Cep');
If rgpOpcoes.ItemIndex = 7 Then
  Consulta.sql.Add('Order by Cidade');
If rgpOpcoes.ItemIndex = 8 Then
  Consulta.sql.Add('Order by UF');

Consulta.Open;
edtPesquisa.Text := '';
edtPesquisa.SetFocus;

Este código serve para, quando o usuário clicar na opção de ordenação, fechar a consulta alterar a instrução SQL ordenando (Order by) pelo campo escolhido.

2 – No Onclick do botão do Filtro (btnFiltro) :

If btnFiltro.Tag = 1 Then
Begin
//Desabilitar o Filtro
Consulta.Filtered := False;
edtInicial.Text := '';
edtFinal.Text := '';
btnFiltro.Hint := 'Filtrar';
btnFiltro.Tag := 0;
Exit;
End;

//Se não foi preenchido nada avisa
If ((edtInicial.Text = '') AND (edtFinal.Text = '')) Then
Begin
MessageDlg('Você deve preencher pelo menos o valor inicial !', mtInformation, [mbOk],0);
Exit;
End;

//Se for preenchido somente o inicial, o final recebe o inicial
If ((edtInicial.Text <> '') AND (edtFinal.Text = '')) Then
edtFinal.Text := EdtInicial.Text;

If RgpOpcoes.ItemIndex = 0 Then
  Consulta.Filter := 'Nome>='''+edtInicial.Text+''''+
  'and Nome<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 1 Then
  Consulta.Filter := 'Codigo>='''+edtInicial.Text+''''+
  'and Codigo<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 2 Then
  Consulta.Filter := 'CPF>='''+edtInicial.Text+''''+
  'and CPF<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 3 Then
  Consulta.Filter := 'DataNasci>='''+edtInicial.Text+''''+
  'and DataNasci<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 4 Then
  Consulta.Filter := 'Fone>='''+edtInicial.Text+''''+
  'and Fone<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 5 Then
  Consulta.Filter := 'Endereco>='''+edtInicial.Text+''''+
  'and Endereco<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 6 Then
  Consulta.Filter := 'CEP>='''+edtInicial.Text+''''+
  'and CEP<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 7 Then
  Consulta.Filter := 'Cidade>='''+edtInicial.Text+''''+
  'and Cidade<='''+edtFinal.Text+'''';
If RgpOpcoes.ItemIndex = 8 Then
  Consulta.Filter := 'UF>='''+edtInicial.Text+''''+
'  and UF<='''+edtFinal.Text+'''';

Consulta.Filtered := True;
btnFiltro.Tag := 1;
btnFiltro.Hint := 'Desfiltrar';

Esta parte dá a funcionalidade para o Filtro. Quando o usuário digitar um valor inicial e um valor final ele poderá clicar no botão de filtro que filtrará pelo campo que estiver selecionado na ordenação. Claro que deve-se tomar cuidado com os campos inteiros e data.

3 – No OnChange do Edit (edtPesquisa) :
If rgpOpcoes.ItemIndex = 0 Then

Consulta.Locate('Nome', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
//Quando for Código temos que testar para o valor não ser nullo e ser um número
If rgpOpcoes.ItemIndex = 1 Then
If edtPesquisa.Text <> '' Then
  Try
  Consulta.Locate('Codigo', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
  Except on EConvertError do
  MessageDlg(edtPesquisa.Text+' não é um número válido',   mtError, [mbOk],0);
  End;
If rgpOpcoes.ItemIndex = 2 Then
  Consulta.Locate('CPF', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
//Quando for Data temos que testar para o valor não ser nullo e ser uma   data válida
If rgpOpcoes.ItemIndex = 3 Then
If Length(edtPesquisa.Text) = 10 Then
  Try
  Consulta.Locate('DataNasci', StrToDate(edtPesquisa.Text), [loCaseInsensitive,   loPartialKey]);
  Except On EConvertError Do
  MessageDlg(edtPesquisa.Text+' não é uma data válida', mtError,   [mbOk],0);
  End;
If rgpOpcoes.ItemIndex = 4 Then
  Consulta.Locate('Fone', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
If rgpOpcoes.ItemIndex = 5 Then
  Consulta.Locate('Endereco', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
If rgpOpcoes.ItemIndex = 6 Then
  Consulta.Locate('CEP', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]);
If rgpOpcoes.ItemIndex = 7 Then
  Consulta.Locate('Cidade', StrToDate(edtPesquisa.Text), [loCaseInsensitive, loPartialKey]);
If rgpOpcoes.ItemIndex = 8 Then
  Consulta.Locate('UF', StrToDate(edtPesquisa.Text), [loCaseInsensitive, loPartialKey]);

Este código serve para fazer uma pesquisa incremental pelo campo que estiver selecionado na ordenação. È necessário controlar a digitação de números e datas, conforme os comentários.

4 – No Onclick do Botão Abrir : (Abrir Formulário);
  frmClientes.tabClientes.Locate('Codigo', Consulta.FieldByName('Codigo').Value, []);
  frmClientes.ShowModal;

Com este código você seleciona um registro e chama o formulário para edição do mesmo.

5 – OnClick do Botão Imprimir (btnImprimir) :
  Application.CreateForm(TRelClientes, RelClientes);
  RelClientes.QuickRep1.Preview;
  RelClientes.Free;

Este código cria e chama um relatório que levará em conta a ordenação e filtro da tela de pesquisa, ou seja estará ligado na Consulta. Neste caso o relatório é criado em tempo de execução, por isto não esqueça de tirá-lo da opção de Auto-Create Form do projeto.

6 – OnClick do Botão Fechar (btnFechar) :

Consulta.Close;

Close;

7 – OnShow do Formulário:
//Para selecionar a primeira opção de ordenação e executar o clique
rgpOpcoes.ItemIndex := 0;
rgpOpcoesClick(Sender);

Todo este artigo foi escrito levando em conta que o desenvolvedor já conhece os procedimentos para acesso à dados. No exemplo foi utilizado o Paradox, mas nada impede que ele seja utilizado por qualquer maneira de acesso a dados.

Layout do relatório:

Clique para ver em tamanho real

 

 

 

 

 

 

 

 

 

 


 
 Edição Atual

Edição Atual


 Aprendizagem

Para você que quer aprender SQL, abaixo tem o link para um Objeto de Aprendizagem (OA) sobre o assunto.

Aprendendo SQL


 Frases
As pessoas que falam muito mentem sempre, porque acabam esgotando seu estoque de verdades.
"Millôr Fernandes"

 Arquivo
 :: Acessando o Firebird através do Excel  
 :: Dar um pouco de amor incentiva muito as outras pessoas a fazerem o mesmo 
 :: Super produção da minha KX250F 
 :: Retorno a FAHOR/CFJL 
 :: O que você quer ser quando crescer? 
 :: Como a vida ensina 
 :: Delphi Conference 2010 - Uma certa indignação... 
 :: RadPHP XE o novo Delphi for PHP 
 :: Delphi - Tratando erros de banco de dados 
 :: Delphi - Tratando erros de sistemas 
 :: Delphi - Uilizando o Enter ao invés do TAB em projetos CLX 
 :: Delphi 2009 
 :: Crie uma loja virtual com Delphi for PHP - Parte XII 
 :: Crie uma loja virtual com Delphi for PHP - Parte XI 
 :: Crie uma loja virtual com Delphi for PHP - Parte X 
 :: Delphi - Como fazer o enter disparar um Click de um botão 
 :: Crie uma loja virtual com Delphi for PHP - Parte IX 
 :: Crie uma loja virtual com Delphi for PHP - Parte VIII 
 :: Crie uma loja virtual com Delphi for PHP - Parte VII 
 :: Delphi - Validando CNPJ 
 :: Crie uma loja virtual com Delphi for PHP - Parte VI 
 :: Crie uma loja virtual com Delphi for PHP - Parte V 
 :: Crie uma loja virtual com Delphi for PHP - Parte IV 
 :: Crie uma loja virtual com Delphi for PHP - Parte III 
 :: Encontro de Craques 
 :: Crie uma loja virtual com Delphi for PHP - Parte II 
 :: Você é Hands on? 
 :: Crie uma loja virtual com Delphi for PHP - Parte I 
 :: Autenticação no Delphi for PHP - Parte IV 
 :: Autenticação no Delphi for PHP - Parte III 
 :: Autenticação no Delphi for PHP - Parte II 
 :: Autenticação no Delphi for PHP - Parte I 
 :: Cá entre nós... – Horizontina e os horizontinenses 
 :: Window (Janelas) no Delphi For PHP 
 :: Nada substitui o Talento 
 :: MainMenu no Delphi For PHP 
 :: Aplicações MySQL com Delphi for PHP - Parte VII 
 :: Aplicações MySQL com Delphi for PHP - Parte VI 
 :: Delphi - Conexões dinâmicas ao Banco de Dados 
 :: Mundo Corporativo - A história da formiga 
 :: Aplicações MySQL com Delphi for PHP - Parte V 
 :: Impedir os cadastros em duplicidade 
 :: Aplicações MySQL com Delphi for PHP - Parte IV 
 :: Aplicações MySQL com Delphi for PHP - Parte III 
 :: Aplicações MySQL com Delphi for PHP - Parte II 
 :: Aplicações MySQL com Delphi for PHP - Parte I 
 :: Gráficos no Delphi II 
 :: Gráficos no Delphi I 
 :: Delphi For PHP 
 :: Delphi - Relatórios com Quick Report - Parte VI 
 :: Delphi - Relatórios com Quick Report - Parte V 
 :: Delphi Tour 
 :: Delphi - Relatórios com Quick Report - Parte IV 
 :: Delphi - Relatórios com Quick Report - Parte III 
 :: Delphi - CodeGear anuncia Delphi 2007 
 :: Delphi - CodeGear anuncia Delphi for PHP 
 :: Delphi - Relatórios com Quick Report - Parte II 
 :: Delphi - Relatórios com Quick Report - Parte I 
 :: Delphi - Mestre/Detail com dbExpress 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte V 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte IV 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte III 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte II 
 :: Delphi - Iniciando a utilização da Tecnologia Ajax - Parte I 
 :: Delphi - Wizards para criação de banco de dados no Delphi 7 
 :: Delphi - Trabalhando com o Database Desktop 
 :: Delphi - Validando CPF 
 :: Delphi - Colocando Backup e Restauração em Sistemas com Firebird ou Interbase 
 :: Delphi - Artigo publicado na Revista ClubeDelphi 
 :: Palestrante na Borcon 
 :: Calculando o "Custo Brasil" em um PC 
 :: Delphi - Aplicações Web com Webbroker - Parte V 
 :: Políticos Honestos 
 :: Delphi - Aplicações Web com Webbroker - Parte IV 
 :: Delphi - Artigo publicado na revista Clube Delphi 
 :: Delphi - Aplicações Web com Webbroker - Parte III 
 :: Delphi - Artigo publicado na revista Clube Delphi 
 :: Delphi - Aplicações Web com Webbroker - Parte II 
 :: Delphi - Aplicações Web com Webbroker - Parte I 
 :: Delphi - Instalando o QuickReport no Delphi 7 
 :: Delphi - DLL's com formulários 
 :: Delphi - DLLs! Porque e Como utilizar 
 :: Delphi - Montando telas de cadastro dinamicamente 
 :: Delphi - Executando vídeo no Delphi através do ActiveX do Windows Media Player 
 :: Delphi - Listando arquivos de um diretório 
 :: Delphi - Como criar arquivos de Help com softwares gratuitos 
 :: Delphi - Consumindo RSS de notícias em .Net 
 :: Delphi - Criando uma instalação profissional para sua aplicação utilizando o InstallShield  
 :: Comissão Editorial da Revista Clube Delphi 
 :: Lançamento do Sistema SAS 
 :: Colunista ClubeDelphi 
 :: Delphi - Não perder dados com uma queda de energia 
 :: Delphi - Colocando a opção de configurar impressão 
 :: Delphi - Traduzindo as mensagens de erro 
 :: Exemplo de Persistência 
 :: Delphi - Colocando Backup em sistemas com tabelas Paradox 
 :: Delphi - Uilizando o Enter ao invés do TAB 
 :: Delphi - Deixando seus sistemas muito mais bonitos 
 :: Delphi - Impedir o fechamento da tela com ALT+F4 
 :: Delphi 2005 
 :: Delphi - Tela de Consultas Personalizáveis 
 ::  Delphi - Gerar planilhas do excel através de uma consulta (Query) 
 :: Delphi - Telas de Apresentação 
 :: Delphi - Filtrando Tabelas 

Fabrício Desbessel - É permitida a reprodução de qualquer material desse site desde que seja citada a fonte.