Hawi
08-05-20, 11:53
Moin zusammen,
ich bin gerade auf ein "Problem" bei nachfolgendem Code gestoßen und habe dazu mal eine Frage.
Das Programm läuft so bis zu dem Zeitpunkt, wo innerhalb der Funktion $Update_LAGPT der sqlcode 100 auftritt, der dort als "ok" eingestuft wird.
Da der sqlcode aber gefüllt ist, wird dann natürlich auch die innere Schleife beendet, ohne weitere fetch next und dann auch close cursor auszuführen.
Beim nächsten Durchlauf der der äußerenSchleife scheitert dann natürlich der open cursor, da dieser ja noch offen ist.
Gibt es eine elegante Möglichkeit, den sqlcode nicht immer explizit auf 0 setzen zu müssen, wenn mich das Ergebnis eines sql's auf eine bestimmte Datei eigentlich nicht interessiert, aber für die allgemeine Programmverarbeitung doch noch gebraucht wird?
Beim fetch selbst hatte ich bereits daran gedacht, den sqlcode auf 0 zu setzen, jedoch weiß man ja nicht zwangsläufig, ob dieser in aufgerufenen Funktionen noch gesetzt wird und auch so bleibt.
Im "normalen" RPG nehme ich halt %EOF(Dateiname) oder %Found(Dateiname).
Da gibt es dann keine Problme mit Überschneidungen.
Ich hoffe, ich habe einigermaßen verständlich ausgedrückt, worum es mir geht.
Danke und Gruß
Michael
DOW sqlcode <> 0;
Diverse SQL bis hier
if not $defineCursorRGZPT();
return false; // Fehler (bereits behandelt => Programmende)
endIf;
doW sqlCode = 0;
// Lesen nächste Rechnungszeilenpartie
exec sql fetch rgzpt_Cursor into :sqlRecRZP;
if sqlCode <> 0;
if sqlCode = 100; // = EoF
exec sql close rgzpt_Cursor;
if sqlCode = 0; // = EoF
$protokolliere( '* SQL-Cursor RGZPT für Umfuhr '
+ %char(sqlrecAK.akatnr)
+ ' erfolgreich entfernt');
else;
$protokolliere( '* SQL-Cursor RGZPT'
+ ' konnte nicht entfernt werden');
endif;
sqlcode = 0; // sicherheitshalber wegen Hauptschleife wieder auf 0
leave;
endIf;
// Andere Fehler
$protokolliere('Fehler beim Fetch Next, Datei RGZPTPF. '
+ 'SQLCode: ' + %char(SqlCode)
+ ' - SQLState: ' + SqlState
+ '. ' + SQLLIB_getLastSQLError()
);
return false; // => Programm abbrechen
endIf;
// Aktualisieren der Abgangsmenge bei Lagerpartie
innerhalb der Funktion kann auch auch sqlcod <>0 entstehen, was aber ok sein kann
if not $Update_LAGPT( sqlrecRZP.rzpfrm : sqlrecRZP.rzpartnr
: sqlrecRZP.rzplager : sqlrecRZP.rzpptnr
: sqlrecRZP.rzpmgeve);
return false;
endIf;
enddo;
ab hier weitere Verarbeitung nach Abarbeitung aller Sätze des fetch.
Diverse SQL ab hier
enddo;
ich bin gerade auf ein "Problem" bei nachfolgendem Code gestoßen und habe dazu mal eine Frage.
Das Programm läuft so bis zu dem Zeitpunkt, wo innerhalb der Funktion $Update_LAGPT der sqlcode 100 auftritt, der dort als "ok" eingestuft wird.
Da der sqlcode aber gefüllt ist, wird dann natürlich auch die innere Schleife beendet, ohne weitere fetch next und dann auch close cursor auszuführen.
Beim nächsten Durchlauf der der äußerenSchleife scheitert dann natürlich der open cursor, da dieser ja noch offen ist.
Gibt es eine elegante Möglichkeit, den sqlcode nicht immer explizit auf 0 setzen zu müssen, wenn mich das Ergebnis eines sql's auf eine bestimmte Datei eigentlich nicht interessiert, aber für die allgemeine Programmverarbeitung doch noch gebraucht wird?
Beim fetch selbst hatte ich bereits daran gedacht, den sqlcode auf 0 zu setzen, jedoch weiß man ja nicht zwangsläufig, ob dieser in aufgerufenen Funktionen noch gesetzt wird und auch so bleibt.
Im "normalen" RPG nehme ich halt %EOF(Dateiname) oder %Found(Dateiname).
Da gibt es dann keine Problme mit Überschneidungen.
Ich hoffe, ich habe einigermaßen verständlich ausgedrückt, worum es mir geht.
Danke und Gruß
Michael
DOW sqlcode <> 0;
Diverse SQL bis hier
if not $defineCursorRGZPT();
return false; // Fehler (bereits behandelt => Programmende)
endIf;
doW sqlCode = 0;
// Lesen nächste Rechnungszeilenpartie
exec sql fetch rgzpt_Cursor into :sqlRecRZP;
if sqlCode <> 0;
if sqlCode = 100; // = EoF
exec sql close rgzpt_Cursor;
if sqlCode = 0; // = EoF
$protokolliere( '* SQL-Cursor RGZPT für Umfuhr '
+ %char(sqlrecAK.akatnr)
+ ' erfolgreich entfernt');
else;
$protokolliere( '* SQL-Cursor RGZPT'
+ ' konnte nicht entfernt werden');
endif;
sqlcode = 0; // sicherheitshalber wegen Hauptschleife wieder auf 0
leave;
endIf;
// Andere Fehler
$protokolliere('Fehler beim Fetch Next, Datei RGZPTPF. '
+ 'SQLCode: ' + %char(SqlCode)
+ ' - SQLState: ' + SqlState
+ '. ' + SQLLIB_getLastSQLError()
);
return false; // => Programm abbrechen
endIf;
// Aktualisieren der Abgangsmenge bei Lagerpartie
innerhalb der Funktion kann auch auch sqlcod <>0 entstehen, was aber ok sein kann
if not $Update_LAGPT( sqlrecRZP.rzpfrm : sqlrecRZP.rzpartnr
: sqlrecRZP.rzplager : sqlrecRZP.rzpptnr
: sqlrecRZP.rzpmgeve);
return false;
endIf;
enddo;
ab hier weitere Verarbeitung nach Abarbeitung aller Sätze des fetch.
Diverse SQL ab hier
enddo;