as telas de cadastro, previsões (contas a pagar/receber) e lançamentos (avulsos e baixas).

 

Gerando o histórico

Todas as operações realizadas nas tabelas Cax_Contas, Cax_Previsoes e Cax_Lancamentos serão armazenadas na tabela de histórico do sistema. Cada vez que o usuário do sistema incluir, alterar ou apagar um registro dessas tabelas, será disparada uma trigger que armazenará as informações do registro em questão, na tabela de histórico (Cax_Historico).

Todo o processo de geração do histórico será feito através de triggers vinculadas a eventos das tabelas. Utilizaremos os eventos After Insert, After Update e After Delete para inserir as informações na tabela de histórico. Veja na Listagem 1 as instruções SQL para geração do histórico da tabela Cax_Contas.

 

Listagem 1. Triggers para geração do histórico referente às operações efetuadas na tabela Cax_Contas

/*CAX_CONTAS - Após inserir um novo registro*/

CREATE TRIGGER "TRG_INS_CON_HIS" FOR "CAX_CONTAS"

ACTIVE AFTER INSERT POSITION 0

AS

BEGIN

  INSERT INTO CAX_HISTORICO (HIS_PRELANCON, HIS_TIPO,

    HIS_CODREFERENCIA, HIS_DESCRNOVA, HIS_VALORNOVO)

  VALUES ('C', 'I', NEW.CON_CODIGO, NEW.CON_DESCRICAO,

  NEW.CON_SALDOINICIAL);

END;

 

/*CAX_CONTAS – Após alterar um registro*/

CREATE TRIGGER "TRG_UPD_CON_HIS" FOR "CAX_CONTAS"

ACTIVE AFTER UPDATE POSITION 0

AS

BEGIN

  IF ((OLD.CON_DESCRICAO <> NEW.CON_DESCRICAO) OR

  (OLD.CON_SALDOINICIAL <> NEW.CON_SALDOINICIAL)) THEN

  BEGIN

    INSERT INTO CAX_HISTORICO (HIS_PRELANCON, HIS_TIPO,

    HIS_CODREFERENCIA, HIS_DESCRANTIGA, HIS_DESCRNOVA,

   HIS_VALORANTIGO, HIS_VALORNOVO)

     VALUES ('C', 'A', NEW.CON_CODIGO,

     OLD.CON_DESCRICAO, NEW.CON_DESCRICAO,

     OLD.CON_SALDOINICIAL, NEW.CON_SALDOINICIAL);

  END

END;

 

/*CAX_CONTAS – Após apagar um registro*/

CREATE TRIGGER "TRG_DEL_CON_HIS" FOR "CAX_CONTAS"

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

  INSERT INTO CAX_HISTORICO (HIS_PRELANCON, HIS_TIPO,

  HIS_CODREFERENCIA, HIS_DESCRANTIGA, HIS_VALORANTIGO)

   VALUES ('C', 'D', OLD.CON_CODIGO, OLD.CON_DESCRICAO,

   OLD.CON_SALDOINICIAL);

END;

Para o campo His_PreLanCon da tabela Cax_Historico armazenamos os valores “C” (Contas), “P” (Previsões) ou “L” (Lançamentos) para identificar a origem do registro. No campo His_Tipo armazenaremos os valores “I” (Inclusão), “A” (Alteração) ou “D” (Delete/Exclusão) para indicar a operação que originou o registro no histórico.

Na tabela de histórico serão incluídas apenas as informações mais importantes de cada tabela. Na trigger Trg_Upd_Con_His, por exemplo, só geraremos um histórico da alteração caso os campos Con_Descricao ou Con_SaldoInicial tenham sido alterados pelo usuário.

Dica: A variável Old guarda temporariamente os valores antigos das colunas, enquanto que a variável New armazena os novos valores a serem inseridos/alterados nas colunas.

Você pode baixar o script contendo as instruções SQL para definição das triggers para geração de histórico das tabelas Cax_Previsoes e Cax_Lancamentos a partir do endereço de download deste artigo, como também os arquivos do banco para FB 1.5, IB 6 e IB 7.5.

 

Controlando a inclusão/alteração do saldo inicial das contas

Cada vez que uma conta é cadastrada ou alterada, o sistema permite que o usuário entre com um saldo inicial. Essa opção é interessante, visto que quando uma empresa passa a utilizar um sistema informatizado para controlar suas contas, como caixa e contas bancárias, por exemplo, normalmente essas contas já possuem algum saldo (positivo ou negativo).

O saldo diário de cada conta cadastrada no sistema será armazenado junto com a data na tabela Cax_Saldos. Caso algum valor seja incluído ou alterado no campo Con_SaldoInicial da tabela Cax_Contas, utilizaremos uma stored procedure para atualizar o saldo na tabela Cax_Saldos. Para criar a SP, utilize a instrução da Listagem 2.

 

Listagem 2. Criando uma Stored Procedure para atualizar o saldo

CREATE PROCEDURE PROC_ATUALIZA_SALDO_CONTA (

  CODCONTA INTEGER, DT DATE, VALOR NUMERIC(18, 2))

AS

BEGIN

  /*Caso já exista um saldo para a conta na data

  informada no parâmetro DT, atualiza o valor*/

  IF (EXISTS(SELECT 1 FROM CAX_SALDOS

      WHERE CON_CODIGO = :CODCONTA AND

      SAL_DATASALDO = :DT)) THEN

  BEGIN

    UPDATE CAX_SALDOS SET SAL_SALDO =

      SAL_SALDO + :VALOR

     WHERE CON_CODIGO = :CODCONTA AND

      SAL_DATASALDO = :DT;

  END

  ELSE

  /*Caso não haja saldo para a conta na data informada

   no parâmetro DT, inclui o valor*/

  BEGIN

    INSERT INTO CAX_SALDOS(CON_CODIGO, SAL_DATASALDO,

      SAL_SALDO) VALUES (:CODCONTA, :DT, :VALOR);

  END

END

 

Utilizamos o comando Exists para verificar se já existe um registro com o código da conta e a data informada nos parâmetros de entrada da SP. Faremos a execução dessa SP, através de triggers vinculadas a eventos da tabela Cax_Contas. Utilizaremos os eventos After Insert e Before Update para fazer a atualização do saldo. Veja na Listagem 3 as instruções SQL para criação das duas triggers.

 

Listagem 3. Triggers para execução da stored procedure pra atualização do saldo diário da conta a partir do saldo inicial

CREATE TRIGGER "TRG_INC_CONTAS_SALDO" FOR "CAX_CONTAS"

ACTIVE AFTER INSERT POSITION 5

AS

DECLARE VARIABLE DT DATE;

BEGIN

  DT = 'NOW';

  DT = DT - 1;

  /*Caso saldo inicial seja diferente de 0

    ...

Quer ler esse conteúdo completo? Tenha acesso completo