CallBimlScript wird interaktiv!

CallBimlScript wird interaktiv!

This blog post has also been published in English.

Und schon folgt das nächste Killer-Feature in BimlExpress und BimlStudio 2017: CallBimlScriptWithOutput!

Falls Ihnen CallBimlScript noch nicht vertraut ist, empfehlen wir zunächst Cathrine’s Beitrag zu diesem Thema.

CallBimlScript war schon immer eine große Hilfe um einzelne Biml Bausteine zu automatisieren. Der Nachteil war, dass es, außer der Ausgabe von Biml Code, nicht mit der aufrufenden Datei (Caller) interagieren konnte.
Dies stellte insbesondere bei komplexen Frameworks ein Problem dar, aber auch schon bei Themen wie der Ermittlung des OutputPath eines Datenflusstasks oder ähnlichem konnte es knifflig werden.

Bisher waren die Optionen beschränkt: Viel Logik nachbilden, XML parsen, endlose Annotations oder eine Reihe verschiedene Versionen der aufgerufenen Datei (Callee).

Klingt alles nicht so richtig prickelnd, oder?

Aber: Die Rettung naht! Ergänzend zum bereits bekannten CallBimlScript gibt es nun CallBimlScriptWithOutput!
Dieses erlaubt es, mit Hilfe eines dynamischen Objekts welches ebenfalls, also ergänzend zum Biml Code, von CallBimlScript zurückgegeben wird jegliche Art von Information an den Caller zurückgegeben.

Sehen wir uns an wie das in der Praxis aussieht. Dieses Beispiel generiert keinen nützlichen Biml Code (lediglich eine auskommentierte abgeleitete Spalte) – wie CallBimlScript funktioniert wissen Sie ja bereits.
Der spannende Teil sind die letzten Zeilen des Callers sowie des Callee.

Wir definieren uns als Startpunkt eine einfache manuelle Tabelle:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<Connections>
		<OleDbConnection ConnectionString="server=local" Name="MyConn"/>
    </Connections>
	<Databases>
		<Database Name="DB" ConnectionName="MyConn"></Database>
    </Databases>
	<Schemas>
		<Schema Name="dbo" DatabaseName="DB"></Schema>
    </Schemas>
	<Tables>
		<Table Name="MyFirstTable" SchemaName="DB.dbo">
			<Columns>
				<Column Name="Col1"></Column>
				<Column Name="Col2"></Column>
            </Columns>
        </Table>
    </Tables>
</Biml>

Jetzt kommt der spannende Teil. Wie üblich haben wir einen Caller und einen Callee:

<#@ template language="VB" optionexplicit="False" #>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<# Dim table = RootNode.Tables(0) 
	   	Dim customOutput #>
	<#=CallBimlScriptWithOutput("callee.biml", customOutput , table) #>

	<!-- Result from customOutput: -->
	<!--<#= customOutput.ColCount #> -->
	<!--<#= customOutput.Description #> -->
</Biml>
<#@  template language="VB" #>
<#@ property type="AstTableNode" name="tbl" #>
<!-- Biml Code being returned directly: -->
<!--<DerivedColumns Name="MyderivedCol">...</DerivedColumns>-->

<!-- CustomOutput gets populated to be passed back to Caller: -->
<# CustomOutput.ColCount =  tbl.columns.count 
   CustomOutput.Description ="Isn't this awesome?"
   CustomOutput.Cols = tbl.Columns #>

Bevor wir die Parameter (hier nur eine AstTableNode) an den Callee weitergeben definieren wir ein dynamisches Objekt und geben dieses ebenfalls an den Callee.

Innerhalb des Callee können wir hier nun wiederum beliebig Eigenschaften an das CustomOutput Objekt anhängen (Achtung: Innerhalb des Callee ist der Name dieses Objekts entscheidend!).
In diesem Fall geben wir einzelne Properties der durchgereichten Tabelle sowie einen statischen Text zurück und geben das Ergebnis innerhalb des aufrufenden Caller lediglich als Kommentar aus.

Ziemlich cool, oder?

Und da ich akzeptiert habe, dass manche von Ihnen immer noch nicht überzeugt sind, dass VB die schönere Sprache als C# ist… Hier nochmal der gleiche Code in C#. Aber das muss unter uns bleiben!

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
	<# AstTableNode table = RootNode.Tables[0];
	   	dynamic customOutput; #>
	<#=CallBimlScriptWithOutput("callee.biml", out customOutput, table) #>

	<!-- Result from customOutput: -->
	<!--<#= customOutput.ColCount #> -->
	<!--<#= customOutput.Description #> -->
</Biml>
<#@ property type="AstTableNode" name="tbl" #>
<!-- Biml Code being returned directly: -->
<!--<DerivedColumns Name="MyderivedCol">...</DerivedColumns>-->

<!-- CustomOutput gets populated to be passed back to Caller: -->
<# CustomOutput.ColCount =  tbl.columns.count;
   CustomOutput.Description ="Isn't this awesome?";
   CustomOutput.Cols = tbl.Columns; #>

Haben Sie hierzu Fragen oder Anmerkungen? Wir freuen uns auf Ihren Input unter biml@solisyon.de!

Weitere Informationen zu Biml, einschließlich Terminen und Blog Beiträgen finden Sie auch auf unserer Biml Seite.

Viel Spaß beim Biml’n!

Facebook