Dieser Abschnitt wendet sich an Leser, die bereits über Erfahrungen mit Nicht-S-Prozeduren verfügen, also denjenigen Prozeduren, die mit dem Kommando PROCEDURE oder BEGIN-PROCEDURE anfangen.
S-Prozeduren sind im Wesentlichen als eine Weiterentwicklung des bisherigen Prozedurformats anzusehen, die sich an den Gepflogenheiten höherer Programmiersprachen orientiert. Nicht-S-Prozeduren lassen sich oft ohne größere Änderungen in S-Prozeduren umwandeln (siehe Kapitel „Nicht-S-Prozeduren umstellen“). Die eigentlichen Vorteile des neuen Prozedurformats lassen sich jedoch erst dann effektiv nutzen, wenn einige in „alten“ Prozeduren häufig verwendete Programmiermethoden umgestellt werden auf die Nutzung der von SDF-P gebotenen neuen Konstrukte. Welche erweiterten Möglichkeiten sich dadurch bieten, zeigt die folgende Tabelle:
Merkmal | Nicht-S-Prozeduren | S-Prozeduren |
Aufbewahrung von Informationen | Prozedurparameter (konstant), | S-Variablen; Jobvariablen |
Kontrollflusssteuerung | bedingte und unbedingte | Bedingungsblöcke, Schleifen, |
Textverarbeitung | Editoraufruf | Stringoperatoren, |
Arithmetik | Editoraufruf, eigene Programme | Integeroperatoren, |
Zugriff auf Systemausgaben | SYSOUT-Zuweisung auf Datei | strukturierte Ausgabe in S-Variablen, vordefinierte Funktionen |
Prüfung der Prozedurintegrität | Aufruf im SDF-Testmodus | Variablen- und Typdeklarartionen, |
Debugging von Prozeduren | – – – | Prozedurtestmodus, |
Im später folgenden „Abschnitt „Aufbau einer S-Prozedur“ ab "Aufbau einer S-Prozedur " wird eine Beispielprozedur angegeben, die die letzten Zeilen einer Textdatei nach SYSOUT ausgibt, wobei der Dateiname und die Zeilenanzahl wählbar sind. Eine funktional nahezu gleichwertige Prozedur im Nicht-S-Format kann nur unter Zuhilfenahme von TU-Programmen, z.B. des Texteditors EDT, formuliert werden. Um den Kontrast zur S-Prozedur deutlich werden zu lassen, sei hier eine mögliche Realisierung im Nicht-S-Format wiedergegeben:
/BEG-PROC LOG=*NO,PROC-PAR=(&DATEI,&ANZAHL=10),ESC-CHAR='&' /ASS-SYSDTA *SYSCMD /MOD-JOB-SW ON=(4,5) /START-EXEC-PROG $EDT @ SETSW OFF=4-5 @ PRO 1 @ 1.00 @N Parameter DATEI analysieren: @N entweder vollqual. Dateiname ohne Gen/Vers @N oder '[*lib-elem](bibliothek,element[(vers)][,typ])' @@CR #S1 = '&DATEI' @@ON #S1 F '(' @@IF .F. GOTO 3 @ 2.00 @N Es wurde ein Element angegeben: @N Bibliotheksnamen extrahieren @@#I1 = #I0 + 1 @@#I2 = L #S1 @@CR #S1: #S1:#I1-#I2: @@ON #S1 D R ')' @@IF .F. GOTO 4 @@ON #S1 F',' @@IF .F. GOTO 5 @@#I3 = #I0 - 1 @@CR #S2: #S1:1-#I3: @@#I3 = #I3 + 2 @@#I2 = L #S1 @@CR #S1: #S1:#I3-#I2: @N Element einlesen @@PRO 11 @@CR 1: '@COPY L=', #S2, '(', #S1, ')' @@END @@DO 11 @@IF NO ERRORS: @GOTO 7 @@GOTO 6 @ 3.00 @N Datei einlesen @@READ '&DATEI' @@IF NO ERRORS: @GOTO 7 @@GOTO 6 @ 4.00 @@CR #S1: 'Schliessende Klammer nach Elementangabe fehlt.' @@P #S1 N @@GOTO 6 @ 5.00 @@CR #S1: 'Komma fehlt zwischen Bibliotheks- und Elementname.' @@P #S1 N @@GOTO 6 @ 6.00 @@CR #S1: 'Fehler beim Einlesen von "&DATEI"!' @@P #S1 N @@GOTO 9 @ 7.00 @N jetzt Zeilennummer bestimmen, ab der die @N Ausgabe erfolgen soll (nicht < 1!) @@#I1 = &ANZAHL @@IF #I1 < 1 GOTO 9 @@#L1 = $ @@#S1 = C #L1 @@#I2 = S #S1:1-4: @@IF #I2 > #I1 GOTO 8 @N alles ausgeben @@P & N @@GOTO 9 @ 8.00 @N Bereich ausgeben @@#I1 = #I1-1 @@#L1 = $-#I1 @@P #L1.-.$ N @ 9.00 @@N @ END @ DO 1 @N aufraeumen (sonst kommt Anfrage beim @HALT) @ DROP ALL @ HALT /SET-JOB-STEP /MOD-JOB-SW OFF=(4,5) /END-PROC