Artigo Clube Delphi 106 - Trabalhando com transações avançadas em DBExpress e DataSnap
Artigo da Revista Clube Delphi Edição 106.
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
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo