Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi BOF und EOF nach Locate (https://www.delphipraxis.net/151772-bof-und-eof-nach-locate.html)

QuickAndDirty 1. Jun 2010 09:47

Datenbank: MSSQL,DBISAM4, ElevateDB, Paradox, Oracle • Version: 0 • Zugriff über: Verschieden

BOF und EOF nach Locate
 
Hallo,
ich habe einen eigenen TDataset Nachfahren betrachtet ihn als TQuery ähnlich.
Es könnte sein das ich da eine Randbedingung nicht beachtet habe....

Folgendes Szenario
1. öffnen der Datenmenge (ein SQL)
2. das Resultset hat danach genau einen Datensatz
3. ausführen eines Locate('ID',genau der eine Datensatz,[]).

Wie sollte EOF und BOF nach 3. aussehen? (darum geht es eigentlich)
Wie sollte EOF und BOF nach 2. aussehen ? (nur zur Sicherheit)

hoika 1. Jun 2010 10:02

Re: BOF und EOF nach Locate
 
Hallo,

nimm eine TQuery diener Wahl und probiere es einfach mal aus.

Bei 2. und 3. sollten BoF und EoF aber True sein,
weil ein Open den Satzzeiger auf den 1. Datensatz setzt.


Heiko

QuickAndDirty 1. Jun 2010 10:14

Re: BOF und EOF nach Locate
 
bist du sicher das das für 2. gilt ?
Weil dann funktionieren ja etliche While not eof do schleifen nicht bei nur einem Datensatz.

QuickAndDirty 1. Jun 2010 10:48

Re: BOF und EOF nach Locate
 
Delphi-Quellcode:
Procedure TForm1.Buuton1Click(Sender:Tobject);
begin
  If not assigned(q) then
    q := tQuery.create(self);
  q.Databasename := 'MeineDb';
  q.SQL.Text := 'Select * from MeineTabelle Order By ID';
  q.open;
  Showmessage('offen! BOF:'+Booltostr(q.Bof,true)+' EOF:'+Booltostr(q.Eof, true));
  // Mein Ergebnis= offen! BOF:True EOF:False
  If Locate('ID',1,[]) then
    Showmessage('gefunden! BOF:'+Booltostr(q.Bof,true)+' EOF:'+Booltostr(q.Eof, true));
  // Mein Ergebnis= gefunden! BOF:False EOF:False
  q.close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var Bm:Pointer;
begin
  if not assigned(q) then
    q := Tquery.create(self);
  q.DatabaseName := 'MeineDb';
  q.SQL.text :='SELECT * FROM MeineTabelle ORDER BY ID';
  q.Open;
  BM := q.GetBookmark;
  q.Close;
  q.Open;
  q.GotoBookmark(bm);
  Showmessage('bm! BOF:' + Booltostr(q.Bof,True) + ' EOF:' + Booltostr(q.Eof,True));
  //Mein Ergebnis= bm! BOF:False EOF:False
  q.Close;
end;
Hm, komisch! Hat jemand was anderes?

Blup 1. Jun 2010 12:11

Re: BOF und EOF nach Locate
 
Code:
Wird eine Query geöffnet, steht der Datensatzzeiger normalerweise auf dem ersten Datensatz:
   BOF = False
-> Satz1
   Satz2
   Satz3
   EOF = False

Ein erfolgreiches Locate verschiebt nur den Datensatzzeiger auf ein anders Element:
   BOF = False
   Satz1
-> Satz2
   Satz3
   EOF = False

Wird der Datensatzzeiger durch Next über den letzten Datensatz hinaus bewegt:
   BOF = False
   Satz1
   Satz2
   Satz3
-> EOF = True

Wird der Datensatzzeiger durch Prior vor den ersten Datensatz bewegt:
-> BOF = True
   Satz1
   Satz2
   Satz3
   EOF = False

Enthält die Datenmenge überhaupt keine Daten:
-> BOF = EOF = True

QuickAndDirty 1. Jun 2010 12:55

Re: BOF und EOF nach Locate
 
wieso stimmt dein erstes beispiel dann nicht mit dem hier
Delphi-Quellcode:
  If not assigned(q) then
    q := tQuery.create(self);
  q.Databasename := 'MeineDb';
  q.SQL.Text := 'Select * from MeineTabelle Order By ID';
  q.open;
  Showmessage('offen! BOF:'+Booltostr(q.Bof,true)+' EOF:'+Booltostr(q.Eof, true));
  // Mein Ergebnis= offen! BOF:True EOF:False
überein?

Nebenbei
Die Datenmenge hat nur einen Datensatz es ist eine normale Paradox Datenbank!
Ich habe das selbe mit ElevateDB gemacht die reagiert genauso!

Nach OPEN ist
BOF = TRUE
EOF = FALSE

Mit welcher Datenbank hast du das gemacht? Das wäre relativ wichtig für mich!

Blup 2. Jun 2010 09:43

Re: BOF und EOF nach Locate
 
Zitat:

Zitat von QuickAndDirty
Mit welcher Datenbank hast du das gemacht? Das wäre relativ wichtig für mich!

IBObjects mit Interbase/Firebird

Im Prinzip können die Datensätze so vorwärts oder rückwärts geparst werden.
Delphi-Quellcode:
First;
while not Eof do
begin

  Next;
end;
Close;

Last;
while not Bof do
begin

  Prior;
end;
Close;

joachimd 2. Jun 2010 09:51

Re: BOF und EOF nach Locate
 
Zitat:

Zitat von Blup
Code:
Wird eine Query geöffnet, steht der Datensatzzeiger normalerweise auf dem ersten Datensatz:
   BOF = False
-> Satz1
   Satz2
   Satz3
   EOF = False

Ein erfolgreiches Locate verschiebt nur den Datensatzzeiger auf ein anders Element:
   BOF = False
   Satz1
-> Satz2
   Satz3
   EOF = False

Wird der Datensatzzeiger durch Next über den letzten Datensatz hinaus bewegt:
   BOF = False
   Satz1
   Satz2
   Satz3
-> EOF = True

Wird der Datensatzzeiger durch Prior vor den ersten Datensatz bewegt:
-> BOF = True
   Satz1
   Satz2
   Satz3
   EOF = False

Enthält die Datenmenge überhaupt keine Daten:
-> BOF = EOF = True

In der Regel werden aber keine NULL-Datensätze angezeigt, d.h. nach einem prior auf dem ersten Datensatz steht der Zeiger immer noch auf dem ersten, BOF wird aber gesetzt. Bei einem next auf dem letzten Datensatz steht der Zeiger wieder auf dem letzten, EOF ist aber gesetzt. Somit ist sichergestellt, dass immer ein gültiger Datensatz (außer BOF=EOF=TRUE -> keiner vorhanden) vorhanden ist. Ein next bzw prior springt dann jeweils auf den zweiten/zweitletzten und löscht die EOF/BOF Flags.

QuickAndDirty 2. Jun 2010 11:33

Re: BOF und EOF nach Locate
 
Also bei mir liefern alle datenbanken
Paradox, DBISAM, Elevatedb
nach dem OPEN
BOF = True
EOF = False

machen die das falsch?
Habt ihr das mit einer Datenmenge die nur einen Datensatz enthält getestet?

joachimd 2. Jun 2010 13:14

Re: BOF und EOF nach Locate
 
Advantage 10 auf Delphi 2010 mit ADT-Tabellen:

1) leere Tabelle öffnen, EOF=BOF=TRUE

2) Tabelle mit einem Datensatz öffnen: BOF=TRUE
3) next: eof=TRUE

4) Tabelle mit mehreren Datensätzen öffnen: BOF=TRUE
5) next bis zum letzten: kein Flag gesetzt
6) next: Zeiger auf dem letzten, EOF=TRUE
7) first: Zeiger auf dem ersten, BOF=true
8) next: Zeiger auf dem zweiten, kein Flag
9) prior: Zeiger auf dem ersten, kein Flag
10) prior: Zeiger auf dem ersten, BOF=true

HTH
Joachim


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz