RDLC für NAV Entwickler #5 – RDLC Belegdesign – Grundlagen & unterschiedliche Kopfgrößen
Hey Leute,
nachdem wir uns mit den Einstiegs-Themen zum Thema RDLC beschäftigt haben:
- RDLC für NAV Entwickler #1 – Allgemeine Informationen & das Dataset
- RDLC für NAV Entwickler #2 – Grundlagen des Layouts – Teil 1 „Der Kopf“
- RDLC für NAV Entwickler #3 – Grundlagen des Layouts – Teil 2 „Der Textkörper“
- RDLC für NAV Entwickler #4 – Kopieren von Berichten / Layouts
möchte ich nun auf Belegdesign eingehen und wie Belege aus meinen Erfahrungen gestaltet werden müssen. Dabei meine ich mit Belegen, alle Berichte, die eine Kopf-/Zeilenstruktur besitzen. Beispiele sind Einkaufs- und Verkaufsbelege (Verkaufsrechnung, Einkaufsbestellung, …). In meinen heutigen Beispiel gehe ich daher auf ein paar Grundlagen ein und zeige wie man unterschiedliche Kopfgrößen in RDLC realisieren kann!
Ich werde auf verschiedene Dinge eingehen, allerdings keine kompletten Belege zur Verfügung stellen. Wenn ich also nicht auf den CopyLoop eingehe oder andere Dinge (Mehrsprachigkeit, unterschiedliche Währungen, Übertragen von Textkonstanten) eingehe, dann bitte ich dies zu entschuldigen. Falls es dort Bedarf gibt, lasst es mich wissen, dann schauen wir uns das noch in einem späteren Beitrag an.
Zu allererst benötigen wir eine Ausgangsbasis. Dafür habe ich einen neuen Bericht erstellt und ein grundlegendes Dataset erstellt.
Wichtig ist hierbei, dass ich das Bild in einem separaten DataItem übergebe. Das mache ich natürlich aus einem bestimmten Grund:
- Das Bild ist normalerweise auf jedem Ausdruck gleich. Würde ich es im “Sales Invoice Header” an das Dataset übergeben, dann sorge ich für ein stark vergrößertes Dataset. Das kann im schlimmsten Fall zu einer “OutofMemoryException” führen. Daher immer dafür sorgen, dass das Bild nur einmal übergeben wird!
- Da die Firmendaten und der Sales Invoice Header auf der ersten Ebene sind, funktioniert der “SETTABLEVIEW”-Befehl für den Bericht immer noch. Es hat also keine Nachteile.
- In Visual Studio müssen wir dann aber auch berücksichtigen, dass wir diesen ersten Eintrag im Dataset “wegfiltern”.
Darüber hinaus gibt es von Microsoft selbst auch ein paar Tipps zur Performance (blogs.msdn.microsoft.com – RDLC Performance Optimization Tips).
Sollte man beim Erstellen und Testen von Berichten auf leere Seiten stoßen, dann kann ich nur diesen Blog von Natalie empfehlen: nataliesnav.de – Leere Seiten im NAV Report
Des Weiteren habe ich folgenden Code eingefügt:
mit folgenden Variablen:
Mehr brauchen wir im ersten Schritt nicht. Nun werde ich Schritt für Schritt erläutern, wie das Layout aufgebaut werden muss. In Visual Studio stelle ich natürlich wieder das Format auf A4 Hochformat und auf Zentimeter:
Wenn wir uns nun den Kopf eines Berichtes anschauen, dann müssen wir folgendes akzeptieren. Die Kopfgröße ist immer statisch. Es gibt keine Möglichkeit diese Größe flexibel zu gestalten. Habe ich nun einen Kopf, der 5 cm hoch ist, dann kann ich das auf der nächsten Seite nicht verkleinern:
Wir sollten also nicht versuchen, dieses Verhalten zu verändern, da es technisch nicht möglich ist. Aber was ist mit der folgenden Idee?
Warum nicht den Kopf im RDL so gestalten, wie er auf der zweiten, dritten, vierten Seite sein soll. Ich kann doch auch den Textkörper für den großen Kopf der ersten Seite benutzen.
Die große Frage ist nun, wie soll das Ganze funktionieren? Das werde ich nun Schritt für Schritt erläutern.
Einfügen einer Liste in den Textkörper. Eine Liste dient uns als Tabelle und gleichzeitig ein Rechteck. Der große Vorteil? Ich kann einen Seitenumbruch pro Beleg generieren und kann in meinem Rechteck alles platzieren, was auf einem Beleg gedruckt werden soll. Dafür erstellen wir also eine Liste, gruppieren nach der Nummer des Sales Invoice Header und erzeugen einen Seitenumbruch, wenn sich das Gruppenmerkmal “No.” ändert.
Zusätzlich setze ich die Seitennummer in RDL zurück, wenn sich der Beleg ändert und setze einen Filter auf die “No.” damit der erste Datensatz ausgeblendet wird.
Nun erstelle ich einfach einfach einen Kopf für die erste Seite und für die zweite Seite. Alles was auf der ersten Seite nicht in den Kopf passt, packen wir dann in Textkörper. Dafür benutze ich auch SetData / GetData. Diese Funktionen werden benötigt um Daten pro Beleg im Stapeldruck an den Kopf zu übergeben (Im Kopf kann man nämlich nur auf den ersten oder den letzten Eintrag im Dataset zugreifen). Das kann man auch hier nachlesen: SetData / GetData – Why it’s required? und hier: MSDN – SetData / GetData
In dem ersten Beitrag zu SetData/GetData sollte man aber die Geschichte mit der VB Funktion “GetGroupPageNumber” vergessen. Mit Dynamics NAV 2013 R2 ist das Feature “ResetPageNumber” (s.o.) verfügbar und man braucht keinen extra Code dafür. Ich benutze die SetData/GetData-Funktionen aus dem MSDN mit einer kleinen Änderung. Wichtig ist meiner Meinung nach dabei, dass man die Aufrufe in die Hidden-Eigenschaft packt und das SetData immer True als Return Value zurückgibt.
So sieht dann mein Kopfbereich aus:
Ich habe also zwei Rechtecke und habe dort das Bild platziert (erst mal ohne flexible Positionierung) und mit einigen Werten. Ebenfalls blende ich das jeweilige Rechteck je nach der Seitennummer ein. Als Folgeschritt erstelle ich nun den zweiten Teil meines Kopfs auf der ersten Seite im Textkörper.
Ich packe noch ein paar Zeilen dazu und sorge für große Platzhalter um eine zweite Seite zu erzwingen:
Das Ergebnis sieht dann so aus:
Seite 1
Seite 2
So nun hat man zwei verschieden große Köpfe auf Seite 1 und den folgenden Seiten. Hier findet ihr wie immer das Objekt: 160312_RobertsVKRechnung
Falls Fragen bestehen, dann schreibt mir einfach einen Kommentar.
The post RDLC für NAV Entwickler #5 – RDLC Belegdesign – Grundlagen & unterschiedliche Kopfgrößen first appeared on Robert's Dynamics NAV/BC Entwickler Blog.
This was originally posted here.
*This post is locked for comments