[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Oct 2011
    Beiträge
    23

    SQL-Fehler in embedded SQL im aufrufenden Programm abfangen?

    Liebe Gemeinde,
    wie kann ich in einem aufgerufenen Programm bei Auftreten eines negativen SQL-Codes bewirken, dass mein aufrufendes Programm diesen Fehler im on-error monitor richtig interpretiert?

    Beispiel:
    Programm: XYZ
    ....
    C monitor
    C call 'SQLPGM' ---------------> SQLCOD < 0 im embedded SQL
    C on-error
    C eval w_err = *on
    C leavesr ----------------------> oder anderes Fehlerhandling
    C endmon


    Was müsste ich in SQLPGM ausgeben/einstellen, damit der negative SQLCOD
    in Programm XYZ den Monitor on-error auslöst?

    Danke vorab für einen guten Tipp.

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Die einzige Möglichkeit ist eine Prozedur zu schreiben, die nach dem SQL-Statement aufgerufen wird, die den SQLCODE prüft und bei einem negativen SQLCODE eine Abbruch-Nachricht schickt.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Wenn du das SQL-Programm "im Griff" hast (also die Source), dann erfinde einfach einen weiteren Aufrufparameter, der dir einen detailierten Fehlercode (nicht einfach den SQLCODE) zurück gibt.
    Das macht mehr Sinn, als eine ESCAPE-Nachricht an den Aufrufer zu senden, da u.U. dies erst mal zu einer Antwort-Nachricht führen kann und der Prozess hängen bleibt.
    Zumal du bei ILE nicht die "*PRV"-Ebene angeben kannst, da das immer noch das eigene Programm ist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Zumal du bei ILE nicht die "*PRV"-Ebene angeben kannst, da das immer noch das eigene Programm ist.
    Wenn Du eine (externe) Prozedur schreibst und die Escape-Message aus der Prozedur aufrufst, kommt diese sehr wohl in dem Programm an.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wenn du das SQL-Programm "im Griff" hast (also die Source), dann erfinde einfach einen weiteren Aufrufparameter, der dir einen detailierten Fehlercode (nicht einfach den SQLCODE) zurück gibt.
    Das macht mehr Sinn, als eine ESCAPE-Nachricht an den Aufrufer zu senden, da u.U. dies erst mal zu einer Antwort-Nachricht führen kann und der Prozess hängen bleibt.
    Zumal du bei ILE nicht die "*PRV"-Ebene angeben kannst, da das immer noch das eigene Programm ist.
    ... ich bin da schon eher ein Anhänger der escape Message (analog zu throw in Java) und im ILE gibt extra noch *PGMBDY als Ziel, wenn man sich die Callstack Ebenen Zählerei ersparen will.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Oct 2011
    Beiträge
    23
    Vielen Dank für eure blitzschnellen Antworten.

    Das SQLPGM wird ohne Parameter von vielen Programmen aufgerufen, es liest noch Daten aus der LDA.

    Ich kann sowohl den SQLCODE in SQLPGM interpretieren als auch den Monitor im aufrufenden Programm ändern.
    Was muss das Programm SQLPGM ausgeben, damit der Monitor on-error Alarm schlägt?
    Eine Möglichkeit wäre den SQLCODE in die LDA zu schreiben, aber vielleicht gibt es etwas Eleganteres?

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Erol Beitrag anzeigen
    Eine Möglichkeit wäre den SQLCODE in die LDA zu schreiben, aber vielleicht gibt es etwas Eleganteres?
    ... solche Programme gehören ausgedruckt und dem Programmierer um die Ohren gehauen.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    In den On-Error Block wird bei einer Escape Message gesprungen.
    Was das betrifft bin ich Dieters Meinung. So wie im Java & Co via CATCH & THROW verwende ich auch in der RPG Welt die Escape Messages zum Werfen und Empfangen von Fehlern.

    lg Andreas

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Auch bei der Objektorientierung vermeide ich selber Throw/Catch, da die meisten Aufrufe durchaus mit einem Bool-Return einen OK-Status zurückgeben können.
    Zumal das Fehlerhandling durch diese Methodik die Programmausführung bei häufigen "Fehlern" durchaus verlangsamt.
    Hinzu kommt, dass jeder SNDPGMMSG/QMHSNDPM einen Joblog-Eintrag erzeugt. Auch dies ist bei häufigem Vorkommen verlangsamend zumal es zusätzlich unnötige Joblogs (WRAP) produziert.

    *PGMBDY ist zwar eine Möglichkeit, da musst du aber sicher sein, dies in der Hauptprozedur durchzuführen. Befindest du dich in einer internen Unter-Procedur, schlägt das auf den Aufrufer des Programmes und nicht den Aufrufer der Prozedur durch. Damit können durchaus mehrere Aufrufebenen übersprungen werden.
    Dies gilt auch für Service-Programme, die Aufrufe durchaus verschachteln können.

    Eine saubere Schnittstellendefinition incl. Fehleraussage halte ich generell für besser.
    Siehe auch SYSERR-Struktur bei API's.

    Aber das ist halt alles Geschmackssache;-).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Naja, wenn Exceptions sind ja ... wie der Name es schon sagt ... Außnahmen.
    Kommen diese oft oder regelmäßig vor, ist es eher ein Designfehler.
    Exceptions im Joblog sind natürlich auch eine super Sache für Analysen (neben Logtabellen/Logfiles).

  11. #11
    Registriert seit
    Oct 2011
    Beiträge
    23
    Die Fehler kommen im Grunde nur während der Testphase vor. Sobald das Programm fertig ist, sollte kein Fehler mehr auftreten, falls doch wäre es richtig, wenn der Programmablauf abbricht.

    Die Frage ist: Wie gebe ich eine korrekte Message im ILE RPG Programm aus?

    SNDPGMMSG MSGID(CPF9899) MSGF(QCPFMSG) MSGTYPE(*NOTIFY) mit QCMD?

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... ein Beispiel findest Du hier (procedure error):
    http://bender-dv.de/Sourcen/QRPGLESRC.APILIST
    den Prototyp für QMHSNDPH hier:
    http://bender-dv.de/Sourcen/QRPGLEH.QMHSNDPM
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. embedded SQL Fehler SQL0312 beim Umwandeln
    By Hubert in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 09-12-19, 13:45
  2. Replaced Programm verursacht Fehler
    By harkne in forum NEWSboard Programmierung
    Antworten: 16
    Letzter Beitrag: 24-10-18, 13:44
  3. Antworten: 2
    Letzter Beitrag: 12-08-14, 13:09
  4. Antworten: 2
    Letzter Beitrag: 06-09-02, 08:59
  5. Fehler im C-Programm bei SQLALLOCENV
    By delphix in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 06-03-02, 16:07

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •