Autor Beitrag
kiwicht
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Sa 29.03.03 17:17 
Danke für die schnelle Antwort, werd mir das ma durch den Kopf ziehen ;D
kiwicht Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mi 02.04.03 10:02 
hallöle..

ich steh so kurz: || vor einer verzweiflungs-tat... weiß nur noch nich was... :(


Also:
so siehts aus bei QReport.OnBeforePrint:

ausblenden Quelltext
1:
Woche := 0;					

so siehts aus bei QRGroupt.OnBeforePrint:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
  var jahr, monat, tag : Word;
begin
jahr := FormatDateTime('yy', Query1.fieldValues['termin']);
monat := FormatDateTime('mm', Query1.fieldValues['termin']);
tag := FormatDateTime('dd', Query1.fieldValues['termin']);
TempWoche := ISOWeekNumber(jahr, monat, tag, 1);
end;

und was geht nicht? Ganz klar: String <-> Word. Inkompatible...

Ich weiß, is schlimm wenn nicht ma die grundlegensten Sachen funzen... aber ich bin echt kurz vorm Durchdrehen... :autsch: :hair: :eyecrazy: :eyes: :bawling: :think: :crying: ... meine Verzweiflung lässt sich nur noch in metaphorischen Symbolen zum Ausdruck bringen...
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 02.04.03 10:24 
Hi kiwicht
gaaaanz ruhig, hier werden sie geholfen. Ein paar kleine Änderungen:
ausblenden 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. :D

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
kiwicht Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: Mi 02.04.03 11:12 
.... :D kennst du dieses Gefühl, wenn du stundenlang vor einem Problem gesessen hast, und es dann endlich funktioniert?
.... herrlich..... :dance2: :dance:

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.... :D

vielen Dank!
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 02.04.03 11:15 
Erschlag mich nicht gleich mit Lobeshymnen :mrgreen: Gern geschehen.

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...