Guia Delphi

Aplicações mestre-detalhe com FireDAC

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
 (6)  (0)

Neste artigo veremos como construir uma aplicação de cadastro no estilo mestre-detalhe utilizando a biblioteca FireDAC e seu recurso de Cache Updates.

Fique por dentro
Aplicações que utilizam a relação N x N são denominadas do tipo mestre-detalhe. Nesse tipo de aplicação a exibição dos dados contidos na tabela detalhe é dependente da tabela mestre, ou seja, a seleção de dados na tabela mestre faz com que os dados exibidos na tabela detalhe sejam atualizados automaticamente. Essas aplicações são as mais comuns e largamente utilizadas em sistemas comerciais, uma vez que podem trazer agilidade e economia de tempo nas telas de consulta. Elas podem ser construídas utilizando ou não os recursos de cache, sendo que essa segunda abordagem apresenta uma série de vantagens e funcionalidades adicionais que podem aumentar o controle sobre os dados nesse tipo de aplicação, como o envio de registros em lote para serem gravados e um controle de erro mais eficaz. Desta forma, é importante o conhecimento sobre como construir aplicações mestre-detalhe utilizando a engine de acesso a dados padrão do Delphi atualmente, o FireDAC.

Autores: Jones Granatyr e Fábio Spak

Quando se pensa no desenvolvimento de software seguindo a metodologia cliente e servidor, basicamente podemos utilizar dois métodos principais no que diz respeito à manipulação dos registros. O primeiro é o mais comum e ocorre quando os registros são enviados um a um para a base de dados, ou seja, a cada clique em algum botão específico é executado um comando insert, update ou delete. Por outro lado, o segundo método é utilizar conceitos de cache. Nesse caso, as atualizações são armazenadas em memória até que o usuário decida aplicá-las no servidor em uma operação em lote (batch), que geralmente ocorre em uma única transação. A segunda abordagem é bastante conhecida dos desenvolvedores Delphi, sendo que esses mecanismos são geralmente implementados utilizando dbExpress em conjunto com os componentes TClientDataSet e TDataSetProvider.

Conforme mencionado anteriormente, sem a utilização de cache os dados são enviados um por um diretamente para o banco de dados, fato que não permite a revisão dos dados por parte dos usuários ou então a gravação em lote. Portanto, a utilização desse recurso apresenta uma série de vantagens, das quais podemos citar a visualização e possibilidade de modificação dos dados antes de serem gravados e, principalmente, a facilidade de salvar os dados em um arquivo local, o que permite trabalhar com o sistema desconectado. Nesse contexto, a conexão ao servidor seria necessária somente na gravação final de todos os registros.

Apesar de possuir essas vantagens, um problema desse tipo de aplicação é que os dados podem “envelhecer” rapidamente. Imagine que dois usuários acessem um mesmo conjunto de registros e que o primeiro abra uma janela e deixe o sistema inativo por algum tempo. Enquanto isso, o segundo usuário realiza várias alterações e as grava no servidor. Neste contexto, o primeiro usuário estaria trabalhando com uma cópia inválida dos dados, o que aumentaria o risco de sobrescrever os registros e até mesmo invalidar as modificações aplicadas pelo primeiro usuário. De acordo com isso, podemos perceber que aplicações desta natureza necessitam de um maior controle para evitar inconsistência dos dados.

Baseado nisso, o objetivo do presente artigo é mostrar como construir uma aplicação mestre-detalhe utilizando o Delphi 10.1 Berlin, a engine FireDAC de acesso a dados e o SQL Server como o sistema gerenciador de banco de dados. Será mostrado como criar a base de dados e utilizar duas formas para a implementação da janela mestre-detalhe: a primeira sem a utilização dos recursos de cache e a segunda fazendo uso desse recurso. Serão também discutidas algumas vantagens de utilizar cache, sendo mostrados também vários recursos adicionais que o uso desse mecanismo possibilita. As próximas seções mostram o desenvolvimento completo do software.

Criando a base de dados

O primeiro passo é a criação da base de dados que representará nosso exemplo de aplicação mestre-detalhe. Para isso, a Listagem 1 apresenta os comandos SQL para a definição da base de dados e das tabelas no SQL Server. Na linha 01 encontra-se o comando para a criação da base de dados, enquanto que entre as linhas 04 e 11 estão os comandos para a criação da tabela de clientes e de produtos. Como pode ser observado, essas duas tabelas armazenam somente um identificador (chave primária e autoincremento — identity) e um nome.

Entre as linhas 12 e 16 encontra-se o script para a definição da tabela de vendas, que, além da chave primária autoincremento, possui a data da venda e uma chave estrangeira para a tabela de clientes. Por fim, a partir da linha 17 se localiza o script de criação da tabela venda_produtos, que armazenará os produtos existentes em cada venda e que caracteriza a relação mestre-detalhe deste exemplo. Essa tabela contém uma chave primária autoincremento, a quantidade de produtos comprados e duas chaves estrangeiras: uma relacionada à venda e outra ao produto.

Listagem 1. Scripts de criação da base de dados.

  01 create database mestre_detalhe;
  02 go
  03 use mestre_detalhe;
  04 create table clientes (
  05   idcliente int not null primary key identity,
  06   nome varchar(50) not null
  07 );
  08 create table produtos (
  09   idproduto int not null primary key identity,
  10   nome varchar(50) not null
  11 );
  12 create table vendas (
  13   idvenda int not null primary key identity,
  14   idcliente int not null foreign key references clientes (idcliente),
  15   data_venda date not null
  16 );
  17 create table venda_produtos (
  18   idvenda_produtos int not null primary key identity,
  19   idvenda int not null foreign key references vendas (idvenda),
  20   idproduto int not null foreign key references produtos (idproduto),
  21   quantidade int not null
  22 );

O c" [...]

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
Ficou com alguma dúvida?