PDA

View Full Version : Cursor (open state) prüfen



mahones
11-11-20, 10:37
Hallo,

wie kann ich vor einem CLOSE eines Cursors prüfen, ob dieser geöffnet ist?
Aktuell erzeugen wir durch ein präventives CLOSE ewig viele Joblogeinträge:
Cursor C1 nicht geöffnet.
=> Ursache . . . . : Der Cursor C1 wurde in einer Anweisung FETCH oder
CLOSE angegeben, aber der Cursor ist nicht geöffnet.

Dieses möchten wir gerne verhindern, bzw. sauber abfangen.
Ich habe in einem screenshot eines Programms gesehen, dass dort eine Prozedur aufgerufen wird, wo eben bei erfolgreicher Prüfung ein CLOSE erfolgt.
Zumindest ließ der Name darauf schließen (in etwa "CloseCursorIfOpen")
Leider konnte ich weder den Code dazu sehen, noch konnte ich Kontakt zum Programmierer aufnehmen.

Da ich davon ausgehe, dass das entweder ein kleiner Schnipsel im RPG ist oder aber eine API, hoffe ich hier auf die (oder eine) Lösung.

Vielen Dank

xenofob
11-11-20, 11:54
Hi,

http://www.go4as400.com/Built-In-function-in-rpgle/functions.aspx?cid=322

Vg

Fuerchau
11-11-20, 12:24
%OPEN funktioniert nicht mit SQL sondern ist eine reine RPGLE-Funktion auf Dateien der F-Bestimmungen.

Präventive Closes bedeuten ja nichts anderes als dass man nicht weiß was in dem Programm geschieht.
Generell gibt es eine Option wann ein Cursor automatisch geschlossen wird.

set option closqlcur = *ENDMOD / *ENDACTGRP;

Zusätzlich könnte man Hauprprogramme die aus einem Menü aufgerufen werden immer mit ACTGRP(*NEW) umwandeln, dann wird auch alles geschlossen was zu der ACTGRP gehört.

Ansonsten ist es halt guter Stil, wenn man im Programm Ressourcen freigibt wenn man sie nicht mehr braucht.
Und wenn ihr halt grundsätzlich einen Close vor einem Open macht dann gibts halt die Joblogeinträge.

Also bevor man eine Unterroutine verlässt immer überlegen, ob man den geöffneten Cursor in dieser Routine nicht schließt. Dies gilt auch für Fehlerbehandlung.

manuel.marcos
11-11-20, 14:04
Ich habe das auch einige Zeit so gemacht, immer den einen close auf den Cursor abzusetzen bevor der open kommt. Habe mich aber auch an den Meldungen im Joblog gestört.
Inzwischen gehe ich folgendermaßen vor:
Zum einem rufe ich im on-exit immer den close cursor auf. Zum anderen rufe ich stumpf den open cursor auf und wenn ich dann den Code -502 (Cursor bereits geöffnet) bekomme, mache ich einen close gefolgt von einem erneuten open. Nach dem open dann nochmal den Code abfragen und wenn alles gut gehts weiter, sonst Abbruch.

mahones
13-11-20, 08:29
Danke für die Tipps - saubere Programmierung ist natürlich das sinnvollste.
Aber die Abfrage beim OPEN (und anschließender CLOSE + OPEN) werde ich trotzdem mal ausprobieren.