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

Code:
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;