Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:31 Uhr.
Seite 1 von 3  1 23      

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