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