Wie kent of gebruikt de Firedac component BatchMove wel eens? Of de LocalSQL? Bij de meeste ontwikkelaars zijn deze componenten relatief onbekend, terwijl ze wel heel handig zijn. In twee blogs wil ik de meerwaarde van deze componenten uitleggen en laten zien hoe ze werken. Deze blog gaat over de BatchMove component.
Met de BatchMove kun je eenvoudig data verplaatsen tussen verschillende data bronnen en data structuren. Denk aan data uit een CSV inladen in een DataSet, of de inhoud van een DataSet exporteren naar een JSON file, of het resultaat van een database query wegschrijven in een andere database.
Een batch move bestaat daarom altijd uit een Reader en een Writer. Je hebt readers voor Textbestanden, een SQL query en voor DataSets. Er zijn ook Writers voor Textbestanden, SQL en DataSet, maar daarnaast ook nog voor JSON. Je kunt met deze Readers en Writers dus alle mogelijke combinaties maken, om data te verplaatsen tussen verschillende bronnen. En dat gaat veel eenvoudiger en sneller dan het handmatig code schrijven voor dergelijke situaties.
Hieronder zie je de opzet van mijn applicatie. Links is er een connectie met de database en de QueryCustomers die de data uit de database inleest. Aan de rechterkant zie je de CsvDataset, een Firedac MemTable. In deze dataset wordt door de CsvMove (TFDBatchMove) de data uit de CSV geladen. Om dat te kunnen is de CsvMove gekoppeld aan de CsvReader (TFDBatchMoveTextReader) en de CsvDatasetWriter (TFDBatchMoveDataSetWriter).
De grid toont eerst twee kolommen met de customer gegevens uit de database. De drie kolommen daarna komen uit de CSV. Deze data wordt gecombineerd via de CombinedLocalSQL (TFDLocalSQL) component.
De eerste stap is het inlezen van de CSV. Hiervoor configureren we de CsvReader component. In de screenshots hierna is te zien dat er diverse properties zijn om het bestand en het format op te geven. Via de Fields property kun je aangeven welke velden (of kolommen) er in het bestand aanwezig zijn. Je kunt via de optie WithFieldNames aangeven of de velden ook als kolomtitels in je bestand staan.
Voor ieder veld kun je opgeven welk data type het bevat en (indien van toepassing) de grootte en nauwkeurigheid. In onderstaande screenshots zie je hoe de velden gedefinieerd zijn in de CsvReader en daadwerkelijk in de CSV. De titels zijn verschillend, maar dit wordt door de CSV Reader correct geinterpreteerd.
Voor het wegschrijven van de CSV heb ik als doel gekozen voor de DataSet, zodat ik de data kan tonen in een grid. Deze Writer is een van de eenvoudigste, er valt weinig aan te configureren. Bij de andere Writers zijn er opties beschikbaar voor formatting of voor queries (in het geval van de SQL writer). De DataSet Writer heeft onderstaande opties.
De optie Direct op True zetten, betekent dat er, bij het schrijven van de data naar de dataset, geen gebruik gemaakt wordt van de standaard Append, Edit en Post functies van de dataset. Dat betekent dat er ook geen dataset events afgevuurd worden. Er wordt dan gebruik gemaakt van de interne Firedac functies. Dit geldt dus alleen voor een Firedac gebaseeerde dataset. In andere gevallen maakt de instelling van dit vinkje niet uit.
Iets dergelijks geldt voor de Optimise optie. Die heeft ook alleen effect op Firedac datasets en geldt niet voor andere types. Als je gebruik maakt van een dataset die gekoppeld is aan data-aware components, zoals een TDBGrid, dan kan dit vinkje aanzetten problemen opleveren. Als de optimalisatie aanstaat, stelt Firedac diverse fetch en update opties in die het schrijven naar de dataset versnellen.
Om uiteindelijk de Reader en Writer bijelkaar te krijgen en de data in de CsvDataset, is de TFDBatchMove component nodig. Die staat op het scherm als CsvMove. Hier koppel je in de opties de Reader en Writer aan elkaar. In de BatchMove kun je ook de mapping aangeven tussen de velden uit de Reader en de velden van de Writer. Daarnaast zijn er opties om de files te laten valideren (Analyze) en andere opties die het gedrag beinvloeden, zoals Mode (wil je toevoegen, updaten of deleten) en Options (data eerst legen, transacties gebruiken, etc.).
Het uitvoeren van de daadwerkelijke Move, kan eenvoudig door in de code de Execute procedure aan te roepen.
CsvMove.Execute;
Het verplaatsen van gegevens tussen CSV en JSON bestanden, Databases en Datasets, wordt door de TFDBatchMove components heel erg eenvoudig gemaakt. Doordat ook het schrijven van en naar een dataset ondersteund wordt, biedt het ook veel mogelijkheden voor andere oplossingen die gebruik kunnen maken van een dataset. Denk alleen al aan het verplaatsen van gegevens tussen twee verschillende databases of een Firedac dataset en bijvoorbeeld een ADO dataset. De BatchMove is een mooie Firedac optie die het verdient om meer gebruikt te worden.
Contact