Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query-Durchlauf funktioniert nicht richtgi (https://www.delphipraxis.net/138878-query-durchlauf-funktioniert-nicht-richtgi.html)

Barret 19. Aug 2009 08:03

Datenbank: MySQL • Zugriff über: ADO

Query-Durchlauf funktioniert nicht richtgi
 
Morgen!

ich habe da ein kleines Problem. Ich habe eine Datenbank mit veranstaltungen. Jetz möchte ich Auswerten (in eine Datei schreiben). Soweit funktioniert auch alles super (Datei schreiben, die richtigen Einträge filtern, etc.).

Problem is nur, dass meine Query nicht richtig durchlaufen wird. Ich habe einen Start-Tag. Von diesem diesem wird dan immer jeweils alle Veranstaltungen die an einem Tag sind aufgezählt und dan ist der kommende Tag drann. Aussehen soll das so:

Freitag, 14. Aug
Ort: Name, ...

Freitag, 15. Aug
Ort: Name, ...
Ort: Name, ...

Freitag, 18. Aug
Ort: Name, ...
Ort: Name, ...


Die Stings die unter den jeweiligen Tagen kommen baue ich auch richtig zusammen. Mein Problem is nur, wenn ich Veranstaltungen habe die über mehrere Tage gehen sollen diese auch in ALLEN Tagen der Zeitspanne stehen. Wenn ich nur ein Result in der Query habe funktioniert es auch. Bei mehreren Ergebnissen zeigt er mir immer nur den ersten Tag der Veranstaltung an.
Das Verwirrt mich ein wenig.

(oben steht noch with query do und first)
Delphi-Quellcode:
  bAusgabe := false; //bestimmen ob das Enddatum erreicht ist (Abbruch der Schleife)
  bDatumAusgabe := false; //Bestimmen ob Datum schon als Tagesüberschrift angezeigt wird
  dAusgabe := FieldByName('datum_von').AsDateTime;

  while bAusgabe = false do
  begin
    if ((dAusgabe >= FieldByName('datum_von').AsDateTime) AND (dAusgabe <= FieldByName('datum_bis').AsDateTime)) then
    begin
      if (bDatumAusgabe = false) then
      begin
        bDatumAusgabe := true;

        ShortDateFormat := 'dddd, dd. mmm';
        LBText.Items.Add('');
        LBText.Items.Add(DateToStr(dAusgabe));
        ShortDateFormat := 'yyyy-mm-dd';
      end;

               //String zusammenbauen und ausgeben ....

    end;


    if Eof then
    begin
      if (dAusgabe = trunc(DTPBis.Date)) then
        bAusgabe := true;

        First;
        bDatumAusgabe := false;
        dAusgabe := dAusgabe + 1;
    end;

    Next;
  end;

mkinzler 19. Aug 2009 08:18

Re: Query-Durchlauf funktioniert nicht richtgi
 
Besser
Delphi-Quellcode:
while not bAusgabe do
Ich würde das aber anders lösen. Wie sieht die Datenbankstruktur aus?

Barret 19. Aug 2009 08:24

Re: Query-Durchlauf funktioniert nicht richtgi
 
Tabelle Veranstaltungen:
- id
- name
- beschreibung
- ...

Tabelle Veranstaltung Widerholung:
- id
- veranstaltung_id
- datum_von
- datum_bis
- zeit_von
- zeit_bis
- ...

Also is es so, dass eine Veranstaltung mehrere Zeitspannen haben kann.
Dazu kommen dan noch Tabellen mit Personen als Ansprechpartner und Kategorien der Veranstaltung.
Oder soll ich die ganze Struktur posten.

Barret 19. Aug 2009 08:34

Re: Query-Durchlauf funktioniert nicht richtgi
 
OK!
Fehler ist halb gefunden!!!


so muss es sein:
Delphi-Quellcode:
  bAusgabe := false; //bestimmen ob das Enddatum erreicht ist (Abbruch der Schleife)
  bDatumAusgabe := false; //Bestimmen ob Datum schon als Tagesüberschrift angezeigt wird
  dAusgabe := FieldByName('datum_von').AsDateTime;

  while not bAusgabe do
  begin
    if ((dAusgabe >= FieldByName('datum_von').AsDateTime) AND (dAusgabe <= FieldByName('datum_bis').AsDateTime)) then
    begin
      if (bDatumAusgabe = false) then
      begin
        bDatumAusgabe := true;

        ShortDateFormat := 'dddd, dd. mmm';
        LBText.Items.Add('');
        LBText.Items.Add(DateToStr(dAusgabe));
        ShortDateFormat := 'yyyy-mm-dd';
      end;

               //String zusammenbauen und ausgeben ....

    end;


    if Eof then
    begin
      if (dAusgabe = trunc(DTPBis.Date)) then
        bAusgabe := true;

        First;
        bDatumAusgabe := false;
        dAusgabe := dAusgabe + 1;
    end
    else
      Next;
  end;
Jetz habe ich nur noch das Problem, dass der letzte Datensatz zweimal eingetragen wird...

Gibt es eine Möglichkeit vom Eof einen abzuzzihen?

hoika 19. Aug 2009 11:22

Re: Query-Durchlauf funktioniert nicht richtgi
 
Hallo,

Delphi-Quellcode:
if Eof then
    begin
      if (dAusgabe = trunc(DTPBis.Date)) then
        bAusgabe := true;

        First;                   //  wieso wieder First ?
        bDatumAusgabe := false;
        dAusgabe := dAusgabe + 1;
    end
    else
      Next;
Was soll das denn werden ?

Eof einen abziehen, um einen Fehler im Code zu beheben ? Nee !!!
Debugge doch mal den Code, das sieht ja ganz finster aus.


Heiko

Barret 19. Aug 2009 12:02

Re: Query-Durchlauf funktioniert nicht richtgi
 
Danke für die Bemühungen. Geht jetz alles wie es soll.

@hoika: Das first setzen brauch ich schon an der stelle. sonnst bekomm ich nicht alle Daten so ausgegeben wie ich Sie brauche für den Kalender. Ich lass immer tageweise auslesen und dadurch muss ich die query für jeden Tag einmal durchgehen. Hängt aber mit den jeweiligen Zeiträumen zusammen die die Veranstaltungen haben. das Problem war, dass ich erst Eof geprüft habe und dan Next ... muss genau anders rum.

hoika 19. Aug 2009 13:51

Re: Query-Durchlauf funktioniert nicht richtgi
 
Hallo,

Einspruch :)
Ich sehe ja jetzt nicht den ganzen Code,
aber wenn du wirklich für jeden Tag eine Abfrage machst,
wirst du irgendwann Performance-Probleme haben.

1 Tag, 1 Abfrage
1 Jahr, 365/366 Abfragen
2 Jahre, 365*2

Ich würde die Daten des Zeitraumes in genau einer Query (sortiert nach Startdatum)
holen und dann per Code (wie ja jetzt auch) auf die einzelnen Tage aufteilen.

Ansatz:

Delphi-Quellcode:
Query.SQL.Add('select * From Tab1');
Query.SQL.Add('where (StartDatum>=:StartDate) and (EndDatum<=:EndDate)');

Query.ParamByName('StartDate').AsDateTime := tdtStartDate
Query.ParamByName('EndDate').AsDateTime  := tdtStartDate

Heiko

mquadrat 19. Aug 2009 14:22

Re: Query-Durchlauf funktioniert nicht richtgi
 
@Heiko

Macht er doch. Deshalb das First. Zugegebenermaßen auch nicht wirklich performant.

Er scheint für jeden Tag des Abfragezeitraums einmal durch die gesamte Ergebnismenge der gleichen Query zu laufen. Ergo: 2 Jahre = 1 query, 365*2 Schleifendurchläufe

hoika 19. Aug 2009 14:35

Re: Query-Durchlauf funktioniert nicht richtgi
 
Hallo,

hm, so genau habe ich mir den Wirrwarr nicht angesehnn ;)


Heiko

khh 19. Aug 2009 14:46

Re: Query-Durchlauf funktioniert nicht richtgi
 
Zitat:

Zitat von hoika
Hallo,

hm, so genau habe ich mir den Wirrwarr nicht angesehnn ;)


Heiko

mh, ich kenne jetzt zwar die ado - komponente nicht, aber im Ursprungspost sehe ich kein sql-statement :-(
bin ich blind, oder funktioniert ado anders ?


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