Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit DB und Schleife (https://www.delphipraxis.net/138278-probleme-mit-db-und-schleife.html)

aaaaaaaaaa_10 6. Aug 2009 14:19


Probleme mit DB und Schleife
 
Delphi-Quellcode:
if SameTime(StrToTime(WL.Strings[1])-StrToTime(MyTime),StrToTime('00:10:00')) = true then
                  begin                                                        
                    t.Open;
                    t.Append;
                    for i := 0 to WL.Count - 1 do
                    begin
                      t.Fields[i].Value := WL.Strings[i];    //Einträge in DB einfügen
                    end;
                    t.Post;
                    t.Close;
                    time := WL.Strings[1];
                  end;
Hab ein Problem (merkwürdiges):
Ich will alle 10 Minuten etwas in eine Datenbank schreiben (über t : TTable).
Das schreiben an sich funktioniert,aber das mit dem Intervall nicht so richtig. er schreibt 2mal was in die datenbank (z.B. um 12:23:34 und dann um 12:33:34), aber dann nicht mehr. Lasse ich ihn alle 5 Minuten schreiben, macht er es durchgängig. Komisch oder?

mkinzler 6. Aug 2009 14:25

Re: Probleme mit DB und Schleife
 
Warum wandelst du Zeitwerte nach String um sie zwischenzuspeichern?

aaaaaaaaaa_10 6. Aug 2009 14:27

Re: Probleme mit DB und Schleife
 
Wo mache ich TimeToStr?

mkinzler 6. Aug 2009 14:28

Re: Probleme mit DB und Schleife
 
Irgendwo schreibst du das ja in die StringListe

aaaaaaaaaa_10 6. Aug 2009 14:32

Re: Probleme mit DB und Schleife
 
Was schreibe ich irgendwo in welche StringListe? Kannst du bitte in ganzen Sätzen antworten, sonst weiß ich nicht was du meinst :gruebel:

mkinzler 6. Aug 2009 14:33

Re: Probleme mit DB und Schleife
 
WL.Strings[] ist ja wohl eine StringListe

aaaaaaaaaa_10 6. Aug 2009 14:35

Re: Probleme mit DB und Schleife
 
Ja, ist es.

Delphi-Quellcode:
WL.Delimiter := #9;
          WL.DelimitedText := Werte;
Werte ist ein String, in dem die Daten stehen.

mkinzler 6. Aug 2009 14:37

Re: Probleme mit DB und Schleife
 
Ich würde nicht auf Gleichheit sondern auf > prüfen.

divBy0 6. Aug 2009 14:42

Re: Probleme mit DB und Schleife
 
Sollte dafür nicht ein TTimer besser geeignet sein?

aaaaaaaaaa_10 6. Aug 2009 14:45

Re: Probleme mit DB und Schleife
 
Zitat:

Ich würde nicht auf Gleichheit sondern auf > prüfen.
Warum das?

mkinzler 6. Aug 2009 14:47

Re: Probleme mit DB und Schleife
 
Wenn die Abarbeitung länger dauert, könnte es passieren (und passiert scheinbar auch), dass es 11 Minuten sind. Dann greift der Vergleich auf Gleichheit nicht mehr. Auf Größer aber schon. Dann kannst du dir auch das SameTime() sparen

aaaaaaaaaa_10 6. Aug 2009 14:54

Re: Probleme mit DB und Schleife
 
Delphi-Quellcode:
if (StrToTime(WL.Strings[1])-StrToTime(Time)) > StrToTime('00:01:00') then
Also so, ja?

Da schreibt er jetzt gar nix mehr rein.

mkinzler 6. Aug 2009 14:57

Re: Probleme mit DB und Schleife
 
Delphi-Quellcode:
if (StrToTime(WL.Strings[1])-StrToTime(Time)) >= 600 then
sollte reichen

hazard999 6. Aug 2009 15:13

Re: Probleme mit DB und Schleife
 
nein.

600 wären 600 Tage.

10 / 24 / 60 wären dann 10 Minuten.

aaaaaaaaaa_10 7. Aug 2009 07:23

Re: Probleme mit DB und Schleife
 
An sich schreibt er jetzt wenigstens etwa alle z.B. 2 Minuten einen Wert in die Datenbank,aber die sind ja nun nicht genau 2 Minuten auseinander. Bsp :
07:21:35
07:23:40
07:25:40
07:27:45
usw.

Ist natürlich nicht so gut. Und nun?

alzaimar 7. Aug 2009 07:38

Re: Probleme mit DB und Schleife
 
Rechne die Zeit in Sekunden um und vergleiche dann:
Delphi-Quellcode:
Function TimeToSeconds (aTime : TDateTime) : Integer;
Begin
  Result := Trunc (0.5 + Fract(aTime)*86400);
End;

Function TimeToMinutes (aTime : TDateTime) : Integer;
Begin
  Result := Trunc (0.5 + Fract(aTime)*1440);
End;

...
  If TimeToSeconds(Now) - TimeToSeconds(LastTime) >= 120 Then Begin // 120 Sekunden = 2 Minuten
    LastTime := Now;
    DoSomething;
  End;

// Oder

  If TimeToMnutes(Now) - TimeToMinutes(LastTime) >= 2 Then Begin
    LastTime := Now;
    DoSomething;
  End;

divBy0 7. Aug 2009 08:07

Re: Probleme mit DB und Schleife
 
Ich kapiere das nicht...

Was spricht denn hier gegen den Einsatz von TTimer? Ein Intervall auf 2 Minuten und fertig...

aaaaaaaaaa_10 10. Aug 2009 07:19

Re: Probleme mit DB und Schleife
 
Hallo,
hab das jetzt mit Timer probiert.

Delphi-Quellcode:
  //Timer für Datenbank zur Laufzeit erstellen
          MyTimer3 := TTimer.Create(nil);
          MyTimer3.Enabled := True;
          MyTimer3.Interval := 120000;   // alle 2 Minuten die Datenbank aktualisieren
          MyTimer3.OnTimer := DatenbankFuellen;
Delphi-Quellcode:
procedure TFiles.DatenbankFuellen(Sender: TObject);
var Werte, Datei : string;
    i : integer;
    WerteList, WL : TStringList;
begin
      Datei := extractfilepath(application.exename)+'Mom10min_'+Kennung+'.txt';
      WerteList := TStringList.Create;
      WL       := TStringList.Create;
      try
        WerteList.LoadFromFile(Datei);
        if WerteList.Count >=2 then                
        begin
          Werte := WerteList.Strings[WerteList.count-1];  
          WL.Delimiter := #9;
          WL.DelimitedText := Werte;                              
          if count = WL.Count then
          begin
            with t do    
            begin                                                  
                    t.Open;
                    t.Append;
                    for i := 0 to WL.Count - 1 do
                    begin
                      t.Fields[i].Value := WL.Strings[i];
                    end;
                    t.Post;
                    t.Close;    
            end;
          end;

         WerteList.SaveToFile(Datei);
        end;
      finally
        Free;
        WerteList.Free;
        WL.Free;
      end;
end;
Das Problem dabei, dass er dann erst nach 2 Minuten den ersten Wert reinschreibt. Er soll aber sofort anfangen.

himitsu 10. Aug 2009 07:31

Re: Probleme mit DB und Schleife
 
du kannst DatenbankFuellen auch z.B. auch noch über OnCreate der Form aufrufen, dann fängt er sofort an.

aaaaaaaaaa_10 10. Aug 2009 07:54

Re: Probleme mit DB und Schleife
 
Was muss denn bei dem TimerEreignis in Datenbankfuellen(?). Da steht ja Sender:TObject drin,aber beim Aufruf? t für die Datenbank?

jaenicke 10. Aug 2009 08:08

Re: Probleme mit DB und Schleife
 
Der Sender ist für dich selbst um in einem Ereignis feststellen zu können, von welchem Objekt das Ereignis ausgelöst wurde. Denn du kannst ja z.B. mehreren Buttons die selbe Prozedur an das OnClick-Ereignis zuweisen.
Wenn du Sender nicht benutzt, kannst du einfach nil angeben oder eben die Komponente z.B., deren Ereignis das ist.

aaaaaaaaaa_10 10. Aug 2009 08:29

Re: Probleme mit DB und Schleife
 
Funktioniert irgendwie nicht. Ich muss ja erst die DB erstellen:
Delphi-Quellcode:
procedure TFiles.DatenbankErstellen;
var
    sl : TStringList;
    i : integer;
    Label SprungDB;
begin
  if check1 = false then
  begin
    sl := TStringList.Create;
    try
      sl.Delimiter := #9;
      sl.DelimitedText := TabHead; //Tabellenkopf
      t := TTable.Create(nil);
      count := sl.Count;
      with t do
      begin
        Close;
        if not Fileexists (ExtractFilePath(application.exename)+'Datenbank_'+Kennung+'.db') then
        begin
          TableName := ExtractFilePath(application.exename)+'Datenbank_'+Kennung+'.db';
          TableType := ttParadox;
          with FieldDefs do
          begin
            Clear;                                      
            Add(sl.Strings[0], ftDate, 0, False);          
            Add(sl.Strings[1], ftTime, 0, False);          
            for i := 2 to sl.Count-1 do                  
            begin
              Add(sl.Strings[i],ftFloat,0,False);
            end;
          CreateTable;
          end;
        end else
        begin
          TableName := ExtractFilePath(application.exename)+'Datenbank_'+Kennung+'.db';
          TableType := ttParadox;
          goto SprungDB;
        end;

SprungDB:
           //Timer für Datenbank zur Laufzeit erstellen
               DatenbankFuellen(nil) // <------------------------------------------------------
          MyTimer3 := TTimer.Create(nil);
          MyTimer3.Enabled := True;
          MyTimer3.Interval := 300000;  
          MyTimer3.OnTimer := DatenbankFuellen;
     check1 := true;
   end;
    finally
      Free;
      sl.Free;
    end;
  end;

end;
Und dann kann ich diese erst füllen. Hab daher DatenbankFuellen an obige Stelle geschrieben. Aber geht auch nicht

jaenicke 10. Aug 2009 10:11

Re: Probleme mit DB und Schleife
 
Zitat:

Zitat von aaaaaaaaaa_10
Aber geht auch nicht

Sehr ausführliche Fehlerbeschreibung... :glaskugel: :roll:

aaaaaaaaaa_10 10. Aug 2009 10:30

Re: Probleme mit DB und Schleife
 
war mein fehler ( wie solls auch anders sein). hat sich geklärt.danke


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