AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schleife nimmt ersten und letzten Datensatz nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Schleife nimmt ersten und letzten Datensatz nicht

Ein Thema von kluckweb · begonnen am 5. Jan 2008 · letzter Beitrag vom 6. Jan 2008
Antwort Antwort
Seite 1 von 3  1 23      
kluckweb

Registriert seit: 8. Okt 2005
149 Beiträge
 
#1

Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:01
Datenbank: MySQL • Version: 5 • Zugriff über: lokal
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;
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#2

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:08
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
Michael Kübler
  Mit Zitat antworten Zitat
kluckweb

Registriert seit: 8. Okt 2005
149 Beiträge
 
#4

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:21
Hallo,

erstmal danke für die schnellen Antworten.

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

Registriert seit: 8. Okt 2005
149 Beiträge
 
#5

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:31
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?

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

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
kluckweb

Registriert seit: 8. Okt 2005
149 Beiträge
 
#7

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:35
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?
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#8

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:40
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?
  Mit Zitat antworten Zitat
kluckweb

Registriert seit: 8. Okt 2005
149 Beiträge
 
#9

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:41
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.
  Mit Zitat antworten Zitat
kluckweb

Registriert seit: 8. Okt 2005
149 Beiträge
 
#10

Re: Schleife nimmt ersten und letzten Datensatz nicht

  Alt 5. Jan 2008, 23:46
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 20:56 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