[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2

Hybrid View

  1. #1
    Registriert seit
    Jan 2007
    Beiträge
    1.032
    ... da wäre ich doch völlig schmerzfrei und füge zwei fixe Statements ein: GOTO (evtl. auch mit einem Indikator konditioniert) und einen TAG. ;-)
    kf

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.950
    ... und was passiert, wenn Dein Programm fehlerhaft beendet wurde und erst gar nicht zu dem CLOSE kommt?
    Dann hast Du beim nächsten Aufruf u.U. ein Problem.

    Natürlich versucht jeder so sicher wie möglich zu programmieren, aber ich habe genügend Situationen erlebt, in denen dann "eine leere Liste" oder ein "leerer Bildschirm" zurückkam.
    ... und was noch schlimmer war, dass der Programmierer dann das Problem so gelöst hat, dass das Programm vor dem Aufruf immer neu compiliert wurde.

    Klar, man kann natürlich jetzt (seit 2 Releasen) auch den Close exklusiv im ON-EXIT machen, dann geht man ganz auf Nr. sicher.

    ... Ach und übrigens, gibt es mit dem TR2 in Release 7.1 (bzw dem entsprechenden TR in Release 7.3) die Möglichkeit auch im Free-Format eine Endlos-Schleife zu programmieren:

    Code:
    DOW *ON;
    ...
    ENDDO
    Birgitta Hauser

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

  3. #3
    Registriert seit
    May 2013
    Beiträge
    15
    Birgitta,

    jetzt hast Du mich mit Deiner Aussage etwas unsicher gemacht

    Zitat Zitat von B.Hauser Beitrag anzeigen
    ... und was passiert, wenn Dein Programm fehlerhaft beendet wurde und erst gar nicht zu dem CLOSE kommt?
    Dann hast Du beim nächsten Aufruf u.U. ein Problem.
    War das auf den Close bezogen?

    Ich wäre jetzt davon ausgegangen, dass im schlimmsten Fall der CLOSQLCSR = *ENDMOD das dann zumindest erledigt?!

    Schlechter sieht es allerdings mit den erstellten Aliassen aus, die beim harten Ausstieg tatsächlich als Leiche bleiben.

    Hier würde ich mir ein Drop Alias vor dem Erstellen des neuen Alias einfallen. Da ich den Alias sowieso in QTEMP erstelle, kann ich mir zumindest sicher sein, dass es mein eigener ist.
    Ein ganz sicherer Umgang damit fällt mir dazu aber aktuell nicht ein.

    Wenn das alles Blödsinn ist, klärt mich gerne auf, denn ich bin nicht so lernresitent, wie es xenofob vielleicht erscheinen mag. Ansonsten hätte ich den Thread ja auch gar nicht erstellen müssen.

    Nur ist Programmierung mit Embedded SQL nicht mein täglich Brot und ich wollte es auch mal komplett damit durchziehen. Da es sich um ein Korrekturprogramm handelt, war das eine gute Gelegenheit.

    Trotzdem schon einmal vielen Dank für die reichlichen Informationen und auch die kritischen Anregungen/Anmerkungen.

  4. #4
    Registriert seit
    May 2013
    Beiträge
    15
    ups...leider zu spät gesehen, dass es ja schon eine 2. Seite gibt.

    Ich sagte ja schon eingangs, dass man nicht über Programmierstile streiten sollte.

    Ich bin allerdings voll auf Birgittas Seite. Ich darf aktuell genau einen solchen Code pflegen mit SETLL/READE.....DOW %EOF......READE ENDDO

    Ggf. ist der RAEDE noch mit Abfragen verbunden etc. Bis ich dann beim DOW bin, habe ich schon fast vergessen, warum ich den überhaupt setzen wollte.
    Und am Ende muss ich dann den ganzen Schmonsens nochmal einbauen....und später bei Änderungen 2mal pflegen....na danke

    Und ja, zu Zeiten von RPGII und RPGIII fand ich den GOTO/TAG, sinnvoll eingesetzt, auch gar nicht so übel. Heute m free lässt sich der Code, sofern einigermaßen programmiert, eh viel besser lesen und ich benötige den auch gar nicht mehr.

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.122
    Zitat Zitat von Hawi Beitrag anzeigen
    Ich sagte ja schon eingangs, dass man nicht über Programmierstile streiten sollte.
    Finde ich nicht.
    Mein Kollege und ich haben stundenlang über den besten Programmierstil gestritten.
    Mit dem Ergebnis das ich auch 20 jahre später die Programme wieder schnell verstehe.

    War zwar mühsam die Streiterei aber hat uns beide wirklich vorwärtsgebracht.

    Und warum soll man das Rad neu erfinden, wenn es andere schon getan haben. Die meisten sind ja wohl schon im fortgeschritten Alter (hüstel..) und müßen nicht mehr mit dem Kopf durch die Wand.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.817
    Für mich gehört das Lesen an den Anfang der Schleife, da ohne GOTO bei Prüfbedingungen per "ITER" immer an den Schleifenanfang gesprungen werden kann.
    Wenn das Lesen am Ende liegt, sehe ich dann häufig z.B. 2x Fetch/Read, 1x vor der Schleife und 1x am Ende und mitten drin komplizierte If's um für Prüfungen oder zum Überlesen wieder an den Ende-Read zu kommen.

    In anderen Sprachen gibt es auch den "break" um eine Schleife zu verlassen und einen "continue" um an den Schleifenanfang zu gehen. Als Schleifen gibts dann "while(true) {}" oder "for(; ; ) {}" und niemand hält dies für schlechten Stil. Dies hat auch nichts mit RPG-Denke zu tun.

    Was spricht also gegen Break und Iter?
    Damit wird ein Code viel übersichtlicher und vor allem klarer.

    Tja, und was Abbruch Bedingungen angeht, so kann man da auch noch mit Monitor-Gruppen arbeiten. Dies entspricht dann "Try {} catch (ex) {}", wobei der Finally{} noch fehlt.
    Auch damit kann ich dann Close() bei Abbrüchen erreichen.

    In ILE habe ich mir z.B. für das FileHandler-Problem das Konzept verinnerlicht:

    dow CallRead(Buffer);
    enddo;

    dcl-proc CallRead;
    dcl-pi *n ind;
    Buffer ...
    end-pi;

    fetch ... into Buffer;
    if sqlcode = *zero;
    return *on;
    endif;
    // Logging !
    return *off;
    end-proc;

    Somit habe ich den Read wieder am Schleifenanfang und kann Iter/Leave verwenden.

    Dies kann man dann ebenso für alle anderen SQL's lösen und im Code liest sich das dann so:
    if CallUpdate(Buffer);
    endif;
    if CallInsert(Buffer);
    endif;
    if CallDelete(Buffer);
    endif;

    Dann sieht's schon fast so schön wie C# aus. Und dies mache ich schon eine halbe Ewigkeit (auch seit RPG) so.
    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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.393
    ... leave und iter - wo ist der Eimer.
    Da macht man sich eine procedure, die gibt true zurück, wenn sie was gelesen hat und dann hat man:

    dow liesWas();
    machwas();
    enddo;

    Hat Dirk mal Turnschuhprogrammierung genannt - wer auch immer habe ihn selig - hat aber nicht nur mir gefallen.

    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
    Dec 2000
    Beiträge
    287
    Ist zwar schon etwas älter,
    aber ich schieb den SQLcode nach der Operation evtl in eine neue Variable.
    damit kann ich dann zb. einen zweiten Fetch innerhalb einer weiteren der Schleife machen und der zweite FETCH beendet nicht meine erste Schleife
    dou sqlcod_1 <> 0;
    fetch f1 into ....
    sqlcode_1 = sqlcode
    dou sqlcode_2 <> 0
    fetch f2 into....
    sqlcode_2 = sqlcode
    .....
    enddo
    enddo
    Programmierung

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.817
    Mag nicht state of the art sein, aber meine Verfahren laufen so:

    dow 1=1; // früher Do *hival
    fetch ...
    if sqlcode <> *zero;
    leave;
    endif;

    // towas
    if error;
    iter;
    endif;

    enddo:

    Vorteile:
    - Bei Fehlern/nicht zuverarbeitenden Daten kann ich einfach an den Anfang springen.
    - SQLCODE ist für die Schleifen nicht relevant.
    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
    May 2004
    Beiträge
    479
    So dann gebe ich auch noch meinen Senf zum Close cursor dazu.
    Mein Close Cursor findet immer da statt wo ich ihn auch machen möchte und es logisch ist und zur Sicherheit noch vor dem OPEN CURSOR, in die PSSR und vor den *INLR.
    Und ich bin auch schon daran verzweifelt als ich ein Programm geändert hatte warum das SQL immer noch nicht richtig funktioniert, dabei war der Cursor nicht geschlossen und er hat den bereits geöffneten verwendet. Deshalb auch die vielen CLOSE CURSOR.

Similar Threads

  1. SQLCODE -805 beim Zugriff auf ein fernes System
    By mahones in forum NEWSboard Programmierung
    Antworten: 31
    Letzter Beitrag: 02-04-20, 11:21
  2. SQLCODE = -206
    By Hubert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 14-10-19, 14:02
  3. SQLCODE = -000000811. in einem SQLCBLLE
    By nico1964 in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 29-06-15, 07:53
  4. IP-Verarbeitung
    By Gimli in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 06-09-02, 12:58
  5. PC-Konsole für mehrere AS/400
    By moskito in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-09-01, 18:40

Berechtigungen

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