Cálculos ao salvar no banco e dúvida com Report Builder
Boa noite pessoal tudo bem? Espero que sim :D
Estou com a seguinte questão, estou aqui com um formulário que faz o controle simples de um caixa. Data - Histórico e Valor.
Só que é daí vem a questão, quando eu for gerar relatório eu preciso saber qual saldo eu tinha antes da inserção de um registro e qual saldo eu tenho depois da inserção de um registro, ou seja:
ID Data Histórico Valor Operação Saldo
1 16/01/2014 Recebimento 200,00 Crédito 100,00
2 16/01/2014 Recebimento 250,00 Crédito 350,00
3 16/01/2014 Recebimento 500,00 Crédito 850,00
4 16/01/2014 Pagamento 600,00 Débito 250,00
E se acaso o Débito for maior que o crédito ficaria assim baseado na informação acima:
4 16/01/2014 Pagamento 1000,00 Débito -150,00
Eu consigo fazer isso somente tendo no meu banco as colunas: ID, Data, Historico, Valor? Ou eu teria que fazer alguma coisa para o banco armazenar em algum lugar que quando a operação fosse crédito ele acrescentaria e quando fosse débito ele retiraria? Ou simplesmente com eu conseguiria trabalhar os dados informados pelo banco com base nas minhas colunas com condições?
A duvida sobre meu relatório era mais ou menos isso assim, eu conseguiria mostrar no relatório essas condições com base nas colunas que tenho?
Uso Delphi 2010 e Report Builder
Obrigado
Estou com a seguinte questão, estou aqui com um formulário que faz o controle simples de um caixa. Data - Histórico e Valor.
Só que é daí vem a questão, quando eu for gerar relatório eu preciso saber qual saldo eu tinha antes da inserção de um registro e qual saldo eu tenho depois da inserção de um registro, ou seja:
ID Data Histórico Valor Operação Saldo
1 16/01/2014 Recebimento 200,00 Crédito 100,00
2 16/01/2014 Recebimento 250,00 Crédito 350,00
3 16/01/2014 Recebimento 500,00 Crédito 850,00
4 16/01/2014 Pagamento 600,00 Débito 250,00
E se acaso o Débito for maior que o crédito ficaria assim baseado na informação acima:
4 16/01/2014 Pagamento 1000,00 Débito -150,00
Eu consigo fazer isso somente tendo no meu banco as colunas: ID, Data, Historico, Valor? Ou eu teria que fazer alguma coisa para o banco armazenar em algum lugar que quando a operação fosse crédito ele acrescentaria e quando fosse débito ele retiraria? Ou simplesmente com eu conseguiria trabalhar os dados informados pelo banco com base nas minhas colunas com condições?
A duvida sobre meu relatório era mais ou menos isso assim, eu conseguiria mostrar no relatório essas condições com base nas colunas que tenho?
Uso Delphi 2010 e Report Builder
Obrigado
Marlon Minotti
Curtidas 0
Respostas
Joel Rodrigues
19/01/2014
Olá, qual banco você utiliza? Seria uma ideia talvez fazer isso usando triggers direto no banco.
Duas formas comuns de fazer esse tipo de controle é da seguinte forma:
1) usar esses mesmos campos e salvar valores positivos para entradas, e negativos para saídas. Assim, bastaria sempre somar ao total, pois a soma de um negativo é equivalente a uma subtração.
2) criar outra coluna para identificar se o movimento é entrada ou saída.
Um recurso que talvez deixasse esse processo ainda mais simples seria usar um stored procedure que recebesse a data, o valor (positivo ou negativo, ou ainda a coluna indicando o tipo de movimento) e a descrição. Esse procedure calcularia o saldo restante e retornaria esse saldo como um valor positivo ou negativo, indicando se você ficou com crédito ou débito no caixa. EU faria assim.
Abraço.
Duas formas comuns de fazer esse tipo de controle é da seguinte forma:
1) usar esses mesmos campos e salvar valores positivos para entradas, e negativos para saídas. Assim, bastaria sempre somar ao total, pois a soma de um negativo é equivalente a uma subtração.
2) criar outra coluna para identificar se o movimento é entrada ou saída.
Um recurso que talvez deixasse esse processo ainda mais simples seria usar um stored procedure que recebesse a data, o valor (positivo ou negativo, ou ainda a coluna indicando o tipo de movimento) e a descrição. Esse procedure calcularia o saldo restante e retornaria esse saldo como um valor positivo ou negativo, indicando se você ficou com crédito ou débito no caixa. EU faria assim.
Abraço.
GOSTEI 0
Marlon Minotti
19/01/2014
Um campo que indica se é entrada ou saída eu tenho, são os valores Débito ou Crédito que estão na tabela plano_conta
Só que com um porém, na minha tabela "lancamento" eu tenho as colunas "historico, data, valor e plano_conta_ID". Essa tabela plano de conta é um meio que utilizo para identificar o tipo de entrada ou saída que tenho, por exemplo: A minha descrição do plano de contas é "Recebimento de Parcela" com o tipo de operação "Crédito", então quando eu selecionar o plano de conta no lancamento eu ja vou saber qual operação que ele pertence, se é entrada (crédito) ou saída (débito).
Como eu faria essa stored procedure? Não entendi muito bem como eu criaria ela. Eu já fiz procedures só que no PostgreSQL. Se puder ajudar obrigado.
Só que com um porém, na minha tabela "lancamento" eu tenho as colunas "historico, data, valor e plano_conta_ID". Essa tabela plano de conta é um meio que utilizo para identificar o tipo de entrada ou saída que tenho, por exemplo: A minha descrição do plano de contas é "Recebimento de Parcela" com o tipo de operação "Crédito", então quando eu selecionar o plano de conta no lancamento eu ja vou saber qual operação que ele pertence, se é entrada (crédito) ou saída (débito).
Como eu faria essa stored procedure? Não entendi muito bem como eu criaria ela. Eu já fiz procedures só que no PostgreSQL. Se puder ajudar obrigado.
GOSTEI 0
Joel Rodrigues
19/01/2014
Eu achei esse código aqui, pra SQL Server, talvez lhe ajude:
CREATE PROCEDURE usp_REGISTRAR_LANCAMENTO_CAIXA @VALOR DECIMAL, @HISTORICO VARCHAR(MAX), @DATA DATETIME AS BEGIN DECLARE -- VARIÁVEL PARA ARMAZENAR O SALDO DO DIA @SALDO DECIMAL, @TOTAL_LANCAMENTOS DECIMAL, @FUNDO_CAIXA DECIMAL -- INSERE O LANÇAMENTO NA TABELA INSERT INTO LANCAMENTOS (VALOR, HISTORICO, DATA) VALUES (@VALOR, @HISTORICO, @DATA) -- RETORNA O TOTAL DE LANÇAMENTOS (CRÉDITOS E DÉBITOS, SOMANDO POSITIVOS E NEGATIVOS) SELECT @TOTAL_LANCAMENTOS = SUM(VALOR) FROM LANCAMENTO WHERE DATA = @DATA -- RETORNA O FUNDO DE CAIXA DO INÍCIO DO DIA -- NESSA TABELA, TEM-SE O VALOR DE ABERTURA DO CAIXA, O VALOR DE FECHAMENTO E A DATA, UM REGISTRO POR DIA SELECT @FUNDO_CAIXA = VALOR_ABERTURA FROM CAIXA WHERE DATA = @DATA -- SOMA TUDO PARA VER QUANTO TEM EM CAIXA SET @SALDO = @TOTAL_LANCAMENTOS + @FUNDO_CAIXA -- RETORNA UM SELECT COM UMA COLUNA CHAMADA SALDO SELECT @SALDO AS SALDO END GO
GOSTEI 0
Marlon Minotti
19/01/2014
Eu uso MySQL, desculpa não ter falado
GOSTEI 0
Joel Rodrigues
19/01/2014
Veja este artigo e, com base no exemplo acima, você poderá adaptar: Stored Procedures no MySQL.
GOSTEI 0