PDA

View Full Version : CLRDTAQ



Seiten : [1] 2

sirdidi
27-07-12, 08:17
Hallo,

ich habe zwei Fragen an Euch:

1. Wenn ich ein CLRDTAQ aus führe und einzelne Einträge löschen will, wie muss ich da vorgehen. Muss der CLR in einer Schleife so oft ausgeführt werden, bis zum Ende. Wie wird das Ende dann festgestellt, das keine passenden Einträge mehr vorhanden sind?



2. Ich habe das mal für mich in einem kleinen Test-Programm vorbereitet. Leider bekomme ich bei der Umwandlung immer diese beiden Fehler.

*RNF5410 30 1 Der Prototyp für den Aufruf ist nicht definiert.
*RNF7030 30 1 Der Name oder die Bezugszahl/der Anzeiger ist nicht
definiert.

Ich denke es hängt an dem Parameter CERROR (Error wurde auch bei RCVDTaq schon mal definiert)


SOURCECODE:
D RCVDTAQ PR EXTPGM('QRCVDTAQ')
D DATAQUEUENAME 10A CONST
D DATAQUEUELIB 10A CONST
D DATALENGTH 5P 0
D DABABUFFER 32767A OPTIONS(*VARSIZE)
D WAITTIME 5P 0 CONST
D KEYORDER 2A CONST OPTIONS(*NOPASS)
D KEYLENGTH 3P 0 CONST OPTIONS(*NOPASS)
D KEYBUFFER 256A OPTIONS(*NOPASS : *VARSIZE)
D SNDLENGTH 3P 0 CONST OPTIONS(*NOPASS)
D SNDBUFFER 44A OPTIONS(*NOPASS)
D REMOVEMSG 10A CONST OPTIONS(*NOPASS : *OMIT)
D RCVSIZE 5P 0 CONST OPTIONS(*NOPASS : *OMIT)
D ERROR 32767A OPTIONS(*NOPASS : *VARSIZE)
D
D CLRDTAQ PR EXTPGM('QCLRDTAQ')
D DATAQUEUENAME 10A CONST
D DATAQUEUELIB 10A CONST
D KEYORDER 2A CONST OPTIONS(*NOPASS)
D KEYLENGTH 3P 0 CONST OPTIONS(*NOPASS)
D KEYDATA 32767A CONST OPTIONS(*NOPASS)
D CERROR 32767A CONST OPTIONS(*NOPASS : *VARSIZE)


C EVAL KEY = E_JOBNR + E_JOBUSR
C CALLP CLRDTAQ('DYQ01' : '*LIBL' : 'EQ' : 17: KEY : CERROR)




Danke für Euere Hilfe!!!!

RobertMack
27-07-12, 08:28
... aus meiner Erfahrung: bis einschl. V4R5 kam es hin und wieder zu systemseitigen Hustenanfällen. Meine Clears bestehen deshalb je nach Dienst aus DLTDTAQ (Ende des fütternden Subsystems, z.B. QINTER) und CRTDTAQ mit MONMSG (Start des Subsystems).

RobertMack
27-07-12, 08:34
zum CLRDTAQ - letzter Eintrag:

man kann den 5. Parameter WAIT am QRCVDTAQ nutzen, um den letzten Eintrag zu erkennen (-1 = warte endlos, nn = warte diese Zeit, wenn bis dahin nichts neues gekommen ist...)

RobertMack
27-07-12, 08:38
zum Schluss noch 'ne Gegenfrage:

Ein QRCVDTAQ bedeutet doch, dass die Queue bereits um den Eintrag erleichtert ist. Was soll denn dann noch gecleart werden. Auf welcher Leitung stehe ich?

Pikachu
27-07-12, 09:13
Ich denke es hängt an dem Parameter CERROR (Error wurde auch bei RCVDTaq schon mal definiert
Daran scheint's zu liegen: Hast du CERROR (das aus dem CALLP) auch als eigenständiges Feld definiert?

B.Hauser
27-07-12, 10:30
Ein QCLRDTAQ-Aufruf kann nicht zum Löschen einzelner Einträge verwendet werden, da entweder die gesamte DataQueue oder bei einer geschlüsselten Dataqueue alle Einträge, die dem angegebenen Schlüssel entsprechen gecleart wird.

Hier die API-Beschreibung:
Clear Data Queue (QCLRDTAQ) API (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fapis%2Fqclrdtaq.htm)

Normalerweise werden die Einträge beim Lesen der DataQueue aus dieser entfernt, es sei den der 11. Parameter (Remove Message) wird mit *NO übergeben.

Das Schlüssel-Wort CONST darf bei Ein/Ausgabe-Parameter nicht gesetzt werden.
Hier die API-Beschreibung zu QRCVDTAQ:
Receive Data Queue (QRCVDTAQ) API (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fapis%2Fqrcvdtaq.htm)

Der Error-Code wird als Datenstruktur ausgegeben. Die Beschreibung der Datenstrukturen ist hier:
Error Code Parameter (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fapiref%2Ferror.htm)
und dann Error Code Paramter Format.

Birgitta

RobertMack
27-07-12, 11:42
11. Parameter (Remove Message) mit *NO

Danke! Hatte ich nicht auf dem Schirm. :)

sirdidi
27-07-12, 13:32
Erstmal danke an die reichlichen Anworter!!!

Das in dem Programm ein RCVDTAQ steht hat folgenden Hintergrund: Dieses augegeliederte "Teil"-Programm ist ein Teil zum testen. Das eigentliche enthält einen SNDDTAQ und einen RCVDTAQ und steuert die Kommunikation zwischen einem Client und unser iSeries. Alle paar Tage kam es nun vor das sich der Client aufgehängt hat. Das mit dem SND und RCV funktioniert also schon länger ohne Probleme.
Ein Problem haben wir festgestellt könnte sein, wenn der Client wieder neu reingeht und einen RCV macht und dann unter Umständen "Altlasten" liest und sich dann dementsprechend seltsam verhält. Um dies zu verhindern wollten wir mit CLR alle "Altlasten" mit Jobnummer und User vorm RCV löschen.

Ich hab mit Dtaq noch nicht soviel gemacht. Vieles wird mir durch lesen klarer.
Was ich aber nicht "raffe" ist - das mit dem Error.
Wenn ich den CERROR aus dem CALLP rauslasse, bekomme ich das Programm umgewandelt - aber beim Aufruf einen Fehler.

Lass ich ihn so drin, krieg ich das Teil nicht umgewandelt.

Wie muss ich also die Definition richtig machen in den D-Bestimmungen?

B.Hauser
27-07-12, 14:36
Der Error Code ist in der Required Paramter Group 2, d.h. entweder alle oder keiner der Parameter in Parameter Group 2 muss übergeben werden.
Bei dem Parameter handelt es sich um einen Ein-/Ausgabe-Parameter und Du hast ihn als Input Only (Schlüssel-Wort Const) definiert.


Die Error-Datenstruktur (Format ERRC0100 sieht so aus)

D RefDSAPIError1 DS Qualified
D ByteProv 10I 0 inz(%size(RefDSAPIError1))
D ByteAvail 10I 0
D MsgId 7A
D Reserved 1
D ExceptData 32767

Der Parameter Error Code kann dann so aussehen:

D ParErrDS LikeDS(RefDSAPIError1) Error Data Structure
D Options(*NoPass)

Eine entsprechende Variable wird wie folgt definiert:

D ParErrDS1 DS LikeDS(RefDSAPIError1) inz(*LikeDS)

Birgitta

Logic IT-Services
27-07-12, 14:38
Hi,

Versuch mal den Error-Code so zu definieren

DCL VAR(&CERROR) TYPE(*CHAR) LEN(16)