Der Ablauf einer S-Prozedur kann durch Kontrollflusskommandos gesteuert werden, mit denen – analog zu höheren Programmiersprachen – bedingt auszuführende Kommandosequenzen (IF-Blöcke) und Schleifen (WHILE-, REPEAT-UNTIL- und FOR-Blöcke) gebildet werden können. Anfang und Ende dieser bedingten oder zu wiederholenden Kommandofolgen werden durch je ein besonderes Kommando gekennzeichnet:
/IF (bedingung) / "then-Kommandofolge" /END-IF /WHILE (bedingung) / "Schleifenrumpf" /END-WHILE /REPEAT / "Schleifenrumpf, wird mindestens einmal durchlaufen" /UNTIL (bedingung) /FOR variable = werteliste, CONDITION = (bedingung) / "Schleifenrumpf" /END-FOR
Die Kontrollstrukturen können daher beliebig und eindeutig ineinander verschachtelt werden. Der IF-Block kann noch zusätzliche Abfragen weiterer Bedingungen und/oder einen ELSE-Zweig enthalten:
/IF (bedingung-1) / "Kommandos, die ausgefuehrt werden ..." / "... wenn bedingung-1 TRUE ist" /ELSE-IF (bedingung-2) / "... wenn bedingung-1 FALSE, aber bedingung-2 TRUE ist" / " (beliebig viele weitere ELSE-IF sind moeglich" /ELSE / "... wenn keine der Bedingungen erfuellt war" /END-IF
Der Deutlichkeit halber können Anfang und Ende eines Blocks durch Marken gekennzeichnet werden, deren Übereinstimmung von SDF-P geprüft wird:
/&* Diese Kommandofolge entfernt aus einer Stringvariablen TEXT /&* alle nachlaufenden Leerzeichen. TEXT sollte wenigstens ein /&* Zeichen ungleich ' ' enthalten. /BLANKS-AB: WHILE (SUBSTR(TEXT,LENGTH(TEXT),1) == ' ') / TEXT = SUBSTR(TEXT,1,LENGTH(TEXT) - 1) "um ein Byte kuerzen" /END-WHILE BLANKS-AB
Auf eine solche Marke kann auch mit dem Kommando EXIT-BLOCK Bezug genommen werden, wenn ein umschließender Block vorzeitig verlassen werden soll. Ebenfalls durch Angabe der Marke einer umschließenden Schleife lässt sich mit dem Kommando CYCLE der nächste Schleifendurchlauf anstoßen, bevor der eigentliche Schleifenrumpf bis zum Ende abgearbeitet ist.
Ähnlich einer Schleife fasst ein so genannter BEGIN-Block eine Kommandofolge zusammen, jedoch hat er auf die Abarbeitungsreihenfolge keinen Einfluss. Er kann beispielsweise im Zusammenwirken mit EXIT-BLOCK dazu dienen, einen Prozedurabschnitt unter gewissen Bedingungen vorzeitig zu verlassen:
/TAGESARBEIT: BEGIN-BLOCK / "Arbeiten, die an jedem Tag auszufuehren sind" / IF (DAY() == 'SAT' OR DAY() == 'SUN') / EXIT-BLOCK TAGESARBEIT / END-IF / "Arbeiten, die nur werktags auszufuehren sind" / IF (SUBSTR(DATE(),9,2) <> '01') / EXIT-BLOCK TAGESARBEIT / END-IF / "Arbeiten, die nur am Monatsersten auszufuehren sind" /END-BLOCK TAGESARBEIT
Hierdurch kann sich ein gegenüber zahlreichen verschachtelten IF-Blöcken übersichtlicherer Prozeduraufbau ergeben.
Für diejenigen Programmierer, die entgegen seinem schlechten Ruf auf ein GOTO nicht verzichten möchten, ist auch dieses Kommando implementiert; als Sprungziel ist eine Marke anzugeben, die dem Zielkommando vorangestellt wird:
/IF (...); GOTO AUFRAEUMEN; END-IF /"weitere Kommandos" /AUFRAEUMEN: DELETE-FILE ...
Es gelten die üblichen Einschränkungen (z.B. kein GOTO von außen in einen Block hinein).