Soma na Sql não funciona

04/12/2005

Executo, no mesmo botão, duas Sql, já que tentei com uma e não funcionou. Eis os códigos: Antes, quero dizer, que não é erro de sintaxe não, pois não dá erro nenhum. A Sql, do ConsVenda, funciona beleza, do jeito que eu quero, mas a do somatorio(sumvenda), não dá erro, mais não retorna nada. O que pode ser? Tentei colocar o mesmo somatorio(sum(valor) as total) na Sql da ConsVenda, mas o DBText, ligado ao campo total, não vinha nada. Fiz com duas sql somente para teste aqui, e não tá funcionando tbm. Em design time, eu faço a Sql, com datas fixas, funciona, assim:
select data_venda, sum(valor) as total from itens_venda where data_venda between ´11/01/2005´ and ´11/30/2005´ group by data_venda
. Dessa forma funciona, porem a diferença está nos parâmetros, que estão corretos, pois são os mesmos da ConsVenda e não funciona. Eis abaixo os códigos:

if rgRela.ItemIndex = 0 then begin with Dm2.SumVenda do begin close; Sql.Text:=´select data_venda,sum(valor) as total from venda_itens where data_venda between :d1 and :d2 group by data_venda´; ParamByName(´d1´).Value:=FormatDateTime(´mm/dd/yyyy´, edIni.Date); ParamByName(´d2´).Value:=FormatDateTime(´mm/dd/yyyy´, EDfIM.Date); Open; end; with Dm2.ConsVenda do begin Dm2.cdsConsVenda.Close; close; CommandText:=´select numvenda,clie,data_venda,vendedor,forma_pag,nome_forma,´+ ´plano_pag,valor from venda_itens where data_venda ´+ ´between :d1 and :d2 group by numvenda,clie,data_venda,vendedor,forma_pag,´+ ´nome_forma,plano_pag,valor´; ParamByName(´d1´).Value:=FormatDateTime(´mm/dd/yyyy´, edIni.Date); ParamByName(´d2´).Value:=FormatDateTime(´mm/dd/yyyy´, EDfIM.Date); Open; Dm2.cdsConsVenda.Open; end; end;



Paulo

Respostas

05/12/2005

Emerson

tente assim:
if rgRela.ItemIndex = 0 then
begin
  with Dm2.SumVenda do
  begin
    Dm2.cdsSumVenda.Close;
    close; 
    Sql.Text:=´select data_venda,sum(valor) as total from venda_itens ´+
              ´where data_venda between :d1 and :d2 ´+
              ´group by data_venda´; 
    ParamByName(´d1´).AsDate := edIni.Date;
    ParamByName(´d2´).AsDate := EDfIM.Date;
    Open;

    /**** repare nessa linha ****/
    Dm2.cdsSumVenda.Open;
    /**** antes você abria somente o Dm2.SumVenda, e agora está abrindo 
          o Dm2.cdsSumVenda, da mesma forma que é feito na query abaixo ****/
  end; 

  with Dm2.ConsVenda do
  begin 
    Dm2.cdsConsVenda.Close; 
    close; 
    CommandText:=´select numvenda,clie,data_venda,vendedor,forma_pag,nome_forma,´+ 
                 ´plano_pag,valor from venda_itens ´+
                 ´where data_venda between :d1 and :d2 ´+
                 ´group by numvenda,clie,data_venda,vendedor,forma_pag,´+ 
                 ´nome_forma,plano_pag,valor´; 
    ParamByName(´d1´).AsDate := edIni.Date;
    ParamByName(´d2´).AsDate := EDfIM.Date;
    Open;
    Dm2.cdsConsVenda.Open;
  end; 
end;


uma dica: se o seu parâmetro é do tipo data, utilize-o diretamente como tal.

eu sugiro ainda que você faça as manipulações somente no ClientDataset. Altere a opção poAllowCommandText da propriedade Options do seu DatasetProvider para True. Assim você poderá manipular a instrução diretamente no ClientDataset. Supondo que isso seja feito, bastaria usar assim:
if rgRela.ItemIndex = 0 then
begin
  with Dm2.cdsSumVenda do
  begin
    close;
    CommandText := ´select data_venda,sum(valor) as total from venda_itens ´+
                   ´where data_venda between :d1 and :d2 ´+
                   ´group by data_venda´; 
    Params.ParamByName(´d1´).AsDate := edIni.Date;
    Params.ParamByName(´d2´).AsDate := EDfIM.Date;
    Open;
  end; 

  with Dm2.cdsConsVenda do
  begin
    close;
    CommandText := ´select numvenda,clie,data_venda,vendedor,forma_pag,nome_forma,´+
                   ´plano_pag,valor from venda_itens ´+
                   ´where data_venda between :d1 and :d2 ´+
                   ´group by numvenda,clie,data_venda,vendedor,forma_pag,´+
                   ´nome_forma,plano_pag,valor´;
    Params.ParamByName(´d1´).AsDate := edIni.Date;
    Params.ParamByName(´d2´).AsDate := EDfIM.Date;
    Open;
  end;
end;



Responder Citar

05/12/2005

Paulo

Eu não coloquei o cds.close e nem cds.open, porque, eu coloquei uma SqlQuery, pois era somente para ver o somatório do período. mesmo assim, não funciona. Vou fazer pela sua dica, trabalhar em cima do cds e ver o que dá. Qualquer coisa, posto aqui de novo.


Responder Citar

05/12/2005

Paulo

Continua não me retornando nada. Fiz direto no CDS e nada, coloquei o SqlQuery, e nada. No caption do painel, pedi o valor de retorno e veio 0(zero), assim: Total: R$0,00. Veja abaixo:

[color=green:1ca98767f2]with Dm2.SumVenda do begin close; Sql.Text := ´select data_venda,sum(valor) as total from venda_itens ´+ ´where data_venda between :d1 and :d2 group by data_venda´; ParamByName(´d1´).Value := FormatDateTime(´mm/dd/yyyy´, edIni.Date); ParamByName(´d2´).Value := FormatDateTime(´mm/dd/yyyy´, EDfIM.Date); Open; end; pnTotal.Caption:=´Total: ´+floattostrf(Dm2.SumVendaTOTAL.AsFloat,ffCurrency,12,2);[/color:1ca98767f2]



Responder Citar

05/12/2005

Emerson

olha... não trabalho com [i:f8314dc5e0].Value[/i:f8314dc5e0] nem [i:f8314dc5e0]FormatDateTime()[/i:f8314dc5e0] nos parâmetros. isso complica muito e eu não sei que erros ou inconvenientes possam haver trabalhando dessa forma.
infelizmente não poderei ajudar.


Responder Citar

06/12/2005

Paulo

Emerson, já ajudou. Realmente o Value e o formatdatetime, estavam impedindo que funcionasse. Agora, eu pensei, que Value ou Asdate, fosse a mesma coisa. Preciso rever conceitos. Valeu. Funcionou conforme abaixo. Após ler esse último post seu, é que caiu a ficha sobre o VALUE e o ASDATE.

with Dm2.SumVenda do begin close; Sql.Text := ´select data_venda,sum(valor) as total from venda_itens ´+ ´where data_venda between :d1 and :d2 group by data_venda´; ParamByName(´d1´).AsDate := edIni.Date; ParamByName(´d2´).AsDate := edFim.Date; Open; end; pnTotal.Caption:=´Total: ´+floattostrf(Dm2.SumVendaTOTAL.AsFloat,ffCurrency,12,2);



Responder Citar