VON SCOTT KLEMENT
Seit einigen Releases gibt es numerische Nachrichtenfelder, die als Datentyp *UBIN defi niert sind. *UBIN-Felder sind vorzeichenfreie 8-Bit Integerfelder, die erst ab Release IBM i 7.1 in CL direkt unterstützt werden. Ein Beispiel für eine solche Nachricht ist CPC7061 (&4 Einträge von Journal &1 in &2 empfangen), die als Diagnosenachricht des Befehls RCVJRNE gesendet wird. Ein
DSPMSGD CPC7061
und die anschließende Auswahl 2 („Felddaten anzeigen“) ergibt
Dezimal- Var. Feld Datenart Länge stellen Länge Dump &1 *CHAR 10 *NO &2 *CHAR 10 *NO &3 *BIN 4 *NO &4 *UBIN 8 *NO
Feld 4 gibt sich als *UBIN zu erkennen, dessen Wert in den Nachrichtendaten ab Stelle 25 auszulesen ist. (Die drei davor liegenden Felder nehmen die ersten 24 Byte der Nachrichtendaten ein.) Wollen Sie dieses numerische 8 Byte Feld bis inklusive Release IBM i 6.1 korrekt auswerten, müssen Sie das traditionelle Verfahren der Zerlegung in zwei 4 Byte Felder mit anschließendem Rechenvorgang anwenden.
Auf das konkrete Beispiel der Nachricht CPC7061 angewendet, bietet sich folgender CL Code an:
DCL &MsgDta *char 32 DCL &CountL *uint 4 + Stg(*defined) defvar(&MsgDta 25) DCL &CountR *uint 4 + Stg(*defined) defvar(&MsgDta 29)
Die beiden letzten Dcl-Anweisungen sind Unterdefi nitionen des 32 Byte Feldes &MsgDta, vergleichbar mit Datenstruktur-Subfeldern in RPG, mit denen die ersten und letzten 4 Byte des vierten Nachrichtenfeldes explizit angesprochen werden. Um aus diesen beiden 4 Byte Feldern den Wert des 8 Byte *UBIN Feldes zu berechnen, ergänzen wir folgenden CL-Code:
DCL &Anzahl *dec (15 0) und : RCVMSG &MsgId Msgf( &MsgF ) MsgDta( &MsgDta ) + RtnType( &RtnType ) (MsgType( *last ) if ( ( &RtnType *eq ‘01‘ ) *and &MsgId *eq ‘CPC7061‘ ) ) do chgvar &Anzahl ( ( &CountL * 4294967296) + &CountR ) enddo
Das Ergebnisfeld für die Anzahl der Einträge (&Anzahl) wurde mit der maximalen ganzzahligen Größe (15 0) defi niert. Die Multiplikation mit 2 ^ 32 (= 4294967296) verarbeitet die linken 4 Byte des *UBIN Feldes, die anschließende Addition fügt den Wert der rechten 4 Byte hinzu.
Verdeutlichen kann man sich dieses Verfahren an folgendem einfachen Beispiel mit Dezimalzahlen: die Zahl 6028, in zwei zweistellige Zahlen aufgebrochen, ergibt sich zu 60×10^2 + 28. Der Unterschied zu unserem CL-Code besteht lediglich in Multiplikation mit der abweichenden Basis 10 an Stelle der Basis 2.
Auf ein „kleines“ Problem muss allerdings hingewiesen werden: Dummerweise unterstützt CL nur maximale 15-stellige Zahlenwerte; unsere Multiplikation mit den zwei 32 Bit Feldern könnte zu größeren Werten führen! Der Beispiel-Code wird also bei mehr als 999 x10^12 Journaleinträgen zu Fehlern führen.
Ab Release i 7.1 können *UBIN Felder direkt defi niert und verarbeitet werden. Dann sind die beschriebenen „Verrenkungen“ nicht mehr erforderlich. ♦
Scott Klement ist technischer Redakteur für NEWSolutions. Außerdem ist er IS Manager der Klement Sausage Co., Inc. Sie erreichen ihn unter iSN (ät) Scott- Klement.com.


