Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Quickreport -> NeedData Problem (https://www.delphipraxis.net/10670-quickreport-needdata-problem.html)

Christian_1980 23. Okt 2003 08:49


Quickreport -> NeedData Problem
 
Huhu @ all :-)


Ich weiss: ihr seid alle clevere Jungs und könnt mir bestimmt helfen :-)

Folgendes Problem: Ich habe einen Quickreport, der aus einer Liste von Objekten bestimmte Objekteigenschaften ausgeben soll. Dazu bediene ich mich im NeedData-Aufruf des Quickreports folgenden Codes:

Delphi-Quellcode:
procedure TqrBeipiel.qrBeispielNeedData(Sender: TObject;
  var MoreData: Boolean);

var JumpNextDataSet: Boolean;

begin

JumpNextDataSet := TRUE;

if (Counter < ObjektListe.Count) then
 begin
   While JumpNextDataSet do
     begin
         if (ObjektListe[Counter].gueltig)
         begin
           JumpNextDataSet := FALSE;
           MoreData := TRUE
         end else begin
             Counter := Counter + 1;
             JumpNextDataSet := TRUE;
         end
     end;
  end;
end;
sowie:

Delphi-Quellcode:
procedure TqrBeipiel.QRDesignSummaryBandAfterPrint(Sender: TQRCustomBand;
  BandPrinted: Boolean);
begin

  Counter := Counter + 1;

end;
so *hüstel*, jetzt zum eigentlichen Probelem: Ist das letzte Objekt in der Liste nicht gültig, so überschreitet der Index der Liste das Maximum (... mit anderen worten: der letzte Datensatz wird, sofern er nicht gültig ist ebenfalls übersprungen). Weiss jemand von euch wie ich das ausbügeln kann? :gruebel:

Vielen Dank schonmal,

Christian

Sourcemaker 23. Okt 2003 09:42

Re: Quickreport -> NeedData Problem
 
Hi,

ich verstehe nicht warum du in SummaryAfterPrint den Counter hochzählst (würde ich nebenbei mit
Inc(nCounter) machen). Needdata wird danach doch nicht wieder aufgerufen. Hast du daran gedacht den Counter im BeforePrint wieder auf 0 zu setzen ?
Wo genau kommt der Abbruch ?

Mfg.

Frank

Christian_1980 23. Okt 2003 10:07

Re: Quickreport -> NeedData Problem
 
Hi Sourcemember !

folgendes: wenn MoreData auf True steht und das DetailBand geschrieben wurde, dann wird der Counter incrementiert. Und: Es wird der nächste Datensatz aus NeedData ermittelt. (Der aktuelle Datensatz besteht im Wert von Counter - wird in BeforePrint mit Ausgabe(Counter) gemacht - das ist auch der Grund, warum Counter nicht wieder auf 0 gesetzt wird).

Ich habe aber bereits eine Möglichkeit gefunden, das ganze zu lösen. Die Lösung empfinde ich jedoch als ziemlich unschön. Der ganze Lösungsweg ist nicht toll. Aber mir fällt keine andere Möglichkeit ein die einzelnen Datensätze zu ermitteln und nicht gültige auszuschließen. Prinzipiell möchte ich also einfach jedes gültige objekt der liste in mein detailband schreiben. Falls jemandem noch eine intelligentere Lösung einfällt wäre ich sehr dankbar, wenn er sie hier posten würde.

Meine Lösung:

Delphi-Quellcode:
if (Counter < ObjektListe.Count) then
 begin
   While JumpNextDataSet do
     begin
         if (ObjektListe[Counter].gueltig) then
         begin
           JumpNextDataSet := FALSE;
           MoreData := True;      
         end else begin
           if (Counter = ObjektListe.Count-1) then
             begin
              JumpNextDataSet := FALSE;
              MoreData := False;
              Last := FALSE
             end else begin
              Counter := Counter + 1;
              JumpNextDataSet := TRUE;
             end;
         end
     end;
Danke für Deine Hilfe Sourcemember!

Christian_1980 23. Okt 2003 10:16

Re: Quickreport -> NeedData Problem
 
Der Abbruch erfolgt durch MoreData := False :zwinker:

Sourcemaker 23. Okt 2003 11:08

Re: Quickreport -> NeedData Problem
 
Hi Cristian,

was hältst du davon:

Delphi-Quellcode:
MoreData := Counter < ObjektListe.Count; //sicher stellen das MoreData richtig ist
if MoreData then
begin
   While True do
   begin
      if (ObjektListe[Counter].gueltig) then
         break
      else begin
         if (Counter = ObjektListe.Count) then //sonst kommt der letzte Satz nicht
         begin
            MoreData := False;
            Last    := False;
            break; //Edit: hatte ich vergessen  
         end else inc(Counter);            
      end;
   end;
end;
Mfg.

Frank

P.S. Mit "wo der Abbruch ist ?" meinte ich den Fehler.

Christian_1980 23. Okt 2003 11:50

Re: Quickreport -> NeedData Problem
 
Hi Frank !

Ich danke Dir für Deine Hilfe. Leider gibt es bei Deiner Variante wieder exakt denselben Fehler. Wenn das letzte Objekt ungültig ist, überschreitet der Index der Liste das Maximum.

:roll:

Sorry,

Christian

Sourcemaker 23. Okt 2003 13:10

Re: Quickreport -> NeedData Problem
 
Hi Cristian,

hatte noch ein break vergessen (ist jetzt nachgetragen) aber sag mir doch bitte in welcher Quelltextzeile der Fehler kommt. Im NeedData oder später ? Zeig doch mal den gesamten Code.

Mfg.

Frank

Christian_1980 23. Okt 2003 14:12

Re: Quickreport -> NeedData Problem
 
Das Break hat leider auch nix am Fehler geändert. :roteyes:

Er crasht in der Zeile:

Delphi-Quellcode:
      if (ObjektListe[Counter].gueltig) then // <-- index der liste überschreitet max.

:wiejetzt:

Sourcemaker 23. Okt 2003 16:30

Re: Quickreport -> NeedData Problem
 
Verstehe ich nicht ! :wiejetzt:
Welchen Wert hat Counter und ObjectList.Count wenn es crasht ?

Gruß

Frank


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