{"id":55000750,"date":"2010-12-01T00:00:00","date_gmt":"2020-05-22T22:08:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=750"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Reflexive_Daten_in_Berichten","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/","title":{"rendered":"Reflexive Daten in Berichten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Reflexive Daten kommen immer mal wieder vor &#8211; bei der Abbildung der Mitarbeiterhierarchie, in St&uuml;cklisten oder auch in Aufgabenlisten. Dass das TreeView-Steuerelement das geeignete Mittel zur Abbildung dieser Strukturen in Formularen ist, hat sich mittlerweile herumgesprochen. Aber wie bringt man diese Daten in Berichten unter Dieser Beitrag zeigt, wie Sie Daten aus reflexiv verkn&uuml;pften Tabellen f&uuml;r die Anzeige in Berichten vorbereiten.<\/b><\/p>\n<p><b>Vorbereitungen<\/b><\/p>\n<p>Nehmen wir doch einfach das am meisten zitierte Beispiel: Die Hierarchie von Mitarbeitern. Dabei verwenden wir eine so einfach wie m&ouml;glich gestaltete Mitarbeitertabelle namens <b>tblMitarbeiter<\/b>, die lediglich die beiden Felder <b>MitarbeiterID <\/b>und <b>Mitarbeiter <\/b>enth&auml;lt (s. Bild 1), sowie eine Tabelle zur Herstellung der Hierarchie.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Mitarbeitertabelle &#8230;<\/span><\/b><\/p>\n<p>Diese hei&szlig;t <b>tblHierarchie <\/b>und enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>HierarchieID <\/b>zwei Fremdschl&uuml;sselfelder mit Verweisen auf die Tabelle <b>tblMitarbeiter<\/b>. Diese hei&szlig;en <b>VorgesetzterID <\/b>und <b>UntergebenerID <\/b>und bringen jeweils ein Paar zweier hierarchisch verbundener Mitarbeiter zusammen (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: &#8230; und die Tabelle zum Herstellen der Hierarchie<\/span><\/b><\/p>\n<p>Wir gehen an dieser Stelle davon aus, dass es eine Pr&uuml;fung gibt, die daf&uuml;r sorgt, dass beim Zuweisen von Vorgesetzten und Untergebenen keine Zirkelbez&uuml;ge entstehen. Im Falle der Beispieldatenbanken sorgte daf&uuml;r eine kleine Routine, welche die Mitarbeiter nach dem Zufallsprinzip jeweils einem anderen, bereits in der Hierarchie verankerten Mitarbeiter unterordnete (s. Beispieldatenbank, Modul <b>mdlHierarchie<\/b>, Prozedur <b>HierarchieSchreiben<\/b>).<\/p>\n<p>Wie aber sollen wir die hierarchisch aufgebaute Mitarbeiterstruktur in einem Bericht abbilden Grunds&auml;tzlich sollte dies in einem dem TreeView-Steuerelement &auml;hnlichen Aufbau geschehen. Das hei&szlig;t, dass die obersten Elemente der Hierarchie ganz links stehen und die untergeordneten Elemente jeweils rechts unterhalb angeordnet werden.<\/p>\n<p>Ein Beispiel f&uuml;r das gew&uuml;nschte Ergebnis zeigt der Bericht in Bild 3. Hier steht einer der Mitarbeiter der obersten Ebene ganz links oben und rechts darunter folgen die Untergebenen dieses Mitarbeiters.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Beispiel f&uuml;r die hierarchische Darstellung von Mitarbeitern im Bericht<\/span><\/b><\/p>\n<p><b>Berichte und Rekursion<\/b><\/p>\n<p>Berichte und Rekursion &#8211; das schlie&szlig;t sich grunds&auml;tzlich aus. Berichte werden linear aus der zugrunde liegenden Datenherkunft gef&uuml;llt, wobei es gegebenenfalls noch Gruppierungsebenen gibt. Das F&uuml;llen eines Berichts durch rekursives Durchlaufen der Datenherkunft ist nicht vorgesehen &#8211; zumindest nicht, wenn Sie eine herk&ouml;mmliche Datenherkunft verwenden m&ouml;chten. Eine Alternative hierzu schauen wir uns sp&auml;ter an. Zun&auml;chst jedoch bleiben wir bei der klassischen Datenherkunft.<\/p>\n<p><b>Datenherkunft vorbereiten<\/b><\/p>\n<p>Eine Datenherkunft, die den Bericht wie in der Abbildung f&uuml;llen soll, muss mindestens zwei Informationen liefern: den Namen des jeweiligen Mitarbeiters und die Hierarchieebene, der dieser angeh&ouml;rt, beziehungsweise einen Hinweis auf die Anordnung. Wenn man sich die Abbildung genau ansieht, scheint es zu reichen, wenn man die Mitarbeiter in der richtigen Reihenfolge und mit entsprechender Einr&uuml;ckung darstellt.<\/p>\n<p>Diesen Ansatz wollen wir verfolgen und erstellen zun&auml;chst eine Tabelle, welche die ben&ouml;tigten Informationen enth&auml;lt. Diese sieht wie in Bild 4 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Entwurfsansicht der Tabelle zum Speichern der Informationen zur hierarchischen Darstellung im Bericht<\/span><\/b><\/p>\n<p>Das Feld <b>MitarbeiterHierarchieID <\/b>dient als Prim&auml;rschl&uuml;ssel und als Sortierkriterium. Wir m&uuml;ssen die Hierarchie-Informationen also gleich in der richtigen Reihenfolge speichern. Das Feld <b>MitarbeiterID <\/b>speichert schlicht einen Verweis auf das Prim&auml;rschl&uuml;sselfeld der Tabelle <b>tblMitarbeiter<\/b>. <b>Ebene <\/b>schlie&szlig;lich enth&auml;lt einen Zahlenwert, der die fehlende Information liefert.<\/p>\n<p>Die Informationen aus den Tabellen <b>tblMitarbeiter <\/b>und <b>tblHierarchie <\/b>m&uuml;ssen nun so in der Tabelle <b>tblHierarchieBericht <\/b>gespeichert werden, dass die Mitarbeiter ohne Vorgesetzten im Feld <b>Ebene <\/b>den Wert <b>0 <\/b>erhalten. Ein Mitarbeiter, der einem solchen Mitarbeiter der obersten Hierarchiestufe direkt untergeben ist, erh&auml;lt im Feld <b>Ebene <\/b>den Wert <b>1 <\/b>und wird in der Reihenfolge der Datens&auml;tze direkt unterhalb des Vorgesetzten einsortiert.<\/p>\n<p>Wenn dieser wiederum Untergebene hat, folgen diese als N&auml;chstes und so weiter. Wichtig ist, dass jeder Zweig zuerst bis zur untersten Ebene abgearbeitet wird, bevor der n&auml;chste Zweig der gleichen Ebene in der Tabelle erscheint. Die Werte f&uuml;r die ersten Eintr&auml;ge des Berichts aus Bild <a href=\"#anker-31-anchor\">5<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Diese Daten stellt der Bericht hierarchisch geordnet dar.<\/span><\/b><\/p>\n<p><b>Hierarchiedaten schreiben<\/b><\/p>\n<p>Das Schreiben der Mitarbeiter in die Tabelle <b>tblHierarchieBericht <\/b>&uuml;bernehmen zwei Routinen, von denen die eine sich rekursiv selbst aufruft. Die erste Routine hei&szlig;t <b>HierarchieErmitteln <\/b>und sieht wie in Bild 6). Diese Abfrage liefert alle Mitarbeiter, die keinen &uuml;bergeordneten Mitarbeiter besitzen und somit in der obersten Ebene der Hierarchie stehen.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Diese Prozedur startet die rekursive Zusammenstellung der Datenherkunft.<\/p>\n<pre>Public Sub HierarchieErmitteln()\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim intEbene As Integer\r\n    Set db = CurrentDb\r\n    db.Execute &quot;DELETE FROM tblHierarchieBericht&quot;, dbFailOnError\r\n    Set rst = db.OpenRecordset(&quot;qryHierarchie_Top&quot;)\r\n    intEbene = 0\r\n    Do While Not rst.EOF\r\n         db.Execute &quot;INSERT INTO tblHierarchieBericht(MitarbeiterID, Ebene) VALUES(&quot; _\r\n            &amp; rst!MitarbeiterID &amp; &quot;, &quot; &amp; intEbene &amp; &quot;)&quot;\r\n        HierarchieErmittelnRekursiv db, rst!MitarbeiterID, intEbene + 1\r\n        rst.MoveNext\r\n    Loop\r\nEnd Sub<\/pre>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Diese Abfrage liefert alle Mitarbeiter der obersten Ebene.<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Das Zusammenstellen einer solchen Abfrage ist nicht gerade trivial: Sie soll alle Mitarbeiter liefern, f&uuml;r die es in der Tabelle <b>tblHierarchie <\/b>keinen Eintrag im Feld <b>UntergebenerID <\/b>gibt. Nat&uuml;rlich ist es kein Problem, Mitarbeiter mit einem bestimmten Vorgesetzten zu ermitteln &#8211; daf&uuml;r brauchen wir einfach nur die <b>MitarbeiterID <\/b>des entsprechenden Vorgesetzten als Kriterium f&uuml;r das Feld <b>VorgesetzterID <\/b>zu einer Abfrage &uuml;ber die beiden Tabellen <b>tblMitarbeiter <\/b>und <b>tblHierarchie <\/b>hinzuzuf&uuml;gen.<\/p>\n<p>Die Tabelle <b>tblHierarchie <\/b>enth&auml;lt aber nur Datens&auml;tze mit vollst&auml;ndigen Paaren aus Vorgesetztem und Untergebenem. Um aus allen Datens&auml;tzen der Tabelle <b>tblMitarbeiter <\/b>alle Eintr&auml;ge zu ermitteln, die keinen Vorgesetzten haben, m&uuml;ssen wir also alle Mitarbeiter finden, die nicht als Untergebener in der Tabelle <b>tblHierarchie <\/b>auftauchen.<\/p>\n<p>Die Abfrage f&uuml;hrt die beiden Tabellen <b>tblMitarbeiter <\/b>und <b>tblHierarchie <\/b>&uuml;ber eine Verkn&uuml;pfung zusammen, die das Prim&auml;rschl&uuml;sselfeld <b>MitarbeiterID <\/b>mit dem Fremdschl&uuml;sselfeld <b>UntergebenerID <\/b>verkn&uuml;pft, aber zus&auml;tzlich alle Datens&auml;tze der Tabelle <b>tblMitarbeiter <\/b>ber&uuml;cksichtigt, die nicht &uuml;ber <b>UntergebenerID <\/b>mit einem der Datens&auml;tze der Tabelle <b>tblHierarchie <\/b>verkn&uuml;pft sind. Und genau diese zeigt die Abfrage an, wenn Sie als Kriterium f&uuml;r <b>UntergebenerID <\/b>den Ausdruck <b>Ist Null <\/b>angeben.<\/p>\n<p>Der Rest der Routine <b>HierarchieErmitteln <\/b>ist schnell erkl&auml;rt: Sie durchl&auml;uft alle Datens&auml;tze dieser Abfrage und legt f&uuml;r jeden einen neuen Datensatz in der Tabelle <b>tblHierarchieBericht <\/b>an. Der Wert des Feldes <b>Ebene <\/b>wird dabei auf <b>0 <\/b>eingestellt. Au&szlig;erdem ruft die Routine die rekursive Prozedur <b>HierarchieErmittelnRekursiv <\/b>auf und &uuml;bergibt den Verweis auf die aktuelle Datenbank, die <b>MitarbeiterID <\/b>des soeben eingetragenen Mitarbeiters sowie den um eins erh&ouml;hten Wert der Variablen <b>intEbene<\/b>.<\/p>\n<p>Die Routine <b>HierarchieErmittelnRekursiv <\/b>funktioniert prinzipiell genau so, nur dass sie eine andere Datenherkunft verwendet und sich selbst aufruft (s. <span class=\"querverweisohneumbruch\">Listing 2<\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Der rekursive Teil des Codes zum Ermitteln der Hierarchie<\/p>\n<pre>Public Sub HierarchieErmittelnRekursiv(db As DAO.Database, lngMitarbeiterID As Long, intEbene As Integer)\r\n    Dim rst As DAO.Recordset\r\n    Set rst = db.OpenRecordset(&quot;SELECT * FROM tblHierarchie WHERE VorgesetzterID = &quot; &amp; lngMitarbeiterID, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n         db.Execute &quot;INSERT INTO tblHierarchieBericht(MitarbeiterID, Ebene) VALUES(&quot; _\r\n            &amp; rst!UntergebenerID &amp; &quot;, &quot; &amp; intEbene &amp; &quot;)&quot;\r\n        HierarchieErmittelnRekursiv db, rst!UntergebenerID, intEbene + 1\r\n        rst.MoveNext\r\n    Loop\r\nEnd Sub<\/pre>\n<p>Die Datenherkunft besteht hier schlicht aus allen Datens&auml;tzen der Tabelle <b>tblHierarchie<\/b>, deren Feld <b>VorgesetzterID <\/b>den Wert der &uuml;bergebenen Variablen <b>MitarbeiterID <\/b>enth&auml;lt &#8211; also alle Hierarchiebeziehungen zwischen Vorgesetztem und Untergebenem, f&uuml;r welche die aufrufende Prozedur soeben einen Datensatz in die Tabelle <b>tblHierarchieBericht <\/b>geschrieben hat.<\/p>\n<p>Der folgende Aufruf erfolgt dann wiederum mit dem Untergebenen des aktuellen Datensatzes der Tabelle <b>tblHierarchie<\/b>. Auf diese Weise landen schlie&szlig;lich alle Mitarbeiter in Form eines Verweises im Feld <b>MitarbeiterID <\/b>der Tabelle <b>tblHierarchieBericht<\/b>.<\/p>\n<p><b>Bericht mit rekursiven Daten f&uuml;llen<\/b><\/p>\n<p>Der Bericht schlie&szlig;lich verwendet die Tabelle <b>tblHierarchieBericht <\/b>als Datenherkunft. Am besten rufen Sie die Prozedur <b>HierarchieErmitteln<\/b> beim &Ouml;ffnen des Berichts auf, also beispielsweise in der Ereignisprozedur <b>Beim Laden<\/b>. Die Prozedur sieht dann schlicht so aus:<\/p>\n<pre>Private Sub Report_Load()\r\n    HierarchieErmitteln\r\nEnd Sub<\/pre>\n<p>Auch der Aufbau des Berichts ist schnell erledigt. Sie brauchen lediglich die beiden Felder <b>Mitarbeiter <\/b>und <b>Ebene <\/b>der Datenherkunft zum Detailbereich des Entwurfs hinzuzuf&uuml;gen (s. Bild 7). Dabei k&ouml;nnen Sie das Feld <b>Ebene <\/b>sogar noch unsichtbar machen (Eigenschaft <b>Sichtbar <\/b>auf <b>Nein <\/b>einstellen), da es nur zur Berechnung des Abstands des Mitarbeiternamens vom linken Spaltenrand dient und nicht angezeigt werden soll.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_06\/RekursiveDatenInBerichten-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Entwurfsansicht des Berichts zur Anzeige der Mitarbeiterhierarchie<\/span><\/b><\/p>\n<p>Nun fehlen nur noch zwei Schritte zur hierarchischen Mitarbeiter-Darstellung:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Legen Sie eine neue Sortierung im Bericht an, welche die angezeigten Datens&auml;tze nach dem Wert des Feldes <b>MitarbeiterhierarchieID <\/b>ordnet.<\/li>\n<li class=\"aufz-hlung\">F&uuml;gen Sie f&uuml;r die Ereigniseigenschaft <b>Beim Formatieren <\/b>des Detailbereichs die folgende Ereignisprozedur hinzu:<\/li>\n<\/ul>\n<pre>Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)\r\n    Me!Mitarbeiter.Left = Me!Ebene * 400\r\nEnd Sub<\/pre>\n<p>Diese Prozedur wird f&uuml;r jeden Datensatz einmal aufgerufen und stellt den Abstand vom linken Spaltenrand auf einen Wert ein, welcher der Hierarchieebene des Mitarbeiters entspricht.<\/p>\n<p>Durch die Kombination dieser Prozedur und der Reihenfolge der Mitarbeiter entsteht die gew&uuml;nschte Anordnung.<\/p>\n<p><b>Echte Rekursion in Berichten<\/b><\/p>\n<p>Es gibt noch eine weitere Variante, bei der die ausgebenden Daten jedoch mit einer Berichtsseite auskommen m&uuml;ssen. Dabei m&uuml;ssen Sie im Bericht selbst gar keine Steuerelemente mehr unterbringen und der Bericht verwendet auch keine Datenherkunft.<\/p>\n<p>Sie m&uuml;ssen lediglich die H&ouml;he des Detailbereichs auf den maximalen Wert einstellen. Anschlie&szlig;end k&ouml;nnen Sie gleich mit dem Hinzuf&uuml;gen der beiden Prozeduren aus <span class=\"querverweisohneumbruch\"><a href=\"#anker-34-anchor\">Listing 3<\/a><\/span> beginnen.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Rekursive Darstellung von Mitarbeiterhierarchien ohne Zwischentabelle<\/p>\n<pre>Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)\r\n    Dim db As DAO.Database\r\n    Dim rst As DAO.Recordset\r\n    Dim intEbene As Integer\r\n    Set db = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;qryHierarchie_Top&quot;)\r\n    intEbene = 0\r\n    Do While Not rst.EOF\r\n        Me.CurrentX = 0\r\n        Me.Print rst!Mitarbeiter\r\n        HierarchieRekursiv db, rst!MitarbeiterID, intEbene + 1\r\n        rst.MoveNext\r\n    Loop\r\nEnd Sub\r\nPrivate Sub HierarchieRekursiv(db As DAO.Database, lngMitarbeiterID As Long, intEbene As Integer)\r\n    Dim rst As DAO.Recordset\r\n    Set rst = db.OpenRecordset(&quot;SELECT tblMitarbeiter.* FROM tblMitarbeiter INNER JOIN tblHierarchie ON &quot; _\r\n        &amp; &quot;tblMitarbeiter.MitarbeiterID = tblHierarchie.UntergebenerID WHERE tblHierarchie.VorgesetzterID = &quot; _\r\n          &amp; lngMitarbeiterID, dbOpenDynaset)\r\n    Do While Not rst.EOF\r\n        Me.CurrentX = intEbene * 200\r\n        Me.Print rst!Mitarbeiter\r\n        HierarchieRekursiv db, rst!MitarbeiterID, intEbene + 1\r\n        rst.MoveNext\r\n    Loop\r\nEnd Sub<\/pre>\n<p>Die erste wird durch das Ereignis <b>Beim Drucken <\/b>des Detailbereichs ausgel&ouml;st. Legen Sie im Eigenschaftsfenster den Wert <b>[Ereignisprozedur] <\/b>f&uuml;r diesen Bereich an, klicken Sie auf die Schaltfl&auml;che rechts und erg&auml;nzen Sie die Ereignisprozedur <b>Detailbereich_Print <\/b>wie im Listing angegeben. F&uuml;gen Sie au&szlig;erdem die zweite Prozedur des Listings hinzu.<\/p>\n<p>Auch hier verwenden wir wieder eine Prozedur, die den rekursiven Vorgang startet, und eine weitere, die sich selbst aufruft. Die erste Prozedur verwendet wie im Beispiel mit der tempor&auml;ren Tabelle die Abfrage <b>qryHierarchie_Top <\/b>als Datenherkunft f&uuml;r ein Recordset. Dieses durchl&auml;uft die Prozedur anschlie&szlig;end und erledigt dabei jeweils drei Aufgaben:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Einstellen der aktuellen Druckposition im Detailbereich auf den linken Rand<\/li>\n<li class=\"aufz-hlung\">Direktes Drucken des Mitarbeiternamens mit der <b>Print<\/b>-Methode des <b>Report<\/b>-Objekts<\/li>\n<li class=\"aufz-hlung\">Aufrufen der Prozedur <b>HierarchieRekursiv<\/b>, um untergeordnete Datens&auml;tze auf die gleiche Art und Weise zu verarbeiten<\/li>\n<\/ul>\n<p>Dabei &uuml;bergibt die Prozedur genau wie beim obigen Beispiel einen Verweis auf das aktuelle Datenbankobjekt, die ID des Mitarbeiters sowie die Nummer der aktuellen Ebene in Form der Integer-Variablen <b>intEbene<\/b>.<\/p>\n<p>Die rekursive Prozedur <b>HierarchieRekursiv <\/b>arbeitet prinzipiell auch wieder wie die entsprechende Prozedur zum F&uuml;llen der tempor&auml;ren Tabelle, verwendet aber ein etwas ver&auml;ndertes Recordset. Dieses ber&uuml;cksichtigt nicht nur die Tabelle <b>tblHierarchie<\/b>, sondern auch noch die Tabelle <b>tblMitarbeiter<\/b>. Der Hintergrund ist schlicht, dass hier die Daten direkt in den Bericht gedruckt werden, w&auml;hrend zuvor nur die <b>MitarbeiterID <\/b>in die Tabelle <b>tblMitarbeiterHierarchie <\/b>geschrieben werden sollte. Im aktuellen Fall soll das Recordset daher direkt den Mitarbeiternamen mitliefern.<\/p>\n<p>Die Prozedur <b>HierarchieRekursiv <\/b>durchl&auml;uft ebenfalls alle Datens&auml;tze des ermittelten Recordsets. Dabei verschiebt sie den Beginn des Mitarbeiternamens in Abh&auml;ngigkeit von der aktuellen Ebene aus <b>intEbene <\/b>entsprechend nach rechts und druckt erst dann den Mitarbeiternamen.<\/p>\n<p>Der Nachteil dieser Vorgehensweise ist, dass nur eine Berichtsseite gef&uuml;llt werden kann. F&uuml;r einfache Hierarchien reicht dies jedoch aus.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zusammenfassung und Ausblick<\/p>\n<p>Wenn man ein wenig ins Detail geht, l&auml;sst sich aus Access-Berichten viel herausholen. Dabei muss man jedoch alle Register ziehen und verschiedene Ans&auml;tze pr&uuml;fen: F&uuml;r manche Konstellationen m&uuml;ssen die auszugebenden Daten schlicht vorher speziell f&uuml;r die Ausgabe in einem Bericht aufbereitet und in einer tempor&auml;ren Tabelle gespeichert werden, andere erfordern ein wenig Tricksereien im Berichtsentwurf selbst.<\/p>\n<p>Mit den weiteren Methoden zum manuellen Bearbeiten der Berichtsausgabe lassen sich sicher noch optische Erweiterungen hinzuf&uuml;gen &#8211; beispielsweise Linien zum Verbinden der verschiedenen Mitarbeiterebenen etwa wie im TreeView-Steuerelement. Sollten Sie experimentierfreudig sein, helfen Ihnen die Stichw&ouml;rter <b>Line<\/b>, <b>Circle<\/b>, <b>CurrentX<\/b> oder <b>CurrentY <\/b>sicher weiter.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>HierarchischeBerichte.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{F4298E19-EE53-415E-8A6C-72FC69AAC06E}\/aiu_750.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Reflexive Daten kommen immer mal wieder vor &#8211; bei der Abbildung der Mitarbeiterhierarchie, in St&uuml;cklisten oder auch in Aufgabenlisten. Das das Treeview-Steuerelement das geeignete Mittel zur Abbildung dieser Strukturen in Formularen ist, hat sich mittlerweile herumgesprochen. Aber wie bringt man diese Daten in Berichten unter Dieser Beitrag zeigt, wie Sie Daten aus reflexiv verkn&uuml;pften Tabellen f&uuml;r die Anzeige in Berichten vorbereiten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662010,66062010,44000024],"tags":[],"class_list":["post-55000750","post","type-post","status-publish","format-standard","hentry","category-662010","category-66062010","category-Berichte_und_Reporting"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Reflexive Daten in Berichten - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reflexive Daten in Berichten\" \/>\n<meta property=\"og:description\" content=\"Reflexive Daten kommen immer mal wieder vor - bei der Abbildung der Mitarbeiterhierarchie, in St&uuml;cklisten oder auch in Aufgabenlisten. Das das Treeview-Steuerelement das geeignete Mittel zur Abbildung dieser Strukturen in Formularen ist, hat sich mittlerweile herumgesprochen. Aber wie bringt man diese Daten in Berichten unter Dieser Beitrag zeigt, wie Sie Daten aus reflexiv verkn&uuml;pften Tabellen f&uuml;r die Anzeige in Berichten vorbereiten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:08:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Reflexive Daten in Berichten\",\"datePublished\":\"2020-05-22T22:08:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/\"},\"wordCount\":1940,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/2172e00b47e5461db5df2e2b7b1845ee\",\"articleSection\":[\"2010\",\"6\\\/2010\",\"Berichte und Reporting\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/\",\"name\":\"Reflexive Daten in Berichten - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/2172e00b47e5461db5df2e2b7b1845ee\",\"datePublished\":\"2020-05-22T22:08:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/2172e00b47e5461db5df2e2b7b1845ee\",\"contentUrl\":\"http:\\\/\\\/vg04.met.vgwort.de\\\/na\\\/2172e00b47e5461db5df2e2b7b1845ee\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Reflexive_Daten_in_Berichten\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reflexive Daten in Berichten\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Reflexive Daten in Berichten - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/","og_locale":"de_DE","og_type":"article","og_title":"Reflexive Daten in Berichten","og_description":"Reflexive Daten kommen immer mal wieder vor - bei der Abbildung der Mitarbeiterhierarchie, in St&uuml;cklisten oder auch in Aufgabenlisten. Das das Treeview-Steuerelement das geeignete Mittel zur Abbildung dieser Strukturen in Formularen ist, hat sich mittlerweile herumgesprochen. Aber wie bringt man diese Daten in Berichten unter Dieser Beitrag zeigt, wie Sie Daten aus reflexiv verkn&uuml;pften Tabellen f&uuml;r die Anzeige in Berichten vorbereiten.","og_url":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:08:31+00:00","og_image":[{"url":"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Reflexive Daten in Berichten","datePublished":"2020-05-22T22:08:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/"},"wordCount":1940,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee","articleSection":["2010","6\/2010","Berichte und Reporting"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/","url":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/","name":"Reflexive Daten in Berichten - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#primaryimage"},"thumbnailUrl":"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee","datePublished":"2020-05-22T22:08:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#primaryimage","url":"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee","contentUrl":"http:\/\/vg04.met.vgwort.de\/na\/2172e00b47e5461db5df2e2b7b1845ee"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Reflexive_Daten_in_Berichten\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Reflexive Daten in Berichten"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000750"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000750\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}