![]() |
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:
SetPrintTime lautet: Form1.Query1.Edit;
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); Form1.Query.FieldByName('Gedruckt').AsDateTime:= now; |
Hi,
hast Du da Schreibfehler geschickt, oder verwendest Du tatsächlich i als Variable für zwei verschachtelte Schleifen :?: |
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:
Jetzt besteht nur noch das Problem, das der erste DS immer 2 x in die Txt geschrieben wird.
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; 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. |
Delphi-Quellcode:
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.
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; |
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:
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.
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; |
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; |
na siehste,
Delphi-Quellcode:
war wohl dich nicht das Gelbe vom Ei. :mrgreen: Ein j kann Wunder bewirken. :lol:
for i:= ... do begin
for i:= ... end; |
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. |
Re: DateTime in DB Speichern, wird nur jeder 2 gespeichert W
Zitat:
|
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 17:19 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-2025 by Thomas Breitkreuz