Calculo delphi

30/08/2013

5

Pessoal estou com uma tremenda dificuldade, vamos ver se alguem pode me dar uma luz.

Possuo 5 tabelas com os seguintes campos :
Fluxocaixa - campo valor
Contas a receber - campo valor
contas a pagar - campo valor
cheques a receber - campo valor
conta corrente - campo valor

Preciso pegar um periodo exemplo (01/08/2013 a 31/08/2013) e somar todos os valores de cada tabela, dentro de seu dia e mostrar em um unico Dbgrid. ficando assim

Data Valor caixa Receber Pagar Cheques Conta Corrente
01/08/2013 100,00 1.240,00 800,00 0,00 10.000,00
02/08/2013 90,00 300,00 120,00 480,00 10.000,00

resumindo cada dia deste periodo preciso ter o resultado da soma da movimentacao referente ao dia.

Alguem ja fez algo assim ?
Responder

Post mais votado

31/08/2013

Bom dia Andre,

No seu caso, para qualquer movimento, existe um caixa, certo?
Vou fazer um exemplo, pensando no fluxocaixa como principal, se não for, só vc adequar!

select sum(fc.campovalor) as valor_fc,
(select sum(cr.campovalor) from contasreceber cr where cr.data = fc.data) as valor_cr,
(select sum(cp.campovalor) from contaspagar cp where cp.data = fc.data) as valor_cp,
(select sum(chr.campovalor) from chequereceber chr where chr.data = fc.data) as valor_chr,
(select sum(cc.campovalor) from contacorrente cc where cc.data = fc.data) as valor_cc
from fluxoxaixa fc
where data between :dataini and :datafim


Não sei se a performance será boa

Espero te ajudado!
Responder

Mais Posts

que banco de dados você utiliza?

creio que isso seja bem mais prático numa Stored Procedure.

Responder

31/08/2013

Andre Ucella

Emerson, uso o banco de dados Firebird.
Responder

31/08/2013

Andre Ucella

Bretas, vou fazer um teste desta forma que você me passou, ja tinha feito algo parecido mas não deu certo pelo motivo de alguma tabela não tiver registro na data solicitada, mas da forma que você escreveu o sql ta um pouco diferente do que eu fiz, entao vou tentar assim.
Responder
veja se algo assim te ajuda:

CREATE OR ALTER PROCEDURE MOVIMENTO (
    dataini date,
    datafim date)
returns (
    data date,
    nfluxo numeric(15,2),
    ncontasreceber numeric(15,2),
    ncontaspagar numeric(15,2),
    ncheque numeric(15,2),
    ncontacorrente numeric(15,2))
as
begin
  data = dataini;
  while (:data < :datafim) do
  begin
    select coalesce(sum(valor),0) from fluxo where data = :data into :nfluxo;
    select coalesce(sum(valor),0) from contasreceber where baixa = :data into :ncontasreceber;
    select coalesce(sum(valor),0) from contaspagar where baixa = :data into :ncontaspagar;
    select coalesce(sum(valor),0) from cheques where baixa = :data into :ncheque;
    select coalesce(sum(valor * (case when tipo = 'D' then -1 else 1 end)),0) from contacorrente where data = :data into :ncontacorrente;

    suspend;

    data = data + 1;
  end
end
Responder

02/09/2013

Andre Ucella

Emerson, sensacional, isso mesmo deu certinho para o que eu estava precisando, modifiquei da forma que eu precisava e ficou show de bola.

Obrigadão em ...
Responder

04/09/2013

Andre Ucella

Surgiu uma duvida agora, fiz o codigo da seguinte maneira.

CREATE PROCEDURE SP_MOVIMENTO (
DATAINI DATE,
DATAFIM DATE,
COD_CAIXA INTEGER,
COD_CONTA INTEGER)
RETURNS (
DATA DATE,
CAIXA INTEGER,
CONTA INTEGER,
NFLUXO NUMERIC(15,2),
NCONTASRECEBER NUMERIC(15,2),
NCONTASPAGAR NUMERIC(15,2),
NCHEQUE NUMERIC(15,2),
NCARTAO NUMERIC(15,2),
NCONTACORRENTE NUMERIC(15,2))
AS
begin
data = dataini;
caixa = cod_caixa;
conta = cod_conta;

while (:data < :datafim) do
begin
select coalesce(sum(tab1.valorfechamento),0) from fluxo tab1 where tab1.cod_caixa = :caixa and tab1.datafechamento = :data into :nfluxo;
select coalesce(sum(tab2.valor_ctr),0) from contas_receber tab2 where tab2.vencto_ctr = :data into :ncontasreceber;
select coalesce(sum(tab3.valor_ctp),0) from contas_pagar tab3 where tab3.dtvencto_ctp = :data into :ncontaspagar;
select coalesce(sum(tab4.valor_che),0) from cheque tab4 where tab4.vencto_che = :data into :ncheque;
select coalesce(sum((tab5.valor - (tab5.valor * tab5.taxa)/100)),0) from contas_receber_adm_cartao tab5 where tab5.vencimento = :data into :ncartao;
select coalesce(sum(tab6.valor_lan * (case when tab6.dc_lan = '0' then -1 else 1 end)),0) from lancamentos_contas_corrente tab6 where tab6.cod_conta =:conta and tab6.dataemi_lan = :data into :ncontacorrente;

suspend;

data = data + 1;
end
end

Ta funcionando perfeitamente, porem teria algum jeito de mostrar o saldo da conta corrente ao invés do valor lançado no dia ?, so na conta corrente o restante ta td certinho...
Responder
veja se é isso:

CREATE PROCEDURE SP_MOVIMENTO (
	DATAINI DATE,
	DATAFIM DATE,
	COD_CAIXA INTEGER,
	COD_CONTA INTEGER)
RETURNS (
	DATA DATE,
	CAIXA INTEGER,
	CONTA INTEGER,
	NFLUXO NUMERIC(15,2),
	NCONTASRECEBER NUMERIC(15,2),
	NCONTASPAGAR NUMERIC(15,2),
	NCHEQUE NUMERIC(15,2),
	NCARTAO NUMERIC(15,2),
	NSALDOCONTACORRENTE NUMERIC(15,2))
AS
declare variable nsaldoinicial numeric(15,2);
declare variable nsaldo numeric(15,2);
begin
	data = dataini;
	caixa = cod_caixa;
	conta = cod_conta;

	-- é preciso saber se você tem algum totalizador para a conta corrente ou se o saldo é calculado em tempo-real.
	-- assumindo a segunda opção (tempo-real), será preciso calcular o saldo inicial do período.
	-- o cálculo poderia ter sido feito 'diariamente' naquela instrução da conta corrente, mas creio que assim, separado,
	-- tenha melhor performance. com isso, preciso obter o saldo inicial do período. 

	-- obtém o saldo inicial do período, ou seja, o saldo até o dia imediatamente anterior ao início período
	select coalesce(sum(tab6.valor_lan * (case when tab6.dc_lan = '0' then -1 else 1 end)),0)
	from lancamentos_contas_corrente tab6 where tab6.cod_conta = :conta and tab6.dataemi_lan < :data into :nsaldoinicial;

	-- efetua o cálculo diário dos movimentos
	while (:data <= :datafim) do -- Aqui troquei o operador para 'menor ou igual'
	begin
		select coalesce(sum(tab1.valorfechamento),0) from fluxo tab1 where tab1.cod_caixa = :caixa and tab1.datafechamento = :data into :nfluxo;
		select coalesce(sum(tab2.valor_ctr),0) from contas_receber tab2 where tab2.vencto_ctr = :data into :ncontasreceber;
		select coalesce(sum(tab3.valor_ctp),0) from contas_pagar tab3 where tab3.dtvencto_ctp = :data into :ncontaspagar;
		select coalesce(sum(tab4.valor_che),0) from cheque tab4 where tab4.vencto_che = :data into :ncheque;
		select coalesce(sum((tab5.valor - (tab5.valor * tab5.taxa)/100)),0) from contas_receber_adm_cartao tab5 where tab5.vencimento = :data into :ncartao;

		select coalesce(sum(tab6.valor_lan * (case when tab6.dc_lan = '0' then -1 else 1 end)),0) from lancamentos_contas_corrente tab6
		where tab6.cod_conta = :conta and tab6.dataemi_lan between :data_ini and :data into :nsaldo;

		nsaldocontacorrente = nsaldoinicial + nsaldo; -- saldo da conta corrente no dia

		suspend;

		data = data + 1;
	end
end
Responder

04/09/2013

Andre Ucella

Beleza amigo isso mesmo fechou...... muito Obrigado salvou minha semana, Obrigado mesmo.
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira