[firebase-br] Select retornando registro errado

Eduardo Jedliczka eduardo em gerasoft.com.br
Sex Mar 11 16:26:55 -03 2005


Cara, acho que você não está entendendo, ou melhor, acho que você está
complicando...

Explicação Simples de SQL:

O Exists retorna verdadeiro ou falso! Se o resultado de um sub-select com
exists retornar qualquer quantidade de linhs / registros / tuplas , será
verdadeiro, se retornar zero linhas, será falso.

Quanto ao Sub-Select, posso lhe dar um exemplo:

Imagine uma tabela Contas: (CodConta PK, NomeConta) e uma tabela Movimento
(IDMovimento PK, ContaDebito FK, ContaCredito Fk, Data, Valor)

Então se eu quizesse saber todas as contas e os valores debitados e
creditados nesta conta durante um periodo, poderia escrever o seguinte
select...

Select
CodConta, NomeConta,
(Select Sum(M.Valor) from Movimento M where C.CodConta=M.ContaDebito and
Data between :PeriodoIni and :PeriodoFim) as TotalDebito,
(Select Sum(M.Valor) from Movimento M where C.CodConta=M.ContaCredito and
Data between :PeriodoIni and :PeriodoFim) as TotalCredito
from Contas C
Order by CodConta

pode retornar por exemplo:
01 Caixa          1500,00    350,00
02 Banco Brasil      Null    200,00
03 Banco Itaul      Null    Null
04 CEF            850,00   Null
etc...

[s]

==========================
Eduardo Jedliczka
Gerasoft Informática
Apucarana - Pr
==========================

----- Original Message ----- 
From: "Carlos Vitorino" <vitorino em ctvoicer.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, March 11, 2005 3:46 PM
Subject: Re: [firebase-br] Select retornando registro errado


> na condição where não seria where MF.VrDebito <>  (select
Sum(MF2.VrCredito)
> from MovFinanc MF2 ...  ?
>
> Então seria só verificar se MF.Numero ou MF.NumDoc são nulos, se forem, o
> sql interno sempre será Nulo, ou alterar a condição do sql interno para:
>
> (MF2.Numero = MF.Numero or MF.Numero is null)
> AND (MF2.NumDoc = MF.NumDoc or MF.Numero is null)
>
> []'s
>
> Carlos Vitorino
>
>
>
> ----- Original Message ----- 
> From: "Pha-Lista" <lista em pha.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Friday, March 11, 2005 2:26 PM
> Subject: Re: [firebase-br] Select retornando registro errado
>
>
> > Mais ou menos,
> >
> >>
> >> Então o externo retorna todas as contas que tem valor débito, e vai u>
> >> sar os
> >> seus valores como parametro para o interno.
> >
> > Isso e feito a cada registro do Select externo, como o Eduardo disse.
> >
> >> Se um dos registros que ele usa na comparação for nula, ela não fun>
> >> ciona, no
> >> caso se não me engano o campo NUMDOC é nulo, então o resultado do s> ql
> >> interno sempre vai ser nulo.
> >
> > Funciona como um Select normal, com a excecao que você pode utilizar os
> > campos do Select externo, se a condicao where nao satisfazer nenhum
> > registro, sera retonado um select vazio, e False para o operador Exists,
> > nao nencessariamente precisaria ser utilizado exists, poderria com para
um
> > campo de retorno.
> >
> > Exemplo:
> >
> > Select MF.Numero, MF.NumDoc, MF.NumParcela, MF.VrDeb, MF.Data,
> > MF.DtVenc, MF.CodCli, C.Nome, C.Cidade, C.ContaCtb
> > from MovFinanc MF
> > Left Outer Join Cliente C on C.Codigo = MF.CodCli
> >
> > where MF2.VrDebito <>  (select Sum(MF2.VrCredito) from MovFinanc MF2
> >     where  MF2.Numero = MF.Numero
> >         and MF2.NumDoc = MF.NumDoc
> >         and MF2.NumParcela = MF.NumParcela
> >         and MF2.CodCli = MF.CodCli
> >         and MF2.VrCredito is not Null)
> >
> >   and MF.Data <= '01/31/2005' and MF.VrDeb is not Null
> >    and MF.CodCli = 1640
> >
> >
> > PHA
> > Nova Odessa / SP - Brazil
> > -----Mensagem original-----
> > From: "Carlos Vitorino" vitorino em ctvoicer.com.br
> > Date: Fri, 11 Mar 2005 13:59:54 -0300
> > To: "FireBase" lista em firebase.com.br
> > Subject: Re: [firebase-br] Select retornando registro errado
> >
> >>
> >> Então o externo retorna todas as contas que tem valor débito, e vai u>
> >> sar os
> >> seus valores como parametro para o interno.
> >> Se um dos registros que ele usa na comparação for nula, ela não fun>
> >> ciona, no
> >> caso se não me engano o campo NUMDOC é nulo, então o resultado do s> ql
> >> interno sempre vai ser nulo.
> >>
> >> To certo??
> >>
> >> []'s
> >>
> >> Carlos Vitorino
> >>
> >>
> >> ----- Original Message ----- 
> >> From: "Eduardo Jedliczka" <eduardo em gerasoft.com.br>
> >> To: "FireBase" <lista em firebase.com.br>
> >> Sent: Friday, March 11, 2005 1:43 PM
> >> Subject: Re: [firebase-br] Select retornando registro errado
> >>
> >>
> >> Para cada registro do select externo, o Banco executa o Sub-Select...
Ou
> >> seja, funciona!
> >>
> >> [s]
> >>
> >> =========================> =
> >> Eduardo Jedliczka
> >> Gerasoft Informática
> >> Apucarana - Pr
> >> =========================> =
> >>
> >> ----- Original Message ----- 
> >> From: "Carlos Vitorino" <vitorino em ctvoicer.com.br>
> >> To: "FireBase" <lista em firebase.com.br>
> >> Sent: Friday, March 11, 2005 1:38 PM
> >> Subject: Re: [firebase-br] Select retornando registro errado
> >>
> >>
> >> Olá
> >>
> >> Eu tenho uma dúvida,
> >>
> >> O select interno não vai retornar sempre nulo?
> >> Em que ordem o Firebird vai resolver as querys? Ele não vai verifcar a
> >> cláusula mais externa primeiro e para cada registro que ele retornar
el>
> >> e usa
> >> como parametro para o mais interno, seria isso?
> >>
> >> []'s
> >>
> >> Carlos Vitorino
> >>
> >>
> >> ----- Original Message ----- 
> >> From: "Carvalho" <carvalho em invitro.com.br>
> >> To: "FireBase" <lista em firebase.com.br>
> >> Sent: Friday, March 11, 2005 10:29 AM
> >> Subject: Re: [firebase-br] Select retornando registro errado
> >>
> >>
> >> > Caro Antônio Carlos,
> >> >
> >> > O Select que estou tentando execuar é este:
> >> > Select MF.Numero, MF.NumDoc, MF.NumParcela, MF.VrDeb, MF.Data,
> >> >  MF.DtVenc, MF.CodCli, C.Nome, C.Cidade, C.ContaCtb
> >> >  from MovFinanc MF
> >> > Left Outer Join Cliente C on C.Codigo = MF.CodCli
> >> > where not exists
> >> >    (select 1 from MovFinanc MF2
> >> >     where  MF2.Numero = MF.Numero
> >> >         and MF2.NumDoc = MF.NumDoc
> >> >         and MF2.NumParcela = MF.NumParcela
> >> >         and MF2.CodCli = MF.CodCli
> >> >         and MF2.VrCredito is not Null )
> >> >
> >> >    and MF.Data <= '01/31/2005' and MF.VrDeb is not Null
> >> >    and MF.CodCli = 1640
> >> >
> >> > Order by C.Nome
> >> >
> >> > Eu vou testar a sua sugestão também.
> >> >
> >> > Obrigado
> >> >
> >> >
> >> >> Li o rodape do email e lá o seu select é completamente diferente d>
o
> >> >> último
> >> >> postado, será que vc não esqueceu de passar maiores informaçõe> s ?
> >> >>
> >> >> Tenho uma sugestão :
> >> >>
> >> >> Por exemplo se vc ao inves de criar um registro NOVO para o crédito,
> >> >> alterasse o de debito seria mais fácil pois bastaria um
> >> >>
> >> >> Select MF.Numero, MF.NumDoc, MF.NumParcela, MF.VrDeb, MF.Data,
> >> >> MF.DtVe> nc,
> >> >> MF.CodCli, C.Nome, C.Cidade, C.ContaCtb
> >> >> from MovFinanc MF ,  Cliente C
> >> >> WHERE  C.Codigo = MF.CodCli
> >> >> and MF.VrCredito IS Null
> >> >> and MF.Data <= '01/31/2005'
> >> >> and MF.CodCli = 1640
> >> >> Order by C.Nome
> >> >>
> >> >> Analisando o Select original, creio que o erro seja porque mesmo que
> >> >> v> oce
> >> >> tenha um lancamento de crédito,
> >> >> sempre vai haver um de debito com o CAMPO crédito nulo.
> >> >>
> >> >> Antonio Carlos
> >> >>
> >> >>
> >> >>
> >> >> ----- Original Message -----
> >> >> From: "Carvalho" <carvalho em invitro.com.br>
> >> >> To: "FireBase" <lista em firebase.com.br>
> >> >> Sent: Friday, March 11, 2005 9:40 AM
> >> >> Subject: Re: [firebase-br] Select retornando registro errado
> >> >>
> >> >>
> >> >> > Caro Eduardo,
> >> >> >
> >> >> > Quando eu executo assim:
> >> >> >
> >> >> > Select MF.Numero, MF.NUMParcela, MF.NumDoc, MF.VrCred, MF.VrDeb,
> >> > mf.cODCLI
> >> >> > from MovFinanc MF
> >> >> > Where MF.CODCLI = 1640 and MF.Numero = 49201
> >> >> >
> >> >> > o retorno vem assim:
> >> >> >
> >> >> > NUMERO NUMPARCELA NUMDOC VRCRED    VRDEB   CODCLI
> >> >> > 49201                    1                049201       null
> >> >> > 490,80    1640
> >> >> >
> >> >> > Quando eu executo assim:
> >> >> >
> >> >> > Select MF.Numero, MF.NUMParcela, MF.NumDoc, MF.VrCred, MF.VrDeb,
> >> > mf.cODCLI
> >> >> > from MovFinanc MF
> >> >> > Where MF.Numero = 49201
> >> >> >
> >> >> > o retorno vem assim:
> >> >> >
> >> >> > NUMERO NUMPARCELA NUMDOC VRCRED    VRDEB   CODCLI
> >> >> > 49201                    1                049201       null
> >> >> > 490,80    1640
> >> >> > 49201                    1                049201        490,80
> >> > null
> >> >> > 1640
> >> >> >
> >> >> > Muito louco... :-(((
> >> >> >
> >> >> > ----- Original Message -----
> >> >> > From: "Eduardo Jedliczka" <eduardo em gerasoft.com.br>
> >> >> > To: "FireBase" <lista em firebase.com.br>
> >> >> > Sent: Friday, March 11, 2005 8:35 AM
> >> >> > Subject: Re: [firebase-br] Select retornando registro errado
> >> >> >
> >> >> >
> >> >> > Me ocorreu mais uma coisa...
> >> >> >
> >> >> > Qual o retorno no select abaixo (por favor, coloque sem cortes)
???
> >> >> >
> >> >> > Select MF.Numero, MF.Parcela, MF.NumDoc, MF.VrCredito, MF.VrDebito
> >> >> > >>From MovFinanc MF
> >> >> > Where MF.Cliente = 1640 and Numero = 49201 and Parcela = 1
> >> >> >
> >> >> > [s]
> >> >> >
> >> >> > =======================> ===
> >> >> > Eduardo Jedliczka
> >> >> > Gerasoft Informática
> >> >> > Apucarana - Pr
> >> >> > =======================> ===
> >> >> >
> >> >> > ----- Original Message -----
> >> >> > From: "Carvalho" <carvalho em invitro.com.br>
> >> >> > To: "FireBase" <lista em firebase.com.br>
> >> >> > Sent: Friday, March 11, 2005 8:32 AM
> >> >> > Subject: [firebase-br] Select retornando registro errado
> >> >> >
> >> >> >
> >> >> > > In Vitro Diagnóstica S/AColegas,
> >> >> > >
> >> >> > > Eu não sei mais o que testar...
> >> >> > >
> >> >> > > O select abaixo não está funcionando.
> >> >> > >
> >> >> > > Select MF.Numero, MF.NumDoc, MF.NumParcela, MF.VrDeb, MF.Data,
> >> >> > >  MF.DtVenc, MF.CodCli, C.Nome, C.Cidade, C.ContaCtb
> >> >> > >  from MovFinanc MF
> >> >> > > Left Outer Join Cliente C on C.Codigo = MF.CodCli
> >> >> > > where not exists
> >> >> > >    (select 1 from MovFinanc MF2
> >> >> > >     where  MF2.Numero = MF.Numero
> >> >> > >         and MF2.NumDoc = MF.NumDoc
> >> >> > >         and MF2.NumParcela = MF.NumParcela
> >> >> > >         and MF2.CodCli = MF.CodCli
> >> >> > >         and MF2.VrCredito is not Null )   <-- AQUI
> >> >> > >
> >> >> > >    and MF.Data <= '01/31/2005' and MF.VrDeb is not Null
> >> >> > >    and MF.CodCli = 1640
> >> >> > >
> >> >> > > Order by C.Nome
> >> >> > >
> >> >> > > A consulta está me retornando o seguinte registro:
> >> >> > >
> >> >> > > DtEmissao    Cliente   VrDebito   VrCredito  Vencimento   Numero
> >> > Parcela
> >> >> > > 16/12/2004    1640      490,80                      14/01/2005
> >> > 49201
> >> >> > 1
> >> >> > >
> >> >> > > A tabela está assim:
> >> >> > >
> >> >> > > DtEmissao   Cliente  VrDebito  VrCredito   Vencimento  Numero
> >> >> > > Parc> ela
> >> >> > > 16/12/2004  1640       490,80                    14/01/2005
> >> >> > > 4920> 1
> >> > 1
> >> >> > > 16/12/2004  1640                       490,80    20/01/2005
> >> >> > > 4920> 1
> >> > 1
> >> >> > >
> >> >> > > Eu não quero que retorna nada.
> >> >> > >
> >> >> > > Somente quando houver Débitos sem Créditos, ou seja:
> >> >> > >
> >> >> > > DtEmissao    Cliente   VrDebito   VrCredito  Vencimento   Numero
> >> > Parcela
> >> >> > > 15/02/2005    1640      525,28                      20/03/2005
> >> > 49262
> >> >> > 1
> >> >> > >
> >> >> > > Detalhe utilizo Interbase 6 com IBX
> >> >> > >
> >> >> > > O que fazer?
> >> >> > >
> >> >> > > Obrigado
> >> >> > >
> >> >> > >
> >> >> > >
> >> >> > >
> >> >> > >
> >> >> >
> >> >> >
> >> >>
> >>
>> ---------------------------------------------------------------------->
> >> >>  ---
> >> -
> >> >> --
> >> >> > ----
> >> >> >
> >> >> >
> >> >> > ______________________________________________
> >> >> > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> >> > Para editar sua configuração na lista, use o endereço
> >> >> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >>
> >>
>> ---------------------------------------------------------------------->
> >> >>  ---
> >> -
> >> >> --
> >> >> > ----
> >> >> >
> >> >> >
> >> >> > ______________________________________________
> >> >> > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> >> > Para editar sua configuração na lista, use o endereço
> >> >> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >>
> >> >>
> >>
>> ---------------------------------------------------------------------->
> >> >>  ---
> >> -
> >> > --
> >> >> ----
> >> >>
> >> >>
> >> >> ______________________________________________
> >> >> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> >> Para editar sua configuração na lista, use o endereço
> >> >> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >> >>
> >> >>
> >> >>
> >> >
> >> >
> >>
> ----------------------------------------------------------------------->
> >> >  ---
> >> --
> >> > ----
> >> >
> >> >
> >> > ______________________________________________
> >> > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> > Para editar sua configuração na lista, use o endereço
> >> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >> >
> >> >
> >> >
> >> >
> >> >
> >>
> >>
>
>> -------------------------------------------------------------------------
>
> >>  ---
> >> ----
> >>
> >>
> >> ______________________________________________
> >> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> Para editar sua configuração na lista, use o endereço
> >> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >>
> >>
> >>
> >>
> >>
>
>> -------------------------------------------------------------------------
>
> >>  ---
> >> ----
> >>
> >>
> >> ______________________________________________
> >> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> Para editar sua configuração na lista, use o endereço
> >> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >>
> >>
> >>
> >>
> >>
>
>> -------------------------------------------------------------------------
>
> >>  -------
> >>
> >>
> >> ______________________________________________
> >> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >> Para editar sua configuração na lista, use o endereço
> >> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >>
> >>
> >>
> >
> >
> >
>
>
> --------------------------------------------------------------------------
------
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>





Mais detalhes sobre a lista de discussão lista