Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andre Renato

Select no oracle (mas no Delphi...)

Recommended Posts

Seguinte,

Criei essa consulta para exibir o valor total de um grid em uma tela mestre-detalhe:

 

SELECT SUM(tblItemLocacao.itlQuantidade * tblCategoria.catValor)

FROM tblCategoria, tblItemLocacao, tblFilmes

WHERE tblFilmes.catCodigo = tblCategoria.catCodigo

AND tblItemLocacao.filCodigo = tblFilmes.filCodigo

AND tblItemLocacao.locCodigo = :lCodigo

 

No SQL Plus ele roda belezinha, retorna o resultado e boa.

No delphi, ele dá o erro:

 

"ORA00937: não é uma função de grupo de grupo simples."

 

Porque no Oracle ele roda o no Delphi ele tá dando pau? http://forum.imasters.com.br/public/style_emoticons/default/upset.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok!Tentei acrescentar um GROUP BY, deu outro erro, agora em tempo de execução:ORA-00979: não é uma função GROUP BY.O que eu faço?Em que ponto dessa query devo mudar para essa cláusula?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao user parametros, passe o valor direto para o SQL.

 

Tipo:

 

qry.Close;qry.SQL.Clear;qry.SQL.Add('SELECT SUM(tblItemLocacao.itlQuantidade * tblCategoria.catValor)');qry.SQL.Add('FROM tblCategoria, tblItemLocacao, tblFilmes');qry.SQL.Add('WHERE tblFilmes.catCodigo = tblCategoria.catCodigo');qry.SQL.Add('AND tblItemLocacao.filCodigo = tblFilmes.filCodigo');qry.SQL.Add('AND tblItemLocacao.locCodigo = ' + edit1.Text);qry.SQL.Add('group by seu_campo_group_by');qry.Open;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, só preciso de mais uma dica:

Como atribuo o resultado dessa query à uma edit box sendo que o campo só vai resultar após a execução do código?

 

Esse código está dentro da procedure TfrmLocacao.dbeCodigoChange, ou seja, quando muda o código da locação, altera os itens e consequentemente o somatório dessa query.

 

Fiz assim e não funcionou:

 

With qryValorTotal do

begin

 

Close;

SQL.Clear;

SQL.Add('SELECT SUM(tblItemLocacao.itlQuantidade * tblCategoria.catValor)');

SQL.Add('FROM tblCategoria, tblItemLocacao, tblFilmes');

SQL.Add('WHERE tblFilmes.catCodigo = tblCategoria.catCodigo');

SQL.Add('AND tblItemLocacao.filCodigo = tblFilmes.filCodigo');

SQL.Add('AND tblItemLocacao.locCodigo = ' + dbeCodigo.Text);

SQL.Add('GROUP BY tblFilmes.filCodigo');

Open;

 

end;

dbeValorTotal.Text := qryValorTotal.Fields[0].Value;

 

Tem alguma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você quer atribuir um valor a um edit, tudo bem. Mas se quiser fazer isto a um DBEdit, não vai dar certo. Pelo nome que você colocou no componente, acredito eu, que ele seja um DBEdit. Troque o componente por um Edit e faça:

editValorTotal.Text := qryValorTotal.Fields[0].AsString;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok,Apliquei essa sugestão e ficou assim:With qryValorTotal do begin Close; SQL.Clear; SQL.Add('SELECT SUM(tblItemLocacao.itlQuantidade * tblCategoria.catValor)'); SQL.Add('FROM tblCategoria, tblItemLocacao, tblFilmes'); SQL.Add('WHERE tblFilmes.catCodigo = tblCategoria.catCodigo'); SQL.Add('AND tblItemLocacao.filCodigo = tblFilmes.filCodigo'); SQL.Add('AND tblItemLocacao.locCodigo = ' + dbeCodigo.Text); SQL.Add('GROUP BY tblFilmes.filCodigo'); Open; end; edtValorTotal.text := qryValorTotal.Fields[0].AsString;Mas mesmo assim não teve efeito, o campo permanece estático sem ação quando movimento os registros da tabela pai.E agora? :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colegas,

Resolvi o problema da seguinte forma, criei um Function no Oracle para fazer o cálculo:

 

create or replace function ValorTotalLocacao

(lCodigo in Tbllocacao.Loccodigo%Type)

return number as

ValorTotal number(5,2);

begin

SELECT

SUM(tblItemLocacao.itlQuantidade * tblCategoria.catValor)

into ValorTotal

FROM

tblCategoria, tblItemLocacao, tblFilmes

WHERE

tblFilmes.catCodigo = tblCategoria.catCodigo

AND tblItemLocacao.filCodigo = tblFilmes.filCodigo

AND tblItemLocacao.locCodigo = lCodigo;

 

return(ValorTotal);

 

end ValorTotalLocacao;

 

No Delphi, inseri um ADO StoredProc, onde passava o parâmetro e me retornava o valor do somatório, onde também formatei o campo com máscara de moeda:

 

with stpValorTotal do

begin

 

Parameters[1].Value := StrToInt(dbeCodigo.Text);

ExecProc;

 

end;

 

edtValorTotal.Text := stpValorTotal.Parameters[0].Value;

edtValorTotal.Text := FormatFloat('R$ #####0.00', StrToFloat(edtValorTotal.Text));

 

Tá funcionando perfect!

É isso... valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.