Artigo Clube Delphi 106 - Trabalhando com transações avançadas em DBExpress e DataSnap

Artigo da Revista Clube Delphi Edição 106.

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


Expert

Trabalhando com transações avançadas em DBExpress e DataSnap

Aprenda a reaproveitar as transações já abertas pelo DataSnap

 

 

Neste artigo veremos

·Modelagem e criação de banco de dados.

·Utilização de recursos da tecnologia DataSnap para controle transacional;

·Técnicas que podem agregar qualidade e facilidade na manutenção do software.

Qual a finalidade

·Utilizar os recursos transacionais da tecnologia DataSnap evitando os controles transacionais manuais, aumentando a produtividade e facilidade de uso dos mesmos.

Quais situações utilizam esses recursos?

·Qualquer aplicação de arquitetura cliente-servidor ou multicamadas que utilize a tecnologia DataSnap, podendo ser aplicável a qualquer tipo de software que necessite realizar ações seqüenciais como atualizar estoque ou gerar contas a pagar / receber por exemplo.

 

Resumo do DevMan

Qualquer desenvolvedor iniciante ou não já teve dúvidas de como utilizar uma transação para realizar ações após o término de uma ação prévia. Transações requerem certos cuidados, pois podem ocasionar sérios problemas a um software caso não sejam utilizadas corretamente. Neste artigo é apresentada uma forma elegante e diferente de realizar atualizações / inserções por meio de uma transação aberta pelo próprio Datasnap, prevenindo problemas com transações manuais e garantindo maior facilidade para a manutenção.

 

Por participar muito de listas de discussão, percebo que alguns assuntos sempre são pauta nos fóruns e abordam questões do tipo: Como gerar meu contas a receber após a venda usando multicamadas? ou Como utilizo minha transação para atualizar meu estoque ao concluir/cancelar a venda?.

Grande parte dos desenvolvedores fazem estas tarefas utilizando um conjunto de objetos de bancos de dados como Triggers e Procedures, outros criam métodos na própria linguagem, passando parâmetros e montando a instrução de inserção ou atualização manualmente. Neste artigo irei abordar uma maneira diferente de se realizar tarefas como estas utilizando a própria transação do DataSnap, através de um exemplo comumente utilizado em sistemas comerciais, o típico controle de estoque no ato da venda.

Entendendo a problemática do sistema

Para o nosso exemplo faremos com que o usuário cadastre os produtos e as pessoas, clientes, que serão necessários para simularmos um exemplo simples de venda. O detalhe fica no cadastro de produtos onde informaremos a quantidade disponível de determinado produto, para que, no ato da venda façamos a baixa automática do estoque de cada produto vendido sem ter que iniciar uma transação manualmente. Ao efetuar o cancelamento da venda o estoque será automaticamente reposto com os produtos da venda cancelada.

 

Nota: Em caso de erro na atualização do estoque ou mesmo na própria venda / cancelamento, toda a operação será revertida do mesmo modo que o rollback de uma transação implementada manualmente, caso contrário, todas as operações receberão o commit realizado automaticamente pelo DataSnap.

 

Modelando e criando o banco de dados

Para o desenvolvimento de nosso banco utilizei o banco de dados Firebird em sua versão 1.5.5, porém o exemplo é totalmente aplicável a qualquer outra versão do mesmo. Sem mais delongas vamos à Figura 1.

 

Figura 1. Modelagem proposta para o nosso exemplo

Analisando-a, é possível ver que nossa modelagem é bem simples e composta de quatro tabelas sendo: PESSOA, PRODUTO, VENDA e VENDA_ITEM. É claro que algumas tabelas não foram implementadas por não serem o foco do nosso artigo, porém, através deste exemplo poderemos simular a atualização de estoque através. Vale lembrar que este exemplo pode ser aplicado a inúmeras situações e em diferentes arquiteturas que utilizem DataSnap.

A Listagem 1 contém todo o script do banco de dados. Para a criação do seu banco de dados, basta utilizar uma ferramenta como o IBExpert ou IBOConsole e executar o mesmo no local desejado. Passaremos agora para o desenvolvimento da nossa aplicação.

 

Listagem 1. Script do banco de dados

01 SET SQL DIALECT 3;

02 SET NAMES WIN1252;

03 SET CLIENTLIB '<DIRETÓRIO DA INSTALAÇÃO DO FIREBIRD>\BIN\fbclient.dll';

04 CREATE DATABASE '<DIRETÓRIO DO BANCO DE DADOS>\VENDAS.FDB'

05 USER 'SYSDBA' PASSWORD 'masterkey'

06 PAGE_SIZE 4096

07 DEFAULT CHARACTER SET WIN1252;

 

08 CREATE TABLE PESSOA

09 ( IDPESSOA INTEGER NOT NULL,

10   NOME VARCHAR(100) NOT NULL,

11   ENDERECO VARCHAR(100), 

12   BAIRRO VARCHAR(100),  

13   CIDADE VARCHAR(100), 

14   CEP CHAR(8),

15   ESTADO CHAR(2));

 

16 ALTER TABLE PESSOA ADD CONSTRAINT PK_PESSOA

17 PRIMARY KEY (IDPESSOA) USING INDEX IDX_PK_PESSOA;

 

18 CREATE TABLE PRODUTO

19 ( IDPRODUTO INTEGER NOT NULL,

20   PRODUTO VARCHAR(100) NOT NULL,

21   QTD_MIN INTEGER NOT NULL, 

22   QTD INTEGER NOT NULL,

23   VALOR_UNITARIO DOUBLE PRECISION NOT NULL);

 

24 ALTER TABLE PRODUTO ADD CONSTRAINT PK_PRODUTO

25 PRIMARY KEY (IDPRODUTO) USING INDEX IDX_PK_PRODUTO;

 

26 CREATE TABLE VENDA

27 ( IDVENDA INTEGER NOT NULL,

28   IDPESSOA INTEGER NOT NULL,

29   TOTAL_VENDA DOUBLE PRECISION NOT NULL);

 

30 ALTER TABLE VENDA ADD CONSTRAINT PK_VENDA

31 PRIMARY KEY (IDVENDA) USING INDEX IDX_PK_VENDA;

 

31 ALTER TABLE VENDA ADD CONSTRAINT FK_VENDA_PESSOA

32 FOREIGN KEY (IDPESSOA) REFERENCES PESSOA(IDPESSOA)

33 USING INDEX IDX_VENDA_PESSOA;

 

34 CREATE TABLE VENDA_ITEM

35 ( IDVENDA_ITEM INTEGER NOT NULL,

36   IDVENDA INTEGER NOT NULL,

37   IDPRODUTO INTEGER NOT NULL,

38   ITEM NOT NULL,

39   VALOR DOUBLE PRECISION NOT NULL,

40   QUANTIDADE INTEGER NOT NULL);

 

41 ALTER TABLE VENDA_ITEM ADD CONSTRAINT PK_VENDA_ITEM

42 PRIMARY KEY (IDVENDA_ITEM) USING INDEX IDX_VENDA_ITEM;

 

43 ALTER TABLE VENDA_ITEM ADD CONSTRAINT FK_ITEM_VENDA

44 FOREIGN KEY (IDVENDA) REFERENCES VENDA(IDVENDA)

45 ON" [...] continue lendo...

Artigos relacionados