Bom pessoal, primeiro agradeco pelas dicas passadas. Estou colocando a solucao que cheguei para o meu problema.
Usei um sql dinamico, onde eu ia adicionando os wheres... ficou mais ou menos assim... comando := 'select c.CD_CLIENTE, c.NOME, c.NUMERO, c.ESTADO, c.CEP, c.DATA_NASCIMENTO, '+ 'c.TELEFONE1, c.TELEFONE2, c.E_MAIL1, c.E_MAIL2, c.ESTADO_CIVIL, c.APOSENTADO, '+ '(select p.DESCRICAO from gcprofissao p where p.cd_controle = c.profissao) as prof, '+ '(select cd.CIDADE from gccidade cd where cd.cd_cidade = c.cidade) as cidade, '+ '(select b.BAIRRO from gcbairro b where b.cd_bairro = c.bairro) as bairro, '+ '(select r.rua from gcrua r where r.cd_rua = c.rua) as rua, '+ 'CASE '+ ' WHEN c.SEXO = ''M'' then ''Masculino'' '+ ' else ''Feminino'' '+ ' end as SEXO, '+ 'CASE '+ ' WHEN c.APOSENTADO = ''S'' then ''Sim'' '+ ' else ''Não'' '+ ' end as APOSENTADO '+ 'from GCCADASTRO c '; Depois eu fui testando as escolhas do usuario e adicionando as condicoes... if CbxProfissao.ItemIndex > 0 then begin comando2 := comando2 + '(c.profissao = (select p1.cd_controle from gcprofissao p1 where p1.descricao like ('''+ CbxProfissao.Text +''')))'; //proximo comando precisa de "and" coloca_and := true; end; //verifica rua if CmbxRua.ItemIndex > 0 then begin if coloca_and then comando2 := comando2 + ' and '; comando2 := comando2 + '(c.rua = (select r1.cd_rua from gcrua r1 where r1.rua like ('''+ CmbxRua.Text +''')))'; //proximo comando precisa de "and" coloca_and := true; end; e assim por diante... Funcionou numa boa, e acessando por rede em um banco com mais de 50.000 reg fico satisfarotio... Jeferson Adoryan <[EMAIL PROTECTED]> escreveu: O banco é Firebird 1.5.3 Bom, vou testar as dicas que me passou. Vou tentar tambem fazer o select dinamico de acordo com a escolha. Depois posto o resultado Assim, o campo sexo e aposentado sempre tem algum valor, o maior problema é com profissao. Valeu Danilo Rogério <[EMAIL PROTECTED]> escreveu: Jeferson, ajudaria muito se você dissesse: 1 - qual banco está utilizando, pois existem comandos específicos que poderiam ajudar ... Mas vamos lá. 1º Passo: A grosso modo, sugiro você montar seu select em tempo de execução, se for possível, pois vc eliminaria esses "likes" desnecessários. 2º Passo: Em relação aos campos SEXO, APOSENTADO. Eles só aceitam M ou F, e S ou N, respectivamente, certo? Então, vc poderia substituí-los por: and (c.SEXO = COALESCE(:SexoPessoa,c.Sexo)) // Firebird ou entao and (c.SEXO = DECODE(:SexoPessoa,Null,C.Sexo,:SexoPessoa)) // Oracle Neste caso, vc esta dizendo que se o Parametro(:SexoPessoa) for igual a nulo, vc ira comparar C.Sexo = C.Sexo, trazendo todos os registros... Faça isso com o campo Aposentado também. 3º Passo: Para os campos de Like faça assim: and (upper(b.BAIRRO) like (coalesce(:bairro,upper(b.bairro))) //Firebird and (upper(b.BAIRRO) like (decode(:bairro,null,b.bairro,:bairro)) // Oracle Qual é a ideia neste segundo passo: se o usuário NÃO informar o bairro(ou seja, nulo), ficara assim: and (upper(b.bairro) like upper(b.bairro). Novamente comparando o campo com ele mesmo. Agora, caso ele informe vc concatena o % no final do seu parâmetro. Jeferson, veja se essas dicas vão melhorar sua performance, e poste a resposta, pois muita gente tem esse tipo de problema, e com certeza, fica uma solução prática(caso a performance seja satisfatória). No mais, boa sorte, e aguardamos resposta... Danilo Rogério Jeferson Adoryan <[EMAIL PROTECTED]> escreveu: Boa tarde pessoal Estou fazendo um select onde eu trago os dados do contribuinte (para alguns dados tenho tabelas auxiliares, como profissao, bairro, cidade, rua). Nesse select, eu posso localizar por profissao, rua, bairro, cidade, cep, estado_civil, aposentado e sexo, posso ter todas as opcoes, algumas ou apenas uma. Segue abaixo um exemplo que esta quase funcionando, o problema eh quando os campos chave estrangeira na tabela contribuinte sao NULL. Quando o usuario nao seleciona profissao por exemplo, passo '%' como parametro. select c.CD_CLIENTE, c.NOME, c.NUMERO, c.ESTADO, c.CEP, c.DATA_NASCIMENTO, c.TELEFONE1, c.TELEFONE2, c.E_MAIL1, c.E_MAIL2, c.ESTADO_CIVIL, c.APOSENTADO, p.DESCRICAO, cd.CIDADE, b.BAIRRO, r.RUA, CASE WHEN c.SEXO = 'M' then 'Masculino' else 'Feminino' end as SEXO, CASE WHEN c.APOSENTADO = 'S' then 'Sim' else 'Não' end as APOSENTADO from GCCADASTRO c, GCPROFISSAO p, GCCIDADE cd, GCBAIRRO b, GCRUA r where (p.DESCRICAO like (:profissao)) and (c.PROFISSAO = p.CD_CONTROLE) and (c.CIDADE = cd.CD_CIDADE) and (c.BAIRRO = b.CD_BAIRRO) and (c.RUA = r.CD_RUA) and (upper(b.BAIRRO) like upper(:bairro)) and (upper(cd.CIDADE) like upper(:cidade)) and (upper(r.RUA) like upper(:rua)) and (upper(c.CEP) like upper(:cep)) and (c.SEXO like :sexo) and (upper(c.ESTADO_CIVIL) like upper(:estcivil)) and (c.APOSENTADO like :apos) order by c.NOME como eu poderia melhorar esse select?? Obrigado a todos _______________________________________________ Jeferson Adoryan Técnico em Desenvolvimento de Software Objetiva Informática LTDA Fone: (55) 3375 3828 Celular: (55) 8115 4544 Linux Counter #404063 Home Page: http://adoryan.byethost24.com ============================= www.softtotal.com.br www.firehost.com.br Panambi - RS --------------------------------- Yahoo! Search Música para ver e ouvir: You're Beautiful, do James Blunt [As partes desta mensagem que não continham texto foram removidas] --------------------------------- Yahoo! Search Música para ver e ouvir: You're Beautiful, do James Blunt [As partes desta mensagem que não continham texto foram removidas] _______________________________________________ Jeferson Adoryan Técnico em Desenvolvimento de Software Objetiva Informática LTDA Fone: (55) 3375 3828 Celular: (55) 8115 4544 Linux Counter #404063 Home Page: http://adoryan.byethost24.com ============================= www.softtotal.com.br www.firehost.com.br Panambi - RS --------------------------------- Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu celular. Registre seu aparelho agora! [As partes desta mensagem que não continham texto foram removidas] _______________________________________________ Jeferson Adoryan Técnico em Desenvolvimento de Software Objetiva Informática LTDA Fone: (55) 3375 3828 Celular: (55) 8115 4544 Linux Counter #404063 Home Page: http://adoryan.byethost24.com ============================= www.softtotal.com.br www.firehost.com.br Panambi - RS --------------------------------- Yahoo! Search Música para ver e ouvir: You're Beautiful, do James Blunt [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> <*> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages <*> Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html