[NEWSboard IBMi Forum]

Thema: SQL Cursor

  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    1.975

    SQL Cursor

    Moin zusammen,

    ich hab hier was recht verrücktes ...

    ein SQLRPGLE Pgm macht (immer in der Reihenfolge)

    close c1

    declare c1 cursor for ...

    open c1

    Schleife:
    fetch next from c1 into ...
    verarbeiten

    ...

    seton LR

    Wird in dem Ablauf das Pgm zum 2. mal gerufen liest der fetch Daten des ersten Aufrufes

    CloseCursor steht auf endactgrp, die endet zwischen 2 aufrufen NICHT
    Aber der exlizite Close müsste doch greifen?

    ne Idee?

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hast Du den SQLCODE und/oder den SQLSTATE unmittelbar nach dem CLOSE und dem OPEN geprüft?
    Ich könnte mir vorstellen, dass der CLOSE aus irgendeinem Grund nicht gemacht wird und deshalb auch der OPEN fehlschlägt und beim FETCH die nächsten Daten des Cursors liest.

    Ansonsten müsste der explizite CLOSE greifen.

    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
    Jun 2001
    Beiträge
    1.975
    danke Birgitta,

    SQLCOD ist 0,
    SQLSTATE ist 02000

    Den State habe ich nicht beachtet, wo steht was das bedeutet?
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  4. #4
    Registriert seit
    Jun 2009
    Beiträge
    316
    SQLSTATE ist 02000 = no row was fount

    lt. Google

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    SQLCODE = 0 bedeutet eigentlich alles Okay und entspricht dem SQLSTATE = 00000.
    SQLSTATE = 02000 heisst Record not found und entspricht dem SQLCODE = 100.

    Wo,nach welchem SQL-Befehl hast Du denn den SQLCODE 0 und wo den SQLSTATE 02000? erst nach dem FETCH?
    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

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    nö, nach dem close

    Code:
    C                  FILL_MDS              BEGSR
    C*EXEC SQL                                                                                         
    C* CLOSE C1                                                                                        
    C*END-EXEC                                                                                         
         SQLER6 = 5;                                                           //SQL                   
         IF SQL_00024 = 0;                                                     //SQL                B01
         SQLROUTE_CALL(                                                        //SQL                 01
              SQLCA                                                            //SQL                 01
            : SQL_00022                                                        //SQL                 01
         );                                                                    //SQL                 01
         ELSE;                                                                 //SQL                X01
         SQLCLSE_CALL(                                                         //SQL                 01
              SQLCA                                                            //SQL                 01
            : SQL_00022                                                        //SQL                 01
         );                                                                    //SQL                 01
         ENDIF;                                                                //SQL                E01
    eval sqlca
    --> sqlcode 0
    --> sqlstate 02000

    V7R3
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... da bräuchte man schon das ganze Programm. Wenn der fetch in den Ofen geht und die Zielvariablen nicht initialisiert waren...
    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
    Jun 2001
    Beiträge
    1.975
    der fetch funktioniert ja

    Es ist ein Subfile

    Bsp.:
    Anzeige 1
    25 Sätze zu der gewählten Selektion

    Anzeige 2. Aufruf
    25 Sätze der gewählten Selektion und 1-5 Sätze der vorherigen

    Das verstehe ich nicht

    Werdem mir jetzt mal des sqlca mit einem ereignismerker in eine datei ausgeben um mehr infos zu bekommen.
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Frage:
    Wenn Du jeweils das SQL-Statement separat (z.B. mit STRSQL oder ACS) ausführst, bekommst Du dann die richtigen bzw. erwarteten Daten?
    Die Ausgabe-Felder sind auch vor dem 2. Fetch wirklich sauber initialisiert?

    Kannst Du das SELECT-Statement mal posten?
    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

  10. #10
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Ja, einzelnd aufgerufen bekomme ich nur 'meine' Daten

    Ablauf:
    close
    declare
    open
    fetch first
    Schleife bis sqlcode <> 0: fetch next
    (neu close
    seton LR

    der declare, schon mit und Ohne scroll versucht

    Code:
    WITH A AS(                                                   
    SELECT CHGHIP.*, FERELE FROM CHGHIP, FELKAP WHERE            
          (       CHKEYXX        = :SUNRA OR                     
                  CHKEYXX        = :SUNRB)  AND                  
           CHHERK <> 'EGA'                      AND              
                                                                 
          (CHFILE = 'SCHULP' OR                                  
           CHFILE = 'SCHUVP') AND                                
          CHFILE=FEFILE AND CHFELD= FEFELD                       
                               AND (FEKORE = 1 OR FEKORE = 3) AND
                         SUBSTR(FERELE, 1, 2) <> 'S1' AND        
                         SUBSTR(FERELE, 1, 2) <> 'S2'            
    ) SELECT * FROM A                                            
    ORDER BY FERELE, CHFELD, CHDAEN DESC, CHKEYXX
    der fetch (mal first mal next)
    FETCH FIRST FROM C9 INTO :CHSATZ, :FERELE

    CHSatz ist eine E DS auf ein PF
    FERELE kommt aus der FELKAP die auch als E DS am Pgm ist

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  11. #11
    Registriert seit
    Nov 2004
    Beiträge
    325
    Moin,

    etwas ähnliches hatte ich auch mal. Cleare mal vorher deine EDS.

    mfg

    DKSPROFI

Similar Threads

  1. Cursor-Steuerung in DSPF
    By urrumpel in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 06-04-21, 16:35
  2. SQL Reset Cursor
    By camouflage in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 29-05-20, 14:42
  3. DDS Numerisches Feld Cursor rechtsbündig
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 15-11-19, 12:16
  4. Close SQL Cursor from another Job
    By woodstock99 in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 01-11-16, 11:47
  5. Embedded SQL Cursor updaten
    By Tschabo in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 23-10-16, 19:12

Berechtigungen

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