Erro estranho em Order num select
Olá amigos,
Utilizo o seguinte select no ibexpert por exemplo e o mesmo funciona perfeitamente:
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.
Alguma idéia do possa ser?
att
mario
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
Curtidas 0
Respostas
Wilson Junior
16/03/2010
Pode ser por causa da versão do Banco de dados.
Utilize
Espero ter colaborado.
Utilize
ORDERBY 5 /* índice da coluna Destino */
Espero ter colaborado.
GOSTEI 0
Thiago Santana
16/03/2010
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
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
GOSTEI 0
Wilson Junior
16/03/2010
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.
Espero ter colaborado.
GOSTEI 0
Mario Inacio
16/03/2010
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.
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
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
GOSTEI 0
Emerson Nascimento
16/03/2010
where codcli >=100
GOSTEI 0
Mario Inacio
16/03/2010
Olá Emerson,
esse select fiz apenas para ilustrar a situação.
Realmente preciso filtrar por um campo assim.
Um exemplo prático seria:
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?
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?
GOSTEI 0
Mario Inacio
16/03/2010
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
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
GOSTEI 0
Km Sistemas
16/03/2010
Tente fazer com sub-select.
Desta forma:
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'
GOSTEI 0
Mario Inacio
16/03/2010
Bom dia,
tentei executar pelo ib mas retornou o erro:
Obrigado
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
GOSTEI 0
Carlos Mazzi
16/03/2010
Ta faltando algum from ... ai nao?
GOSTEI 0
Mario Inacio
16/03/2010
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.
está faltando sim, mas foi uma colocação do amigo Farinha,
e estou aguardando uma resposta dele.
Não consegui entender o comando.
GOSTEI 0
William Galleti
16/03/2010
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.
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.
GOSTEI 0
Emerson Nascimento
16/03/2010
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.
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.
GOSTEI 0