AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi BOF und EOF nach Locate
Thema durchsuchen
Ansicht
Themen-Optionen

BOF und EOF nach Locate

Ein Thema von QuickAndDirty · begonnen am 1. Jun 2010 · letzter Beitrag vom 2. Jun 2010
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

BOF und EOF nach Locate

  Alt 1. Jun 2010, 10:47
Datenbank: MSSQL,DBISAM4, ElevateDB, Paradox, Oracle • Version: 0 • Zugriff über: Verschieden
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)
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: BOF und EOF nach Locate

  Alt 1. Jun 2010, 11:02
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
Heiko
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#3

Re: BOF und EOF nach Locate

  Alt 1. Jun 2010, 11:14
bist du sicher das das für 2. gilt ?
Weil dann funktionieren ja etliche While not eof do schleifen nicht bei nur einem Datensatz.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#4

Re: BOF und EOF nach Locate

  Alt 1. Jun 2010, 11:48
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#5

Re: BOF und EOF nach Locate

  Alt 1. Jun 2010, 13:11
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
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#6

Re: BOF und EOF nach Locate

  Alt 1. Jun 2010, 13:55
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!
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#7

Re: BOF und EOF nach Locate

  Alt 2. Jun 2010, 10:43
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;
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#8

Re: BOF und EOF nach Locate

  Alt 2. Jun 2010, 10:51
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#9

Re: BOF und EOF nach Locate

  Alt 2. Jun 2010, 12:33
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?
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#10

Re: BOF und EOF nach Locate

  Alt 2. Jun 2010, 14:14
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
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  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 08:30 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