AJUDA COM FLUXO DE CAIXA

FBGSYSTEMS 12/03/2014 17:32:30
#435937
Boa tarde galera.

Meu cliente pediu que eu desenvolvesse ao controle de despesas e receitas dele o fluxo de caixa.

Exemplo se nao estiver claro:

Tabela movimento
------------------------
Vencimento Tipo Valor Saldo
10/03/2014 E 10,00 10,00
11/03/2014 E 15,00 25,00
11/03/2014 S 5,00 20,00

Algo parecido com isso para ele estimar a quantia de dinheiro ele terá futuramente.

Mas estou em duvida em como executar isso.. Pois preciso saber o saldo atual dele. Pensei em criar um registro na tabela de movimentação com o saldo atual, e a partir dai gerar a coluna saldo com base no primeiro registro.

Porém já estou pensando em algumas possibilidades, como por exemplo o sistema gerar a tabela acima, e depois ele incluir outro registro entre uma data e outra. Assim o saldo vai ficar bagunçado.

Em outro sistema fiz a criação da coluna saldo toda vez que ele fosse abrir o relatório, porém neste cliente o fluxo de informação é maior e em pouco tempo ficará muito lento este processo.

Alguem me da alguma dica da melhor forma de desenvolver isso ?
FBGSYSTEMS 13/03/2014 14:51:49
#436009
Ninguem ?
MARCELO.TREZE 13/03/2014 16:35:02
#436016
você pode fazer de varias maneiras, você pode criar uma outra tabela com o saldo atualizado, exemplo:

TabelaSaldo

Campos

id = numeração automatica
datalancamento = data/hora
Valor = Currency

dai você faz uma verificação onde se a tabela estiver vazia um inputbox surge para o cliente lançar o saldo atual.

caso a tabela ja possua valores basta você lancar conforme data o saldo atual nesta tabela quando o=houver movimentação na tabela movimento, e pronto.


FBGSYSTEMS 13/03/2014 16:43:24
#436017
Marcelo, é assim que pensei em fazer.
Porém o meu problema esta sendo para gerar a coluna saldo.
Eu teria mesmo que fazer um loop em todos os registros a partir do saldo pra atualizar meus registros financeiros.

Esta é minha preocupação
MARCELO.TREZE 13/03/2014 17:28:03
#436021
colega é o seguinte qual é o banco de dados que vc está utilizando?
FBGSYSTEMS 13/03/2014 17:33:24
#436023
MySql
MARCELO.TREZE 13/03/2014 18:46:23
#436025
Resposta escolhida
Então vai uma dica legal, porém vc terá de pesquisar, o MySQL possui uma ferramenta legal que se chama TRIGGER, trigger é um gatilho que pode fazer o seguinte apos você incluir por exemplo uma entrada a trigger verifica realmente se é entrada e atualiza o saldo, algo assim:

na janela do mysql

mysql> DELIMITER $$

mysql> CREATE TRIGGER saldoAtual BEFORE INSERT ON movimento
-> FOR EACH ROW
-> BEGIN
-> DECLARE saldoAnterior DECIMAL(10,2);
-> SET saldoAnterior = (SELECT M.saldo FROM movimento M ORDER BY M.id DESC LIMIT 1);
-> IF (NEW.tipo= [ô]E[ô]) THEN
-> SET NEW.saldo = saldoAnterior + NEW.valor;
-> ELSE
-> SET NEW.saldo = saldoAnterior - NEW.valor;
-> END IF;
-> END $$

mysql> DELIMITER ;



pra você entender com a trigger acima ao você inserir um movimento o saldo do mesmo sera atualizado conforme o tipo.

exemplo

se você fizer

INSERT INTO movimento (Vencimento, Tipo,  Valor) VALUES ([ô]2013-03-10[ô], [ô]E[ô], [ô]10,00[ô])


repare que nao coloquei o saldo acima, isso porque a trigger vai ver o insert , ler que é [ô]E[ô] entrada e fazer a atualização no saldo.

bom o código não é uma solução definitiva, porém o fiz baseado em uma tabela simples (movimento), mostro aqui o caminho das aguas o restante fica a seu critério, ou seja erros e acertos para corrigir algo na trigger.

qual a vantagem disto? todo processo ficara por conta do próprio banco de dados o que vai aumentar o desempenho consideravelmente.

ps: a trigger acima foi feita baseada apenas na tabela movimentos, eu não criei outra tabela, e nesta tabela movimente deverá ter também um campo id (autonum) para que a mesma funcione
MARCELO.TREZE 14/03/2014 00:47:04
#436028
bom colega voltei só pra dizer que fiz um teste criei uma tabela movimentos e inclui os seguintes campos

id - autoincremnt
vencimento -data
tipo - Char(1)
valor - double
saldo - double

criei a tigger no mysql, no meu caso criei usando o heidi sql mesmo, a tigger funcionou muito bem desta forma

CREATE TRIGGER movimentos_before_insert BEFORE INSERT ON movimento
-> FOR EACH ROW
-> BEGIN
-> DECLARE saldoAnterior DOUBLE;
-> SET saldoAnterior = (SELECT M.saldo FROM movimento M ORDER BY M.id DESC LIMIT 1);
-> IF (NEW.tipo= [ô]E[ô]) THEN
-> SET NEW.saldo = saldoAnterior + NEW.valor;
-> END IF;
-> IF (NEW.TIPO =[ô]S[ô]) THEN
-> SET NEW.saldo = saldoAnterior - NEW.valor;
-> END IF;

-> END $$


SE VOCÊ USA O HEIDISQL AVISE QUE TE ENSINO A CRIAR A TIGGER NELE.

por fim bastou eu inserir os dados até o valor apenas que o saldo foi se atualizando, eu me surpreendi comigo mesmo, rs ainda num tinha usado uma tigger, rs

FBGSYSTEMS 20/03/2014 08:41:51
#436278
Bom dia. Consegui finalmente me focar nisso novamente. Porem acho qu enao vai ter como, vou ter mesmo que fazer um laço.

Porque disso ?

Simples, o usuário tem os seguintes dados na tabela movimento:

10/03/2014 E 10,00 10,00
11/03/2014 E 15,00 25,00
11/03/2014 S 5,00 20,00

Ele pode no dia 12/03, ir la e lançar algo com assim:
10/03/2014 E 5,00 5,00

O que teria que deixar a tabela assim :
10/03/2014 E 5,00 5,00
10/03/2014 E 10,00 15,00
11/03/2014 E 15,00 30,00
11/03/2014 S 5,00 25,00

Acho que não encontrarei uma solução pra isso. E infelizmente temos que deixar uma opção para o cliente corrigir situações de esquecimento ou erro mesmo.
Por exemplo, ele pode ter lançado um lançamento e ter que apaga-lo, enfim.

[EDIT] Esqueci de dizer, seu exemplo funcionou aqui. Obrigado pela atenção![/edit]
Tópico encerrado , respostas não são mais permitidas