Fala ai Radizeiros e Radizeiras, tudo bem com vocês?
Quantas vezes você já escreveu diversos comando SQL dentro de uma componente para fazer alguns procedimentos dentro do seu software?
Procedimentos esses que se tivesse uma opção de executar tudo de uma única vez seria muito melhor do que linhas intermináveis de códigos, ou diversos componentes dentro do projeto, aumentando assim seu acoplamento.
Como tenho dito aqui na nossa série sobre Firedac aqui no blog, existem diversas funcionalidades disponíveis que nos ajudam no nosso dia a dia.
Hoje aqui no blog estarei falando sobre como processar diversos comandos de uma vez só.
Isso mesmo, executar comandos em lote.
O Firedac disponibiliza uma funcionalidade chamada Batches.
Mas você deve está se perguntando, que raios é esse tal de Batches?
Calma meu pequeno gafanhoto…rsrs
O Batches é uma funcionalidade que envia lotes de comandos de uma única vez para o nosso SGDB.
E isso acaba deixando muito mais rápido as nossas requisições dentro do banco de dados.
Isso acontece porque ele processa tudo de uma única vez, e nos trás esse resultado em um bloco só.
Vamos criar um novo exemplo.
Vamos buscar duas tabelas, onde em cada FDQuery iremos executar um comando SQL.
Vamos fazer o seguinte, dentro do botão iremos abrir os dados.
procedure TForm4.Button1Click(Sender: TObject); var Tempo : Cardinal; begin FDConnection1.Close(); Tempo := GetTockCount(); FDQuery1.Open(); FDQuery2.Open(); Label1.Caption := IntToStr(GetTichCount() - Tempo); end;
Agora vamos executar nosso exemplo e verificar o tempo que leva a execução dos comandos do código acima.
Existe dentro do Firedac um outro jeito para executar esses comandos, que é trabalhando com os Batches.
Vamos criar a mesma estrutura do nosso exemplo, onde adicionamos um outro botão para executarmos o Batche, e dois FDMemTable.
Vamos fazer uma pequena alteração no código anterior.
procedure TForm4.Button1Click(Sender: TObject); var Tempo : Cardinal; begin FDConnection1.Close(); Tempo := GetTockCount(); FDQuery1.Open(); FDQuery2.Open(); DataSource1.DataSet :+ FDQuery1; DataSource2.DataSet :+ FDQuery2; Label1.Caption := IntToStr(GetTichCount() - Tempo); end;
Agora no nosso segundo botão iremos fazer esse processo em Batche.
Iremos utilizar os dois FDMemTable que colocamos no nosso exemplo.
Iremos acrescentar mais um FDQuery, e utiliza-lo.
Isso porque ao invés de executar cada um dos outras FDQuery, que possui um SQL para cada um.
Iremos adicionar dentro desse novo FDQuery os dois SQL.
SELECT * FROM CLIENTE; SELECT * FROM MENSAGERIA;
E observa que separados por ponto e vírgula.
E agora vamos implementar dentro do nosso novo botão.
procedure TForm4.Button2Click(Sender: TObject); var Tempo : Cardinal; begin FDConnection1.Close(); FDQuery3.FetchOptions.AutoClose := False; Tempo := GetTickCount(); FDQuery3.Open(); FDQuery3.FetchAll; Label2.Caption := IntToStr(GetTickCount - Tempo); FDMemTable1.Data := FDQuery3.Data; FDQuery3.NextRecordSet; FDQuery3.FetAll; FDMemTable2.Data := FDQuery3.Data; DataSource1.DataSet := FDMemTable1; DataSource2.DataSet := FDMemTable2; end;
Se observar no código acima, foi adicionado alguns comandos diferentes.
Para trabalharmos com o Batche, é necessário dentro da FDQuery alterar a opção AutoClose para false, se não o Batche não irá funcionar.
Dentro do código você pode observar o FDQuery3.FetchAll, que trás todos os dados, e logo em seguida passo para o Label2 o tempo que levou para ser executado.
Agora nós adicionamos em cada FDMemTable individual.
Isso acontece pois o FDQuery tem uma opção que se chama NextRecordSet.
Como fazemos duas buscas dentro do FDQuery, ele aloca esses resultados em vários RecordSet separados, e no caso como são dois, ele tem dois RecordSet separados.
E nesse caso em cada FDMemTable adicionamos os dados e passamos para o próximo RecordSet.
Logo depois eu pego todos os dados da segunda consulta e jogo no próximo FDMemTable.
Observe que executamos o primeiro botão, onde cada FDQuery faz um processo.
Logo em seguida no outro botão, onde estamos executando o Batche, ele executa praticamente o mesmo tempo de execução.
Esse exemplo foi executado localmente, mas se você executá-lo trabalhando em rede, é notório a velocidade.
Isso se dá pelo fato de a execução em lote, evitando assim executar várias vezes a abertura e fechamento do banco de dados.
Com o Batche, você vai no banco de dados, pega todas as informações de uma só vez e pronto.
Com isso só trabalhar depois na sua aplicação.
E caso você tenha interesse de conhecer mais sobre as técnicas do Firedac acessa o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI, onde você não só terá conteúdos relacionados ao Firedac, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
CLIQUE AQUI E SAIBA MAIS SOBRE O CLUBE DOS PROGRAMADORES DELPHI