Soma na Sql não funciona
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
Curtidas 0
Respostas
Emerson Nascimento
04/12/2005
tente assim:
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.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;
GOSTEI 0
Paulo
04/12/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.
GOSTEI 0
Paulo
04/12/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:
[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]
GOSTEI 0
Emerson Nascimento
04/12/2005
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.
infelizmente não poderei ajudar.
GOSTEI 0
Paulo
04/12/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.
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);
GOSTEI 0