Seiten berechnen
-
Hallo Leute,
ich bastle schon Tage an einem Problem herum und komme einfach nicht weiter. Ich rufe Datensätze ab, die ich dann in einer Tabelle in der GUI darstelle. Die Datensätze sind in Seiten und Sätzen abzurufen, pro Seite aber max. 100 Sätze. Wenn ich zum Beispiel 200 Sätze haben möchte, muss ich 2 Seiten mit jeweils 100 Sätzen abrufen, oder bei 350 Sätzen: 4 Seiten, ersten drei Seiten je 100 Sätze und die 4. Seite 50 Sätze.
Alle bereits abgerufenen Sätze werden zusammengezählt und als startIndex beim Abrufen übergeben, inkl. der Anzahl an Sätzen die der User bei einem Abruf in der GUI-Tabelle haben will. Wenn er jetzt das erste Mal 200 Sätze Daten abrufen möchte, ist startIndex = 1 und count = 200, beim zweiten Abruf ist startIndex = 201 und dann 401, 601, 801 usw. count bleibt ja 200.
Wie teile ich das nun in die Seiten und Sätze ein bzw. wie berechne ich das? Er muss beim 2. Abrufen ja dann auch bei Seite 3 starten und beim 3. Abrufen bei Seite 5 usw.!
Hier mal der Code:
void Class::list(const int startIndex, const int vCount) { int total = 0; int start = 0; int count = vCount; int limit = vCount; int divisor = vCount; if (vCount > 100) { divisor = 100; limit = 100; } total = ceil((double)(startIndex + vCount) / divisor); start = startIndex / divisor; for (int i = 0; i < total; i++) { if (i < start || limit == 0) { continue; } cout << "page:" << i + 1 << "limit:" << limit; if (vCount > 100) { count -= limit; if (count <= 100) { limit = count; } } } }Funktioniert leider nicht richtig, manchmal werden zu viele Seiten abgerufen (dann hat die letzte Seite limit=0)! Je nach vCount Wert!
Kann mir da jemand helfen?
Danke und Gruß
Chris
-
Wie teile ich das nun in die Seiten und Sätze ein bzw. wie berechne ich das? Er muss beim 2. Abrufen ja dann auch bei Seite 3 starten und beim 3. Abrufen bei Seite 5 usw.!
Also
Aufruf*2-1
z.B.: Ist es der dritte Aufruf, dann ist es 3*2-1=5 und Seite 5;
Also irgw.
(startIndex % vCount +1)*2-1müsste dann die Seite ergeben.
z.B.:Startindex = 201, count 200 (zweiter Aufruf, 200 Sätze)
(201 % 200 +1)*2 -1 = 3P.S.: Das limit 0 ist, könnte an Zeile 24 liegen. Wenn count und limit gleich sind (also wenn in Z. 8 vCount kleiner gleich 100 ist und somit beide unverändert bleiben), ist count 0 und folglich (Z. 27) auch limit. In Zeile 17 entsteht dann eine Schleife, die bis zum Ende der in Z. 16 platzierten ausharrt.
Edit: bin mir da aber nich' sicher ... ist nur eine Idee
-
Wie meinst Du das mit
(startIndex % vCount +1)*2-1?
...in welche Zeile soll das?
-
realdarkman71 schrieb:
Wie meinst Du das mit
(startIndex % vCount +1)*2-1?
...in welche Zeile soll das?
Nein, das war nur ein Vorschlag wie du die Seite herausfinden kannst.
Wo und wie du es einsetzen willst, das ist ganz dir überlassen.
-
Welche Seite herausfinden? start? Der Code ergibt bei mir immer 3, egal wie hoch startIndex und vCount sind!?
-
realdarkman71 schrieb:
Wenn er jetzt das erste Mal 200 Sätze Daten abrufen möchte, ist startIndex = 1 und count = 200, beim zweiten Abruf ist startIndex = 201 und dann 401, 601, 801 usw. count bleibt ja 200.
Warum fängt der startIndex nicht bei 0 an?
Was willst du jetzt herausfinden, die Seitenzahl?
Und wie verhält das sich, wenn ich erst 350 Sätze abrufe (3,5 Seiten). Kommen die Sätze des nächsten Abrufs dann auf die nächste Seite oder wird die halbe Seite erst noch vollgepackt?
-
realdarkman71 schrieb:
Welche Seite herausfinden? start? Der Code ergibt bei mir immer 3, egal wie hoch startIndex und vCount sind!?
Ou sorry, ich meinte startIndex / Count!
(startIndex / vCount +1)*2-1
-
fdfdg schrieb:
Warum fängt der startIndex nicht bei 0 an?
Ich habe noch eine andere Routine, die braucht immer als startIndex die 1 und ich wollte das das gleich bleibt!
fdfdg schrieb:
Was willst du jetzt herausfinden, die Seitenzahl?
Und wie verhält das sich, wenn ich erst 350 Sätze abrufe (3,5 Seiten). Kommen die Sätze des nächsten Abrufs dann auf die nächste Seite oder wird die halbe Seite erst noch vollgepackt?
Das muss dann so aussehen:
Erster Aufruf (startIndex=1, vCount=350):
page: 1 limit: 100
page: 2 limit: 100
page: 3 limit: 100
page: 4 limit: 50Zweiter Aufruf (startIndex=351, vCount=350):
page: 5 limit: 100
page: 6 limit: 100
page: 7 limit: 100
page: 8 limit: 50Dritter Aufruf (startIndex=701, vCount=350):
page: 9 limit: 100
page: 10 limit: 100
page: 11 limit: 100
page: 12 limit: 50usw.
Die Routine soll das alles berechnen und die Daten entsprechend abrufen! Funktioniert ja auch soweit, nur manchmal ruft die Routine noch eine zusätzliche Seite mit limit:0 ab ... und dann stimmt das mit den nächsten Seiten beim darauf folgenden Aufruf nicht mehr!
-
Also dann
inline void list(const int vCount) { int count=vCount; short limit; static int startIndex(1); while((startIndex-1)%100 != 0) ++startIndex; for(;count>0;count-=100){ limit=(count>=100)?100:counter; std::cout<<"page: "<<startIndex/100+1<<" limit: "<<limit<<std::endl; startIndex+=100; } }Oder wie?
-
Hm, einfach so?: (Ausgabe)
#include <iostream> class Class { static const int ELEMS_PER_PAGE = 100; public: Class() : startIndex(1), page(1) { } void list( int count ) { std::cout << "list: startIndex=" << startIndex << ", page=" << page << ", count=" << count << "\n"; while ( count > 0 ) { int elems = std::min( count, ELEMS_PER_PAGE ); count -= elems; // elems Elemente auf Seite page ab Index startIndex std::cout << "page: " << page << " limit: " << elems << "\n"; startIndex += elems; ++page; } } private: int startIndex; int page; }; int main() { Class cl; cl.list( 350 ); cl.list( 330 ); cl.list( 350 ); }
-
Ja genau so, nur ohne private Variablen (wie page und startIndex), das sollte alles in dieser einen Routine ablaufen:
void Class::list(const int startIndex, const int vCount)...und Class ist nur ein Platzhalter!
-
realdarkman71 schrieb:
Ja genau so, nur ohne private Variablen (wie page und startIndex), das sollte alles in dieser einen Routine ablaufen
Das kann doch gar nicht funktionieren. Start-Index wolltest du ja ursprünglich als Parameter übergeben, das passt dann dafür.
Die aktuelle Seite kannst du dir aber nicht errechnen, wenn du nur den Start-Index hast.
-
Ist mir auch gerade klar geworden, habe page jetzt als private implementiert!
Habe es mit vielen Werten für vCount probiert, Ergebnis war immer korrekt ... die Routine sollte jetzt funktionieren wie sie soll!
Vielen Dank für Eure Hilfe!!!

Gruß
Chris
-
Und mach die Parameter nicht const. Das ist 1.) ein Implementierungsdetail und 2.) Verwirrt nur.