Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage mit Daumswechsel (https://www.delphipraxis.net/22568-abfrage-mit-daumswechsel.html)

celinaw 19. Mai 2004 12:57


Abfrage mit Daumswechsel
 
Hi

Habe bissher folgenden Code:

Delphi-Quellcode:
var
  anzahl : Integer;
begin
  dbMain.HostName:=Form2.Hostname.Text; //Server
  dbMain.User:=Form2.User.Text; //Benutzername
  dbMain.Password:=Form2.Password.Text; //Passwort
  dbMain.Database:=Form2.Datenbank.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  Screen.Cursor := crHourGlass;
  try
    with qrMain do
    begin
      Close;
      SQL.Text :=
       'SELECT COUNT(*) AS anzahl FROM table_ordertracking WHERE order_type=:order_type';
      ParamByName('order_type').AsString := 'FT';
      Open;
      anzahl := FieldByName ('anzahl').AsInteger;
      DFCount.Text:= IntToStr(anzahl);
      qrmain.Close;
  finally
    Screen.Cursor := crdefault;
  end;
end;
Hier wird jetzt die Anzahl der Datensätze ausgegeben bei denen in der Spalte "Order_type" FT steht.
In der Tabelle ist ein Date/Time Feld.
Jetzt möchte ich das ganze aber über einen Zeitraum von 19:00 Uhr bis 19:00 Uhr haben.
Z.B: 05.05.04 19:00Uhr - 06.05.04 19:00Uhr.
Also demnach dann ab 06.05.04 19:00:01 wieder 06.05.04 19:00 - 07.05.04 19:00 usw.
Das ganze soll so zusagen ein Counter werden, der alle Datensätze des Types FT von zb. 05.05.04 19:00Uhr - 06.05.04 19:00Uhr
hochzählt. Am 06.05.04 19:00:01 geht das denn wieder von vorne los.

Ist so etwas überhaup möglich :?:


Gruß Celina

Gollum 19. Mai 2004 13:10

Re: Abfrage mit Daumswechsel
 
Hallo,

etwa in der Art:

Code:
'SELECT
  COUNT(*) AS anzahl
FROM table_ordertracking
  WHERE order_type=:order_type AND datum BETWEEN (:von AND :bis)';

Sharky 19. Mai 2004 13:27

Re: Abfrage mit Daumswechsel
 
In diesem Fall wäre BETWEEN wohl nicht geeignet da es ja die "begrenzungswerte" mit einschließt (>= AND <=).

Somit würde bei
1.5.2004 19:00 bis 2.5.2004 19:00
2.5.2004 19:00 bis 3.5.2004 19:00

Der Zeitstempel 2.5.2004 19:00 in beiden Abfragen berücksichtigt werden.

Ich würde abfragen: (datum > 1.5.2004 19:00) AND (datum <= 2.5.2004 19:00). Dann müsste es eigentlich stimmen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  anzahl : Integer;
  von   : TDateTime;
  bis   : TDateTime;
begin
  von := EncodeDateTime(2004,5,1,19,00,00,00); //1. Mai 2004 19:00
  bis := EncodeDateTime(2004,5,2,19,00,00,00); //2. Mai 2004 19:00
  dbMain.HostName:=Form2.Hostname.Text; //Server
  dbMain.User:=Form2.User.Text; //Benutzername
  dbMain.Password:=Form2.Password.Text; //Passwort
  dbMain.Database:=Form2.Datenbank.Text; //Name der Datenbank
  dbMain.Connected:=True; //Verbindung herstellen
  Screen.Cursor := crHourGlass;
  try
    with qrMain do
    begin
      Close;
      SQL.Text :=
       'SELECT COUNT(*) AS anzahl '+#10+
       'FROM table_ordertracking '+#10+
       'WHERE (order_type=:order_type)'+#10+
       'AND (datum > :von) AND (datum <= :bis)';
      ParamByName('order_type').AsString := 'FT';
      ParamByName('von').AsDateTime := von;
      ParamByName('bis').AsDateTime := bis;
      Open;
      anzahl := FieldByName ('anzahl').AsInteger;
      DFCount.Text:= IntToStr(anzahl);
      qrmain.Close;
  finally
    Screen.Cursor := crdefault;
  end;
end;

Gollum 19. Mai 2004 14:19

Re: Abfrage mit Daumswechsel
 
Hallo,

@Sharky:

Wo ist das Problem?

von: 06.05.04 19:00:01
bis: 07.05.04 19:00:00

Siehe auch Posting von celinaw.

Sharky 19. Mai 2004 14:25

Re: Abfrage mit Daumswechsel
 
Zitat:

Zitat von Gollum
...Wo ist das Problem?....

Zitat:

Zitat von celinaw
Z.B: 05.05.04 19:00Uhr - 06.05.04 19:00Uhr.
Also demnach dann ab 06.05.04 19:00:01 wieder 06.05.04 19:00 - 07.05.04 19:00 usw.

Ihre erste Abfrage wäre das Problem. Sie müsste bei der ersten Abfrage ein andere Zeit nehmen. Das ist imho eine Quelle für mögliche Fehler. Ansonsten hast Du recht. Andereerseits muss man überlegen in welchen Intervallen Daten eingetragen werden. Wenn es kleiner als 1sek. ist könnten Infos verloren gehen.

Wenn z.B.: Ein Eintrag um 19:00:01:59 erfolgt gibt es ein Problem.

celinaw 19. Mai 2004 19:01

Re: Abfrage mit Daumswechsel
 
Hi :hi:

Also ich denke ganz so einfach wird es nicht sein.
Ich möchte hier kein festes Datum vorgeben.
Das Programm soll mit dem System Datum/Zeit arbeiten.
Also so:

Übrigens: Die Abfrage wird über einen Timer alle 2min aktualliesert.

Wenn der Timer am Datum/Zeit z.B 17.05.2004 20:30 Uhr startet, müsste die Abfrage folgenden Zeitraum abdecken:

von: 17.05.2004 19:00 Uhr bis: 18.05.2004 19:00 Uhr !! Der Haken an der Sache ist, dass wenn der Timer nach OO:00 Uhr und vor 19:00 Uhr startet, müsste die Abfrage bei oben genanntem Beispiel mit folgenden Parameter laufen:
von: 17.05.2004 19:00 Uhr bis: 18.05.2004 19:00 Uhr !!

Ich brauche also immer den Zeitraum 19:00 Uhr bis 19:00 Uhr. Und das ist ja davon abhängig wann die Abfrage ausgeführt wird.
Wird die Abfrage zwischen 19:00 Uhr und 00:00 Uhr ausgeführt, solten die Abfrage Parameter von 19:00 Uhr des Aktuellen Tages bis 19:00 Uhr des folgenden Tages sein. Nach 00:00 Uhr und vor 19:00 müssen die Parameter ja dann von 19:00 Uhr des vergangenen Tages bis 19:00 Uhr des Aktuellen Tages sein.

Ich hoffe da blickt noch einer durch :gruebel:

:oops: Ich denke das ist nicht so leicht zu machen :?:

@ Sharky
Zitat:

EncodeDateTime
gibt bei mir immer den Fehler "Undefinierter Bezeichner" :gruebel:


Gruß Celina

MarkusB 21. Mai 2004 00:22

Re: Abfrage mit Daumswechsel
 
Hi Celina!

Wie ich sehe ist Dein Problem weitgehend gelöst. Was übrig bleibt, ist das richtige Setzen der Zeitgrenzen.
Ich hoffe, dass das folgende Stück Code Dir weiterhelfen wird:

Delphi-Quellcode:
VonDatumZeit := Date() + EncodeTime(19,00,00,00);
BisDatumZeit := VonDatumZeit;

DecodeTime(Now, Hour, Min, Sec, MSec);

if Hour >= 19
then BisDatumZeit := BisDatumZeit + 1
else VonDatumZeit := VonDatumZeit - 1;
Viele Grüße
Markus
:gruebel:

Sharky 21. Mai 2004 09:43

Re: Abfrage mit Daumswechsel
 
Hai Celinachen *gg*,

ich habe das ganze mal so gemacht. Ich weiss das man es auch noch vereinfachen kann. Aber ich denke so ist die "Logik" besser zu erkennen?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sod: TTime; // Start of day
  sop: TTime; // Start of production
  datum: TDate; // Datum des Servers
  zeit: TTime; // Zeit des Servers
  DayOffsetStart: Integer; // 0 = heute; -1 = Gestern
  DayOffsetEnde: Integer; // 0 = heute; 1 = Morgen
  VonDatumZeit: TDateTime; // Abfrage start
  BisDatumZeit: TDateTime; // Abfrage ende
begin
  sod := EncodeTime(0, 0, 0, 0); // 00:00:00  // Neuer Tag neues Glück
  sop := EncodeTime(19, 0, 0, 0); // 19:00:00 // Die Arbeit beginnt
  dbMain.HostName := Form2.Hostname.Text; //Server
  dbMain.User := Form2.User.Text; //Benutzername
  dbMain.Password := Form2.Password.Text; //Passwort
  dbMain.Database := Form2.Datenbank.Text; //Name der Datenbank
  dbMain.Connected := True; //Verbindung herstellen
  Screen.Cursor := crHourGlass;
  try
    with qrMain do  // Ersteinmal Datum und Zeit vom Server holen.
    begin
      Close;
      SQL.Text := 'SELECT CURDATE() AS datum, CURTIME() as zeit';
      Open;
      datum := FieldByName('datum').AsDateTime;
      zeit := FieldByName('zeit').AsDateTime;
      Close;
    end;
    // Jetzt prüfen welche Zeiträume berücksichtigt werden müssen.
    if (zeit >= sod) and (zeit < sop) then // Es ist zwichen 00:00:00 und 19:00:00
    begin
      DayOffsetStart := -1; // Abfrage beginnt gestern
      DayOffsetEnde := 0; // Abfrage endet heute
    end
    else //Es ist zwichen 19:00:00 und 23:59:59
    begin
      DayOffsetStart := 0; // Abfrage beginnt Heute
      DayOffsetEnde := 1; // Abfrage endet Morgen
    end;
    // Start- und Endzeitpunkte berechnen
    VonDatumZeit := datum + sop + DayOffsetStart;
    BisDatumZeit := datum + sop + DayOffsetEnde;
    with qrMain do // Und los geht es
    begin
      Close;
      SQL.Text :=
       'SELECT COUNT(*) AS anzahl '+#10+
       'FROM table_ordertracking '+#10+
       'WHERE (order_type=:order_type)'+#10+
       'AND (datum > :von) AND (datum <= :bis)';
      ParamByName('order_type').AsString := 'FT';
      ParamByName('von').AsDateTime := VonDatumZeit;
      ParamByName('bis').AsDateTime := BisDatumZeit;
      Open;
      anzahl := FieldByName ('anzahl').AsInteger;
      DFCount.Text:= IntToStr(anzahl);
      qrmain.Close;
  finally
    Screen.Cursor := crdefault;
  end;
end;

celinaw 21. Mai 2004 09:48

Re: Abfrage mit Daumswechsel
 
Hi Hai :mrgreen:

Na das werde ich gleich mal testen :zwinker:

Erst mal Vielen Dank :thuimb:

Melde mich gleich wieder..

@MarkusB Dir danke ich natürlich auch :thuimb:

Gruß Celina

celinaw 21. Mai 2004 10:04

Re: Abfrage mit Daumswechsel
 
Hi Hai :mrgreen:

:shock: Wow... Respekt!! :thuimb:

Es funktioniert auf anhieb! Das hast du Spuper hin bekommen :thuimb:
Und ganz besonders toll finde ich es, das du den Code mit nützlichen Kommentaren versehen hast!
So kann jeder verstehen was du da gemacht hast, selbst ich :oops: Du hast dir ein DICKES Lob verdient!! :mrgreen:

@MarkusB: Natürlich danke ich auch dir für deine Mühe.

Also, vielen vielen Dank!

Ein :cheers: auf die DP :thuimb:

Liebe Grüße Celina


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.
Seite 1 von 2  1 2      

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