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.