Você está na página 1de 5

http://www.fabricio.pro.br/defaul t.asp?

id=1&ACT=5&content=28& mnu=1
Pense nesta idia: Ter uma tela onde, o cliente escolhe por qual campo a consulta ser ordenada, pesquisada e se necessrio filtrada. Tambm poderemos oferecer a opo de impresso 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 ordenao da consulta. E se pensarmos no filtro ainda so mais 9 maneiras. J pensou: Um nico relatrio ligado a esta consulta se transforma em 18. O que voc, desenvolvedor, prefere? Fazer um relatrio ou 18? Neste artigo veremos como criar uma tela de pesquisa para um cadastro de clientes. A estrutura fsica da tabela de clientes est demonstrada na figura abaixo:

Design de Tela Bem para montarmos esta tela precisamos dos seguintes componentes: 1RadioGroup com todas opes de ordenao (Campos da Tabela); 2Um filtro com 2 Edits e um boto; 3Uma Pesquisa Incremental com um Edit; 4Uma Grade para visualizar os Dados 5Um Boto de Abrir; 6Um Boto para Imprimir; 7Componentes para acesso a dados (Query e DataSource); 8Tambm podemos ter um boto fechar; 9Uma 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 Ordenao: 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 preferncia. 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 funo de cada boto. Se fizer isto no esquea 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 diretrio onde esto 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 tambm pode alterar as propriedades das colunas da grade, para tanto clique 2 vezes sobre a mesma.e no Editor de Colunas clique no boto 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. No precisamos deixar true porque vamos ativar a consulta quando o usurio escolher a forma de ordenao. Veja como deve ficar o layout:

de fazendo sua codificao. 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');

Aps o design da tela podem os come ar a dar funcio nalida

If rgpOpcoes.ItemIndex = 8 Then Consulta.sql.Add('Order by UF'); Consulta.Open; edtPesquisa.Text := ''; edtPesquisa.SetFocus; Este cdigo serve para, quando o usurio clicar na opo de ordenao, fechar a consulta alterar a instruo SQL ordenando (Order by) pelo campo escolhido. 2 No Onclick do boto 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 no 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 usurio digitar um valor inicial e um valor final ele poder clicar no boto de filtro que filtrar pelo campo que estiver selecionado na ordenao. 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 Cdigo temos que testar para o valor no ser nullo e ser um nmero If rgpOpcoes.ItemIndex = 1 Then If edtPesquisa.Text <> '' Then Try Consulta.Locate('Codigo', edtPesquisa.Text, [loCaseInsensitive, loPartialKey]); Except on EConvertError do MessageDlg(edtPesquisa.Text+' no um nmero vlido', 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 no ser nullo e ser uma data vlida 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+' no uma data vlida', 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 cdigo serve para fazer uma pesquisa incremental pelo campo que estiver selecionado na ordenao. necessrio controlar a digitao de nmeros e datas, conforme os comentrios. 4 No Onclick do Boto Abrir : (Abrir Formulrio); frmClientes.tabClientes.Locate('Codigo', Consulta.FieldByName('Codigo').Value, []); frmClientes.ShowModal; Com este cdigo voc seleciona um registro e chama o formulrio para edio do mesmo. 5 OnClick do Boto Imprimir (btnImprimir) : Application.CreateForm(TRelClientes, RelClientes); RelClientes.QuickRep1.Preview; RelClientes.Free; Este cdigo cria e chama um relatrio que levar em conta a ordenao e filtro da tela de pesquisa, ou seja estar ligado na Consulta. Neste caso o relatrio criado em tempo de execuo, por isto no esquea de tirlo da opo de Auto-Create Form do projeto. 6 OnClick do Boto Fechar (btnFechar) : Consulta.Close; Close; 7 OnShow do Formulrio: //Para selecionar a primeira opo de ordenao 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 relatrio:

Você também pode gostar