This blog post has also been published in English.
Biml liefert von Haus aus unzählige Methoden und Funktionen “out of the Box”. Aber manchmal ist es eine ganz bestimmte Funktion, die fehlt oder gerade sehr praktisch wäre. Nun kann man anfangen hier mit manuellem XML o.ä. zu arbeiten – das wird jedoch schnell unübersichtlich.
Ein Beispiel: Sie haben einige Flatfile-Formate in Ihrer Biml Solution definiert und möchten nun darauf basierend mit Biml die entsprechenden SQL Tabellen in Ihrer Zieldatenbank anlegen. Sie müssen also eine AstFlatFileFormatNode in eine AstTableNode konvertieren. Leider gibt es keine Möglichkeit einfach eine Methode wie ToAstTableNode auf einer AstFlatFileFormatNode aufzurufen – oder doch?
Diese kleine Biml-Datei erzeugt die erforderlichen Table-Tags:
<#@ template language="VB" #> <#@ code file="../code/FlatFileExtensions.vb" #> <# Dim UseSchema as AstSchemaNode = rootnode.schemas(0) #> <Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Tables> <# for each tbl as AstFlatFileFormatNode in rootnode.flatfileformats #> <#= tbl.ToAstTableNode(UseSchema).GetBiml #> <# next #> </Tables> </Biml>
Damit eine AstTableNode gültig ist, benötigt sie ein Schema. Dies ist die einzige Information, welche wir der AstFlatFileFormatNode nicht entnehmen können, weswegen wir eine Variable namens UseSchema definieren und diese an unsere Extension Method weitergeben.
Aber wie funktioniert das mit der Extension Method? VIEL einfacher als man vielleicht zunächst vermutet:
Imports Varigence.Languages.Biml Imports Varigence.Languages.Biml.FileFormat Imports Varigence.Languages.Biml.Table Imports System.Runtime.CompilerServices Module FlatFileExtension <Extension()> Public Function ToAstTableNode(FlatFile As AstFlatFileFormatNode, Schema As AstSchemaNode) As AstTableNode Dim BimlTable As New AstTableNode(Nothing) BimlTable.Name = "FF_" + FlatFile.name BimlTable.Schema = schema For Each flatFileColumn As astflatfilecolumnnode In FlatFile.Columns Dim tableColumn As New AstTableColumnNode(Nothing) tableColumn.Name = flatFileColumn.Name tableColumn.DataType = flatFileColumn.DataType tableColumn.Length = flatFileColumn.Length tableColumn.Precision = flatFileColumn.Precision tableColumn.Scale = flatFileColumn.Scale tableColumn.CodePage = flatFileColumn.CodePage BimlTable.Columns.Add(tableColumn) Next Return BimlTable End Function End Module
Wir müssen nur ein paar Kleinigkeiten beachten:
1. Imports System.Runtime.CompilerServices – VB benötigt dies um eine Extension Method zu erzeugen
2. Statt einer Klasse definieren wir ein Modul
3. Direkt vor der Extension Method markieren wir diese mit "<Extension()>"
4. Standardmäßig nimmt eine Extension Method als ersten Parameter das Objekt von dem es aufgerufen wurde. Wir definieren also 2 Eingabeparameter, übergeben aber nur das Schema.
Wenn das soweit klar ist, ist es ganz einfach:
– Erzeugen einer neuen AstTableNode
– Zuweisung von Namen und Schema
– Für jede Spalte des Flatfile Formats erzeugen wir eine Spalte in der AstTableNode und setzen die ursprünglichen Eigenschaften auch dort
– Rückgabe der Tabelle
Das war es schon – Sie können nun auf der AstFlatFileFormatNode die Methode ToAstTableNode aufrufen.
Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter !
Weitere Informationen zu Biml, einschließlich Terminen und Blog Beiträgen finden Sie auch auf unserer Biml Seite.
Viel Spaß beim Biml’n!