Quem conhece ou usa o componente BatchMove do Firedac? Ou o LocalSQL? Para a maioria dos desenvolvedores, esses componentes são relativamente desconhecidos, embora sejam muito úteis. Em dois blogs, quero explicar o valor agregado desses componentes e mostrar como eles funcionam. Este blog é sobre o componente BatchMove.
O BatchMove permite que você mova facilmente dados entre diferentes fontes e estruturas de dados. Pense em carregar dados de um CSV em um DataSet, ou exportar o conteúdo de um DataSet para um arquivo JSON, ou gravar o resultado de uma consulta de banco de dados em outro banco de dados.
Portanto, uma movimentação em lote sempre consiste em um Reader e um Writer. Você tem leitores para arquivos de texto, uma consulta SQL e para DataSets. Também há Writers para arquivos de texto, SQL e DataSet, bem como para JSON. Portanto, você pode fazer todas as combinações possíveis com esses Readers e Writers para mover dados entre fontes diferentes. E isso é muito mais fácil e rápido do que escrever código manualmente para essas situações.
Abaixo, você pode ver a configuração do meu aplicativo. À esquerda, há uma conexão com o banco de dados e o QueryCustomers, que lê os dados do banco de dados. À direita, você vê o CsvDataset, um Firedac MemTable. Nesse conjunto de dados, o CsvMove (TFDBatchMove) carrega os dados do CSV. Para fazer isso, o CsvMove está vinculado ao CsvReader (TFDBatchMoveTextReader) e ao CsvDatasetWriter (TFDBatchMoveDataSetWriter).
A grade mostra primeiro duas colunas com os dados do cliente do banco de dados. As três colunas seguintes vêm do CSV. Esses dados são combinados por meio do componente CombinedLocalSQL (TFDLocalSQL).
A configuração para leitura
A primeira etapa é ler o CSV. Para isso, configuramos o componente CsvReader. As capturas de tela abaixo mostram que há várias propriedades para especificar o arquivo e seu formato. Por meio da propriedade Fields, você pode especificar quais campos (ou colunas) estão presentes no arquivo. Você pode usar a opção WithFieldNames para especificar se os campos também aparecem como títulos de coluna no arquivo.
Para cada campo, você pode especificar o tipo de dados do campo e (se aplicável) seu tamanho e precisão. Nas capturas de tela abaixo, você pode ver como os campos são definidos no CsvReader e, na verdade, no CSV. Os títulos são diferentes, mas isso é interpretado corretamente pelo CSV Reader.
A configuração para gravação
Para gravar o CSV, escolhi o DataSet como destino, para que eu possa exibir os dados em uma grade. Esse Writer é um dos mais simples, não há muito o que configurar. Com os outros Writers, há opções disponíveis para formatação ou para consultas (no caso do Writer SQL). O DataSet Writer tem as opções abaixo.
Definir a opção Direct como True significa que, ao gravar os dados no conjunto de dados, as funções padrão Append, Edit e Post do conjunto de dados não serão usadas. Isso significa que nenhum evento de conjunto de dados é disparado. As funções internas do Firedac são então usadas. Portanto, isso só se aplica a um conjunto de dados baseado no Firedac. Em outros casos, a configuração dessa opção não importa.
Algo semelhante se aplica à opção Otimizar. Isso também afeta apenas os conjuntos de dados do Firedac e não se aplica a outros tipos. Se estiver usando um conjunto de dados associado a componentes com reconhecimento de dados, como um TDBGrid, a ativação dessa opção poderá causar problemas. Se a otimização estiver ativada, o Firedac define várias opções de busca e atualização que aceleram a gravação no conjunto de dados.
Leitura e gravação dos dados
Para finalmente reunir o Reader e o Writer e colocar os dados no CsvDataset, é necessário o componente TFDBatchMove. Ele aparece na tela como CsvMove. É aqui que você vincula o Reader e o Writer nas opções. No BatchMove, você também pode especificar o mapeamento entre os campos do Reader e os campos do Writer. Além disso, há opções para validar os arquivos (Analyze) e outras opções que influenciam o comportamento, como Mode (você deseja adicionar, atualizar ou excluir) e Options (empty data first, use transactions, etc.).
A execução do Move real pode ser feita simplesmente chamando o procedimento Execute no código.
CsvMove.Execute;
Em resumo
A movimentação de dados entre arquivos CSV e JSON, bancos de dados e conjuntos de dados é muito fácil com os componentes TFDBatchMove. Como a gravação de e para um conjunto de dados também é suportada, ela também oferece muitas possibilidades para outras soluções que podem fazer uso de um conjunto de dados. Basta pensar em mover dados entre dois bancos de dados diferentes ou em um conjunto de dados Firedac e um conjunto de dados ADO, por exemplo. O BatchMove é uma boa opção do Firedac que merece ser mais usada.
Contato