Recalcular Juros em uma Parcela - Ajudem

SQL

Delphi

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.
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

Eduardo Oliveira

Curtidas 0

Respostas

Anderson Gonçalves

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.
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

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:
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]
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):
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
POSTAR