Performancefrage NEXT für Web-Pagination

18. Dezember 2020 16:45

Hi,

ich möchte für ein Webfrontend Datensätze abrufen. Das Frontend besitzt eine Seitennummerierung. Also z.B. 10 Datensätze pro Seite und aktuell steht der User auf Seite 2.
Wie kann ich am performancetechnisch günstigsten jetzt eben genau die nächsten 10 Datensätze abrufen? Sollte ich die Anfrage mit einem Query machen, damit ich TopNumberOfRows (Maximalanzahl der abzurufenden Daten) mitgeben kann?

Meine erste Überlegung, erstmal ohne Query, anhand der Artikeltabelle sieht so aus:
Page und RecordsPerPage sind Integer Variablen und werden vorgegeben. Im Beispiel:
Page := 2; //User steht auf Seite 2
RecordsPerPage := 10;

Code:
IF NOT Item.isempty THEN
  Item.NEXT((Page-1)*RecordsPerPage+1); //Auf Seite 2: Zum 11. Record springen ((2-1)*10)+1

REPEAT
  i += 1;
  Result += Item."No." + '\';
UNTIL (Item.NEXT = 0) OR (i >= RecordsPerPage);

MESSAGE(Result);


Ich nehme an, ein NEXT verhält sich in diesem Fall wie ein Findfirst. Bei einer überschaubaren Anzahl an Daten pro Seite ist das sicherlich verschmerzbar. Andernfalls könnte man auch nach dem Sprung per NEXT, den gefundenen Record nehmen und neu filtern und danach mit FINDSET weiterarbeiten. Also:
Code:
IF NOT Item.isempty THEN
  Item.NEXT((Page-1)*RecordsPerPage+1); //Auf Seite 2: Zum 11. Record springen ((2-1)*10)+1

Item.setfilter("No.",Item."No."+'..');
IF Item.FINDSET THEN REPEAT
  i += 1;
  Result += Item."No." + '\';
UNTIL (Item.NEXT = 0) OR (i >= RecordsPerPage);


Dann wird es aber schwieriger, wenn Filter und Reihenfolge (absteigend/aufsteigend) vorgegeben werden.

Grüße