Ir para conteúdo
Fórum Script Brasil
  • 0

select sum(VALOR) where ...


sergio.lima

Pergunta

Oi, Galera.

Estou com um probleminha simples que eu ainda não havia precisado com relação a consulta SQL. Estou usando delphi 7 + client data set com banco de dados Firebird. Todos comandos SQL que uso sempre faço assim:

dtmdlClube.clntdtstAuxiliar.Close;

dtmdlClube.SQLdtstAuxiliar.CommandText := 'select * from CAIXA where TIPO='+QuotedStr('E');

dtmdlClube.clntdtstAuxiliar.Open;

if dtmdlClube.clntdtstAuxiliar.RecordCount > 0 then

...

Só que agora preciso do valor total em uma determinada data, apenas não sei como pego o resultado disso.

dtmdlClube.clntdtstAuxiliar.Close;

dtmdlClube.SQLdtstAuxiliar.CommandText := 'select sum(VALOR) from CAIXA where DATA='+QuotedStr(FormatDateTime('mm/dd/yyyy',fData))+' and TIPO='+QuotedStr('E')+' order by DATA,TIPO_MOV,NOME';

dtmdlClube.clntdtstAuxiliar.Open;

A instrução SQL está perfeita e funciona sem problema, mas não sei como obter o resultado. Alguém poderia me dar uma ajuda, desde já agradeço muito.

Valeu

Sergio

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Caro amigo, aconselho você a fazer no select buscar a data certa COM O PERIODO,

'select * from CAIXA where TIPO='+QuotedStr('E') and (ata between "0000-00-00" and "0000-00-00") //depois

dtmdlClube.clntdtstAuxiliar.First;

while not dtmdlClube.clntdtstAuxiliar.eof do begin

valor :=valor + dtmdlClube.clntdtstAuxiliar.fieldbyname('valor').asFloat;

end;

caso você queira manter seu select como esta é só

while not dtmdlClube.clntdtstAuxiliar.eof do begin

if (dtmdlClube.clntdtstAuxiliar.fieldbyname('valor').asDataTimer >0000-00-00) and (dtmdlClube.clntdtstAuxiliar.fieldbyname('valor').asDataTimer <0000-00-00) then begin

valor :=valor + dtmdlClube.clntdtstAuxiliar.fieldbyname('valor').asFloat;

end;

end;

é mais ou menos isso só postei co codgo não testei qualquer coisa posta ai..

Te mais...

Editado por William - TI
Link para o comentário
Compartilhar em outros sites

  • 0

Caro William,

Obrigado pelo retorno.

Mas, era exatamente isso que eu estava tentando evitar, ou seja, um loop no clientdataset para apurar o total. A instrução sql já retorna o que eu preciso e de forma muito mais rápida. Inclusive já testei isso utilizando o ibexpress e funciona perfeitamente.

Eu gostaria de saber como retornar o valor diretamente da instrução sql. Mesmo assim, obrigado.

Valeu

Sergio

Link para o comentário
Compartilhar em outros sites

  • 0
Só que agora preciso do valor total em uma determinada data, apenas não sei como pego o resultado disso.

dtmdlClube.clntdtstAuxiliar.Close;

dtmdlClube.SQLdtstAuxiliar.CommandText := 'select sum(VALOR) from CAIXA where DATA='+QuotedStr(FormatDateTime('mm/dd/yyyy',fData))+' and TIPO='+QuotedStr('E')+' order by DATA,TIPO_MOV,NOME';

dtmdlClube.clntdtstAuxiliar.Open;

A instrução SQL está perfeita e funciona sem problema, mas não sei como obter o resultado. Alguém poderia me dar uma ajuda, desde já agradeço muito.

sergio.lima, se você precisa do valor por uma determinada data e o tipo, então você não precisa da cláusula order by, pois vai solicitar ao banco uma coisa que não vai usar (só haverá uma data e um tipo).

A questão da totalização em si deveria estar sendo feita pelo sum.

Eu sugiro que você parametrize a query para não ter problemas com data (principalmente se você vier a usar seu sistema com outro banco no futuro). O firebird usa a data string no formato dd.mm.yyyy ou, se você usar a barra, mm/dd/yyyy. Usar uma string diferente deste formato vai resultar em resultado nulo. O MySQL, já usa yyyy-mm-dd; ....

Usando a parametrização, você passa a informação como tdate/tdatetime e o driver faz a conversão conforme o caso.

...
      dtmdlClube.clntdtstAuxiliar.Close;
      dtmdlClube.SQLdtstAuxiliar.CommandText := 'select sum(VALOR) from CAIXA where DATA=:Data and TIPO=:Tipo';
      dtmdlClube.clntdtstAuxiliar.Params.ParamByName('Data').AsDate := fData;
      dtmdlClube.clntdtstAuxiliar.Params.ParamByName('Tipo').AsString := 'E';
      dtmdlClube.clntdtstAuxiliar.Open;

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, Micheus

Sempre disposto a ajudar! Obrigado.

Mas, ainda não é a questão que eu levanto. Eu costumo usar a parametrização também (neste caso em particular eu não estou usando). Talvez os colegas não estão me entendendo, mas é que eu quero pegar é o resultado da função sum. Estou tentando ler o resultado após a execução do comando, assim:

dtmdlClube.clntdtstAuxiliar.Open;

if dtmdlClube.clntdtstAuxiliar.RecordCount > 0 then

fSaldo := dtmdlClube.clntdtstAuxiliar.FieldByName('VALOR').AsFloat;

só que está apresentando erro de campo inexistente VALOR na última linha.

Continuo com esta dúvida, se alguém puder ajudar, agradeço muito mesmo.

Valeu.

Sergio

Link para o comentário
Compartilhar em outros sites

  • 0

:rolleyes: Olá, Galera.

Depois de muito quebrar a cabeça descobri como obter o retorno da função sum, talvez alguém precise utilizar algum dia:

dtmdlClube.clntdtstAuxiliar.Open;

if dtmdlClube.clntdtstAuxiliar.RecordCount > 0 then

fSaldo := dtmdlClube.clntdtstAuxiliar.FieldByName('SUM').AsFloat;

E funciona muito bem.

Valeu.

Sergio

Link para o comentário
Compartilhar em outros sites

  • 0
só que está apresentando erro de campo inexistente VALOR na última linha.

sergio.lima, foi falha minha. Respondi e nem conferi antes de enviar (estava saindo).

Eu sugiro que você use alias para facilitar sua vida. Quando não se põe um nome, se você tiver outros sum, os campos ficarão tipo: sum, sum1, sum2; e não é muito legal.

Faça como abaixo:

dtmdlClube.SQLdtstAuxiliar.CommandText := 'select sum(VALOR) SUM_VALOR from CAIXA where DATA=:Data and TIPO=:Tipo';

ou

dtmdlClube.SQLdtstAuxiliar.CommandText := 'select sum(VALOR) AS SUM_VALOR from CAIXA where DATA=:Data and TIPO=:Tipo';

O alias (apelido para o campo) você escolhe o que quiser, mas declara do modo como está em negrito - logo após a função. Então, você usa este nome para acesso ao resultado.

Abraços

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...