Artigo Clube Delphi Magazine 64 - Sistema SysCash

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (1)  (0)

Nessa segunda parte da série, implementaremos as triggers e stored procedures contendo as regras de negócio do sistema SysCash.

 

Esse artigo faz parte da revista Clube Delphi edição 64. Clique aqui para ler todos os artigos desta edição

Sistema SysCash

Parte II – Criando as regras de negócio

 

Nessa segunda parte da série, implementaremos as triggers e stored procedures contendo as regras de negócio do sistema SysCash. Iniciaremos também o desenvolvimento da aplicação Delphi, criando 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

"

A exibição deste artigo foi interrompida :(
Este post está disponível para assinantes MVP

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?