Array
(
)

Soma na Sql não funciona

Paulo
   - 04 dez 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:
Citação:
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:


Citação:
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;



Emerson
   - 05 dez 2005

tente assim:
#Código

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:
#Código
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;



Paulo
   - 05 dez 2005

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.


Paulo
   - 05 dez 2005

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:


Citação:
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);



Emerson
   - 05 dez 2005

olha... não trabalho com .Value nem FormatDateTime() 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.


Paulo
   - 06 dez 2005

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.


Citação:
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);