Die Ausgangslage
Für SAP HANA Trainings, welche wir in letzter Zeit vermehrt durchführen, haben wir ein ein Beispiel-Projekt erstellt, welches sich zur besseren Strukturierung in diverse Unterverzeichnisse unterteilt. Jede einzelne Datei darin enthält Quellcode oder Definitionen für einzelne Laufzeit-Artefakte, wie zB Javascript-Dateien, oData Definitionen, Datenbank-Definitionen usw. Während des Trainings müssen nun die Teilnehmer diese Dateien Stück für Stück selbst aufbauen – mit dem Nachteil, das sich oft Tipp- bzw Copy/Paste Fehler einschleichen. Ein einfaches Kopieren der gesamten Datei ist in der Regel auch nicht möglich, weil in der Datei selbst wieder Verweise auf das Benutzer-spezifische Projekt stehen. Als Beispiel sei hier eine Datenbank-Definition genannt:
namespace P1234567.xsdemo.mypackage.myproject; @Schema: '_SYS_BIC' context demo{ @Catalog.tableType: #COLUMN entity Book { key BookID: Integer not null; AuthorID : Integer; BookTitle : String(100); ISBN : Integer not null; Publisher : String(100); }; @Catalog.tableType: #COLUMN entity Author { key AuthorID: Integer not null; AuthorName : String(100); AuthorNationality : String(20); AuthorBirthday : String(100); AuthorAddress : String(100); }; };
Suche und Ersetze…
Was liegt also näher, als diese Benutzer- bzw. Projekt-spezifischen Angaben in den Beispiel-Dateien nicht auszuschreiben, sondern als Template zu hinterlegen und dann per „Suchen und Ersetzen“ im Editor, in unserem Fall das HANA Studio, durchführen zu lassen.
namespace _PACKAGE_; @Schema: '_SCHEMA_' ...
Dies war auch der erste Gedanke, jedoch…das Projekt hat viele Dateien und da ist es vorprogrammiert, dass in einer dieser Dateien sich doch noch Tippfehler einschleichen. Also muss das ganze automatisiert werden.
…automatisiert
Durch Recherchen fand ich im Internet ein nettes Script für die Powershell, welches in einer Datei bestimmte Wortvorkommen findet und ersetzt. Dieses möchte ich Euch natürlich nicht vorenthalten.
Const ForReading = 1 Const ForWriting = 2 strFileName = Wscript.Arguments(0) strOldText = Wscript.Arguments(1) strNewText = Wscript.Arguments(2) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strFileName, ForReading) strText = objFile.ReadAll objFile.Close strNewText = Replace(strText, strOldText, strNewText) Set objFile = objFSO.OpenTextFile(strFileName, ForWriting) objFile.WriteLine strNewText objFile.Close
Der o.a. Quelltext wird in der Datei „replace.vbs“ gespeichert und über
cscript replace.vbs "meine_datei.txt" "Suchwort" "Ersetzwort"
aufgerufen.
Rekursion
Nun galt es noch, den Aufruf dieses Skriptes so einfach wie möglich zu gestalten. Dazu habe ich eine „make_demos.bat“ erstellt mit folgendem Inhalt:
@echo off cls rem Definition der Tags und der Verzeichnisse set package="P1234567.xsdemo.mypackage.myproject" set schema="_SYS_BIC" set srcdir="xsproject_vorlage" set outdir="xsproject" rem ------------------ rem Ausgabe-Verzeichnis löschen und neu erstellen rmdir /S /Q %outdir% mkdir %outdir% rem das Quell-Verzeichnis in das Ausgabe-Verzeichnis kopieren xcopy /S %srcdir% %outdir% rem alle Dateien durchlaufen und die Ersetzen-Passage darauf anwenden For /R %outdir% %%G in (*.*) do (call:replacetags "%%G") pause goto:EOF :replacetags rem hier werden die einzelnen Tags ersetzt cscript replace.vbs ""%1"" "_PACKAGE_" "%package%" cscript replace.vbs ""%1"" "_SCHEMA_" "%schema%" goto:EOF
Beide Dateien werden nun in ein Demo-Verzeichnis kopiert, das Template-Projekt kommt in ein Unterverzeichnis namens „xsproject_vorlage“. Dann muss der Teilnehmer nur noch in der „make_demos.bat“ seine Projekt-/Benutzer-spezifischen Angaben machen und diese aufrufen. Danach kann er jede Datei aus dem Ausgabe-Verzeichnis „xsproject“ übernehmen und muss nichts mehr manuell anpassen.