Einleitung

Was ist ein F-Script Block?

Als F-Script Block bezeichnet man einen Code-Bereich in einem F-Script, welcher zur Laufzeit kompiliert und nicht wie ein klassisches F-Script interpretiert wird.
F- Script Blöcke werden durch die Zeichen { sowie } begrenzt. Hierbei ist es wichtig, dass diese jeweils am Anfang der Zeile stehen, damit der Compiler diese von klassischem F-Script unterscheiden kann.
Beispiel
/Example.ScriptBlock
# ---------------------------------------------------------------------
# Normaler F-Script Kommentar 
«
{
    // Kommentar in Script-Block
}
»
/
Wichtig
Wichtig
F-Script Blöcke sind immer final. Dies bedeutet, dass der Inhalt einer Variablen nicht weiter analysiert wird, wie dies bei klassischem F-Script der Fall ist.

Warum F-Script Blöcke?

F-Script wurde vor über 30 Jahren als Sprache zu Insyde implementiert, welche von einem Interpreter zur Laufzeit Zeile für Zeile abgearbeitet wird.
Dies hat unter anderem den Vorteil, dass Abläufe schnell implementiert und nachvollzogen werden können. F-Script setzt somit keine grundlegenden Kenntnisse über Programmiersprachen voraus…
Jedoch hat dies auch einige grundlegende Nachteile:
Der «overhead» (Speicherbedarf / Laufzeitbedarf) einer Script-/Interpreter-Sprache ist nicht unbeachtlich und steigt linear je mehr Schleifen oder Typenumwandlungen gemacht werden müssen.
Zudem muss jeder Befehl innerhalb einer F-Script Zeile explizit geparsed und evaluiert werden. Dies führt ebenfalls zu einer langsameren Ausführung als man von modernen Sprachen heute gewöhnt ist.
Der primäre Fokus (damals) waren Ausgaben auf Matrix-Drucker. Deshalb wurde damals von Flexform (flexibles Formular) gesprochen.
Früher waren Datenmengen und auch die Scripts deutlich kleiner und die Laufzeit noch kein wirkliches Problem.
In Zeiten, welche von Begriffen wie Big-Data und Digitalisierung gezeichnet sind steigen natürlich auch die Anforderungen an Datenmengen und Verarbeitungszeiten.

               
Ziele von F-Script Blöcken
Durch die schrittweise Migration von Dataflex auf .NET stehen modernere (und bessere) Möglichkeiten zur Verfügung, um F-Script in Zukunft weiterzuentwickeln.
Die Ziele sind:
  • Performance (wie bereits erwähnt)
  • Usability (Anwendbarkeit und Lesbarkeit)
  • Type Safety
  • Error-Verhalten (viele Fehler bereits zur Kompilationszeit erkannt)
  • Security (keine Code-Injection möglich „by design“)
Notiz
Notiz
Beachten Sie, dass für F-Script Blöcke im Editor VS Code eine entsprechende Extension "Opacc BlockScript" zur Verfügung steht.

Vergleich: Klassisches F-Script vs. F-Script Blöcke

Nachfolgend ein Vergleich welcher den Unterschied von klassischem F-Script und F-Script Blöcken aufzeigt:
Beispiel F-Script klassisch Beispiel F-Script Block
Folgender Code führt eine klassische «REPEAT/LOOP» Schleife mit 10'000 Durchläufen aus. Innerhalb dieser Schleife wird nichts getan.
Der F-Script Interpreter merkt sich nun die Position von «REPEAT(1)» und springt jeweils wieder dorthin solange die Bedingung vor «LOOP(1)» zutrifft.
Folgender Code führt eine for-Schleife mit 10'000 Durchläufen aus. Innerhalb dieser Schleife wird nichts getan.
F-Script Blöcke werden «onthefly» kompiliert und nicht im F-Script Interpreter, sondern auf Seite .NET-Framework ausgeführt.
F-Script-Block_02.jpg F-Script-Block_03.jpg
Laufzeit (hh:mm:ss.msec)
00:00:03.743
Laufzeit (hh:mm:ss.msec)
00:00:00.141

Unterschiede: Klassisches F-Script vs. F-Script Blöcke

Performance
F-Script Blöcke werden nicht interpretiert, sondern vorab «onthefly» kompiliert. Dies führt bei der Ausführung des F-Script Codes zu einer besseren Performance.
Wichtig
Wichtig
Hiermit ist nicht die Ausführungszeit z.B. eines Requests gemeint, sondern primär die Ausführung des Codes an sich.
An bekannten Sprachen angelehnte Syntax
F-Script ist eine selbsterfundene (und zudem über 30-jährige) Script-Sprache.
Der Code innerhalb eines F-Script Blocks lehnt sich an aktuelle Sprachen, wodurch sich Personen mit Vorkenntnissen in Sprachen wie JavaScript oder C# schnell zurechtfinden.
Lesbarkeit
Klassisches F-Script besitzt eine möglichst kompakte und dadurch teils schwer lesbare Syntax. Dies ist - soweit wie möglich - für die Verarbeitung eines Interpreters optimiert.
Bei F-Script Blöcken führt die klar definierte Syntax und die Strukturierungsmöglichkeiten zu besserer Lesbarkeit (readability) und Wartbarkeit (maintainability) des Codes.
Lokale Variablen (local typed vars)
Innerhalb F-Script Blöcken stehen so genannte local typed vars zur Verfügung, welche einen klaren Datentyp (string, integer, number, date, boolean) aufweisen.
Voraussetzungen
Um korrekt und effizient mit F-Script Blöcken arbeiten zu können, wird Erfahrung in einer Sprache, wie z.B. JavaScript oder C# vorausgesetzt. Um den kompletten Umfang und alle Möglichkeiten ausschöpfen zu können ist intensives Selbststudium notwendig.
Komplexität
Durch die Fülle an zusätzlichen Möglichkeiten, und daraus resultierend möglichen Fehlern, steigt die Komplexität von F-Script.
Aufwand
Um ein Script mittels F-Script Blöcken zu codieren ist initial mit höherem (zeitlichem) Aufwand zu rechnen.
Type-Casting
In klassischem F-Script Code besitzen Variablen keine Typisierung (alles Strings) und müssen lediglich zur Berechnung und/oder Ausgabe formatiert werden (\A, \N, \D usw.).
In F-Script Blöcken sind Variablen typisiert, wodurch Casting zwingend zu beachten ist.  

Technische Voraussetzungen

Damit in einem F-Script Script Blöcke enthalten sein dürfen (und diese auch korrekt ausgeführt werden) sind folgende Voraussetzungen gegeben:
  • OpaccOXAS Version
    F-Script Blöcke stehen ab OpaccOXAS Version 16.20.07 zur Verfügung.
  • Abbruch bei Fehler (Insyde.ScriptStopOnError)
    Die Einstellung Abbruch bei Fehlern im OpaccOXAS Studio BC 98216 muss aktiviert sein.
    Sollte diese Einstellung nicht aktiviert sein, kann dies optional im Script direkt über folgenden Befehl aktiviert werden:
    # Setzt zur Laufzeit des F-Scripts den Abbruch im Fehlerfall auf true/ja. 
    # Die Einstellung gilt auch für allfällig aufgerufene Sub-Scripts.
    «nXCNT(scriptStopOnError=1)»
    
    Ist diese Einstellung nicht korrekt wird folgender Fehler geworfen:
    ReadNextInterpreterLine: 
    #17 Compiler-Blocks not supported (Ensure that 'ScriptStopOnError=1').
    

Knowhow Voraussetzungen

Um F-Script Blöcke sinnvoll anwenden zu können sind folgende Vorkenntnisse notwendig:
  • Fundierte Kenntnisse über klassisches F-Script
  • ScriptingFollowUp 001 - Services Allgemein (Selbststudium)
  • ScriptingFollowUp 005 - F-Script Meta-Informationen (Selbststudium)
  • Kenntnisse Programmiersprache (JavaScript, C# o.Ä.)