Bei der Erstellung von @DO-Prozeduren im EDT können über @PARAMS formale Parameter definiert werden, denen beim Aufruf der Prozedur mit @DO aktuelle Werte (Aktualparameter) zugewiesen werden.
Die @PARAMS-Anweisung muss als erste Anweisung in einer @DO-Prozedur stehen und darf nur einmal in der Prozedur vorkommen. Es sind Stellungs- und Schlüsselwortparameter erlaubt. Alle Stellungsparameter müssen vor den Schlüsselwortparametern definiert werden.
Ein formaler Parameter beginnt mit dem Zeichen &
. Ihm folgt ein Buchstabe, dem bis zu 6 weitere Buchstaben oder Ziffern folgen können.
Beim Aufruf der Prozedur werden die Parameter in der @DO-Anweisung als Aktualparameter angegeben. Schlüsselwortparameter können auch innerhalb der @PARAMS-Anweisung mit einem Standardwert versorgt werden.
Der Standardwert wird verwendet, wenn der entsprechende Schlüsselwortparameter in der @DO-Anweisung nicht angegeben wird. Beim Ablauf der Prozedur werden die formalen Parameter innerhalb der Prozedur durch die Werte der Aktualparameter bzw. durch die Standardwerte ersetzt.
Die Verarbeitung der Parameter ist als zweistufiger Prozess zu sehen. Zunächst findet innerhalb der aufgerufenen Prozedur eine Textersetzung der formalen Parameter durch die Aktualparameter statt, dann werden die so geänderten Zeilen verarbeitet. Dabei sind evtl. mehrere unterschiedliche Zeichensätze zu berücksichtigen, der Zeichensatz der Anweisung (für die aktuellen Parameter), der Zeichensatz der als Prozedur auszuführenden Arbeitsdatei und der Zeichensatz der aktuellen Arbeitsdatei, auf die die Anweisungen der Prozedur angewendet bzw. in die die Datensätze eingefügt werden.
In der ersten Stufe der Textersetzung muss daher vom Zeichensatz der Anweisung in den Zeichensatz der auszuführenden Prozedur umcodiert werden.
Dies gilt sowohl für die angegebenen Aktualparameter wie für die Namen der formalen Schlüsselwortparameter. Enthalten die Aktualparameter eine Ersatzdarstellung für Unicode-Zeichen (siehe Abschnitt „Unicode-Ersatzdarstellung“), wird diese bei der Textersetzung noch nicht in das entsprechende Unicode-Zeichen umgewandelt, selbst wenn der Aktualparameter in Hochkommas eingeschlossen wurde.
In der zweiten Stufe der Verarbeitung (Ausführung) müssen Datenzeilen sowie Literale innerhalb von Anweisungen vom Zeichensatz der Prozedur in den der aktuellen Arbeitsdatei umcodiert werden, dabei erfolgt dann auch die Interpretation einer Ersatzdarstellung für Unicode-Zeichen, sofern die Ersatzdarstellung innerhalb eines Literals verwendet wurde.
Ein unverändertes Durchschleusen der Aktualparameter ist nicht möglich, weil die Textersetzung an beliebiger Stelle in einer Zeile der auszuführenden Prozedur (in Literalen, in anderen Operanden, sogar im Anweisungsnamen selbst) stattfinden kann.
Wenn in einer Unicode-Umgebung mit einer Prozedurdatei gearbeitet wird, die in einem 7-Bit- oder 8-Bit-Zeichensatz vorliegt, können bei der Umcodierung eines in Unicode eingegebenen Parameters in den Zeichensatz der Prozedurdatei also unerwünschte Zeichen- ersetzungen stattfinden. Dies lässt sich nur verhindern, wenn von der Ersatzdarstellung für Unicode-Zeichen Gebrauch gemacht wird (siehe oben). Die genauen Regeln für die Umcodierung findet man im Abschnitt „Zeichensätze“.
Hinweis
Wenn EDT-Prozeduren mit Parametern innerhalb von ebenfalls parametrisierten BS2000-Systemprozeduren verwendet werden sollen, empfiehlt es sich, zur Vermeidung von Konflikten das BS2000-Parametersymbol auf einen Wert ungleich &
zu setzen (/SET-PROC-OPT DATA-ESCAPE-CHAR=...
).
Beispiel für die Verwendung von Parametern in einer EDT-Prozedur
Im folgenden Beispiel wird eine Datei in die Arbeitsdatei 0 eingelesen. Die Datensätze, die den Suchbegriff enthalten, werden in die Arbeitsdatei 5 kopiert, entsprechend aufbereitet und auf dem Bildschirm ausgegeben.
1. @PROC 4 1. @DELETE 1. @ @PARAMS &DATEI,&SUCH --------------------------------------- (01) 2. @ @DELETE 3. @ @READ '&DATEI' 4. @ @ON & FIND PATTERN '&SUCH' COPY TO (5) 5. @ @PROC 5 6. @ @CREATE 0.01: '~' * 50 7. @ @CREATE 0.02: 'SPEISEPLAN ','&SUCH' 8. @ @CREATE 0.03: '~' * 50 9. @ @RENUMBER 10. @ @CREATE $+1: '~' * 50 11. @ @PRINT 12. @ @END 13. @END 1. @DO 4 (SPEISEPLAN,KW 49) ------------------------------------- (02) 1.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2.0000 SPEISEPLAN KW 49 3.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4.0000 KW 49 - 05.12. BOHNENEINTOPF, SCHOKOLADENCREME 5.0000 KW 49 - 06.12. HACKBRATEN, SALZKARTOFFELN, QUARKSPEISE 6.0000 KW 49 - 07.12. SCHNITZEL WIENER ART, POMMES FRITES, ROTE GRUETZE 7.0000 KW 49 - 08.12. MAULTASCHEN IN BRUEHE, GOETTERSPEISE 8.0000 KW 49 - 09.12. ROTBARSCHFILET, KARTOFFELSALAT, VANILLEPUDDING 9.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10. @DO 4 (SPEISEPLAN,SCHNITZEL) --------------------------------- (02) 1.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2.0000 SPEISEPLAN SCHNITZEL 3.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4.0000 KW 45 - 10.11. JAEGERSCHNITZEL, BRATKARTOFFELN, TUTTI FRUTTI 5.0000 KW 49 - 07.12. SCHNITZEL WIENER ART, POMMES FRITES, ROTE GRUETZE 6.0000 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(01) | Definieren der symbolischen Parameter (zwei Stellungsparameter). |
(02) | Aufruf der Prozedur mit den jeweiligen Aktualparametern. Die Formalparameter in der @READ-, @ON-Anweisung werden bei jedem @DO-Aufruf durch die aktuellen Werte ersetzt. |