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 DELETE CASCADE

46 ON UPDATE CASCADE

47 USING INDEX IDX_ITEM_VENDA;

 

48 ALTER TABLE VENDA_ITEM ADD CONSTRAINT FK_VENDA_PRODUTO

49 FOREIGN KEY (IDPRODUTO) REFERENCES PRODUTO(IDPRODUTO)

50 USING INDEX IDX_VENDA_PRODUTO;

 

51 CREATE GENERATOR GEN_IDPRODUTO;

52 CREATE GENERATOR GEN_IDPESSOA;

53 CREATE GENERATOR GEN_IDVENDA;

54 CREATE GENERATOR GEN_IDVENDA_ITEM;

 

 

ClubeDelphi PLUS!

Acesse agora mesmo o portal do assinante ClubeDelphi e veja uma vídeo aula de Luciano Pimenta que mostra como utilizar o IBExpert para administração avançada de banco de dados Firebird/Interbase.

//www.devmedia.com.br/articles/viewcomp.asp?comp=3082

 

Criando o modelo de aplicação

Enfim vamos dar inicio ao desenvolvimento da nossa aplicação. Abra seu Rad Studio 2007 e acesse o menu File>New>VCL Forms Application – Delphi for Win32 para criar um novo projeto, em seguida altere as propriedades Name para frmMenu, Caption para Controle de Estoque, Position para poDesktopCenter, Height para 600 e Width para 800 e adicione um componente ...

Quer ler esse conteúdo completo? Tenha acesso completo