Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird und query.recordcount (https://www.delphipraxis.net/104905-firebird-und-query-recordcount.html)

mato 12. Dez 2007 16:53

Datenbank: Firebird embedded • Version: 1.5 • Zugriff über: query

Firebird und query.recordcount
 
Hallo Leute

War ein langer Tag, ich kapiere es einfach nicht.

Delphi-Quellcode:
procedure seite_schreiben(ueberarray: array of integer);
var i :integer;
begin
for i := 0 to length(ueberarray) -1 do
 begin
  form1.queryinsert.Active := false;
  form1.trans.Active := false;
  form1.base.Connected := false;
  form1.base.Connected := true;
  form1.trans.Active := true;
  form1.queryinsert.SQL.Clear;
  form1.queryinsert.SQL.Add('select * from LESER where nummer =' +quotedstr(inttostr(ueberarray[i]))+'');
  form1.queryinsert.active := true;
  zeile := zeilereal;
  excel.cells[zeile,spalte].value := inttostr(ueberarray[i]) + '/' + inttostr(form1.queryinsert.RecordCount);
  inc(zeile);
  while not form1.queryinsert.Eof = true do
   begin
    showmessage(inttostr(form1.queryinsert.RecordCount));
    anzahlzeitungen := anzahlzeitungen +1;
    excel.cells[zeile,spalte].value := form1.queryinsert.Fields.Fields[0].AsString + '/' + form1.queryinsert.Fields.Fields[2].AsString;
    inc(zeile);
    form1.queryinsert.Next;
    if form1.queryinsert.Eof = true then spalte := spalte + 1;
   end;//end while
  form1.queryinsert.Active := false;
  form1.trans.Active := false;
  form1.base.Connected := false;
 end;//end for
end;
Die Zeile meine ich.

Delphi-Quellcode:
excel.cells[zeile,spalte].value := inttostr(ueberarray[i]) + '/' + inttostr(form1.queryinsert.RecordCount);
Er zeigt mir immer 1 an, obwohl es mehr sein sollten. Ansonsten funtzt alles wunderbar.
Die Showmessage() in der --While_Schleife-- habe ich nur eingefügt um zu kontrollieren wann er auf die volle Anzahl kommt. Sollte --Recordcount-- nicht die gesamte
Anzahl der Datensätze aus der Query zurückgeben, und zwar sofort und nicht erst wenn ich die gesamten Datensätze durchlaufen habe.
Danke im Voraus

mato

mkinzler 12. Dez 2007 17:03

Re: Firebird und query.recordcount
 
.RecordCount scheint nur die gefetchten Datensätze zu berücksichtigen

mato 12. Dez 2007 17:06

Re: Firebird und query.recordcount
 
Danke erstmal. Gibts eine Möglichkeit an dieser Stelle des Codes an die Anzahl ranzukommen?

mkinzler 12. Dez 2007 17:08

Re: Firebird und query.recordcount
 
Extra abfragen, BDE stilllegen!

mato 12. Dez 2007 17:12

Re: Firebird und query.recordcount
 
Na gut, muß mal sehen. Danke nochmal.

Mato

haentschman 12. Dez 2007 17:14

Re: Firebird und query.recordcount
 
Hallo erstmal... :-D

wenn ich das richtig sehe möchtest du z.B. 1/10 angezeigt bekommen.

...da du bei jedem Schleifendurchlauf die Query neu absetzt hast du jeweils nur 1 Datensatz (RecordCount) als Ergebnis (Übereinstimmung mit Nummer)

...die maximale Anzahl der Datensätze gibt dir doch length(ueberarray) -1 an, oder ? :gruebel:

mato 12. Dez 2007 17:21

Re: Firebird und query.recordcount
 
Zitat:

Zitat von haentschman
Hallo erstmal... :-D

wenn ich das richtig sehe möchtest du z.B. 1/10 angezeigt bekommen.

...da du bei jedem Schleifendurchlauf die Query neu absetzt hast du jeweils nur 1 Datensatz als Ergebnis (Übereinstimmung mit Nummer)

...die maximale Anzahl der Datensätze gibt dir doch length(ueberarray) -1 an, oder ? :gruebel:


Ne, nicht ganz. Kurze Erklärung. In --üeberarray-- stehen Hausnummern. Unter jeder Hausnummer stehen dann verschiedene Namen, welche ich dann für jede Nummer haben möchte. In der ersten Abfrage stehen dann also 6 Datensätze, die ich dann vor der Ausgabe der einzelnen Namen haben möchte, nicht erst danach. Muß mal sehen wie ich das mache und in der Exceltabelle nicht mit den Zeilennummern nicht durcheinander komme.

Mato

haentschman 12. Dez 2007 17:35

Re: Firebird und query.recordcount
 
...ich glaube nicht so ganz, daß in der ersten Abfrage 6 Datensätze stehen, dann wäre RecordCount = 6 :???:

...visualisiere mal die Query in einem Grid und kontrolliere das Ergebnis der Abfrage...
...ich denke, das die SQL Abfrage wirklich nur einen Datensatz liefert.

wie sehe denn der Wert von inttostr(ueberarray[i]) ausgeschrieben aus ?

mato 12. Dez 2007 17:44

Re: Firebird und query.recordcount
 
Also. Die Anzahl der Datensätze ist 6. Ausgeschrieben ist es eine '81', eben die Hausnummer. Die Exceltabelle in die ich alles reinschreibe zeigt mir alle Namen korrekt an, alle schön untereinander. Über diesen Namen hätte ich aber gerne die Anzahl der Namen stehen, da steht aber nur jedesmal eine 1, nicht 6.
Mit dem --showmessage-- in der while-schleife lasse ich mir bei jedem Durchlauf (while) die recordcount anzeigen. Zählt wunderbar hoch, bis sechs. Die 6 erreicht er aber erst wenn ich alle durchlaufen habe, also bei --EOF--. Ich verstehe es ja auch nicht, ist aber so.

mato

haentschman 12. Dez 2007 17:58

Re: Firebird und query.recordcount
 
du durchläufst die Schleife 6 mal... bei jedem Durchlauf ist RecordCount 1 höher...
--> obwohl du jedesmal die Query neu absetzt :wiejetzt:

...warum holst du nicht alle Werte mit einer Query und durchläufst die Ergebnismenge mit der Schleife zum Eintragen in die Tabelle ?

wie sehen die Werte von inttostr(ueberarray[i]) bei jedem Schleifendurchlauf aus ?
wie ist der Aufbau von LESER ?

[edit]
..fast übersehen...
form1.queryinsert.Active := false; -- kann weg.
ersetzen von form1.queryinsert.active := true; durch form1.queryinsert.open;

Zitat:

Also. Die Anzahl der Datensätze ist 6.
...ist die Anzahl der Datensätze in der DB... heißt aber noch lange nicht, daß diese auch in der Query ankommen... :roll:

[/edit]

mato 12. Dez 2007 18:34

Re: Firebird und query.recordcount
 
Also nochmal. -- schreibe jetzt mal nur klein, geht schneller.

in --ueberarray--, was ein array of integer ist, stehen 5 hausnummern. die for-schleife wird also 5-mal durchlaufen. in jeder diesen 5 durchläufen erfrage ich durch die query die datensätze der einzelnen hausnummern. in der while-schleife werden die datensätze durchlaufen, hat also nichts mit den 5 querys zu tun, nur mit der aktuellen abfrage. die abgefragten datensätze stehen ja alle in meiner exceltabelle drin, also waren sie zuvor auch in der query, wo sollten sie auch sonst herkommen. in jedem durchlauf in der while-schleife werden also ein name in die exceltabelle geschrieben, was alles korrekt funktioniert. es hat also was damit zu tun, das scheinbar nur die gefetchten datensätze in --recordcount-- angezeigt werden (wurde weiter oben schon erwähnt). ich werde die ganze sache jetzt also mit einer --sinnlosschleife-- durchlaufen, sprich nichts machen lassen damit ich die anzahl der datensätze bekomme und dann in der zweiten - schon vorhandenen while-schleife-- die datensätze in meine exceltabelle schreiben. etwas umständlich, müsste aber gehen.
ich verstehe erhlich gesagt nicht was das mit dem aufbau meiner db zu tun haben soll, was da drin steht ist auch völlig irrrelevant. ich hoffe ich konnte mich jetzt verständlich ausdrücken.

mato

Kroko1999 12. Dez 2007 18:45

Re: Firebird und query.recordcount
 
rufe mal query.last, danach query.First gleich nach dem Öffnen auf, dann sollte RecordCount stimmen

mato 12. Dez 2007 19:06

Re: Firebird und query.recordcount
 
Zitat:

Zitat von Kroko1999
rufe mal query.last, danach query.First gleich nach dem Öffnen auf, dann sollte RecordCount stimmen

cool. meine schleife funktioniert auch, deins ist kürzer, also besser. ich danke dir. werde mir jetzt den schädel rasieren, vielleicht hilfts ja beim nachdenken. :gruebel: :-D

mato

Kroko1999 12. Dez 2007 19:12

Re: Firebird und query.recordcount
 
man tut, was man kann, :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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 by Thomas Breitkreuz