Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schleife nimmt ersten und letzten Datensatz nicht (https://www.delphipraxis.net/106122-schleife-nimmt-ersten-und-letzten-datensatz-nicht.html)

kluckweb 5. Jan 2008 22:01

Datenbank: MySQL • Version: 5 • Zugriff über: lokal

Schleife nimmt ersten und letzten Datensatz nicht
 
Hallo zusammen,

bräuchte mal kurz Eure Hilfe.

Bei folgender Schleife wird der erste und letzte Datensatz leider nicht kopiert und ich weiß wirklich nicht warum. Könnt Ihr helfen?

Der Code ist:

Delphi-Quellcode:
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.Edit;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Ausgaben.Next
  end;
      Kassenbuch.Post;

grenzgaenger 5. Jan 2008 22:06

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Zitat:

Zitat von kluckweb
Hallo zusammen,

bräuchte mal kurz Eure Hilfe.

Bei folgender Schleife wird der erste und letzte Datensatz leider nicht kopiert und ich weiß wirklich nicht warum. Könnt Ihr helfen?

Der Code ist:

Delphi-Quellcode:
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.Edit;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Ausgaben.Next
  end;
      Kassenbuch.Post;

wundert mich, dass er doch so viel kopiert...

versuchs mal mit:
Delphi-Quellcode:
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Kassenbuch.Post;
      Ausgaben.Next
  end;

scrat1979 5. Jan 2008 22:08

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Zitat:

Zitat von kluckweb
Hallo zusammen,

bräuchte mal kurz Eure Hilfe.

Bei folgender Schleife wird der erste und letzte Datensatz leider nicht kopiert und ich weiß wirklich nicht warum. Könnt Ihr helfen?

Der Code ist:

Delphi-Quellcode:
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.Edit;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Ausgaben.Next
  end;
      Kassenbuch.Post;

Ich meine die letzten beiden Anweisungen sollten genau umgekehrt sein und beide in die Schleife integriert werden (ungetestete Theorie!):

Delphi-Quellcode:
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.Edit;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Kassenbuch.Post;
      Ausgaben.Next    
  end;
//EDIT: Wo war der Rote Kasten?!?!

Zitat:

wundert mich, dass er doch so viel kopiert...
Wenn ein xxx.Append automatisch ein Post durchführt, dann wäre es doch damit IMHO erklärt :gruebel:

kluckweb 5. Jan 2008 22:21

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Hallo,

erstmal danke für die schnellen Antworten.

Aber leider ändert sich nichts. Es wird lediglich der erste Datensatz kopiert. Mehr nicht.

kluckweb 5. Jan 2008 22:27

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
In der Tabelle AUSGABEN sind drei Datensätze drin.

Der gesamte Code lautet:

Delphi-Quellcode:
 Kassenbuch.ExecSQL('delete from kassenbuch');

 // filtern
 Ausgaben.active := false;
 Ausgaben.SQL.Clear;
 Ausgaben.SQL.Add('select * from ausgaben');
 Ausgaben.active := True;

 // Ausgaben ermitteln
 Ausgaben.First;
 while not Ausgaben.Eof do
  begin
      Kassenbuch.Append;
      Kassenbuch.FieldbyName('datum').asVariant := Ausgaben.FieldbyName('datum').asVariant;
      Kassenbuch.FieldbyName('zurgnr').asInteger := Ausgaben.FieldbyName('zurgnr').asInteger;
      Kassenbuch.FieldbyName('betrag').asVariant := Ausgaben.FieldbyName('betrag').asVariant * -1;
      Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
      Kassenbuch.Post;
      Ausgaben.Next;
  end;
 Kassenbuch.Refresh;
 showMessage('Das Kassenbuch wurde erfolgreich erstellt');
Und wenn dieses Ereignis ausgeführt wird, wird lediglich der erste Datensatz aus der DB AUSGABEN kopiert. Die beiden nächsten nicht mehr.

Merkwürdiger Weise biegt der beim 2. oder 3. mal auslösen des Ereignises in eine endlos Schleife ein und kopiert den zweiten Datensatz immer und immer wieder ... macht keinen Sinn in meinen Augen.

Und ich steh langsam wirklich auf dem Schlauch, wo mein Denkfehler ist.

Nochmals danke für Eure Hilfe.

scrat1979 5. Jan 2008 22:31

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Zitat:

Zitat von kluckweb
Hallo,

erstmal danke für die schnellen Antworten.

Aber leider ändert sich nichts. Es wird lediglich der erste Datensatz kopiert. Mehr nicht.

Hmmm, das wundert mich ein wenig. Deine Quelltabelle hat sicher nicht nur einen Datensatz? :twisted:

Laß Dir mal in einer Schleife die Datensätze z.B. mit Showmessage von der Ausgangstabelle anzeigen und schau, ob alle durchlaufen werden:
Delphi-Quellcode:
Ausgaben.First;
while not Ausgaben.Eof do
  begin
      Showmessage(Ausgaben.FieldbyName('vermerk').asString);
      Ausgaben.Next
  end;
Eine andere Idee wäre z.B. eine (bei den Felddefinitionen eingestellte) Beschränkung in MySQL, die nur den 1. Datensatz akzeptiert. Schau mal, ob sich die Daten von den anderen (leere Felder?) unterscheiden. Der Source müsste nämlich laufen :angel:

SCRaT

kluckweb 5. Jan 2008 22:35

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Hi,

habe das ShowMessage Ereignis gerade eingebaut und er durchläuft alle drei Datensätze.

Warum durfläuft er sie denn und kopiert sie bitte nicht?

grenzgaenger 5. Jan 2008 22:40

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
wie wär's denn mit ...

Delphi-Quellcode:
 Kassenbuch.ExecSQL('delete from kassenbuch');

 // filtern
 Ausgaben.active := false;
 Ausgaben.SQL.Clear;
 Ausgaben.SQL.Add('insert into kassenbuch (datum, zurgnr, betrag, vermkerk) select datum, zurgnr, betrag * -1, vermerk from ausgaben');
 Ausgaben.active := True;

 showMessage('Das Kassenbuch wurde erfolgreich erstellt');
PS: kann es sein, dass dein primary key nicht eindeutig ist?

kluckweb 5. Jan 2008 22:41

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Ich habe jetzt folgendes gemacht:

Ich habe Deine SHOWMESSAGE Variant voan gestelt.
Anschließend meine Kopierzeilen angefügt. Es passiert folgendes:

Showmessage 1. Datensatz
1. Datensatz wird kopiert

Showmessage 2. Datensatz
Es wird ein leeter Datensatz in der Tabelle Kassenbuch eingetragen.

Der dritte Datensatz wird gar nicht mehr angezeigt und auch nicht kopiert.

kluckweb 5. Jan 2008 22:46

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Zitat:

Zitat von grenzgaenger
wie wär's denn mit ...

Delphi-Quellcode:
 Kassenbuch.ExecSQL('delete from kassenbuch');

 // filtern
 Ausgaben.active := false;
 Ausgaben.SQL.Clear;
 Ausgaben.SQL.Add('insert into kassenbuch (datum, zurgnr, betrag, vermkerk) select datum, zurgnr, betrag * -1, vermerk from ausgaben');
 Ausgaben.active := True;

 showMessage('Das Kassenbuch wurde erfolgreich erstellt');
PS: kann es sein, dass dein primary key nicht eindeutig ist?

Mein Primary Key steht auf AutoInc und NOT NULL. Gab damit noch nie Probleme.

Wenn ich diese sehr elegante Variante auslösen will, kriege ich die Fehlermeldung, dass das Feld ID nicht gefunden wurde.

kluckweb 5. Jan 2008 22:50

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Nachtrag:

Es werden jedoch damit alle Datensätze kopiert. Das muss ich Dir ja lassen. Ist eine sehr elegante Variante.

Danke

scrat1979 5. Jan 2008 22:50

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Post doch einfach mal die gesamte Felderdefinitionen (mit Primary-Keys etc.) Deiner beiden Tabellen. Eventuell können wir daraus was erkennen...

kluckweb 5. Jan 2008 22:53

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Wie kann ich denn die Felderdefinitionen posten?? Sorry!!


Es scheint wohl so zu sein, dass er nach dem Ausführen das erste Feld aus der Tabelle Ausgaben nicht mehr findet.

scrat1979 5. Jan 2008 22:59

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
SQL-Code:
show columns from tabellenname;
...und die Zeilen abschreiben (oder Screenshot machen und anhängen)

grenzgaenger 5. Jan 2008 23:05

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
sag mal, hast du den tippfehler im statement berichtigt?

grenzgaenger 5. Jan 2008 23:06

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Delphi-Quellcode:
 Kassenbuch.ExecSQL('delete from kassenbuch');

 // filtern
 Ausgaben.active := false;
 Ausgaben.SQL.Clear;
 Ausgaben.SQL.Add('insert into kassenbuch (datum, zurgnr, betrag, betreff) select datum, zurgnr, betrag * -1, vermerk from ausgaben');
 Ausgaben.active := True;

 showMessage('Das Kassenbuch wurde erfolgreich erstellt');
hab gesehen, die feldnamen stimmen nicht überein.

kluckweb 5. Jan 2008 23:11

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Tippfehler habe ich berichtigt.

ANbei der Screenshot.

scrat1979 5. Jan 2008 23:13

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Bevor ich jetzt allen gute N8 wünsche, hier ist mir noch was aufgefallen. Es wird schon stimmen (der 1. Datensatz wird ja kopiert), aber evtl. ist es ja das Problem:

Delphi-Quellcode:
Kassenbuch.FieldbyName('betreff').asString := Ausgaben.FieldbyName('vermerk').asString;
... Du schreibst einmal "betreff" und einmal "vermerk".

Liebe Grüße und gute N8 - bis morgen.

scrat1979 5. Jan 2008 23:17

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Zitat:

Zitat von kluckweb
Tippfehler habe ich berichtigt.

ANbei der Screenshot.

Naja, auf den ersten Blick kann ich tatsächlich keine Unstimmigkeiten feststellen. Ich schau mir den Thread morgen wieder an :-)

SCRaT

kluckweb 5. Jan 2008 23:21

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Naja .... ich kann mir nicht wirklich vorstellen, dass die Feldnamen da irgendwas mit zu tun haben. Dürfte der DB doch eigentlich egal sein, von welchem Feld in welches kopiert wird.

N8 und Danke.

Bis morgen.

kluckweb 5. Jan 2008 23:31

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Ein letzter Nachtrag noch.

Die Fehlermeldung, dass das Feld ID in Ausgaben nicht gefunden wurde taucht genau dann auf, wenn der Befehl "active := True" ausgeführt wird.

Nochmals danke und ich hoffe, dass mir oder Euch morgen was einfällt den Fehler zu beheben.

Viele Grüße

scrat1979 6. Jan 2008 10:18

Re: Schleife nimmt ersten und letzten Datensatz nicht
 
Hmmm, basiert Deine Zieltabelle eigentlich auch auf einem Query oder zeigt das DataSource hier auf eine Tabelle. Nimm doch statt dem Query (select * from tabllenname) mal eine Tabellenkomponente und verknüpfe das (Quell)Datasource damit. Warum der umweg über das Query wenn sowieso alle Datensätze angezeigt werden? Versuch es also mal OHNE Query sondern NUR über Tabellen und gib bescheid :-)

SCRaT


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 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