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!