QuickReport Problem - Seitenumbruch
-
Moin, Bauer hier.
Ich sitze seit 2 Tagen vor meinem Quickreport und versuche einen vernünftigen Seitenumbruch zu machen...
zu meinem Programm:
Es liest Daten aus einer anderen datei (xml) aus und gibt diese in einem Quickreport aus.
Dazu habe ich im Quickreport ein DetailBand, dort werden immer wenn aus der Xml datei daten anfallen jeweils ein Label erstellt
TQRLabel *daten= new TQRLabel etc..
in dieses Label wreden dann die Daten ins Capture geschrieben.
Die Position des Labels wird über eine Variable bestimmt, die nach jeder Labelerstellung um einen bestimmten Betrag erhöht wird, damit das nächste Label dann in der nächsten Zeile steht.Das klappt auch alles einwandfrei, nur sobald die Seite voll ist wird der Rest einfach nicht mehr dargestellt.
Nun stellt sich mir die Frage wie ich es hinbekomme eine neue Seite zu bekommen.
und dort die Labels weiterzuschreiben.Kann sich ein Detailband überhaupt über mehrere Seiten erstrecken?
Oder muss ich dann ein neues Band erstellen? Wenn ja, wie geht das zur Laufzeit?mit: TQRBand *neuesband= new TQRBand
wie ich es mit den Labels mache geht es nicht.Wäre über Hilfe sehr dankbar

Viele grüße
Bauer
-
Hallo,
für jedes zu druckende XML Element gleich ein neues TQRLabel zu erstellen ist glaub ich zu viel des guten.
Schau dir mal OnNeedData an bzw. in der Forumsuche findest du auch viele Infos über OnNeedData.
Und wenn du eine "feste" Struktur machst wird auch automatisch ein Seitenumbruch erzeugt.
-
mh, aus OnNeedData bin ich noch nicht so recht schlau geworden.
Ich hab das jetzt noch immer nicht hinbekommen mit seitenumbruch. Hat noch jemand einen Tipp?Gruß
der Bauer
-
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 ...