AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Setze den Cursor dorthin wo...
Thema durchsuchen
Ansicht
Themen-Optionen

Setze den Cursor dorthin wo...

Ein Thema von Der schöne Günther · begonnen am 27. Nov 2014 · letzter Beitrag vom 28. Nov 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 19:24
Datenbank: Sybase Advantage • Version: 11.10 • Zugriff über: ACE / FireDAC
Das ist wieder eine Idiotenfrage:

Ein TDataSource hat einen Cursor den ich lustig bewegen kann. Die Daten stammen aus einem TDataSet .

Beispielhafte Query: SELECT ZEITPUNKT, MESSWERT FROM myTable

Sagen wir, mein Resultset ist 1.000.000 Einträge groß. Die Zugriffsschicht hat für meine DBGrid-Anzeige nur die ersten 100 Records geladen. Scrolle ich weiter herunter, werden dynamisch neue Päckchen nachgeladen. Bei FireDAC kann ich bspw. detailliert einstellen, wieviele, wann, usw.


Meine Frage: Ich möchte jetzt an den 35. Mai 2008 springen. Kann ich den "Cursor" irgendwie dahin bewegen?
  • Würde ich den Cursor in meiner Applikation immer eins weiterschieben und schauen ob ich da bin? Nein, das dauert garantiert ewig.
  • Setze ich eine neue Query ab die mir alles "ab" dem 35. Mai ausgibt? Nein, denn dann kann ich nicht mehr "hochscrollen" und die Dinge vor dem 35. Mai sehen.

Was muss ich tun damit das DBMS mir sagt "Oh, was du suchst ist in deinem Resultset das ich noch für dich vorhalte an Position 54321. Hier ist Record 54321 und die nächsten 50 Einträge. Wenn du mehr wissen willst, frag nur weiter."
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 19:58
35. Mai 2008
Du solltest mal den Händler (Deiner Drogen) wechseln!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 20:40
Es gibt einen RecordNo. Der ist aber ehr DB-Interner Natur.

Für deinen Fall würde ich eher so vorgehen:

Du willst 31 Mai. Dann lade alle Daten vom 30. Mai - 1 Juni.
Scrollt der User dann Richtung Ende 1. Juni, lade den 2 Juni.
Das alles am besten ohne DB-Sensitive Controls.

Wie man so schön sagt: Niemand will durch 1 Mio. Datensätze sehen. Und der Admin wäre auch froh wenn du nicht 1. Mio Datensätze übers Netz bewegen würdest.
Und die Angabe "ich lade immer ja nur Häpchenweise" bringt den DB-Admin zur Weißglut. Denn deine 1 Mio. Datensätze gehen zwar nicht (gleich) übers Netz, aber der DB-Server muss dafür sorgen das diese 1 Mio. Datensätze entsprechende dem Abfragezeitpunkt gültig bereitstehen (also Löschaktion oder Inserts nicht auf diese 1 Mio. Datensätze wirken).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von humbuck
humbuck

Registriert seit: 26. Nov 2014
Ort: BW
65 Beiträge
 
Delphi XE4 Professional
 
#4

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 21:10
Naja, wenn du wirklich nach dem 35. Mai suchst, wirste sicherlich verdammt lange und erfolglos suchen müssen.

Solltest du jedoch nach einem realen Datum suchen wollen UND Daten-sensitive Controls verwenden, kannst du dies ja mit der folgenden Funktion versuchen:

function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;

Locate setzt die Cursor-Pos auf den angegeb. Datensatz und von dort kannste dann munter vor- und zurückblättern

zum Bleifisch:

Delphi-Quellcode:
DBGrid1.DataSource.DataSet.DisableControls;
DBGrid1.DataSource.DataSet.Locate('Datum','25.05.2008', [loCaseInsensitive])
DBGrid1.DataSource.DataSet.EnableControls;
Die Suche dauert bei einer Million Datensätzen schlechthin vergleichsweise lange und belastet immer den SQL-Server... ist unvermeidlich...
Jörch
Wissen ist Macht!
Wenn man nix weiß, muss man halt nur wissen, wo man nachschlagen muss.
Ergo: Ich weiß nix - macht nix.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 21:25
Und die Angabe "ich lade immer ja nur Häpchenweise" bringt den DB-Admin zur Weißglut. Denn deine 1 Mio. Datensätze gehen zwar nicht (gleich) übers Netz, aber der DB-Server muss dafür sorgen das diese 1 Mio. Datensätze entsprechende dem Abfragezeitpunkt gültig bereitstehen (also Löschaktion oder Inserts nicht auf diese 1 Mio. Datensätze wirken).
Das sehe ich ein. Aber in diesem Fall ist das ok.



kannst du dies ja mit der folgenden Funktion versuchen:

function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;
Danke! Das war genau was ich wollte. In meinem konkreten Fall habe ich dadurch nichts gewonnen denn FireDAC ist nach wie vor genauso langsam, die ACE-Komponenten von Sybase schaffen das in Millisekunden, FireDAC braucht mehrere Sekunden. Da liegt wohl die Schuld bei FireDAC.
  Mit Zitat antworten Zitat
Benutzerbild von humbuck
humbuck

Registriert seit: 26. Nov 2014
Ort: BW
65 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 22:39
wenn du zwingend einen zeitlichen Vorteil benötigst, solltest du sicherlich eine andere Verbindungsschicht einsetzen.

Aber noch mal zu deinem Query:
Zitat:
Beispielhafte Query: SELECT ZEITPUNKT, MESSWERT FROM myTable
Es besteht natürlich auch noch die Möglichkeit, die Datenmenge vom SQL-Server einzugrenzen. Das macht das Paket, das über ein Netzwerk versendet wird deutlich schneller:

Query: SELECT ZEITPUNKT, MESSWERT FROM myTable WHERE ZEITPUNKT BETWEEN '23.04.2014' AND '26.05.2014'
Wenn du die Filter-Funktion deiner Datenkomponente verwendest, musst du allerdings auf BEWTEEN verzichten. Alternativ kannste aber auch logische Vergleichsoperatoren verwenden:
ZEITPUNKT >= '23.04.2014' AND ZEITPUNKT < '27.05.2014'

Das ganze ist immer davon abhängig, wie viele Messungen pro Tag durchgeführt werden. Ggf. musst du dann auch kürzere Intervalle selektieren und die Uhrzeit mit ins Spiel bringen, falls möglich...
Jörch
Wissen ist Macht!
Wenn man nix weiß, muss man halt nur wissen, wo man nachschlagen muss.
Ergo: Ich weiß nix - macht nix.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Setze den Cursor dorthin wo...

  Alt 27. Nov 2014, 23:31
Was muss ich tun damit das DBMS mir sagt "Oh, was du suchst ist in deinem Resultset das ich noch für dich vorhalte an Position 54321. Hier ist Record 54321 und die nächsten 50 Einträge. Wenn du mehr wissen willst, frag nur weiter."
 select Zeitpunkt,messwert top=50 from table order by zeitpunkt Je nachdem was für einen SQLdialekt Deine DB spricht erhältst Du die ersten 50 Sätze mit top= oder max oder.. (bei einigen leider nicht)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (27. Nov 2014 um 23:40 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Setze den Cursor dorthin wo...

  Alt 28. Nov 2014, 10:27
Nein, genau das wollte ich ja nicht: Eine neue Query absetzen die mir ein neues Resulset ergibt. Ich wollte im bestehenden wohin.

Die vorgeschlagene Locate(..) -Methode ist genau, was ich wollte.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Setze den Cursor dorthin wo...

  Alt 28. Nov 2014, 14:45
Und die Angabe "ich lade immer ja nur Häpchenweise" bringt den DB-Admin zur Weißglut. Denn deine 1 Mio. Datensätze gehen zwar nicht (gleich) übers Netz, aber der DB-Server muss dafür sorgen das diese 1 Mio. Datensätze entsprechende dem Abfragezeitpunkt gültig bereitstehen (also Löschaktion oder Inserts nicht auf diese 1 Mio. Datensätze wirken).
Also nee, mittlerweile nicht mehr. Stichwort: Paging Funktionen.
http://en.wikipedia.org/wiki/Select_(SQL) weiter unten bei 'Result limits'
Ist zwar irgendwie auch ein Zugeständnis an die "Ich will alles und immer", aber die Server sind mittlerweile soweit. Wenn sich die Daten mittlerweile ändern, Pech für den Betrachter.

Und, ja: Wenn es keinen Index auf der Ordnungspalte gibt, kotzt der Admin und die Serverprovider reiben sich die Hände, weil noch mehr RAM her muss. Na und der Anwender wartet sich einen Wolf.

Was ganz schlimm ist, und das meinte Bernhard: Wenn ein Provider noch Cursor für das Paging verwendet. Tipp: Schau mal, was der Provider zu deinem SQL-Dings schickt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz