Somar valores
Olá, pessoal...
Tenho uma tabela chamada CAIXA que contém as seguintes colunas: CAIXA_NRO_LANC, CAIXA_ID, CAIXA_HISTORICO, CAIXA_TIPO, CAIXA_DATA e CAIXA_VALOR.
A coluna CAIXA_TIPO guarda um D se for um lançamento de Débito ou C se for Crédito.
Não estou conseguindo fazer a somatória dos totais de Créditos e Débitos.
Estou usando Delphi 7 e banco de dados Firebir.
Agradeço se alguém puder me dar uma dica.
Tenho uma tabela chamada CAIXA que contém as seguintes colunas: CAIXA_NRO_LANC, CAIXA_ID, CAIXA_HISTORICO, CAIXA_TIPO, CAIXA_DATA e CAIXA_VALOR.
A coluna CAIXA_TIPO guarda um D se for um lançamento de Débito ou C se for Crédito.
Não estou conseguindo fazer a somatória dos totais de Créditos e Débitos.
Estou usando Delphi 7 e banco de dados Firebir.
Agradeço se alguém puder me dar uma dica.
Lschmitk
Curtidas 0
Respostas
Rinez
08/09/2006
Coloque em um form, ou se quizer coloque o sqlconnection em um
data module :
um sqlconnection PALETA DBEXPRESS ligue com seu Banco,
um Tsqlquery PALETA DBEXPRESS
nome QLANC ,
um tdataSETprovider ->PALETA DATACESS
nome DSPLANC lique com QLANC
um Tclientdataset ->PALETA DATACESS,
nome CQLANC ligue com DSPLANC ,
um Tdatasource ligue com CQLANC ->PALETA DATA ACESS,
um dbgrid ligue com DATASET DATASOURCE ->PALETA DATAACESS,
um button, nome ATUALIZAR
UM TDATETIMEPICKER, nome INICIAL->PALETA WIN32
UM TDATETIMERPICKER, nome FINAL->PALETA WIN32
Crie uma store procedure no banco assim:
SET TERM ^ ;
CREATE PROCEDURE SP_EXTCONTACAIXA (
DATAINICIAL DATE,
DATAFINAL DATE)
RETURNS (
ID_LANCM INTEGER,
DATAM DATE,
HISTM VARCHAR(60),
VALORM NUMERIC(15,2),
DCM VARCHAR(1),
SALDO NUMERIC(15,2),
SALDODC VARCHAR(1),
SALDOANT NUMERIC(15,2))
AS
DECLARE VARIABLE CRED NUMERIC(15,2);
DECLARE VARIABLE DEB NUMERIC(15,2);
DECLARE VARIABLE VSALDO NUMERIC(15,2);
DECLARE VARIABLE VVALOR NUMERIC(15,2);
begin
/* Procedure Text */
DEB=0;
CRED=0;
VSALDO=0;
SALDO=NULL;
SALDODC=NULL;
SELECT SUM(COALESCE(M.CAIXA_VALOR,0)) FROM CAIXA M WHERE M.CAIXA_DATA < :DATAINICIAL AND
M.CAIXA_tipo=´D´ INTO :deb;
SELECT SUM(COALESCE(M.CAIXA_VALOR,0)) FROM CAIXA M WHERE M.CAIXA_DATA < :DATAINICIAL AND
M.CAIXA_tipo=´C´ INTO :cred;
VSALDO=(COALESCE(deb,0)-COALESCE(cred,0));
SALDO=VSALDO;
DATAM=:datainicial;
IF (COALESCE(VSALDO,0)=0) THEN DCM=´´;
if (COALESCE(VSALDO,0)>0) then DCM=´D´;
if (COALESCE(VSALDO,0)<0) then DCM=´C´;
HISTM=(´SALDO ANTERIOR À DATA INICIAL´);
SUSPEND;
DATAM=NULL;
VSALDO=0;
HISTM=NULL;
DCM=NULL;
FOR SELECT M.CAIXA_NRO_NLANC,
M.CAIXA_DATA,
M.CAIXA_HISTORICO,
M.CAIXA_VALOR,
M.CAIXA_tipo FROM CAIXA M WHERE (M.CAIXA_DATA BETWEEN :DATAINICIAL
AND :DATAFINAL)
INTO :ID_LANCM,
:DATAM,
:HISTM,
:VALORM,
:DCM
do
BEGIN
/* VVALOR=valorm; */
/* IF (DCM=´D´) THEN SALDO=(saldo+:valorm);
IF (DCM=´C´) THEN SALDO=(Saldo-:valorm);
saldo=(saldo+valorm); */
/*SUSPEND; */
VVALOR=VALORM;
if (DCM=´D´) then SALDO=coalesce(SALDO,0)+VVALOR;
if (DCM=´C´) then SALDO=coalesce(SALDO,0)-VVALOR;
SUSPEND;
END
end
^
SET TERM ; ^
NO BUTTON CLICK FAÇA:
procedure SEUFORM.atualizarClick(Sender: TObject);
begin
if inicial.date>final.Date then begin
messagebox(handle,´Data Inválida´,´Atenção´,$000020);
inicial.SetFocus;
exit;
end;
TRY
qlanc.Close;
with qlanc do begin
close;
sql.Clear;
sql.Add(´select * from SP_EXTCONTACAIXA(:INIC,:FIN)´);
PARAMBYNAME(´INIC´).AsDate:=SELF.INICIAL.Date;
PARAMBYNAME(´FIN´).AsDate:=SELF.FINAL.Date;
EXECSQL;
end;
CQLANC.Open;
CQLANC.Refresh;
EXCEPT
ON e:EXCEPTION DO BEGIN
SHOWMESSAGE(´ERRO.´+E.Message);
END; END;
dbgrid1.SetFocus;
end;
´Ai voce tera um conta corrente do caixa completo´
Qualquer coisa é só postar.
data module :
um sqlconnection PALETA DBEXPRESS ligue com seu Banco,
um Tsqlquery PALETA DBEXPRESS
nome QLANC ,
um tdataSETprovider ->PALETA DATACESS
nome DSPLANC lique com QLANC
um Tclientdataset ->PALETA DATACESS,
nome CQLANC ligue com DSPLANC ,
um Tdatasource ligue com CQLANC ->PALETA DATA ACESS,
um dbgrid ligue com DATASET DATASOURCE ->PALETA DATAACESS,
um button, nome ATUALIZAR
UM TDATETIMEPICKER, nome INICIAL->PALETA WIN32
UM TDATETIMERPICKER, nome FINAL->PALETA WIN32
Crie uma store procedure no banco assim:
SET TERM ^ ;
CREATE PROCEDURE SP_EXTCONTACAIXA (
DATAINICIAL DATE,
DATAFINAL DATE)
RETURNS (
ID_LANCM INTEGER,
DATAM DATE,
HISTM VARCHAR(60),
VALORM NUMERIC(15,2),
DCM VARCHAR(1),
SALDO NUMERIC(15,2),
SALDODC VARCHAR(1),
SALDOANT NUMERIC(15,2))
AS
DECLARE VARIABLE CRED NUMERIC(15,2);
DECLARE VARIABLE DEB NUMERIC(15,2);
DECLARE VARIABLE VSALDO NUMERIC(15,2);
DECLARE VARIABLE VVALOR NUMERIC(15,2);
begin
/* Procedure Text */
DEB=0;
CRED=0;
VSALDO=0;
SALDO=NULL;
SALDODC=NULL;
SELECT SUM(COALESCE(M.CAIXA_VALOR,0)) FROM CAIXA M WHERE M.CAIXA_DATA < :DATAINICIAL AND
M.CAIXA_tipo=´D´ INTO :deb;
SELECT SUM(COALESCE(M.CAIXA_VALOR,0)) FROM CAIXA M WHERE M.CAIXA_DATA < :DATAINICIAL AND
M.CAIXA_tipo=´C´ INTO :cred;
VSALDO=(COALESCE(deb,0)-COALESCE(cred,0));
SALDO=VSALDO;
DATAM=:datainicial;
IF (COALESCE(VSALDO,0)=0) THEN DCM=´´;
if (COALESCE(VSALDO,0)>0) then DCM=´D´;
if (COALESCE(VSALDO,0)<0) then DCM=´C´;
HISTM=(´SALDO ANTERIOR À DATA INICIAL´);
SUSPEND;
DATAM=NULL;
VSALDO=0;
HISTM=NULL;
DCM=NULL;
FOR SELECT M.CAIXA_NRO_NLANC,
M.CAIXA_DATA,
M.CAIXA_HISTORICO,
M.CAIXA_VALOR,
M.CAIXA_tipo FROM CAIXA M WHERE (M.CAIXA_DATA BETWEEN :DATAINICIAL
AND :DATAFINAL)
INTO :ID_LANCM,
:DATAM,
:HISTM,
:VALORM,
:DCM
do
BEGIN
/* VVALOR=valorm; */
/* IF (DCM=´D´) THEN SALDO=(saldo+:valorm);
IF (DCM=´C´) THEN SALDO=(Saldo-:valorm);
saldo=(saldo+valorm); */
/*SUSPEND; */
VVALOR=VALORM;
if (DCM=´D´) then SALDO=coalesce(SALDO,0)+VVALOR;
if (DCM=´C´) then SALDO=coalesce(SALDO,0)-VVALOR;
SUSPEND;
END
end
^
SET TERM ; ^
NO BUTTON CLICK FAÇA:
procedure SEUFORM.atualizarClick(Sender: TObject);
begin
if inicial.date>final.Date then begin
messagebox(handle,´Data Inválida´,´Atenção´,$000020);
inicial.SetFocus;
exit;
end;
TRY
qlanc.Close;
with qlanc do begin
close;
sql.Clear;
sql.Add(´select * from SP_EXTCONTACAIXA(:INIC,:FIN)´);
PARAMBYNAME(´INIC´).AsDate:=SELF.INICIAL.Date;
PARAMBYNAME(´FIN´).AsDate:=SELF.FINAL.Date;
EXECSQL;
end;
CQLANC.Open;
CQLANC.Refresh;
EXCEPT
ON e:EXCEPTION DO BEGIN
SHOWMESSAGE(´ERRO.´+E.Message);
END; END;
dbgrid1.SetFocus;
end;
´Ai voce tera um conta corrente do caixa completo´
Qualquer coisa é só postar.
GOSTEI 0