Dúvidas com order by
Pessoal!
Estou usando o seguinte comando
select P.NOME AS PROD_NOME, P.EDICAO, P.PRECO, B.REPARTE, B.ENCALHE, B.COD_BANCA from BANCAS B
inner join
PRODUTO P on (B.COD_PRODUTO=P.COD_PRODUTO)
inner join
SAIDAS S on (S.COD_PRODUTO=P.COD_PRODUTO)
where
S.NOTA=:p1 and
B.BANCA=:p2
order by PROD_NOME
ao rodar obtenho a seguinte mensagem ´Column unknown PROD_NOME´. O erro ocorre no order by. Alguém tem uma idéia para resolver este problema sem utilizar P.NOME ? Uso Firebird e delphi 5. Grato...
Estou usando o seguinte comando
select P.NOME AS PROD_NOME, P.EDICAO, P.PRECO, B.REPARTE, B.ENCALHE, B.COD_BANCA from BANCAS B
inner join
PRODUTO P on (B.COD_PRODUTO=P.COD_PRODUTO)
inner join
SAIDAS S on (S.COD_PRODUTO=P.COD_PRODUTO)
where
S.NOTA=:p1 and
B.BANCA=:p2
order by PROD_NOME
ao rodar obtenho a seguinte mensagem ´Column unknown PROD_NOME´. O erro ocorre no order by. Alguém tem uma idéia para resolver este problema sem utilizar P.NOME ? Uso Firebird e delphi 5. Grato...
Luis.wolff
Curtidas 0
Respostas
Osocram
06/04/2006
Amigo...
Prod_name eh um alias d como o select vai t devolver o nome do campo... mas o nome do campo eh P.Nome enton no order by tem q estar o nome.
Oq vc pode tentar fazer eh colocar numero se referindo a coluna.
Por exemplo P.Nome eh o primeiro campo no seu select enton ele vai ser a primeira coluna da sua consulta.. enton vc pod tentar fazer
non lembro se comeca c 1 ou c 0
eh so testar...
Ou se vc puder explicar o pq d non quer usar o P.Nome no order by... talvez alguem aqui possa t dar uma ideia.
select P.NOME AS PROD_NOME
Prod_name eh um alias d como o select vai t devolver o nome do campo... mas o nome do campo eh P.Nome enton no order by tem q estar o nome.
Oq vc pode tentar fazer eh colocar numero se referindo a coluna.
Por exemplo P.Nome eh o primeiro campo no seu select enton ele vai ser a primeira coluna da sua consulta.. enton vc pod tentar fazer
Order by 1
non lembro se comeca c 1 ou c 0
eh so testar...
Ou se vc puder explicar o pq d non quer usar o P.Nome no order by... talvez alguem aqui possa t dar uma ideia.
GOSTEI 0
Luis.wolff
06/04/2006
Obrigado pela força... não posso usar P.NOME porque estou fazendo uma rotina genérica através de
oPesqFProd:=TPesqFProd.create(self);
oPesqFProd.sSQL:=´select ´+
´P.RECOLHIDA, ´+
´P.NOME, ´+
´P.EDICAO, ´+
´P.PRECO, ´+
´P.ESTOQUE, ´+
´E.REPARTE, ´+
´E.CUSTO, ´+
´E.NOTA AS NT_ENTRA, ´+
´E.DATA AS DT_ENTRA, ´+
´S.NOTA AS NT_SAI, ´+
´S.DT_DEV AS DT_SAI, ´+
´S.DT_REC AS RECOLHIMENTO, ´+
´G.DESCRICAO ´+
´from PRODUTO P ´+
´inner join ENTRADAS E on (E.COD_PRODUTO=P.COD_PRODUTO) ´+
´left outer join GENERO G on (G.COD_GENERO=P.GENERO) ´+
´left outer join SAIDAS S on (S.COD_PRODUTO=P.COD_PRODUTO)´;
oPesqFProd.show;
lá nessa rotina uso um dualListBox (componente Jedi) para ordenar os dados através da rotina
Search2.text:=´´;
Search1.text:=´´;
sOrdem:=´´;
Dg.list2.Clear;
Dg.List1:=Query1.FieldList;
dg.Sorted:=false;
dg.Execute;
while i<dg.List2.count do
begin
sOrdem:=sOrdem+dg.List2.strings[i];
inc(i);
if i=1 then
Comb1.ItemIndex:=Comb1.Items.IndexOf(dg.List2.strings[0])
else if i=2 then
Comb2.ItemIndex:=Comb2.Items.IndexOf(dg.List2.strings[1])
else if i=3 then
Comb3.ItemIndex:=Comb3.Items.IndexOf(dg.List2.strings[2]);
if i<dg.List2.count then
sOrdem:=sOrdem+´, ´;
end;
Query1.close;
Query1.SelectSQL.clear;
if dg.List2.count>0 then
Query1.SelectSQL.Add(sSQl+´ order by ´+sOrdem)
else
Query1.SelectSQL.Add(sSQl);
Query1.open;
Só que na lista não aparece o ´P.´, somente o campo ´NOTA´, que existe na tabela ENTRADA e na tabela SAIDA. Quando tento ordenar recebo uma mensagem de erro por ter dois campos com mesmo nome. resolví o problema usando ´AS´, mas aí deu problema no ´ORDER BY´. Em tempo: A rotina anterior usando P.NOME usei apenas para exemplificar.
oPesqFProd:=TPesqFProd.create(self);
oPesqFProd.sSQL:=´select ´+
´P.RECOLHIDA, ´+
´P.NOME, ´+
´P.EDICAO, ´+
´P.PRECO, ´+
´P.ESTOQUE, ´+
´E.REPARTE, ´+
´E.CUSTO, ´+
´E.NOTA AS NT_ENTRA, ´+
´E.DATA AS DT_ENTRA, ´+
´S.NOTA AS NT_SAI, ´+
´S.DT_DEV AS DT_SAI, ´+
´S.DT_REC AS RECOLHIMENTO, ´+
´G.DESCRICAO ´+
´from PRODUTO P ´+
´inner join ENTRADAS E on (E.COD_PRODUTO=P.COD_PRODUTO) ´+
´left outer join GENERO G on (G.COD_GENERO=P.GENERO) ´+
´left outer join SAIDAS S on (S.COD_PRODUTO=P.COD_PRODUTO)´;
oPesqFProd.show;
lá nessa rotina uso um dualListBox (componente Jedi) para ordenar os dados através da rotina
Search2.text:=´´;
Search1.text:=´´;
sOrdem:=´´;
Dg.list2.Clear;
Dg.List1:=Query1.FieldList;
dg.Sorted:=false;
dg.Execute;
while i<dg.List2.count do
begin
sOrdem:=sOrdem+dg.List2.strings[i];
inc(i);
if i=1 then
Comb1.ItemIndex:=Comb1.Items.IndexOf(dg.List2.strings[0])
else if i=2 then
Comb2.ItemIndex:=Comb2.Items.IndexOf(dg.List2.strings[1])
else if i=3 then
Comb3.ItemIndex:=Comb3.Items.IndexOf(dg.List2.strings[2]);
if i<dg.List2.count then
sOrdem:=sOrdem+´, ´;
end;
Query1.close;
Query1.SelectSQL.clear;
if dg.List2.count>0 then
Query1.SelectSQL.Add(sSQl+´ order by ´+sOrdem)
else
Query1.SelectSQL.Add(sSQl);
Query1.open;
Só que na lista não aparece o ´P.´, somente o campo ´NOTA´, que existe na tabela ENTRADA e na tabela SAIDA. Quando tento ordenar recebo uma mensagem de erro por ter dois campos com mesmo nome. resolví o problema usando ´AS´, mas aí deu problema no ´ORDER BY´. Em tempo: A rotina anterior usando P.NOME usei apenas para exemplificar.
GOSTEI 0
Osocram
06/04/2006
certo.. eu testei o order by c numero e funcou....
vc pod fazer isso usando o Index do Dual List Box
so q o Index do Order by comeca c 1.
Ou vc pod tentar ver o nome do campo lah na query... non estou c o delphi aqui aberto.. mas se non me engano tem uma propriedade q mostra o nome do campo.
Se vc tivesse usando ClienteDataSet poderia apenas setar o campo q vc quer como Index.. dae ele jah ordenaria tbm... sem ter q passar um sql.
Mas acho q a primeira solucao deve resolver o seu prob.
vc pod fazer isso usando o Index do Dual List Box
so q o Index do Order by comeca c 1.
Ou vc pod tentar ver o nome do campo lah na query... non estou c o delphi aqui aberto.. mas se non me engano tem uma propriedade q mostra o nome do campo.
Se vc tivesse usando ClienteDataSet poderia apenas setar o campo q vc quer como Index.. dae ele jah ordenaria tbm... sem ter q passar um sql.
Mas acho q a primeira solucao deve resolver o seu prob.
GOSTEI 0
Luis.wolff
06/04/2006
Osocram.. sou meio novo no delphi... estou usando um IBDataSet e não ví na paleta InterBase o ClientDataSet... como que funciona isso? Em que paleta tá esse componente?
GOSTEI 0
Paullsoftware
06/04/2006
Pessoal!
Estou usando o seguinte comando
select P.NOME AS PROD_NOME, P.EDICAO, P.PRECO, B.REPARTE, B.ENCALHE, B.COD_BANCA from BANCAS B
inner join
PRODUTO P on (B.COD_PRODUTO=P.COD_PRODUTO)
inner join
SAIDAS S on (S.COD_PRODUTO=P.COD_PRODUTO)
where
S.NOTA=:p1 and
B.BANCA=:p2
order by PROD_NOME
ao rodar obtenho a seguinte mensagem ´Column unknown PROD_NOME´. O erro ocorre no order by. Alguém tem uma idéia para resolver este problema sem utilizar P.NOME ? Uso Firebird e delphi 5. Grato...
se vc colocar
Order By 1
Order By P.Nome
Order By Produto.Nome
quando a
[quote:98abb7e168]Osocram.. sou meio novo no delphi... estou usando um IBDataSet e não ví na paleta InterBase o ClientDataSet... como que funciona isso? Em que paleta tá esse componente?
[/quote:98abb7e168]na Paleta DataAccess tem o [b:98abb7e168]ClientDataSet [/b:98abb7e168]e na Paleta Interbase tem o [b:98abb7e168]IbClientDataSet[/b:98abb7e168]
GOSTEI 0