Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Prior (https://www.delphipraxis.net/76197-prior.html)

sveta 31. Aug 2006 10:08

Datenbank: sql • Zugriff über: ADO

Prior
 
Hallo Profis,
am besten schick ich euch erstmal mein Code

Delphi-Quellcode:
function TForm1.nextEntry(t:TDatetime;id:integer):String;
var
dbtext:String;
weiter:Boolean;
tmptime:TDateTime;
begin
 DBtext := 'select * from TABELLE where ID_OBJECT=' + '''' + inttostr(id) + '''';
 with dbconnection do
    begin
      myquery.Close;
      myquery.sql.Clear;
      myquery.sql.add(dbtext);
      myquery.Open;
     
    end;
  weiter:=true;
    while (weiter) and (not myquery.Eof)do
    begin
      tmptime:= myquery.FieldByName('TIME').AsDateTime;
      if t<=tmptime then
      begin
          weiter:=false;
      end
      else
          weiter:=true;
      myquery.Next;
    end;
   
    myaquery.Prior;
   
    tmptime :=myquery.FieldByName('TIME').AsDateTime;
    result:=vartostr(tmptime)

end;
Ich möchte wissen warum Prior hier nichts tut..!
myquery.next wird einmal mehr als das was ich will ausgeführt(in der while-schleife) also möchte ich danach einen Eintrag zurückspringen es geht aber nicht und intressanterweise wenn ich anstatt prior , First schreibe dann wird genau das gemacht was ich will. kann mir jemand das erklären?! :roll:

katjah 31. Aug 2006 10:15

Re: Prior
 
Zitat:

myaquery.Prior;
?

Meinst Du nicht myquery.Prior; ?

oder ist das nur ein Tippfehler hier im Forum ?

rider 31. Aug 2006 10:23

Re: Prior
 
Die Schleife würde ich so schreiben;

Delphi-Quellcode:
while not myquery.Eof do
begin
  if t <= myquery.FieldByName('TIME').AsDateTime then
     break;
  myquery.Next;
end;
Sieht irgendwie kürzer aus. U.U ist das Prior auch gar nicht mehr nötig.

Ansonsten: Prior geht um ein Zeile zurück. First springt hingegen an die erste Zeile.

:wink:

sakura 31. Aug 2006 10:38

Re: Prior
 
Ändere mal den Threadtitel so, dass der etwas aussagekräftiger wird. Unter "Prior" kann sich eigentlich keiner was vorstellen :roll:

...:cat:...

sveta 31. Aug 2006 10:48

Re: Prior
 
@rider danke! toller tipp aber ich möchte es troztdem wissen warum es so ist?!!
@katjah stimmt du hast recht ist ein tippfehler aber ändert nichts...
weiß jemand weiter?!! :gruebel:

MrSpock 31. Aug 2006 11:14

Re: Prior
 
Hallo sveta,

grundsätzlich gilt, wenn Next funktioniert, dann funktioniert auch Prior.

Dein Code hat aber einige Schwächen:
1. Wenn die geliferte Datenmenge leer ist, läuft Prior auf einen Fehler.
2. Wenn kein Datensatz die Bedingung erfüllt, landest du beim vorletzten Datensatz, weil du Prior auch in dem Fall aufrufst, dass das Ende der Datenmenge zu dem Verlassen der Schleife geführt hat.

Mit:

Delphi-Quellcode:
while (weiter) and (not myquery.Eof)do
    begin
      tmptime:= myquery.FieldByName('TIME').AsDateTime;
      if t<=tmptime then
      begin
          weiter:=false;
      end
      else begin
          weiter:=true;
          myquery.Next;
      end;
    end;
geht das Programm nur dann auf den nächsten Datensatz, wenn die Suche noch nicht abgeschlossen ist.

Ist die Query eigentlich mit einem Masterfeld verknüpft? Dann könntest du gar nicht durch die Datenmenge laufen. Wie kommst du denn darauf, dass Prior nicht funktioniert?

sveta 31. Aug 2006 11:30

Re: Prior
 
ja du hast recht..

aber ich meine dass es nicht funktioniert weil ich es so aus probiert hab
Delphi-Quellcode:
      weiter:=true;
      myquery.Next;
    end;

    tmptime1 :=myquery.FieldByName('TIME').AsDateTime;
    myaquery.Prior;
   
    tmptime2 :=myquery.FieldByName('TIME').AsDateTime;
tmptime1 und tmptime2 sind gleich!

Flocke 31. Aug 2006 11:58

Re: Prior
 
Ganz abgesehen davon ob Prior funktioniert oder nicht: du könntest den Wert mit einer einzigen SQL-Abfrage ermitteln, OHNE die Datensätze einzeln durchzugehen.
SQL-Code:
select min(TIME) from TABELLE where ID_OBJECT=:id and TIME>=:time
Außerdem gibst du keine Sortierreihenfolge an - es ist also mehr oder minder Zufall, wenn es so klappt wie du es machst.

MrSpock 31. Aug 2006 12:01

Re: Prior
 
Halle sveta,

es könnte natürlich sein, dass zwei datensätze denselben Zeiteintrag haben, wodurch du den Eindruck gewinnen könntest, Prior hätte nicht funktioniert.

Verbinde doch deine Query über eine DataSource einmal mit einem DataGrid und schau dir die Datenmenge einmal an.

sveta 31. Aug 2006 12:16

Re: Prior
 
@MrSpock nein es ist nicht so
@Flocke danke das sieht ganz gut aus .. query ist richtig aber wenn ich es in Delphi Code rein schreibe wird ein exception ausgeworfen und es wird nach weiteren spalten gefragt. das problem hatte ich schon und deswegen schreibe ich immer
Delphi-Quellcode:
select * from
nach eine bestimmte spalte zu fragen geht nicht !

[PUSH BEITRAG]
*nach Oben*
[/PUSH BEITRAG]

[edit=Christian Seehase]Pushen von Threads ist nach frühestens 24 Stunden erlaubt :!: Nach 11 Minuten pushen... dazu fällt mir nichts mehr ein. Push-Beitrag gelöscht. Mfg, Christian Seehase[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:03 Uhr.
Seite 1 von 2  1 2      

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