Reports: Mehrere Tabellen nebeneinander abbilden

26. Februar 2009 17:27

Hier eine kleine Kopiervorlage, wenn ihr in einem Report mehrere Spalten in dieser Art füllen möchtet:

Code:
Record1 Nr. 1  | Record2 Nr. 1 | ...
Record1 Nr. 2  | Record2 Nr. 2 | ...
Record1 Nr. 3  | Record2 Nr. 3 | ...
Record1 Nr. 4  |               | ...
Record1 Nr. 5  |               |


Record1 und Record2 müssen mit entsprechenden Filtern versehen sein oder im Falle von temp. Records entsprechend gefüllt sein.
Ihr braucht ein Integer-DataItem mit DataItemTableView =
Code:
SORTING(Number) WHERE(Number=FILTER(1..))

Pro Record-Variable benötigt ihr eine neue globale Boolean-Variable, Schema: LoopRecord1, LoopRecord2, ...
In dieses DataItem im OnAfterGetRecord-Trigger schreibt ihr (hier als Beispiel mit genau zwei Record-Variablen):
Code:
IF Number = 1 THEN BEGIN
  LoopRecord1 := Record1.FINDSET;
  LoopRecord2 := Record2.FINDSET;
  ...
END ELSE BEGIN
  IF LoopRecord1 THEN
    LoopRecord1 := Record1.NEXT <> 0;
  IF LoopRecord2 THEN
    LoopRecord2 := Record2.NEXT <> 0;
  ...
END;

IF NOT LoopRecord1 THEN
  CLEAR(TempRecord1);
IF NOT LoopRecord2 THEN
  CLEAR(TempRecord2);
...

IF (NOT LoopRecord1) AND (NOT LoopRecord2) AND (NOT ...) THEN
  CurrReport.BREAK;


Wer das Ganze noch eleganter hinbekommt, bitte melden! :-)

Re: Reports: Mehrere Tabellen nebeneinander abbilden

26. Februar 2009 18:47

Hallo Natalie,

ich versuch das mal. Also die ganze Aktion macht nur Sinn, wenn die beiden Records unabhängig voneinander sind, ansonsten macht man im OnAfterGetRecord von Record 1 schlicht ein Get auf Record2.

Der PreDataItem -Trigger des Integer sieht bei mir so aus:
Code:
Record1.SetFilter();
     .
     .
Record2.SetFilter();
     .
     .
Setrange(Number,1,Record1.COUNT);
if Record2.COUNT > Record1.COUNT then
  Setrange(Number,1,Record2.COUNT);
if not Record1.FINDSET and NOT Record2.FINDSET then
  Currreport.BREAK;


Im OnPostSection des untersten Boddy der Integer-Section tut sich folgendes:
Code:
if record1.Next = 0 then clear(Record1);
if record2.Next = 0 then clear(Record2);


Wer's ein bisschen übersichtlicher mag tut folgendes im OnAfterGetRecord:
Code:
if Number = 1 then begin
  if not record1.FINDSET  then clear(Record1);
  if not record2.FINDSET  then clear(Record2);
end else begin
  if record1.Next = 0 then clear(Record1);
  if record2.Next = 0 then clear(Record2);
end;


Gruß, Fiddi

Re: Reports: Mehrere Tabellen nebeneinander abbilden

26. Februar 2009 19:14

Führt das echt zu keinem Fehler, wenn du ein NEXT ausführst und das Ende aber schon im vorherigen Durchlauf erreicht war?
Habs nie ausprobiert :-)

Ich bevorzuge es, Programmierung in den Section-Triggern möglichst zu vermeiden.