fluxo de caixa

Delphi

16/04/2009

Bom dia, galera.
Estou com problema ve se vcs pdem me ajudar. Tenho uma tabela onde guardo as contas ( PAGAR / RECEBER ) :
CODCONTASPAGARRECEBER INT PK
CODCLIENTE
CODFORNECEDOR
TIPOMOVIMENTO
DATA
HISTORICO
VALOR

Queria montar uma SQL ou SP da seguinte forma :
DATA |TIPOMOV |HISTORICO |VALOR |SALDO
XXXX E SALDO ANT 1000 1000
XXXX E NOTA 999 1000 2000
XXXX S DEB. XXX 300 1700
XXXX E SALDO FINAL 0 1700

Isto eu iria de terminar uma Data inicial e uma Final.

Estou utilizando D7 e Interbase 6.0.

Caso seja melhor fazer via SP como posso faze-la e como executar ela via D7.

Obrigado.


Walter Faria

Walter Faria

Curtidas 0

Respostas

Emarcolongo

Emarcolongo

16/04/2009

Walter boa tarde.

Existem algumas formas de vc fazer isto, poderia ser dentro do
Delphi no seu relatorio, poderia ser por SP ou então montar os
dados dentro do Delphi.

Fiz uma SP, que foi o que vc sugeriu, alem disto acredito adicionei
o saldo anterior a data de pesquisa, para isto criei uma segunda
tabela (tab_auxiliar) com a mesma estrutura que a de origem, mas
com o campo Saldo como adicional, em caso de duvidas fique a vontade.

 
SET TERM ^ ;

CREATE PROCEDURE FLUXO_PRC (
    DINICIO DATE,
    DFIM DATE)
AS
DECLARE VARIABLE DDATA DATE;
DECLARE VARIABLE ITIPO CHAR(1);
DECLARE VARIABLE DVALOR DECIMAL(15,2);
DECLARE VARIABLE SHIST VARCHAR(10);
DECLARE VARIABLE SALDO DECIMAL(15,2);
begin
  saldo = 0;
  delete from tab_auxiliar;

  for select data, tipo, valor, historico from tab_financeiro
      where data < :dinicio
      into :ddata, :itipo, :dvalor, :shist do
  begin
    if (itipo = ´E´) then saldo = (saldo+dvalor);
    if (itipo = ´S´) then saldo = (saldo-dvalor);
  end

  insert into tab_auxiliar (data,tipo,valor,historico,saldo) values(:dinicio,´X´,:saldo,´Sdo.Ant´,:saldo);


  for select data, tipo, valor, historico from tab_financeiro
      where data >= :dinicio and data <= :dfim
      into :ddata, :itipo, :dvalor, :shist do
  begin
    if (itipo = ´E´) then saldo = (saldo+dvalor);
    if (itipo = ´S´) then saldo = (saldo-dvalor);
    insert into tab_auxiliar (data,tipo,valor,historico,saldo) values(:ddata,:itipo,:dvalor,:shist,:saldo);
  end
  suspend;
end
^

SET TERM ; ^

GRANT SELECT,INSERT,DELETE ON TAB_AUXILIAR TO PROCEDURE FLUXO_PRC;

GRANT SELECT ON TAB_FINANCEIRO TO PROCEDURE FLUXO_PRC;

GRANT EXECUTE ON PROCEDURE FLUXO_PRC TO SYSDBA;


para chamar dentro do delphi, vc precisa colocar um componente
SQLStoredProc, se vc tiver usando DBExpress, ou um comp.similar.

Fazer as configurações da propr. SqlConnection e StoredProcName

No codigo vc digita:
SQLStoredProc1.Params.ParamByName(´dinicio´).value := strtodate(edit1.text);
SQLStoredProc1.Params.ParamByName(´dfim´).value    := strtodate(edit2.text);
SQLStoredProc1.ExecProc;


Mas como lhe falei tem várias formas de se fazer, poderiamos inclusive
fazer sem a necessidade talvez da segunda tab. (tab_auxiliar).

Estou a disposição


GOSTEI 0
Walter Faria

Walter Faria

16/04/2009

Primeiramente , muito obrigado por ter me respondido com base na sua fiz a SP. ficou da seguinte forma nao criei tab auxiliar:

CREATE PROCEDURE FLUXO(
SALDOANTERIOR FLOAT,
DATAINICIAL DATE)
RETURNS(
R_CODIGO INTEGER,
R_HISTORICO VARCHAR(50) CHARACTER SET NONE,
R_TIPO VARCHAR(1) CHARACTER SET NONE,
R_VALOR DECIMAL(18, 2),
R_SALDO DECIMAL(18, 2))
AS
DECLARE VARIABLE DEBITO DOUBLE PRECISION;
DECLARE VARIABLE CREDITO DOUBLE PRECISION;
BEGIN
R_SALDO=0.00;

select Sum(CPR.ValorOriginal) from ContasPagarReceber CPR
Inner Join Contas co on co.CodConta = CPR.CodConta
Inner Join GrupoContas gc on gc.CodGrupoConta = co.CodGrupo
Where gc.TipoConta = 2 AND CPR.DataEmissao < :DATAINICIAL into :DEBITO;

select Sum(CPR.ValorOriginal) from ContasPagarReceber CPR
Inner Join Contas co on co.CodConta = CPR.CodConta
Inner Join GrupoContas gc on gc.CodGrupoConta = co.CodGrupo
Where gc.TipoConta = 1 AND CPR.DataEmissao < :DATAINICIAL into :CREDITO;

SALDOANTERIOR =CREDITO - DEBITO;

R_CODIGO =0;
R_TIPO = ´*´;
R_HISTORICO = ´SALDO ANTERIOR´;
R_VALOR = 0;
R_SALDO = SALDOANTERIOR;
suspend;

FOR
select
CPR.CODCONTASPAGARRECEBER,GC.TIPOCONTA,CPR.HISTORICO,CPR.VALORORIGINAL from
CONTASPAGARRECEBER CPR
Inner Join Contas co on co.CodConta = CPR.CodConta
Inner Join GrupoContas gc on gc.CodGrupoConta = co.CodGrupo
WHERE CPR.DATAEMISSAO >= :DATAINICIAL order by CPR.CODCONTASPAGARRECEBER INTO :R_CODIGO,:R_TIPO, :R_HISTORICO,:R_VALOR DO

BEGIN

if (R_TIPO = ´1´) then
BEGIN
R_SALDO = SALDOANTERIOR + :R_VALOR;
R_TIPO = ´C´;
END

if (R_TIPO = ´2´) then
BEGIN
R_SALDO = SALDOANTERIOR - :R_VALOR;
R_TIPO = ´D´;
END

SALDOANTERIOR = :R_SALDO;
suspend;

END

R_SALDO=0.00;

R_CODIGO =0;
R_TIPO = ´*´;
R_HISTORICO = ´SALDO ATUAL´;
R_VALOR = 0;
R_SALDO = SALDOANTERIOR;
suspend;

END


GOSTEI 0
POSTAR