Recalcular Juros em uma Parcela - Ajudem
Galera boa tarde, montei um sql onde que ele irá atualizar o valor da parcela vencida, só que preciso que ela rode 1x por dia se caso o cliente não efetuar o pagamento.
Esta procedure ela roda todo momento quando for abrir o DM (datamodule) , so que ela esta atualizando varias vezes quando entro no sistema.
Oque posso fazer para que ele te não rodar mais de 1x?
begin begin update parcela seT parcela.valor_parcela = parcela.valor_parcela+(current_date - parcela.data_vencimento)* parcela.taxa_juros, parcela.dias_vencimentos = current_date - parcela.data_vencimento WHERE current_date > parcela.data_vencimento; end end
Esta procedure ela roda todo momento quando for abrir o DM (datamodule) , so que ela esta atualizando varias vezes quando entro no sistema.
Oque posso fazer para que ele te não rodar mais de 1x?
Eduardo Oliveira
Curtidas 0
Respostas
Anderson Gonçalves
26/07/2020
Galera boa tarde, montei um sql onde que ele irá atualizar o valor da parcela vencida, só que preciso que ela rode 1x por dia se caso o cliente não efetuar o pagamento.
Esta procedure ela roda todo momento quando for abrir o DM (datamodule) , so que ela esta atualizando varias vezes quando entro no sistema.
Oque posso fazer para que ele te não rodar mais de 1x?
begin begin update parcela seT parcela.valor_parcela = parcela.valor_parcela+(current_date - parcela.data_vencimento)* parcela.taxa_juros, parcela.dias_vencimentos = current_date - parcela.data_vencimento WHERE current_date > parcela.data_vencimento; end end
Esta procedure ela roda todo momento quando for abrir o DM (datamodule) , so que ela esta atualizando varias vezes quando entro no sistema.
Oque posso fazer para que ele te não rodar mais de 1x?
Crie uma variável booleana para você verificar no inicio do programa se ele foi atualizado na data corrente ele é true se não ele é false, se ele for false atualizar se não exit ele não faz nada, tipo isso, mais detalhes entre em contato comigo.
skype: anderson@case13.com.br
GOSTEI 0
Emerson Nascimento
26/07/2020
Sugiro a criação de uma tabela de parâmetros, que pode ser utilizada para inúmeras finalidades.
Como você não indicou qual banco de dados utiliza nem quais são os componentes de acesso utilizados no Delphi, adapte a dica para tua realidade.
A tabela de parâmetros teria uma estrutura mais ou menos assim:
Coloquei o campo NOME como chave primária, assim não corremos o risco de duas estações gravarem mais de uma vez o mesmo parâmetro.
Para o caso apresentado, você poderia criar o seguinte parâmetro (ou deixar que o próprio sistema o crie, conforme demonstrado abaixo):
No momento do recálculo, você faz algo como:
Pronto!
Desta forma você garante que o procedimento de atualização das parcelas será executado apenas uma vez no dia, seja por qual estação for, e independente do número de vezes que você entrar e sair do sistema.
Como você não indicou qual banco de dados utiliza nem quais são os componentes de acesso utilizados no Delphi, adapte a dica para tua realidade.
A tabela de parâmetros teria uma estrutura mais ou menos assim:
CREATE TABLE [dbo].[PARAMETROS]( [NOME] [varchar](50) NOT NULL, [TIPO] [char](1) NOT NULL, [DESCRICAO] [varbinary](max) NULL, [CONTEUDO] [varchar](200) NOT NULL CONSTRAINT [PARAMETROS_PK] PRIMARY KEY CLUSTERED ( [NOME] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Para o caso apresentado, você poderia criar o seguinte parâmetro (ou deixar que o próprio sistema o crie, conforme demonstrado abaixo):
Nome: DATA_RECALCULO_PARCELAS_VENCIDAS Tipo: D (DATA) Descricao: Data do último recálculo das parcelas vencidas. Conteudo:
No momento do recálculo, você faz algo como:
var lExisteParametro: boolean; begin // assim você atualiza os dados da tabela, // que podem ter sido alterados por outra estação dm.Parametros.Refresh; // o dataset deve ser aberto ao criar o dm // posiciona no registro do parâmetro lExisteParametro := dm.Parametros.Locate('NOME', 'DATA_RECALCULO_PARCELAS_VENCIDAS', []); if (not lExisteParametro) or (dm.ParametrosCONTEUDO.AsString < FormatDateTime('yyyy/mm/dd', Date )) then begin {executa procedimento de atualização das parcelas} // depois de executar a atualização, cria ou atualiza o conteúdo do parâmetro if lExisteParametro then dm.Parametros.Edit else begin dm.Parametros.Append; dm.ParametrosNOME.AsString := 'DATA_RECALCULO_PARCELAS_VENCIDAS'; dm.ParametrosTIPO.AsString := 'D'; dm.ParametrosDESCRICAO.AsString := 'Data do último recálculo das parcelas vencidas.'; end; // é aqui mesmo, fora do if, porque o conteúdo será manipulado sendo um novo registro ou atualizando o já existente dm.ParametrosCONTEUDO.AsString := FormatDateTime('yyyy/mm/dd', Date ); try dm.Parametros.ApplyUpdates(); except // a única exceção que pode acontecer aqui é uma duplicidade // (alguma outra estação pode ter inserido o registro), então podemos descartar; dm.Parametros.Cancel; end; end; end;
Pronto!
Desta forma você garante que o procedimento de atualização das parcelas será executado apenas uma vez no dia, seja por qual estação for, e independente do número de vezes que você entrar e sair do sistema.
GOSTEI 0