[firebase-br] RES: RES: RES: RES: where com lista de valores

Kleber - Vector Informática kleber.furtado em vectorinf.com.br
Ter Jun 8 16:27:39 -03 2010


Dica excepcional! Eu não tinha pensado nisso antes. Vale observar apenas a
questão da velocidade. Se for aceitável, nota 10 José! :)

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Jose Aparecido da Silva
Enviada em: sábado, 5 de junho de 2010 12:03
Para: 'FireBase'
Assunto: [firebase-br] RES: RES: RES: where com lista de valores

O problema é que a string a ser passada para o comando sql tem um limite que
não me recordo qual é.
Dá uma olhada em CREATE GLOBAL TEMPORARY TABLE.
Eu já fiz isso e usei uma tabela temporária no FB para isso.
A tabela tem um único campo que é o identificador da outra tabela 
Eu fiz assim: Populei a tabela temporária com os registros que eu havia
separado e depois eu fiz o select ou com in ou com left join. 
Ex:
1. Select t.ID, c.NOME, c.ENDERECO, etc from TABELATMP t
Left join CLIENTES c on t.ID = c.ID

2. select c.ID, c.NOME, c.ENDERECO, etc from CLIENTES c
Where c.ID in (select t.ID from TABELATMP t where t.ID = c.ID)

Fica aí a dica.

[ ]'s
Jose Aparecido da Silva
Fasystem


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Zottis
Enviada em: sábado, 5 de junho de 2010 12:39
Para: 'FireBase'
Assunto: [firebase-br] RES: RES: where com lista de valores

Então, você pode Fazer de Duas Formas, como falei anteriormente:
A primeira, vc Faz um While not......
No primeiro dataset para varrer o resultado e joga os códigos dos clientes
em uma varialvel,
Exemplo: 
Var Codigos; Integer;

Codigos := códigos + QryClienteCodCliente.value + ', ';
Isso retornará 1,2,3 que você pode passar no segundo dataset dentro da
cláusula "IN"

Ou fazer um outro dataset para pegar a lista de valores do primeiro

Monta o SQL na parte do where da mesma forma que o primeiro 
Mas na parte do select faz assim:

Select  LIST(Clientes.CodCliente, ',') AS CodCliente

Isso te retornará assim:

1,2,3 

Daí vc consegue passar para o próximo Dataset na cláusula "IN"

Espero que ajude, qualquer coisa, segunda feira me Fala.

Até mais, e bom Final de Semana.
 

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Carlos Wilson
Enviada em: sábado, 5 de junho de 2010 12:07
Para: FireBase
Assunto: Re: [firebase-br] RES: where com lista de valores

Obrigado pelo seu comentário mas eu realmente não entendi o que voce 
quis dizer, ou acho que voce não entendeu o que quero.
exemplo:
em um dataset depois do usuário ter feitos todas as opções de filtragem 
possivel, resultou em:
QryCliente
Codcliente          Nome
===============================
1                        Carlos
2                        Manoel
3                        Júlia

Aí eu completo a sql do segundo dataset com um laço que vai pegando os 
codigos do 1º dataset:
o que me resulta em ...where codcliente IN (1,2,3);

Funciona que é uma beleza mas para poucos registros se o primeiro 
dataset me retornar 3000 clientes dá pau.

Pergunto: O firebird possui outro comando para comparação de valores que 
aceite MUITOS valores???

Obrigado.

Carlos Wilson

Zottis escreveu:
> Faz um list com os parametros da primeira tela, ele te retornará o que vc
> quer,
> Ou ainda faz um while not na primeira tela e joga em uma variável, antes
de
> chamar a segunda tela
> E passa o parâmetro da variavel 
>
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
Em
> nome de Carlos Wilson
> Enviada em: sábado, 5 de junho de 2010 09:25
> Para: FireBase
> Assunto: Re: [firebase-br] where com lista de valores
>
> É tipo assim quero fazer um relatório de venda dos clientes que foram 
> selecionados numa outra tela.
> QryRelatorio.Close;
> QryRelatorio.Sql.Clear;
> QryRelatorio.Sql.Add(SQL);
> QryRelatorio.SQL.ADD( 'where codcliente in (' );
> Qryclientes.first;
> while not QryClientes.EOF do
> begin
>    QryRelatorio.SQL.ADD( QryClientesCODCLIENTE.AsString + ',' );
>    QryClientes.Next;
> end;
> QryRelatorio.Open;
>
> para poucos clientes funciona muito bem, mas quando é muitos clientes, 
> aparece uma mensagem "Dinamic SQL Error" devido a limitação do comando IN
> existe uma alternativa pra isso?
>
> Garto.
>
> Carlos Wilson.
>
> Alysson Azevedo escreveu:
>   
>> exite o comando "exists"
>> mas posta aew mais ou menos oque vc precisa...
>> alguem vai saber te ajudar...
>> --
>>
>> Alysson Gonçalves de Azevedo
>> (11) 8491-7730
>>
>> (\(''^_^ )/)
>>
>> "Pobre vive dizendo que não tem nada, mas quando vem a enchente, ele sai
>> gritando: -Perdi tudo!!!"
>>
>>
>>
>>
>> Em 4 de junho de 2010 22:15, Carlos Wilson <cwfsa1 em gmail.com> escreveu:
>>
>>   
>>     
>>> Boa noite,
>>>
>>> Estou fazendo um select com base nos valores de outro Dataset. Fiz um
>>>       
> while
>   
>>> para buscar os valores do dataset e acrescentar uma lista de valores
para
>>> ser usada em conjunto com "where in". porém o comando "in"  possui um
>>>       
> limite
>   
>>> de valores que pode ser passado. existe uma alternativa ao comando in?
>>>
>>> Obrigado,
>>>
>>> Carlos Wilson
>>> Delphi+MDO+Firebird 2.1
>>>
>>> ______________________________________________
>>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>> http://www.firebase.com.br/fb/artigo.php?id=1107
>>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>>
>>>     
>>>       
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>>     
> http://www.firebase.com.br/fb/artigo.php?id=1107
>   
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>   
>>     
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> Nenhum vírus encontrado nessa mensagem recebida.
> Verificado por AVG - www.avgbrasil.com.br 
> Versão: 9.0.829 / Banco de dados de vírus: 271.1.1/2919 - Data de
> Lançamento: 06/05/10 03:25:00
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>   


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
Nenhum vírus encontrado nessa mensagem recebida.
Verificado por AVG - www.avgbrasil.com.br 
Versão: 9.0.829 / Banco de dados de vírus: 271.1.1/2919 - Data de
Lançamento: 06/05/10 03:25:00


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista