Fórum Erro estranho em Order num select #31429

16/03/2010

0

Olá amigos,
Utilizo o seguinte select no ibexpert por exemplo e o mesmo funciona perfeitamente:

select 
movestoque.codmest,
movestoque.datmov,
movestoque.numnf,
tipomov.nommov as nommov,
case tipomov.vinculo 
   when 0 then clientes.nomcli                      
   when 1 then fornecedor.nomfor                      
   when 2 then empresas.nomemp 
end as destino,
case 
   when (tipomov.vinculo=2) and (enviado=0) then 'Sim'      
   when (tipomov.vinculo=2) and (enviado=1) then 'Nao'      
   else '   '
end as enviado 

from movestoque           

left join tipomov    on tipomov.codmov   =movestoque.codmov 
left join clientes   on clientes.codcli  =movestoque.codcli 
left join empresas   on empresas.codemp  =movestoque.codemp 
left join fornecedor on fornecedor.codfor=movestoque.codfor              

where DESTINO like :nomeproc                        

order by DESTINO


Peguei esse select já em tempo de execução do meu sistema.   No ib como mencionei, funciona ordem pelo CAMPO DESTINO corretamente, mas pelo meu sistema, diz que o CAMPO DESTINO não existe para ordenar.

Erro: Column unknown DESTINO


Alguma idéia do possa ser?

att
mario

Mario Inacio

Mario Inacio

Responder

Posts

16/03/2010

Wilson Junior

Pode ser por causa da versão do Banco de dados.
Utilize
ORDERBY 5 /* índice da coluna Destino */


Espero ter colaborado.
Responder

Gostei + 0

16/03/2010

Thiago Santana

Mário tente do jeito que o Wilson postou aí!
Ao invés de utilizar o nome do campo utilize o seu indice...
A ordem em que ele está sendo selecionado!
Tipo

SELECT NOME, ENDERECO, CIDADE FROM DADOS;   Se vc kiser ordenar pela cidade utilize
ORDER BY 3;   Espero ter ajudado!
Abraçoo
Responder

Gostei + 0

16/03/2010

Wilson Junior

No Firebird 2.X você pode utilizar o alias do campo no "ORDER BY" já para versão inferiores, deve ser usado os índices dos campos (Lembrando que os índices começam em 1).

Espero ter colaborado.
Responder

Gostei + 0

18/03/2010

Mario Inacio

Olá amigos, tive problemas com minhas internet e não pude responder a vocês.

O order funciona sem problema.

O erro ocorre quando tento filtrar pela coluna gerada através de CASE.

select codcli,

       nomcli,

       case

            when codcli < 100 then 'MENOR'

                              else 'MAIOR'

       end as TESTE

from clientes

where TESTE = 'MENOR'

order by TESTE


Nesse exemplo, diz que a coluna TESTE não existe para procura.

Se retirar a parte WHERE ordena sem problemas, mas preciso fazer uma procura em cima da coluna gerada.

Sabem alguma colução

Segue uma imagem, mostrando a ocorrência.

att
Responder

Gostei + 0

18/03/2010

Emerson Nascimento

where codcli >=100
Responder

Gostei + 0

18/03/2010

Mario Inacio

Olá Emerson,
esse select fiz apenas para ilustrar a situação.
Realmente preciso filtrar por um campo assim.

Um exemplo prático seria:

select codcli,doc,pa,
case situacao when 0 then 'TESTANDO'
              when 1 then 'TESTADO'
              when 2 then 'TESTE'
end as situa
from areceber
where situa = 'TEST'


Em minhas telas de procura, a medida que o cliente vai digitando o sistema vai filtrando através de LIKE.
Nesse caso, o cliente digitaria TEST e selecionaria tudo, se digitasse TESTE somente os dois primeiros casos.

Entendeu a lógica?


Responder

Gostei + 0

15/06/2010

Mario Inacio

Boa amigos,

Sigo com o problema de procura e order com campo
gerado conforme determinadas condições dos registros.

Um caso bem particular e necessário é um select em que
analiso se o débito está vencido a XX dias, coloco uma condição,
se for por outro período coloco outra condição.
E isso vai se alterando diariamente, dependendo da data atual,
ele vai se alterando.

Exemplo:

select
          nomecliente,
          case
              when coalesce((select sum(valdoc) from areceber
                          where quitado=1 and areceber.codcli=clientes.codcli),0) = 0 then ''Normal'''
              when coalesce((select sum(valdoc) from areceber
                          where quitado=1 and areceber.codcli=clientes.codcli and
                                     areceber.datven < current_date),0) > 0 then ''Vencido'''
              else 
                     ''Em aberto''
          end as situacao
from clientes

Aguardo uma idéia, obrigado

Responder

Gostei + 0

15/06/2010

Km Sistemas

Tente fazer com sub-select.
Desta forma:
select codcli,doc,pa,(select SITU FROM              (SELECT 'TESTANDO'                WHERE situacao = 0               union all               SELECT 'TESTADO'                WHERE situacao = 1               union all               SELECT 'TESTE'                WHERE situacao = 2)) as situafrom areceberwhere situa = 'TEST'
Responder

Gostei + 0

16/06/2010

Mario Inacio

Bom dia,
tentei executar pelo ib mas retornou o erro:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 4, column 17.
WHERE.



Obrigado
Responder

Gostei + 0

17/06/2010

Carlos Mazzi

Ta faltando algum from ... ai nao?
Responder

Gostei + 0

17/06/2010

Mario Inacio

Bom dia,
está faltando sim, mas foi uma colocação do amigo Farinha,
e estou aguardando uma resposta dele.

Não consegui entender o comando.
Responder

Gostei + 0

17/06/2010

William Galleti

Cara, sempre que trabalho com apelidos prefiro usar subquerys...Por exemplo o SQL que vc colocou.
Select CodCli,       Doc,       Pa,       Situa  From (         select codcli,doc,pa,
          case situacao when 0 then 'TESTANDO'
               when 1 then 'TESTADO'
               when 2 then 'TESTE'
           end as situa
          from areceber
         where situa = 'TEST') Order By Situa
Dependendo do tamanho do Select vc nem vai perder desempenho.
Responder

Gostei + 0

17/06/2010

Emerson Nascimento

creio que nesse caso a solução seja mesmo agregando selects.

tente algo como:

select * from
(select
  codcli,doc,pa,
  case situacao
    when 0 then 'TESTANDO'
    when 1 then 'TESTADO'
    when 2 then 'TESTE'
  end as situa
from
  areceber) tab
where situa like 'TEST%'

esta sintaxe funciona no SQL SERVER, mas me parece que também funciona nas versões mais novas do Firebird.

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar