In der TAA-Infrastruktur im LAN wurden mit V7.01 alle Oopse des Objekt-Managers, ausgenommen in rein internen Funktionen, auf Conditions umgestellt.
Die Conditions, die von der Infrastruktur gesetzt werden, stammen alle aus Meldungsgruppen, die der Meldungsklasse TAAIM zugeordnet sind. Für Conditions aus dieser Meldungsklasse wird in der Infrastruktur ein Class-Handler installiert, sodass diese Conditions nie in den anwendungsseitig installierten Condition-Handlern ankommen. Außerdem werden diese Conditions nicht direkt geraised, sondern lediglich markiert als „MarkedForRaise“; der Raise erfolgt aus dem Anwendungsmodul heraus, sodass die für die Condition gesetzte Aktion auch ausgeführt werden kann (z.B. ExitModl, ExitArbg).
Die Einführung von „markierten Conditions“ löst die Problematik, dass der Aktionscode einer von der Infrastruktur selbst aufgeworfenen Condition im Anwendungsmodul nicht zur Verfügung steht, und somit die Reaktion auf eine solche Condition nicht oder nur verzögert (durch Setzen des WflState) möglich ist.
Das Markieren von Conditions ist ausschließlich in der Infrastruktur möglich.
„MarkedForRaise“ bedeutet, dass diese Condition so bald wie möglich geraised werden soll, jedoch führt die Infrastruktur den Raise nicht selbst aus, sondern er muss aus einem Anwendungsmodul heraus veranlasst werden, um zu erreichen, dass das Ergebnis des Raise im Anwendungsmodul abgefragt werden kann.
Bei einem von der Anwendung ausgeführten Raise einer Condition kann diese Condition auch eine markierte sein, sodass bei vollständiger Abarbeitung der Condition-Collection automatisch auch die markierten Conditions behandelt werden. Auch beim SHOW-ALL werden die markierten Conditions mit angezeigt.
In COBOL-Modulen, die mit einem Generatorstand ab V7.04 generiert werden, sorgt der TAA-COBOL-Generator dafür, dass nach Infrastrukturaufrufen, die möglicherweise markierte Conditions zur Folge haben, diese geraised werden. Auch in Steuerungsmodulen und CTV-Modulen wird an mehreren Stellen Zz.B. nach Modulaufrufen) das Vorhandensein markierter Conditions geprüft und diese ggf. geraised.
In C, VB, .net und sonstigen Modulen werden diese Conditions erst geraised, wenn das entsprechende Coding vom Anwendungsprogrammierer eingefügt wurde. Das kann in einer Übergangsphase zur Folge haben, dass markierte Conditions, die während der Ausführung solcher Module anfallen, erst geraised werden, wenn ein COBOL- CTV- oder Steuerungsmodul aktiv wird.
Von der Infrastruktur gesetzte und markierte Conditions verwenden Meldungsgruppen, die der Meldungsklasse TAAIM zugeordnet sind (z.Zt. die Gruppen ZZTAAOM1 und ZZTAAIM2). Für diese Meldungsklasse ist in der TAA-Infrastruktur ein eigener Condition-Handler installiert. Dadurch wird vermieden, dass diese Conditions in den Conditionhandlern der Anwendung behandelt werden müssen.
HTAACND taaCndRaiseMarked(hStme)
taaCndRaiseMarked führt den Raise für die erste markierte Condition direkt aus, entspricht also einem
taaCndRaise(taaCndMarkedforRaiseGet());
HTAACND taaCndMarkedforRaiseNext(VOID) taaCndMarkedforRaiseGet liefert die erste markierte Condition. Sobald diese Condition geraised wird, wird sie aus der Collection der markierten Conditions entfernt, sodass der folgende Zugriff über taaCndMarkedforRaiseGet die folgende Condition liefert. Der so beschaffte Condition Handle kann taaCndRaise oder anderen Conditionhandling-Funktionen übergeben werden.
HTAACND taaCndMarkedforRaiseNext(VOID) taaCndMarkedforRaiseNext wird nur benötigt, um die Liste der markierten Conditions abzuarbeiten, ohne diese dabei aufzuwerfen oder zu entfernen.
DWORD taaCndMarkedForRaiseCount(VOID) taacndMarkedForRaiseCount liefert die Information, ob bzw. wieviele markierte Conditions vorhanden sind
<ModlEnv>.cndRaiseMarked() as Long <ModlEnv>.cndMarkedForRaiseCount() As Long
cndRaiseMarked führt den Raise für die erste markierte Condition aus.
Der Code, um für markierte Conditions einen Raise auszuführen, könnte somit lauten:
For i = Me.cndMarkedForRaiseCount To 1 Step -1 Me.cndAction = Me.cndRaiseMarked If Me.cndAction >= taaCndActResume Then Exit For End If Next i
Nach Modulaufrufen in VB wird dieser Code seitens der Infrastruktur bereits ausgeführt, sodass nur noch die Abfrage von cndAction im Anwendungsprogramm erforderlich ist.
TAAConditions ^ModlEnv::cndMarkedForRaise::get() liefert eine Collection aller zur Zeit markierten Conditions. TAAConditionAction ModlEnv::cndRaiseMarked() führt den Raise für die erste markierte Condition direkt aus;
Der Code, um markierte Conditions einen Raise auszuführen, könnte somit lauten:
while (cndAction == TAAConditionAction::Resume && cndMarkedForRaise->Count != 0) cndAction = cndRaiseMarked();
Nach Modulaufrufen in C# (in .net-Modulen) wird dieser Code seitens der Infrastruktur bereits ausgeführt, sodass dies im Anwendungsprogramm nicht mehr erforderlich ist.
In COBOL sind keine Anpassungen im Source notwendig, um die Behandlung der markierten Conditions zu erreichen, sondern lediglich eine Neu-Generierung.
Dabei wird nach bestimmten Anweisungen ein Perform auf auf eine Section generiert, die die markierten Conditions aufwirft. Diese Section ruft – in einer Schleife über alle zum Raise markierten Conditions – die Infrastruktur auf, damit diese die markierten Conditions in der Reihenfolge ihres Auftretens aufwirft. Die Infrastruktur aktiviert beim Raise den dafür installierten Proc-Handler und liefert das Ergebnis zurück.
Die Anweisungen, nach denen der Perform erzeugt wird, sind:
Über den neuen Returncode IM-RC-CND-SET kann zusätzlich abgefragt werden, ob während der Ausführung des letzten EXEC-TAA-Befehls Conditions gesetzt wurden.
TAA * EXEC TAA REGISTER END-EXEC. TAA PERFORM TX-P-REGISTER. exec taa on severe exit module end-exec. exec taa on log resume next. exec taa on warning perform my-check-om end-exec. exec taa on error perform my-cnd-handler end-exec. TAA * exec taa put ptest end-exec TAA MOVE 'PTEST' TO TX-SRC-NAME TAA MOVE TX-PTEST-HANDLE TO TX-SRC-HANDLE TAA MOVE 'PUT' TO TX-OM-CODE TAA MOVE 'OM' TO TX-CODE TAA MOVE LENGTH OF PTEST-REC TO TX-SRC-LENGTH TAA SET TX-SRC-POINTER TO ADDRESS OF PTEST-REC TAA MOVE 'NON' TO TX-SRC-POS-TYPE TAA CALL TAAIM USING TX-TAA TAA PERFORM TX-RAISE-MARKED ...... TAA TX-RAISE-MARKED SECTION. TAA IF TX-CND-MARKEDFORRAISECOUNT = 0 TAA EXIT SECTION TAA END-IF TAA MOVE 'ERR-EXPR' TO TX-CODE TAA CALL TAAIM USING TX-TAA TAA PERFORM UNTIL TX-CND-HANDLE-P = NULL TAA PERFORM TX-ERROR TAA MOVE 25 TO TX-CNDEXPR-CODE TAA MOVE 'ERR-EXPR' TO TX-CODE TAA CALL TAAIM USING TX-TAA TAA END-PERFORM TAA EXIT. ...... TAA TX-ERROR SECTION. TAA MOVE 0 TO TX-ENM-WFLSTATE TAA IF TC-CND-ACTION-CALLERHDL TAA PERFORM TX-P-UNREGISTER TAA GO TO TX-P-GOBACK TAA END-IF TAA IF TX-CND-ACTION-ID TAA EVALUATE TX-CND-HDL-ID TAA WHEN 1 TAA SET TC-CND-ACTION-EXITMODL TO TRUE TAA WHEN 2 TAA SET TC-CND-ACTION-RESUME TO TRUE TAA WHEN 3 TAA PERFORM my-check-om TAA WHEN 4 TAA PERFORM my-cnd-handler TAA END-EVALUATE TAA END-IF TAA EVALUATE TRUE TAA WHEN TC-CND-ACTION-CALLERHDL............ ......... ........ TAA EXIT.
Die von der Infrastruktur gesetzten Conditions haben i.d.R. die Severities Severe oder Warning. Der Klassenhandler für TAAIM reagiert im Falle von Severe mit EXIT-ARBG, sonst mit RESUME. Alle Conditions, die von der Infrastruktur gesetzt und markiert werden, sind der Klasse TAAIM zugeordnet.
Verhalten ohne markierte Conditions | mit markierten Conditions | Unterschied |
---|---|---|
Die Condition wurde sofort bei Auftreten des Fehlers geraised. Im Falle von Severe wurde der Workflow-State auf ERROR gesetzt. | Die Condition wird bei ihrem Entstehen markiert. An festgelegten Stellen in Steuerungs- und CTV-Modulen (z.B. nach Modulaufrufen) werden markierte Conditions geraised. Wenn das Ergebnis eines solchen Raise EXIT-Arbg ist, wird die Ausführung des Moduls beendet. | In einem Fall erfolgt die Unterbrechung indirekt durch das Setzen des Wflstate, im anderen Fall direkt als Reaktion beim Raise. |
Exit-Arbg erfolgt an der nächsten Stelle, wo der WflState abgefragt wird, spätestens also bei Rückkehr in eine Steuerung oder ein COBOL-Modul. | Exit-Arbg erfolgt an der nächsten Stelle, wo ein Raise-Marked erfolgt, spätestens also bei Rückkehr in Steuerung, CTV-Modul oder neu generiertes COBOL-Modul. | Der Zeitpunkt, zu dem der Exit-Arbg wirksam wird, kann etwas früher liegen, da markierte Conditions öfter abgefragt werden als der WflState. |
Generierte COBOL-Module behandeln auch markierte Conditions, die z.B. in aufgerufenen Modulen verursacht und nicht geraised wurden.
In Modulen, die - wie bis 7.03 üblich - eine eigene Fehlerbehandlung für den Fall OM-RC-NOT-OK durchführen, wird diese eigene Fehlerroutine i.d.R. nicht mehr zum Zuge kommen, weil bei einem NOT-OK zumeist eine Condition mit Severity Severe gesetzt wurde. Der generierte Raise der markierten Conditions erfolgt vor der Fortsetzung des anwendungsseitig programmierten Codes. Die Fehlerroutine wird, wenn überhaupt, dann nur mit solchen Fehlern ausgeführt werden, die nicht bereits über eine markierte Condition abgewickelt wurden.