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

 


Responder a