QuickReport Problem - Seitenumbruch
-
Wo ist das Problem ?
Solange wie du Daten hast lässt du im OnNeedData deines Reports MoreData auf true und schreibst die Daten in dein Label.
Wenn du keine Daten mehr hast, setzt du MoreData auf false.
Kannst du ungefähr so verstehen:
Wenn du MoreData auf true setzt, erzeugt er automatisch ein "neues Label".Du must nur die Caption des Labels ändern.Beispiel:
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { static int i=0; if(++i<=10) { QRLabel1->Caption = IntToStr(i); MoreData=true; } else MoreData=false; }
-
Hallo,
das hilft schonmal ein bisschen. Aber ganz klar ist mir das OnNeedData immernoch nicht. Wann und wie wird denn diese QuickRep1NeedData Funktion in deinem Beispiel aufgerufen?
gruß
bauer
-
ah, habe eben rausgefunden dass die Funktion wohl automatisch beim Preview aufgerufen wird. Ich verstehe aber noch nicht so ganz wie die Schleife zustande kommt die jetzt von 1 bis 10 hochzählt?? Heißt das dass die Funktion solange moredata=true ist praktisch immer in Schleife läuft. Im prinzip wie eine for schleife mit bedingung moredata==true!?
-
Im prinzip wie eine for schleife mit bedingung moredata==true
Im Prinzip ja.
-
supi, jetzt habe ich das glaube ich begriffen, es funktioniert auch. Nur jetzt gibt es ein anderes Problem: labels zur laufzeit erstellen geht jetzt nicht mehr (zumindest nicht mehr wie bisher)
vermutlich weil Parent = DetailBand1; jetzt nicht mehr funktioniert...ich brauche aber trotzdem labels zur laufzeit...oder kann man onneeddata auch irgendwie schalteln??
-
Du mußt nur ein einziges Label in dem Detail-Band erzeugen.
In dieses eine Label schreibst Du in der OnNeedData die gewünschte Ausgabe. Solange MoreData true ist, wird beim Drucken automatisch ein weiteres Detail-Band auf dem Ausdruck erzeugt. Dann klappt das auch mit dem Seitenumbruch automatisch.Quick-Report ist eingentlich eine Komponente für Datenbankanbindung. Da weiß man nie im voraus, wie viele Datensätze es geben wird...
-
ich brauche aber trotzdem labels zur laufzeit...
Wozu ?
-
weil ich muss daten darstellen, die wiederum untergeordnete Daten haben und diese haben wiederum untergeordnete Daten. Und die Anzahl der jeweiligen untergeordneter Daten kann jeweils verschieden sein. Also es können beliebig viele "Hauptpunkte" vorhanden sein, die jeweils verschieden viele Unterpunkte haben und die wiederum auch verschieden viele unterpunkte haben können.
ich müsste also im prinzip 3 OnneedDatas verschachteln.
Die hauptpunkte habe ich nun mit Onneeddata, so dass bei jedem neuen Hauptpunkt ein neues Band mit Onneeddata gemacht wird. Aber innerhalb dieses Bandes brauche ich eben wieder unterschiedlich viele Labels, und die wollte ich dann eben weiterhin zur Laufzeit erstellen.Ich hoffe das war Verständlich und ihr habt eine passende Idee, ihr habt echt schon gut geholfen

Gruß
Bauer
-
Verschieb doch dein Label dahin wo du es haben willst bei jeden zeilen druck.
static int i=0; if(++i<=10) { QRLabel1->Left = QRLabel1->Left + 10; QRLabel1->Caption = IntToStr(i); MoreData=true; } else MoreData=false;
-
@VergissEs: Ich denke dann hat er wieder das Problem mit dem Seitenumbruch.
Aber auch die abhängigen Daten sind kein Problem. Dafür gibt es SubDetail-Bands.
-
ja subdetail funktioniert.
aber ich bin immernoch nicht zufrieden..
jetzt bekomme ich so ein layout hin:hauptpunkt1
unterpunkt1
unterunterpunkt1
2
2
1ich möchte aber so:
hauptpunkt1 unterpunkt1 unterunterpunkt1
22 1
-
oh die formatierung hat es nicht so dargestellt wie ich wollte..
jedenfalls wollte ich bänder horizontal nebeneinander anordnen
-
Bauer schrieb:
jedenfalls wollte ich bänder horizontal nebeneinander anordnen
Das geht AFAIK nicht.
-
Nichts ist unmöglich.
Dann setzt du halt drei Labels nebeneinander.
Musst dir dann im OnNeedData eine Logik schreiben, die dir dann die jeweiligen Daten in das entsprechende Label setzt und in die anderen Labels einen EmptyStr.
Dürfte aber ziemlich kompliziert werden.
-
Nein, dann bekommt er noch ganz andere Probleme, da er bereits beim Layout mindestens so viele Labels auf der rechten Seite plazieren müßte, wie sein Sub-SubDetail-Band and Datensätzen maximal hat. Die werden natürlich alle gedruckt, ob mit Inhalt versehen, oder nicht.
Ich weiß nicht, ob andere Report-Komponenten mehr flexibilität bieten, aber ich würde die Druckausgabe 'von Hand' machen.
-
Ich die Geschichte konstuktiv für nicht so toll.
Derartige Verdichtungen mache ich immer (auch für Crystal-Reports mit deutlich mehr Möglichkeiten) über eine Vorabfrage als View oder wenn's noch komplizierter wird, über eine temporäre Reporttabelle.
Dann ist das Report-Layout selbst deutlich einfacher zu halten.
-
Joe_M. schrieb:
@VergissEs: Ich denke dann hat er wieder das Problem mit dem Seitenumbruch.
Wiso sollte er Probleme haben mit dem Seitenumbruch? wenn das Label in einem rbDetail Band liegt?
void __fastcall TForm1::QuickRep1NeedData(TObject *Sender, bool &MoreData) { static int i=0; if(++i<=100) { QRLabel1->Left = QRLabel1->Left +10; QRLabel1->Caption = IntToStr(i); MoreData=true; } else MoreData=false; }@Bauer kannst du nochmal genau Zeigen wie jetzt dein Output ausschauen soll?
evtl im Code Tag mit Spaces erzeugen, da man eigentlich immer noch nicht so richtig weiss wie es aussehen soll?
-
@Bauer kannst du nochmal genau Zeigen wie jetzt dein Output ausschauen soll?
evtl im Code Tag mit Spaces erzeugen, da man eigentlich immer noch nicht so richtig weiss wie es aussehen soll?Geht mir genauso ...
-
Hauptpunkt1 Unterpkt1 Unterunter1 Únterunter2 Unterunter3 Unterpkt2 Unterunter1 Unterunter2 Hauptpunkt2 Unterpkt1 Uu1 Uu2 Unterpkt2 Uu1
-
hoffentlich gehts jetzt...
Hauptpunkt1 Unterpkt1 Unterunter1 Únterunter2 Unterunter3 Unterpkt2 Unterunter1 Unterunter2 Hauptpunkt2 Unterpkt1 Uu1 Uu2 Unterpkt2 Uu1