[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    May 2004
    Beiträge
    444

    SQL Techniken in Verbindung mit Subfile

    Hallo zusammen,

    ich versuche mal meine Problematik zu erklären.

    Auf meiner Subfile kann man sortieren und positionieren oder auch z.B. F5 für aktualisieren drücken.

    Die Subfile ist (ich nenne das volldynamisch) SFLSIZ=SFLPAG bei mir beide 15

    Beim Positionieren und bei F5 hole ich mir den 1. Satz der Subfile und gebe beim SQL WHERE mit an " ... AND FELD1 >= wert AND FELD2 >= wert". Ich habe berücksichtigt dass der eindeutige Schlüssel immer mit dabei ist.

    Bisher noch kein Problem

    Lesen 15 Sätze, Subfile füllen und anzeigen.

    Vorwärts blättern Subfile clearen, Lesen 15 Sätze, Subfile füllen und anzeigen.

    Immer noch kein Problem.

    Blättert er zurück

    Rückwärts Lesen 15 Sätze Subfile füllen und anzeigen.
    Wäre soweit kein Problem bis ich an den ersten Satz des abgesetzten SQL komme.

    Da ich ja mit >= gearbeitet habe gibt es jetzt keinen vorherigen Satz mehr, was ja von den Daten her nicht stimmt.

    Die einzige Möglichkeit die mir jetzt eingefallen ist, ist ich muss das gleiche SQL mit < absetzen und mit DESCEND sortieren.

    Hat irgend jemand noch Ideen?

    Es soll weiterhin SQL bleiben und es sollen auch nur die Daten eingelesen werden die angezeigt werden.

    Viele Grüße Harald

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    832
    Click image for larger version. 

Name:	SQL_Fetch.PNG 
Views:	37 
Size:	69,8 KB 
ID:	609

    Es gibt auch weitere SQL Fetch Möglichkeiten.
    Vielleicht hilft es

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Wenn Du die "Seiten-Nr." kennst, kannst Du mit Limit/Offset (im Declare bzw. nach dem SELECT-Statement) die entsprechenden Datensätze direkt abrufen.

    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

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... prepared statement und für jeden Leseblock neuer open using mit anschließendem Blockfetch und
    close.

    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/

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Einfacher ist ein Scrollable Cursor (wenn es die Abfrage erlaubt).
    Mittels "Fetch relative +/- N" kannst du dann um 2 x N (N = Anzahl/Seite) rückwärts positionieren und die SFL neu füllen.
    Die Daten werden dann auch aktualisiert.

    Limit/Offset ist manchmal halt keine gute Lösung, da durch Offset die Anzahl Zeilen ja erst überlesen werden müssen. Bei den 1. 10 Seiten gehts vielleicht noch, hängt allerdings von der Komplexität der Where-Klausel und den verfügbaren Indizes ab.

    Ins besonders wenn du die Order-By-Klausel noch dynamisierst und keine passenden Indizes vorhanden sind.
    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

  6. #6
    Registriert seit
    May 2004
    Beiträge
    444
    Mein Problem war ja eigentlich dass ich beim Positionieren mit >= gearbeitet habe und dann der Scroll Cursor vorher gar nichts mehr hat zum lesen. Aber ich habe mich jetzt auch davon verabschiedet und setze einfach das SQL ab und versuche dann mit einem eurer Vorschläge an die entsprechende Stelle zu gelangen, wobei mir LIMIT und OFFSET noch fremd sind, da muss ich mal lesen und den Satz von BenderD muss ich auch erst mal Wort für Wort aufdröseln. Das mit dem Zurückblättern wollte ich genauso machen wie Fuerchau das beschreibt nur dann muss ich das komplette SQL absetzen ohne >= und beim Positionieren von einem Wert halt solange lesen bis ich dort bin. Ob ich das mit dem ScrollAble Cursor mache, weiß ich noch nicht, da habe ich wie bereits von Fuerchau erwähnt schlechte Erfahrung bei großer Datenmenge gemacht. Kann sein dass ich die Aktualisierung "händig" mittels CHAIN mache. Wobei ich dann halt auf die gelöschten Sätze und der Anzahl zurücklesender Sätze das selbst steuern muss. Ich schau mir jetzt mal alles an, was ihr geschrieben habt. Vielen Dank für Eure Zeit und Mühe.

    Viele Grüße Harald

  7. #7
    Registriert seit
    May 2004
    Beiträge
    444
    Ich hab das verwechselt. SCROLLABLE mache ich ja. Aber werden da die Daten tatsächlich aktualisiert? Brauche ich da nicht ein SENSITIVE oder so?

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von harkne Beitrag anzeigen
    und den Satz von BenderD muss ich auch erst mal Wort für Wort aufdröseln.
    ... out of my head:

    PrepareStringUp = 'select * from myfile where Feld1 >= ? and Feld2 >= ? order by Feld3;
    PrepareStringDown = 'select * from myfile where Feld1 < ? and Feld2 < ? order by Feld3 descending;

    exec sql declare CUp cursor for SUp;
    exec sql declare CDown cursor for SDown;

    exec sql prepare SUp from PrepareStringUp;
    exec sql prepare SDown from PrepareStringDown;

    open CUp using :feld1, :feld2;

    fetch Cup for 15 rows into :fetchrecDS;

    close CUP;

    analog rückwärts mit CDown.

    Bei den zwei Vergleichsfeldern muss man aufpassen, ob die einfache Kopplung mit and, das ist, was man haben will oder ob das etwas komplizierter wird.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    May 2004
    Beiträge
    444
    @BenderD
    So war auch ein gedanklicher Ansatzweg von mir, bei der Umsetzung hat es dann etwas gehapert, aber das hier sieht gut aus. Das gleich mit 2 Cursor zu machen ist natürlich auch gut. 2 Resultsets. Beim rückwärtsblättern im 1 Resultset und keine Daten mehr mit dem 2. Resultset weiter machen und umgekehrt.

    Danke für die Hilfe. Tja wer die Wahl hat hat die Qual.

    Ich hab mich jetzt erst mal für die andere Variante mit nur einem SQL und dann halt von Anfang an entschieden. Aber das kann je nach Aufwand sich noch ändern :-)

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.206
    Stimmt, Sensitive ist für Aktualisierungen. Allerdings macht Scrollable ohne Sensitive wegen der Performance keinen Sinn, da sonst immer erst eine Kopie erstellt werden muss.

    Was die Paginierung angeht, solltest du dich nicht um den Filter (Where) kümmern sondern nur um den Order By. Der Filter ist ja Users Wunsch und schränkt die Daten ein.
    Einzig die dynamische Sortierung ist dein Problem bei der Subfileanzeige.

    Neben Limit/Offset gibts noch eine Alternative in der Kombination mit D*B's Ansatz (wird auch öfters von Birgitta vorgeschlagen:

    select * from (
    select .....
    ,count(*) over () as Anzahl
    ,row_number() over (order by ....) Zeile
    where UserFilter
    ) x
    where Zeile between ? and ?
    order by Zeile
    fetch first n records

    Die sog. Olap-Funktionen sind explizit für schnelle Ausführung entwickelt (einen Index über die Sortfelder sollte man trotzdem haben).
    Du nummerierst die Zeilen entsprechend der gewünschten Sortierung.
    Anschließend filterst du die gewünschten Zeile über deine Seitenlänge.
    Der Sort nach Zeilennummer bringt dir die gewünschte Reihenfolge, da die Sortierung ja bereits erfolgt ist.

    Vorteil: Du kannst auch nach Spalten sortieren, die nicht im Ergebnis leigen müssen.
    Da die IBM i durchaus mehrere 10.000 Zeilen/Sekunde lesen kann, sollte die Performance kein Problem sein, und wer hat schon Lust, mehrere 100 Seiten durchzublättern.

    Das Verfahren ist i.Ü. auch Sensitive, da ja ständig neu abgefragt wird.
    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

  11. #11
    Registriert seit
    May 2004
    Beiträge
    444
    @FUERCHAU
    das mit OVER kannte ich nicht auch nicht das mit row_number. Hab mir jetzt ein bischen was durchgelesen im Internet. Wenn ich das aber richtig verstehe wird immer wieder das SQL ausgeführt. Immer und immer wieder bei jedem blättern. Würde das der Sensitive auch machen oder aktualisiert er nur selbst an der Stelle an der er es benötigt?

    Für was ist der COUNT(*) in der Abfrage?

    Für fetch first n records bräuchte ich aber dann eine DS mit Mehrfachvorkommen um gleich alle Sätze aufzunehmen, würde auch ein einfacher FETCH NEXT in einer Schleife gehen oder geht das dann auf die Performance?

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... alles overkill. Der Blockfetch dürfte das schnellste sein! ein blockfetch von 1000 Sätzen dauert genauso lange wie ein fetch. Das ganze Gedöns mit Olap und fetch first 15 only beim Cursor braucht es alles nicht, beim reopen wird positioniert und gut ist.

    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/

Similar Threads

  1. Overlay / Subfile
    By alex61 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 09-04-20, 18:20
  2. Satzsperre bei subfile
    By _MG_ in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 25-10-17, 11:04
  3. refresh subfile
    By _MG_ in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 12-07-17, 15:57
  4. Antworten: 2
    Letzter Beitrag: 19-05-15, 11:21
  5. Subfile
    By brittner in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 18-11-13, 16:24

Berechtigungen

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