| Autor |
Beitrag |
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Sa 29.03.03 10:46
Morgen zusammen...
folgendes Prob:
Datenbank, welche zu verschiedenen Tagen verschiedene Einträge enthält. Ähnlich einem Kalender also. Es kommt halt vor, das manche Tage garnicht vorkommen, weil die ohne Einträge sind, und zu manchen Tagen gibt es mehrere Einträge.
Ich grübel jetzt schon seit geraumer Zeit, darüber, wie ich es anstellen kann, das in meinem QuickReport zur Druckausgabe die Tage in Wochen gestaffelt angezeigt werden, und für jede Woche noch eine Summe berechnet wird, aus den Daten die die Wochentage liefern:
01.01.01 Mo bla ... 2
02.01.01 Di test.. 3
03.01.01 Mi nix.. 5
04.01.01 Do dub.. 6
05.01.01 Fr dob... 1
_______________ 17
[und so weiter]
Hat einer ne Idee was den Algorithmus betrifft? Komm echt nicht weiter, wäre euch also sehr dankbar!
mfg[/code]
Zuletzt bearbeitet von kiwicht am Mi 02.04.03 12:41, insgesamt 7-mal bearbeitet
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Sa 29.03.03 15:07
Hi
also mit dem Wochen-Algorithmus kann ich dienen. Allerdings kann ich dir nicht sagen ob sich der Gruppenwechsel bei QReport auch manuell steuern lässt. Ich hab das schon ewig nicht mehr verwendet.
Aber ich glaube du kannst im OnBeforePrint-Ereigniss des Gruppenkopf-Bandes entscheiden ob der Wechsel ausgelöst wird oder nicht.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function ISOWeekNumber(AYear, AMonth, ADay: Word; CMode: integer): integer; const dOffset : array[1..7] of Byte = (6, 7, 8, 9, 10, 4, 5); var Present, StartOfYear : TDateTime; FirstDayOfYear, WeekNumber, NumberOfDays, RYearOfWeekNumber: integer; begin Present := EncodeDate(AYear, AMonth, ADay); StartOfYear := ENcodeDate(AYear, 1, 1); FirstDayOfYear := dOffset[DayOfWeek(StartOfYear)]; NumberOfDays := Trunc(Present - StartOfYear) + FirstDayOfYear; WeekNumber := NumberOfDays div 7; if WeekNumber = 0 then Result := ISOWeekNumber(AYear - 1, 12, 31, CMode) else begin RYearOfWeekNumber := AYear; if WeekNUmber = 53 then begin if DayOfWeek( EncodeDate(AYear, 12, 31) ) < 5 then begin RYearOfWeekNumber := AYear + 1; WeekNumber := 1; end; end; if CMode = 1 then Result := WeekNumber else Result := RYearOfWeekNumber; end; end; |
Aufruf der Funktion mit CMode = 1 liefert die Woche zu dem Datum. CMode = 0 liefert das Jahr in das die Woche fällt (nur bei der 1. Woche sinnvoll).
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Sa 29.03.03 17:17
Danke für die schnelle Antwort, werd mir das ma durch den Kopf ziehen ;D
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: So 30.03.03 17:27
Also, wenn ich das jetzt richtig durchschaut habe, kann ich deiner Funktion immer nur genau 1 Datum übergeben.
Schematisch würde sich das also so auf mein Prog auswirken:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| SELECT-Abfrag für den entsprechenden Bereich: z.B. 01.01.03 - 30.03.03
zum ersten Datensatz
!Sprungmarke!
TempInt := ISOWeekNumber(Query.FieldValue['Datum'], 1)
Schleife:
Übergabe der Restlichen Datenfelder an QReport
Zum nächsten Datensatz
Überprüfe, ob das Datum dieses Datensatzes noch mit TempInt übereinstimmt
Wenn ja, Schleife weitergehen
Wenn nein, füge dem QReport [...] zu, und gehe zu Sprungmarke |
Hab ich das richtig verstanden?
Dann noch eine Frage:
Normalerweise übernimmt ja QReport sämtliche Daten aus der aktuellen ErgebnisMenge, aber wie sage ich ihm, das erstmal nur 5 Datensätze übernommen werden, dann ein Trennzeichen und ein berechnendes Feld (siehe mein [...] oben) und dann die nächsten Datensätze u.s.w.?
Du erwähntest ein OnBeforePrint-Ereignis und einen Gruppenkopf, wie genau muss ich das verstehen?
Kann ich etwa bestimmte Datensätze in Gruppen auf meinem QReport anzeigen lassen, und mit diesen Gruppen Berechnungen durchführen?
(sorry, aber ich hab QReport bisher immer nur zum "normalen" Ausdruck missbraucht, und mehr Informationen liefern da leider auch keine gängigen Delphi-Bücher)
danke im Voraus
mfg
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 01.04.03 05:52
Hi
also ich hab's mal auf die schnelle durchprobiert und es funktioniert folgendermassen:
- Du brauchst in deiner Report-Unit ne globale Variable "Woche", die im OnBeforePrint des Reports auf 0 gesetzt wird.
- Dann hast du wie üblich ein Detailband und dazu einen Gruppenkopf. Die Wechselbedingung (Expression) für den Gruppenkopf ist das Datumsfeld deiner Datenmenge.
- Im OnBeforePrint des Gruppenkopfbandes berechnest du aus dem Datum (des aktuellen Datensatzes) die Woche und vergleichst sie mit der Zahl in "Woche". Wenn ungleich setzt du PrintBand auf True und aktualisierst "Woche" mit der gerade berechneten. Ansonsten setzt du PrintBand auf False
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 02.04.03 10:02
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 02.04.03 10:24
Hi kiwicht
gaaaanz ruhig, hier werden sie geholfen. Ein paar kleine Änderungen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var jahr, monat, tag : Word; begin DecodeDate(Query1.FieldByName('termin').AsDateTime, jahr, monat, tag); TempWoche := ISOWeekNumber(jahr, monat, tag, 1); if TempWoche <> Woche then begin PrintBand := True; Woche := TempWoche; //An dieser Stelle noch den Wert von Woche auf dem Band ausgeben end else PrintBand := False; end; |
Und schon sollte das funktionieren. Jetzt noch mal tief durchatmen und alles wird gut.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 02.04.03 11:12
....  kennst du dieses Gefühl, wenn du stundenlang vor einem Problem gesessen hast, und es dann endlich funktioniert?
.... herrlich.....
Danke für deine Geduld... es funktioniert... einwandfrei... perfekt, genial!
.. ich werd dich dankend in meinen Memoiren und meinem Programm erwähnen!
.... dieses Gefühl unendlicher Glückseligkeit.. hält an bis zum nächsten Problem....
vielen Dank!
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 02.04.03 11:15
Erschlag mich nicht gleich mit Lobeshymnen  Gern geschehen.
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
|