Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DateTime in DB Speichern, wird nur jeder 2 gespeichert WISO? (https://www.delphipraxis.net/6155-datetime-db-speichern-wird-nur-jeder-2-gespeichert-wiso.html)

Albi 1. Jul 2003 14:14


DateTime in DB Speichern, wird nur jeder 2 gespeichert WISO?
 
Hallo alle zusammen, ich habe folgendes Problem:

Ich speichere mehrer Werte in einer *.txt und erstelle daraus einen Serienbrief, nun möchte ich, das wenn er den Serienbrief erstellt, mir Datum/Uhrzeit in der DB hinterlegt. Das klappt auch. Aber nehmen wir mal an, es sind 5 DS da, dann schreibt er jeweils den 1ten, 3ten u. 5ten Datum/Zeit in die DB und in die *.Txt aber in den 2ten u. 4ten jedoch in keines der beiden. Nehme ich das SetPrintTime raus, schreibt er mir wieder alle in die *.txt.

Kann es sein, das das Query dazu zu langsam ist und daher immer einer übersprungen wird?

Ich verwende folgenden Code

Code:
 Form1.Query1.First;
      For i:= 0 To Form1.Query1.FieldCount-1 DO
      Write(f, Form3.DBGrid1.Fields[i].FieldName+';');
      Writeln(f,'');
        while not Form1.Query1.EOF do
         begin
            for i:=0 to Form1.Query1.FieldCount-1 do
             begin
              Write(F, Form1.Query1.Fields[i].asstring+';');
              SetPrintTime;
               if Form1.Query1.FieldCount-1 = Form1.Query1.FieldCount-1 Then
              end;
              Writeln(F, '');
          Form1.Query1.Next;
         end;
    CloseFile(f);
SetPrintTime lautet: Form1.Query1.Edit;
Form1.Query.FieldByName('Gedruckt').AsDateTime:= now;

Hansa 1. Jul 2003 17:54

Hi,

hast Du da Schreibfehler geschickt, oder verwendest Du tatsächlich i als Variable für zwei verschachtelte Schleifen :?:

Albi 1. Jul 2003 19:11

Ne, ich verwende das so. Sollte man dies nicht machen? Ich habe jetzt auch ne Lösung für mein Problem gefunden. Für jeden denes interessiert oder Verbesserungsvorschläge hat. (ist der Code für SetTimePrint)

Code:
Form1.Query1.Prior;
  Form1.Query1.Edit;
  If Form1.Query1.RecNo = Form1.Query1.FieldCount-1 Then
    begin
      Form1.Query1.Last;
      Form1.Query1.FieldByName('Gedruckt').AsDateTime:= Now;
    end
  else
    Form1.Query1.FieldByName('Gedruckt').AsDateTime:= Now;
end;
Jetzt besteht nur noch das Problem, das der erste DS immer 2 x in die Txt geschrieben wird.

Der Fehler trat daher auf, das durch das Query1.Next schon immer einen DS weitergesprungen wurde und somit logischer Weise immer 1 DS ausgelassen wurde.

Hansa 1. Jul 2003 19:54

Delphi-Quellcode:
Form1.Query1.Prior;
  Form1.Query1.Edit;
  If Form1.Query1.RecNo = Form1.Query1.FieldCount-1 Then
    begin
      Form1.Query1.Last;
      Form1.Query1.FieldByName('Gedruckt').AsDateTime:= Now;
    end
  else
    Form1.Query1.FieldByName('Gedruckt').AsDateTime:= Now;
end;
Ich sehe da kein i mehr. Du mußt Dir das mit dem Datenbank-Cursor mal durchlesen. Du springst doch mit Prior und Last und Edit kreuz und quer durch die Daten.

Albi 2. Jul 2003 05:19

Das geht doch im Moment nicht anders, ich weiß zumindest keine andere Lösung.

Aber das muß ich daher machen, das er mir die Daten in der DB richtig speichert. Wenn ich das nicht so mache, dann wird nur in jeder 2ten Zeile das Datum/Uhrzeit in die DB eingetragen. Also muß ich immer wieder einen DS zurück Datum/Uhrzeit schreiben und anschließend wieder 1 DS vor um auf dem richtigen DS zu landen, so das dann der richtige DS wieder in *.Txt geschrieben wird.

Ich hoffe, das ist verständlich gewesen.

Hier mal der komplette Code mit der in die Daten in die Txt schreibe:

Code:
var i, j: Integer;
begin
    assignFile (f,'SerienTxt.txt');
    rewrite (f);
      Form1.Query1.First;
      For j:= 0 To Form1.Query1.FieldCount-1 DO
      Write(f, Form3.DBGrid1.Fields[j].FieldName+';'); //Feldnamen in Txt schrieben
      Writeln(f,'');
        while not Form1.Query1.EOF do
          begin
            for i:=0 to Form1.Query1.FieldCount-1 do
              Write(F, Form1.Query1.Fields[i].asstring+';'); // Felder in txt schreiben
              if Form1.Query1.FieldCount-1 = Form1.Query1.FieldCount-1 // wenn Zeile zu Ende, dann Zeilenumbruch Then
              Writeln(F, '');
              Form1.Query1.Next;
              SetPrintTime; //Procedure siehe vorheriger Beitrag
          end;
    CloseFile(f);
end;
Nun gib es halt nur noch das Problem, das er 1te DS doppelt verarbeitet wird, da ich beim ersten 1ten DS einen zurück gehe und wieder vor, somit lande ich wieder auf gleichen.

Albi 2. Jul 2003 06:34

Hab die Lösung gefunden.

für alle die es interessiert.

Code:
Procedure TForm3.ExportInTxt(Sender: TObject);
var i, j: Integer;
begin
    assignFile (f,'SerienTxt.txt');
    rewrite (f);
      Form1.Query1.First;
      For j:= 0 To Form1.Query1.FieldCount-1 DO
      Write(f, Form3.DBGrid1.Fields[j].FieldName+';');
      Writeln(f,'');
        while not Form1.Query1.EOF do
          begin
            for i:=0 to Form1.Query1.FieldCount-1 do
              Write(F, Form1.Query1.Fields[i].asstring+';');
              if Form1.Query1.FieldCount-1 = Form1.Query1.FieldCount-1 Then
              Writeln(F, '');
              Form1.Query1.Next;
              LastID:= Form1.Query1.FieldByName('ID').AsInteger; //Merken der letzten ID (Primärindex)
              SetPrintTime;
           end;
    CloseFile(f);
end;

Procedure TForm3.SetPrintTime;
var i: Integer;
begin
    Form1.Query1.Locate('ID', LastID, []); //Letzte ID suchen
    Form1.Query1.Edit;
    Form1.Query1.FieldByName('Gedruckt').AsDateTime:= Now;
end;

Hansa 2. Jul 2003 09:20

na siehste,

Delphi-Quellcode:
for i:= ... do begin
  for i:= ...
end;
war wohl dich nicht das Gelbe vom Ei. :mrgreen: Ein j kann Wunder bewirken. :lol:

Albi 2. Jul 2003 09:54

Muß dich leider enttäuchen, die Lösung war das nicht und verschatelt war das ja auch nicht, da ja erst die obere FOR - Schleife abgearbeitet wurde und danach ja erst die zweite For Schleife, somit sind sie sich ja nicht zusammen ausgefüht worden ist aber gut zu wissen das man darauf achten muß.

Die Lösung brachte das auslesen der LastID somit hat er jeden DS betrachtet.

Hansa 2. Jul 2003 10:17

Re: DateTime in DB Speichern, wird nur jeder 2 gespeichert W
 
Zitat:

Zitat von Albi
Delphi-Quellcode:
 Form1.Query1.First;
      For i:= 0 To Form1.Query1.FieldCount-1 DO
...
            for i:=0 to Form1.Query1.FieldCount-1 do
...
         end;

Sag mir mal, wie Du das compiliert hast. Der Compiler bemerkt sogar, daß das ein kapitaler Fehler ist und verweigert die Arbeit. Wußte gar nicht, daß er das sogar merkt, weil ich sowas eben nicht mache. 8) Eine Loop-Variable innerhalb einer Schleife zu VERÄNDERN, was Du mit dem 2. FOR eben machst, das geht irgendwann schief. Delphi unterbindet anscheinend vorsichtshalber, daß solche Programme auf die Menschheit losgelassen werden. :lol:

Albi 2. Jul 2003 10:55

Nen Fehler hat er mir nicht gegeben, zumindest keinen der das Prog vom laufen abhielt, lief ja auch aber das jetzt ja auch egal. Ich habe mir dabei nichts gedacht (obwohl es ja logisch ist).

Wenn ich mich recht insinne, schrieb er mir nur, daß es passieren kann das die Variable i keinen Wert erhält oder so ähnlich.

Aber es ist auch egal, nur aus solchen Fehlern kann man lernen es beim nächsten Mal besser zu machen.


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