Autor Beitrag
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 19.08.05 21:06 
1. Benutz doch Cursors, jede richtige DB hat sowas.
2. Wenn Deine DB sowas wie LIMIT / TOP oder so beherrscht, also das bei einem SELECT nur maximal N Zeilen geliefert werden, dann kannst Du dir die Daten paketweise holen. Dazu erzeugst Du am besten einen Primary Key auf das ID-Feld und dann:
Du rufst die Daten paketweise ab, und zwar so:
"select * from tabelle where ID>:x Limit 100" oder bei MSSQL
"select top 100 * from tabelle where ID>:x"

beim 1.Aufruf ist 'x' = 0, also bekommst du die obersten 100 Zeilen. Nun kannst Du im Client damit hin und her laufen. Unten angekommen, nimmst Du die ID der letzten Zeile deine Paketes (nenn sie Y) und rufe das nächste Paket ab:
"select top 100 * from tabelle where ID>Y"
Du bekommst automatisch das nächste Paket. So kannst Du sehr einfach vorwärts scrollen,. Mit ein wenig Gehirnschmalz kannst das auch Rückwärts.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 19.08.05 21:57 
Gibts in den 4er Versionen schon Trigger ? Von einem Standard-SQL AutoInc Feld habe ich auch noch nichts gehört. Poste bitte mal davon einen Source-Schnipsel. Ein Trigger ist jedenfalls sowieso besser. Ich lasse den ja nicht nur die ID vergeben, sondern z.B. auch das Anlegedatum u.a. ! Mit sowas kann man schön die DAU-Dummheiten zurückverfolgen. :mrgreen: Natürlich gibt es auch einen Update-Trigger, der öhnliche Aufgaben zu erfüllen hat. 8)

_________________
Gruß
Hansa
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Fr 19.08.05 22:06 
user profile iconalzaimar hat folgendes geschrieben:
1. Benutz doch Cursors, jede richtige DB hat sowas.
2. Wenn Deine DB sowas wie LIMIT / TOP oder so beherrscht, also das bei einem SELECT nur maximal N Zeilen geliefert werden, dann kannst Du dir die Daten paketweise holen. Dazu erzeugst Du am besten einen Primary Key auf das ID-Feld und dann:
Du rufst die Daten paketweise ab, und zwar so:
"select * from tabelle where ID>:x Limit 100" oder bei MSSQL
"select top 100 * from tabelle where ID>:x"

beim 1.Aufruf ist 'x' = 0, also bekommst du die obersten 100 Zeilen. Nun kannst Du im Client damit hin und her laufen. Unten angekommen, nimmst Du die ID der letzten Zeile deine Paketes (nenn sie Y) und rufe das nächste Paket ab:
"select top 100 * from tabelle where ID>Y"
Du bekommst automatisch das nächste Paket. So kannst Du sehr einfach vorwärts scrollen,. Mit ein wenig Gehirnschmalz kannst das auch Rückwärts.


Ja meine ich doch wie ich ein paar Beiträge zurück schon ansatzweise dasselbe erklärt habe wie du hier!
Aber wie ich auch noch erwähnt habe wenn ich nicht nach der ID sortiere sondern nach andern Feldern
dann müßte es noch etwas anders aussehen!

Nehmen wir an meine Sortieranweisung sieht folgendermaßen aus:

ORDER BY NAME ASC, VORNAME DESC, STRASSE ASC, HNR DESC

dann verwende ich anstatt das ID Feld das Feld NAME
und übernehme die anderen Sortieranweisungen wie sie sind
Also so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
// First
Query.SQL.Text :=  'SELECT * FROM `person` WHERE NAME = (SELECT MIN(NAME) FROM `person`) ORDER BY VORNAME DESC, STRASSE ASC, HNR DESC';
Query.Open;
LAST_RESULT_VALUE := Query.FieldByName('NAME').Value; // Letztes Ergebnis Wert zwischenspeichern

// Next
// Nächst höheren Wert rausholen mit Limit 1      
Query.SQL.Text := 'SELECT * FROM `person` WHERE NAME > :LAST_RESULT_VALUE LIMIT 1';  //Limit für Next berechnen
Query.ParamByName('LAST_RESULT_VALUE').Value := LAST_RESULT_VALUE;
Query.Open;
LAST_RESULT_TEMP_VALUE := Query.FieldByName('NAME').Value; // Ergebnis zwischenspeichern

// Jetzt anzahl letzten Wertes rausholen für Limit
Query.SQL.Text := 'SELECT COUNT(*) AS ANZAHL FROM `person` WHERE NAME = :LAST_RESULT_TEMP_VALUE';
Query.ParamByName('LAST_RESULT_VALUE').Value := LAST_RESULT_TEMP_VALUE;
Query.Open;
ANZAHL := Query.FieldByName('ANZAHL').AsInteger;

// Jetzt die eigentliche Abfrage mit dem richtigen Limit
Query.SQL.Text := 'SELECT * FROM `person` WHERE NAME > :LAST_RESULT_VALUE ORDER BY VORNAME DESC, STRASSE ASC, HNR DESC LIMIT :ANZAHL';
Query.ParamByName('LAST_RESULT_VALUE').Value := LAST_RESULT_VALUE;
Query.ParamByName('ANZAHL').AsInteger := ANZAHL;
Query.Open;

// usw. usv.