{"id":55000738,"date":"2010-10-01T00:00:00","date_gmt":"2020-05-22T22:07:14","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=738"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Tabellen_und_Felder_dokumentieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/","title":{"rendered":"Tabellen und Felder dokumentieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Dokumentation von Datenbankanwendungen ist bei den meisten Entwicklern nicht besonders beliebt. M&ouml;glicherweise liegt der Grund schlicht darin, dass die Programmierarbeiten meist schon erledigt sind, wenn einem einf&auml;llt, dass der Kunde noch um eine ausf&uuml;hrliche Dokumentation bat. Der vorliegende Beitrag soll zumindest die Dokumentation von Tabellen, Feldern und Co. so weit vereinfachen, dass Sie keinen Grund mehr haben, die Dokumentation an das &auml;u&szlig;erste Ende des Projekts zu verschieben.<\/b><\/p>\n<p>Zur Dokumentation eines Datenmodells geh&ouml;ren eigentlich zwei Stufen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Erfassung der Dokumentation, die mindestens die Beschreibung der Tabellen und der enthaltenen Felder enthalten sollte.<\/li>\n<li class=\"aufz-hlung\">Die Ausgabe der Dokumentation in einem geeigneten Medium, beispielsweise als Access-Bericht, Word-Dokument oder HTML-Seite.<\/li>\n<\/ul>\n<p>Beides kann in einem einzigen Schritt durchgef&uuml;hrt werden: Sie erstellen einfach das Zieldokument, beispielsweise mit Word, legen einige Absatzformatvorlagen fest um die Dokumentation zu strukturieren und tragen dann die Beschreibung der Tabellen und Felder ein.<\/p>\n<p>Dies hat den Nachteil, dass &auml;nderungen in der zugrunde liegenden Datenbank meist nicht gleich in die Dokumentation &uuml;bertragen werden &#8211; und dies sp&auml;ter zu erledigen, d&uuml;rfte zu einer unangenehmen Arbeit werden. Sie m&uuml;ssen dann n&auml;mlich erstmal herausfinden, an welchen Stellen die Dokumentation nun nicht mehr dem aktuellen Stand des Datenmodells entspricht.<\/p>\n<p>Besser ist es, die zwei Stufen wie oben beschrieben zu realisieren. Das hei&szlig;t, dass Sie die Beschreibung der Tabellen und Felder gleich in den entsprechenden, im Entwurf zur Verf&uuml;gung stehenden Eigenschaften unterbringen.<\/p>\n<p>Tabellen und Felder stellen jeweils eine eigene Eigenschaft namens <b>Beschreibung <\/b>zur Verf&uuml;gung, die Sie an folgenden Stellen anpassen k&ouml;nnen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Im Tabellenentwurf stellen Sie die Beschreibung der Tabelle im gleichnamigen Eintrag des Eigenschaftsfensters ein.<\/li>\n<li class=\"aufz-hlung\">Ebenfalls dort legen Sie die Beschreibung der Felder an, und zwar gleich in der jeweiligen Zeile eines Feldes in der Spalte <b>Beschreibung<\/b>.<\/li>\n<li class=\"aufz-hlung\">Zus&auml;tzlich k&ouml;nnen Sie die Beschreibung einer Tabelle im Dialog <b>Tabelleneigenschaften <\/b>eintragen, den Sie &uuml;ber den Kontextmen&uuml;eintrag <b>Tabelleneigenschaften <\/b>der Tabellen im Datenbankfenster (Access 2003 und &auml;lter) beziehungsweise im Navigationsbereich (Access 2007 und j&uuml;nger) &ouml;ffnen.<\/li>\n<\/ul>\n<p>W&auml;hrend nur letztere M&ouml;glichkeit auf den ersten Blick die mehrzeilige Eingabe anbietet, k&ouml;nnen Sie vom Tabellenentwurf aus durch Markieren der entsprechenden Eigenschaft und anschlie&szlig;endes Dr&uuml;cken von <b>Umschalt + F2 <\/b>das Zoom-Fenster &ouml;ffnen. Hier finden Sie ein wenig mehr Platz zum Eingeben auch mehrzeiliger Beschreibungstexte.<\/p>\n<p><b>Was geh&ouml;rt in eine Dokumentation<\/b><\/p>\n<p>Der Beschreibungstext ist am ehesten f&uuml;r Au&szlig;enstehende interessant. Der Entwickler einer Datenbankanwendung k&ouml;nnte sich die Dokumentation neben den Rechner legen, um beispielsweise schnell einmal einen Tabellen- oder Feldnamen nachzuschlagen, weil er gerade mit der Nase im VBA-Editor steckt, ein SQL-Statement zusammenbaut und nicht dauernd zwischen VBA-Editor und dem Tabellenentwurf wechseln m&ouml;chte. Davon abgesehen sollten wir die Dokumentation nicht nur mit Tabellen- und Feldnamen sowie deren Beschreibungstexten, sondern auch mit weiteren Informationen f&uuml;ttern. F&uuml;r Tabellen sind folgende Einstellungen aus dem Eigenschaftsfenster interessant (s. Bild 1):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Eigenschaftsfenster einer Tabelle in der Entwurfsansicht<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">G&uuml;ltigkeitsregel<\/li>\n<li class=\"aufz-hlung\">G&uuml;ltigkeitsmeldung<\/li>\n<\/ul>\n<p>Die Tabellenfelder geben neben dem Feldnamen und der Beschreibung noch wesentlich mehr wichtige Eigenschaften her (s. Bild 2):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: &Uuml;bersicht der Felder und ihrer Eigenschaften in der Tabellenentwurfsansicht<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Felddatentyp<\/li>\n<li class=\"aufz-hlung\">Feldgr&ouml;&szlig;e<\/li>\n<li class=\"aufz-hlung\">Eingabeformat<\/li>\n<li class=\"aufz-hlung\">Beschriftung<\/li>\n<li class=\"aufz-hlung\">Standardwert<\/li>\n<li class=\"aufz-hlung\">G&uuml;ltigkeitsregel<\/li>\n<li class=\"aufz-hlung\">G&uuml;ltigkeitsmeldung<\/li>\n<li class=\"aufz-hlung\">Eingabe erforderlich<\/li>\n<li class=\"aufz-hlung\">Leere Zeichenfolge<\/li>\n<li class=\"aufz-hlung\">Indiziert<\/li>\n<li class=\"aufz-hlung\">Unicode-Kompression<\/li>\n<\/ul>\n<p>F&uuml;r Felder, die als Nachschlagefeld definiert sind, gibt es sogar noch eine ganze Reihe weiterer Eigenschaften (s. Bild 3). Die wichtigsten finden Sie in dieser Auflistung:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Als Nachschlagefeld definierte Felder liefern noch mehr dokumentationswerte Eigenschaften.<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Steuerelement anzeigen<\/li>\n<li class=\"aufz-hlung\">Herkunftstyp<\/li>\n<li class=\"aufz-hlung\">Datensatzherkunft<\/li>\n<li class=\"aufz-hlung\">Gebundene Spalte<\/li>\n<li class=\"aufz-hlung\">Spaltenanzahl<\/li>\n<li class=\"aufz-hlung\">Spaltenbreiten<\/li>\n<\/ul>\n<p><b>Indizes dokumentieren<\/b><\/p>\n<p>Es gibt in Access verschiedene Index-Arten: Einfache Indizes, die lediglich die Suche nach den Werten des indizierten Feldes beschleunigen, eindeutige Indizes, die daf&uuml;r sorgen, dass ein Wert nur einmal je Tabelle vorkommt, und Prim&auml;rschl&uuml;ssel, die als eindeutige Merkmale einer Tabelle dienen. Jede Indexart kann sich &uuml;berdies auf ein oder mehrere Felder beziehen.<\/p>\n<p><b>Beziehungen dokumentieren<\/b><\/p>\n<p>Neben den Tabellen und ihren Feldern sollen auch die Beziehungen zwischen den Tabellen dokumentiert werden. Diese finden Sie in der Benutzeroberfl&auml;che von Access unter Umst&auml;nden nur mit M&uuml;he: Beziehungen werden zwar im Beziehungen-Fenster festgelegt, aber Sie k&ouml;nnen dort Tabellen ein- und ausblenden.<\/p>\n<p>Und mit den Tabellen verschwinden dann auch die Beziehungspfeile, welche die Beziehung charakterisieren. <\/p>\n<p>Dennoch sollen die Beziehungen in einer Dokumentation entsprechend gew&uuml;rdigt werden.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Konzept f&uuml;r den Aufbau der Dokumentation<\/p>\n<p>Bevor wir uns an die technische Umsetzung begeben, sollten wir uns ein paar Gedanken &uuml;ber den Aufbau der Dokumentation machen. Die oberste Einheit in der Struktur der Dokumentation ist die Datenbankanwendung. Gleich darunter folgen die Tabellen. Jede Tabelle enth&auml;lt Felder, also werden diese unterhalb der Tabellen angeordnet.<\/p>\n<p>Indizes beziehen sich auf ein oder mehrere Felder.Daher sollen Indizes auf der gleichen Ebene wie die Felder dargestellt werden, allerdings im Anschluss an diese.<\/p>\n<p>Beziehungen betreffen zwar in der Regel jeweils immer nur ein Feld einer Tabelle, aber da Felder auch in mehrere Beziehungen verstrickt sein k&ouml;nnen, landen auch diese auf der gleichen Ebene wie die Tabellenfelder.<\/p>\n<p>Die Eigenschaften von Tabellen, Feldern, Indizes und Beziehungen landen jeweils eine Ebene unterhalb des Objekts, auf das sie sich beziehen.<\/p>\n<p><b>Der Datenbankdokumentierer<\/b><\/p>\n<p>Access enth&auml;lt von Haus aus bereits einen Datenbankdokumentierer. Dieser bietet zwar eine halbwegs durchdachte Benutzeroberfl&auml;che (s. Bild 4), aber die Dokumentation landet in einem Bericht, der sich nur bedingt zur Weiterverarbeitung eignet.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Access bietet ebenfalls einen Datenbank-Dokumentierer. Dieser liefert sein Ergebnis jedoch nur als Bericht.<\/span><\/b><\/p>\n<p>Mit den nachfolgend vorgestellten Techniken wollen wir uns nicht auf Berichte beschr&auml;nken, sondern verschiedene Ausgabem&ouml;glichkeiten erlauben.<\/p>\n<p><b>Technische Umsetzung: Daten sammeln<\/b><\/p>\n<p>Wir gehen in folgenden Schritten vor: Als Erstes schauen wir, wie wir an die ben&ouml;tigten Informationen gelangen (Tabellen, Felder, Indizes und Beziehungen). Anschlie&szlig;end entwickeln wir die Techniken zum Ausgeben dieser Daten in verschiedenen Formaten.<\/p>\n<p>Entsprechend unserer Struktur geben wir dabei erst den Datenbanknamen aus und dann die Tabellen mit ihren Eigenschaften. F&uuml;r jede Tabelle folgen in einer weiteren Ebene die Felder, Indizes und Beziehungen, ebenfalls mit den jeweiligen Eigenschaften.<\/p>\n<p>Die folgenden Abschnitte beschreiben dabei die grundlegenden Techniken zum Ermitteln der Informationen f&uuml;r die Tabellendokumentation.<\/p>\n<p><b>Tabellen ermitteln <\/b><\/p>\n<p>Die Tabellen und ihre Eigenschaften erhalten wir &uuml;ber die <b>TableDefs<\/b>-Auflistung des <b>Database<\/b>-Objekts. Die folgenden Zeilen zeigen, wie Sie alle Tabellen einer Datenbank durchlaufen und einige ihrer Eigenschaften im Direktfenster ausgeben k&ouml;nnen:<\/p>\n<pre>Public Sub TabellenErmitteln()\r\n    Dim db As DAO.Database\r\n    Dim tdf As DAO.TableDef\r\n    Set db = CurrentDb\r\n    For Each tdf In db.TableDefs\r\n         Debug.Print tdf.Name, tdf.DateCreated\r\n    Next tdf\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Um Systemtabellen auszuschlie&szlig;en, die mit <b>MSys&#8230; <\/b>oder <b>USys&#8230; <\/b>beginnen, k&ouml;nnen Sie innerhalb der <b>For Each<\/b>-Schleife eine entsprechende Bedingung einarbeiten:<\/p>\n<pre>If Not (tdf.Name Like &quot;MSys*&quot; Or tdf.Name Like &quot;USys*&quot;) Then\r\n    Debug.Print tdf.Name, tdf.DateCreated\r\nEnd If<\/pre>\n<p>Das <b>TableDef<\/b>-Objekt bietet noch weitere Eigenschaften, die wir f&uuml;r die Dokumentation verwenden k&ouml;nnen.<\/p>\n<p><b>Felder und ihre Eigenschaften ermitteln<\/b><\/p>\n<p>Wenn Sie einmal auf ein <b>TableDef<\/b>-Objekt zugreifen, ist der Weg zur <b>Fields<\/b>-Auflistung nicht mehr weit &#8211; und die erm&ouml;glicht den Zugriff auf alle <b>Field<\/b>-Objekte einer Tabelle, sprich: auf die Felder.<\/p>\n<p>Die folgende Beispielprozedur k&ouml;nnen Sie von der obigen Prozedur zum Ausgeben aller Tabellen aus aufrufen &#8211; zum Beispiel mit der folgenden Anweisung:<\/p>\n<pre>Call FelderErmitteln(tdf)<\/pre>\n<p>Die Prozedur durchl&auml;uft alle <b>Field<\/b>-Elemente der <b>Fields<\/b>-Auflistung des als Parameter &uuml;bergebenen <b>TableDef<\/b>-Objekts und gibt einige der Eigenschaften aus:<\/p>\n<pre>Public Sub FelderErmitteln(tdf As DAO.TableDef)\r\n    Dim fld As DAO.Field\r\n    For Each fld In tdf.Fields\r\n         Debug.Print fld.Name, fld.Type, fld.Size\r\n    Next fld\r\nEnd Sub<\/pre>\n<p><b>Indizes ermitteln<\/b><\/p>\n<p>Auch auf die Indizes einer Tabelle k&ouml;nnen Sie per DAO zugreifen. Dazu liefert das <b>TableDef<\/b>-Objekt eine Auflistung namens <b>Indexes<\/b>. Jeder Index kann ein oder mehrere Felder betreffen. Dementsprechend enth&auml;lt das <b>Index<\/b>-Objekt wiederum eine <b>Fields<\/b>-Auflistung, &uuml;ber die Sie alle Felder des Indexes abfragen k&ouml;nnen. Die folgende Beispielprozedur rufen Sie wiederum f&uuml;r jedes <b>TableDef<\/b>-Objekt einmal auf:<\/p>\n<pre>Call IndizesErmitteln(tdf)<\/pre>\n<p>Die Prozedur durchl&auml;uft erst alle Elemente der <b>Indexes<\/b>-Auflistung und gibt einige Eigenschaften des aktuellen Indexes aus. Danach durchl&auml;uft sie alle Felder des Indexes und gibt auch diese aus:<\/p>\n<pre>Public Sub IndizesErmitteln(tdf As DAO.TableDef)\r\n    Dim idx As DAO.Index\r\n    Dim fld As DAO.Field\r\n    For Each idx In tdf.Indexes\r\n         Debug.Print idx.Name, idx.Primary, idx.Foreign, idx.IgnoreNulls\r\n        For Each fld In idx.Fields\r\n            Debug.Print &quot; &quot; &amp; fld.Name\r\n        Next fld\r\n    Next idx\r\nEnd Sub<\/pre>\n<p><b>Beziehungen ermitteln<\/b><\/p>\n<p>Die Beziehungen wiederum befinden sich im Objektmodell nicht unterhalb der <b>TableDef<\/b>-Objekte, sondern auf der gleichen Ebene. Das scheint auch logisch, denn schlie&szlig;lich betrifft jede Beziehung zwei Tabellen und verbindet diese.<\/p>\n<p><!--30percent--><\/p>\n<p>Die folgende Beispielprozedur liefert alle Beziehungen der aktuellen Datenbank. <b>ForeignTable <\/b>liefert dabei die Tabelle, die das Prim&auml;rschl&uuml;sselfeld der Beziehung enth&auml;lt, <b>Table <\/b>die Tabelle mit dem Fremdschl&uuml;sselfeld.<\/p>\n<p>Die <b>Fields<\/b>-Auflistung liefert in der Regel nur ein <b>Field<\/b>-Objekt (au&szlig;er, Sie erstellen eine Beziehung mit zwei Feldern jeder Tabelle &#8211; dies sollten Sie jedoch vermeiden).<\/p>\n<p>Dieses <b>Field<\/b>-Objekt liefert &uuml;ber die Eigenschaft <b>Name <\/b>das Feld der Tabelle mit dem Prim&auml;rschl&uuml;ssel. Den Namen des Fremdschl&uuml;sselfeldes finden Sie mit der Eigenschaft <b>ForeignName <\/b>des <b>Field<\/b>-Objekts heraus.<\/p>\n<pre>Public Sub BeziehungenErmitteln()\r\n    Dim db As DAO.Database\r\n    Dim rel As DAO.Relation\r\n    Dim fld As DAO.Field\r\n    Set db = CurrentDb\r\n    For Each rel In db.Relations\r\n         Debug.Print rel.Name, rel.Table, rel.ForeignTable\r\n        For Each fld In rel.Fields\r\n            Debug.Print &quot; &quot; &amp; fld.Name, fld.ForeignName\r\n        Next fld\r\n    Next rel\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Damit haben Sie alle Informationen zusammen, die eine Dokumentation der Tabellen erfordert &#8211; wir haben zwar nur jeweils ein paar Eigenschaften der betroffenen Objekte untersucht, aber das reicht f&uuml;r den Anfang. Die &uuml;brigen Elemente schauen wir uns sp&auml;ter an.<\/p>\n<p><b>Struktur und Inhalt der Dokumentation<\/b><\/p>\n<p>Normalerweise wird eine Tabellendokumentation etwa in diesem Schema aufgebaut sein:<\/p>\n<pre>Datenbank\r\n    Tabelle 1\r\n        Feld 1\r\n        Feld 2\r\n        ...\r\n        Index 1\r\n        Index 2\r\n        ...\r\n        Beziehung 1\r\n        Beziehung 2\r\n        ...\r\n    Tabelle 2\r\n    ...<\/pre>\n<p>Beim Schreiben der Informationen in das Direktfenster kann man einfach alle Informationen heruntertippen &#8211; gegebenenfalls verwendet man noch ein paar Einr&uuml;ckungen, um die Struktur zu verdeutlichen.<\/p>\n<p>Sollen die Daten in ein XML-Dokument geschrieben werden, sieht dies schon anders aus. XML basiert darauf, dass es zu jedem Element ein &ouml;ffnendes und ein schlie&szlig;endes Tag gibt:<\/p>\n<pre>&lt;database&gt;&lt;\/database&gt;<\/pre>\n<p>Dies kann, wenn sich keine Elemente dazwischen befinden, auch zu einem Element zusammengefasst werden:<\/p>\n<pre>&lt;database \/&gt;<\/pre>\n<p>In unserem Fall brauchen wir allerdings einige Verschachtelungen:<\/p>\n<pre>&lt;database&gt;\r\n    &lt;tables&gt;\r\n        &lt;table name=&quot;tblAdressen&quot;&gt;\r\n            &lt;fields&gt;\r\n                &lt;field name=&quot;AdresseID&quot; ...&gt;\r\n                &lt;\/field&gt;\r\n            &lt;\/fields&gt;\r\n            &lt;indexes&gt;\r\n                ...\r\n            &lt;\/indexes&gt;\r\n            &lt;relations&gt;\r\n                ...\r\n            &lt;\/relations&gt;\r\n        &lt;\/table&gt;\r\n        &lt;table name=&quot;tblAnreden&quot;&gt;\r\n            ...\r\n        &lt;\/table&gt;\r\n    &lt;\/tables&gt;\r\n&lt;\/database&gt;<\/pre>\n<p>Das hei&szlig;t, dass unsere Prozedur nicht nur einfach die Elemente des Datenmodells herunterbeten muss, sondern auch noch zu ber&uuml;cksichtigen hat, dass jedes ausgegebene Element eventuell auch noch ein schlie&szlig;endes Element ben&ouml;tigt.<\/p>\n<p>Wir m&uuml;ssen den Aufruf der Methoden zum eigentlichen Ausgeben also so strukturieren, dass wir zum Beispiel im Falle einer XML-Dokumentation eine Verschachtelung abbilden k&ouml;nnen.<\/p>\n<p>Auch ein Export in ein Word-Dokument k&ouml;nnte dies erfordern: Vielleicht m&ouml;chte ja jemand die Eigenschaften der Felder einer Tabelle in einer Word-Tabelle abbilden und anschlie&szlig;end eine Tabellenunterschrift ausgeben.<\/p>\n<p>Dann w&auml;re es sinnvoll, eine Prozedur zu haben, die im Anschluss an die Ausgabe der Felder einer Tabelle aufgerufen werden kann.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Struktur der verwendeten Module und Klassen<\/p>\n<p>Wie bereits erw&auml;hnt, kann es durchaus interessant sein, die Dokumentation in verschiedenen Formaten zu exportieren &#8211; Direktfenster, Word, XML und HTML sind nur ein paar M&ouml;glichkeiten. Um m&ouml;glichst wenig Code mehrmals schreiben zu m&uuml;ssen, arbeiten wir mit drei Komponenten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die erste ist eine Schnittstelle, also eine Klasse, die alle Methoden definiert, die f&uuml;r die Ausgabe der Dokumentation ben&ouml;tigt werden. Den Inhalt dieser Klasse namens <b>IDatabaseDocumentation <\/b>finden Sie in <a href=\"#anker-17-anchor\">Listing 1<\/a>.<\/li>\n<p class=\"listingueberschrift\">Die zweite ist eine Klasse, die mit der Anweisung <b>Implements IDatabaseDocumentation <\/b>als Implementierung der oben genannten Schnittstelle definiert wird. Sie enth&auml;lt den Code, der nach dem Aufruf der Methoden der Implementierung ausgef&uuml;hrt werden soll. Beispiele f&uuml;r diese Implementierung schauen wir uns gleich im Detail an.<\/p>\n<li class=\"aufz-hlung\">Die dritte f&uuml;gt alles zusammen: Die Methode <b>TabellenUndFelderDokumentieren <\/b>im Modul <b>mdlDokumentation <\/b>deklariert ein Objekt auf Basis der Schnittstelle, erzeugt eine konkrete Instanz auf Basis der implementierenden Klasse und ruft dann ihre Methoden auf.<\/li>\n<\/ul>\n<p class=\"listingueberschrift\">Listing 1: Diese Schnittstelle definiert alle Methoden f&uuml;r die Ausgabe des Datenmodells.<\/p>\n<pre>Public Sub StartDocumentation(strDatabase As String, strPath As String, db As DAO.Database)\r\nEnd Sub\r\nPublic Sub StartPrintTables(intTableCount As Integer, cancel As Boolean)\r\nEnd Sub\r\nPublic Sub StartPrintTable(strTablename As String, strDescription As String, tdf As DAO.TableDef)\r\nEnd Sub\r\nPublic Sub StartPrintFields(intFieldCount As Integer, cancel As Boolean)\r\nEnd Sub\r\nPublic Sub StartPrintField(strField As String, strFieldtype As String, intFieldsize As Integer,  fld As DAO.Field)\r\nEnd Sub\r\nPublic Sub FinishPrintField()\r\nEnd Sub\r\nPublic Sub FinishPrintFields()\r\nEnd Sub\r\nPublic Sub StartPrintIndexes(intIndexesCount As Integer, cancel As Boolean)\r\nEnd Sub\r\nPublic Sub StartPrintIndex(strName As String, idx As DAO.Index)\r\nEnd Sub\r\nPublic Sub FinishPrintIndex()\r\nEnd Sub\r\nPublic Sub FinishPrintIndexes()\r\nEnd Sub\r\nPublic Sub StartPrintRelations(intRelationCount As Integer, cancel As Boolean)\r\nEnd Sub\r\nPublic Sub StartPrintRelation(strTable1 As String, strTable2 As String, strField1 As String, _\r\nstrField2 As String, rel As DAO.Relation)\r\nEnd Sub\r\nPublic Sub FinishPrintRelation()\r\nEnd Sub\r\nPublic Sub FinishPrintRelations()\r\nEnd Sub\r\nPublic Sub FinishPrintTable()\r\nEnd Sub\r\nPublic Sub FinishPrintTables()\r\nEnd Sub\r\nPublic Sub FinishDocumentation()\r\nEnd Sub<\/pre>\n<p>Die Grundlagen zu dieser Vorgehensweise finden Sie im Beitrag <b>Schnittstellenvererbung <\/b>(<b>www.access-im-unternehmen.de\/734<\/b>).<\/p>\n<p><b>Die Schnittstelle<\/b><\/p>\n<p>Die Schnittstelle dieser L&ouml;sung (s. <a href=\"#anker-17-anchor\">Listing 1<\/a>) enth&auml;lt eine ganze Reihe Prozeduren, von denen die meisten dazu dienen, die Ausgabe von Tabellen, Feldern, Indizes oder Beziehungen einzuleiten oder zu beenden, damit man auch bei Verwendung von Formaten wie XML alle &ouml;ffnenden und schlie&szlig;enden Tags setzen kann.<\/p>\n<p>Sie werden nicht alle immer ben&ouml;tigen &#8211; die Ausgabe ins Direktfenster beispielsweise verwendet die Prozeduren, die das Beenden der Ausgabe etwa der Felder einer Tabelle ank&uuml;ndigt, nur zu kosmetischen Zwecken (hier f&uuml;r die Ausgabe einer Leerzeile).<\/p>\n<p>Einige der Prozeduren erwarten Parameter. Dabei handelt es sich jeweils um die Prozeduren, welche die Ausgabe eines bestimmten Objekttyps einleiten, zum Beispiel <b>StartPrintTables<\/b>. Dieser Prozedur &uuml;bergeben wir sp&auml;ter als Parameter die Anzahl der Tabellen und einen Variable zum Aufnehmen des R&uuml;ckgabewertes <b>Cancel<\/b>.<\/p>\n<p>Auf diese Weise soll die Implementierung dieser Prozedur auf die Anzahl der im Anschluss auszugebenden Tabellen reagieren k&ouml;nnen. Wenn die Datenbank keine Tabellen enth&auml;lt, wird der Wert <b>0 <\/b>f&uuml;r den Parameter <b>intTableCount <\/b>&uuml;bergeben.<\/p>\n<p>Die Implementierung dieser Prozedur mag darauf reagieren, indem sie dem Parameter <b>Cancel <\/b>den Wert <b>True <\/b>&uuml;bergibt, damit die aufrufende Prozedur die folgenden Prozeduren gar nicht erst ber&uuml;cksichtigt:<\/p>\n<pre>Public Sub StartPrintTables(intTableCount As Integer, cancel As Boolean)\r\nEnd Sub<\/pre>\n<p>Das Zusammenspiel der drei Elemente dieser L&ouml;sung wird vermutlich erst klar, wenn wir uns die Prozedur <b>TabellenUndFelderDokumentieren <\/b>selbst ansehen (s. <a href=\"#anker-18-anchor\">Listing 2<\/a>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Diese Schnittstelle definiert alle Methoden f&uuml;r die Ausgabe des Datenmodells.<\/p>\n<pre>Public Sub TabellenUndFelderDokumentieren()\r\n    Dim objDoku As IDatabaseDocumentation\r\n    Set objDoku = New clsDatabaseDocumentation_Debugwindow\r\n    Set db = CurrentDb\r\n    objDoku.StartDocumentation CurrentProject.Name, CurrentProject.Path, db\r\n    For Each tdf In db.TableDefs\r\n         If Not tdf.Name Like &quot;MSys*&quot; And Not tdf.Name Like &quot;USys*&quot; Then\r\n            intTableCount = intTableCount + 1\r\n        End If\r\n    Next tdf\r\n    objDoku.StartPrintTables intTableCount, bolCancel\r\n    If bolCancel = False Then\r\n         For Each tdf In db.TableDefs\r\n            If Not tdf.Name Like &quot;MSys*&quot; And Not tdf.Name Like &quot;USys*&quot; Then\r\n                On Error Resume Next\r\n                strTableDescription = tdf.Properties(&quot;Description&quot;)\r\n                On Error GoTo 0\r\n                objDoku.StartPrintTable tdf.Name, strTableDescription, tdf\r\n                objDoku.StartPrintFields tdf.Fields.Count, bolCancel\r\n                If bolCancel = False Then\r\n                    For Each fld In tdf.Fields\r\n                        objDoku.StartPrintField fld.Name, fld.Type, fld.Size, fld\r\n                        objDoku.FinishPrintField\r\n                    Next fld\r\n                End If\r\n                objDoku.FinishPrintFields\r\n                objDoku.StartPrintIndexes tdf.Indexes.Count, bolCancel\r\n                If bolCancel = False Then\r\n                    For Each idx In tdf.Indexes\r\n                        objDoku.StartPrintIndex idx.Name, idx\r\n                        objDoku.FinishPrintIndex\r\n                    Next idx\r\n                End If\r\n                objDoku.FinishPrintIndexes\r\n                For Each rel In db.Relations\r\n                    If rel.Table = tdf.Name Or rel.ForeignTable = tdf.Name Then\r\n                        intRelationCount = intRelationCount + 1\r\n                    End If\r\n                Next rel\r\n                objDoku.StartPrintRelations intRelationCount, bolCancel\r\n                If bolCancel = False Then\r\n                    For Each rel In db.Relations\r\n                        If rel.Table = tdf.Name Or rel.ForeignTable = tdf.Name Then\r\n                            objDoku.StartPrintRelation rel.Table, rel.ForeignTable, _\r\n                                rel.Fields(0).Name, rel.Fields(0).ForeignName, rel\r\n                            objDoku.FinishPrintRelation\r\n                        End If\r\n                    Next rel\r\n                End If\r\n                objDoku.FinishPrintRelations\r\n            End If\r\n            objDoku.FinishPrintTable\r\n        Next tdf\r\n    End If\r\n    objDoku.FinishPrintTables\r\n    objDoku.FinishDocumentation\r\nEnd Sub<\/pre>\n<p>Diese Prozedur steuert die Erstellung der Dokumentation auf Basis der durch die Implementierung der Schnittstelle <b>IDatabaseDocumentation <\/b>vorgegebenen Ausgabevorschriften.<\/p>\n<p>Dies beginnt mit der Deklaration der Objektvariablen <b>objDoku <\/b>auf Basis der Schnittstellenklasse und der anschlie&szlig;enden Instanzierung auf Basis der konkreten Klasse <b>clsDatabaseDocumentation_DebugWindow<\/b>, die in diesem Falle die Dokumentation im Direktfenster von Access ausgibt:<\/p>\n<pre>Dim objDoku As IDatabaseDocumentation\r\nSet objDoku = New\r\nclsDatabaseDocumentation_Debugwindow<\/pre>\n<p>Als Erstes ruft diese Prozedur die Methode <b>StartDocumentation <\/b>auf und &uuml;bergibt Datenbankname, Datenbankpfad sowie das Datenbankobjekt selbst.<\/p>\n<p>Die ersten beiden k&ouml;nnen Sie gleich ausgeben, auf das in der Objektvariablen <b>db <\/b>gespeicherte <b>Database<\/b>-Objekt greifen Sie in der Implementierung der Methode <b>StartDocumentation <\/b>selbst nach Belieben zu, um weitere Details zu liefern:<\/p>\n<pre>objDoku.StartDocumentation\r\nCurrentProject.Name, CurrentProject.Path, db<\/pre>\n<p>Von hier aus werfen wir einen kurzen Blick auf die Implementierung dieser Methode im Klassenmodul <b>clsDatabaseDocumentation_DebugWindow<\/b>. Diese gibt einfach nur den Text <b>Dokumentation <\/b>und den Datenbanknamen aus und unterstreicht den Text:<\/p>\n<pre>Private Sub IDatabaseDocumentation_\r\n        StartDocumentation(strDatabase As String,\r\n        strPath As String, db As DAO.Database)\r\n    Debug.Print &quot;Dokumentation &quot; &amp; strDatabase\r\n    Debug.Print &quot;===============================&quot;\r\nEnd Sub<\/pre>\n<p>Dies entspricht der ersten Zeile der Ausgabe aus Bild 5.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Beispiel f&uuml;r die Dokumentation einer einfachen Tabelle im Direktfenster<\/span><\/b><\/p>\n<p>Danach startet die Dokumentation der eigentlichen Objekte des Datenmodells, zun&auml;chst der Tabellen. Die Prozedur ruft die Methode <b>StartPrintTables <\/b>auf und &uuml;bergibt die Anzahl der Tabellen sowie die Variable <b>bolCancel<\/b> (die Anzahl Tabellen wurde zuvor unter Ausschluss der Systemtabellen ermittelt):<\/p>\n<pre>objDoku.StartPrintTables intTableCount, bolCancel<\/pre>\n<p>Die Implementierung der Prozedur <b>StartPrintTables<\/b> sieht so aus:<\/p>\n<pre>Private Sub IDatabaseDocumentation_StartPrintTables(intTableCount As Integer, Cancel As Boolean)\r\n    If intTableCount &gt; 0 Then\r\n        Debug.Print &quot;Tabellen&quot;\r\n        Debug.Print &quot;========&quot;\r\n    Else\r\n        Debug.Print &quot;Die Datenbank enth&auml;lt keine Tabellen.&quot;\r\n        cancel = True\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft anhand des Parameters <b>intTableCount<\/b>, ob die Datenbank &uuml;berhaupt Tabellen enth&auml;lt. Falls ja, gibt sie im Direktbereich die &Uuml;berschrift <b>Tabellen <\/b>aus, falls nein, wird ein entsprechender Text ausgegeben, der auf die fehlenden Tabellen hinweist.<\/p>\n<p>Au&szlig;erdem erh&auml;lt der Parameter <b>Cancel <\/b>den Wert <b>True<\/b>, wodurch die Prozeduren f&uuml;r die &uuml;brigen Elemente ebenfalls nicht mehr aufgerufen werden. In diesem Fall wird noch die Methode <b>FinishPrintTables <\/b>ausgel&ouml;st, in der etwa bei einer XML-Dokumentation noch ein schlie&szlig;endes Tag untergebracht werden m&uuml;sste.<\/p>\n<p>Enth&auml;lt die Datenbank jedoch mindestens eine Tabelle, wird diese anschlie&szlig;end in einer <b>For Each<\/b>-Schleife durchlaufen. Dabei ber&uuml;cksichtigt die Prozedur <b>TabellenUndFelderDokumentieren <\/b>wiederum nur diejenigen Tabellen, deren Name weder mit <b>MSys&#8230; <\/b>noch mit <b>USys&#8230; <\/b>beginnt.<\/p>\n<p>Dann folgt f&uuml;r jede Tabelle der Aufruf der Methode <b>StartPrintTable <\/b>mit dem Tabellennamen, der Tabellenbeschreibung und dem <b>TableDef<\/b>-Objekt als Parameter. Letzteres wird wieder f&uuml;r den Fall &uuml;bergeben, falls die Implementierung mehr als nur die als Zeichenketten &uuml;bergebenen Informationen ausgeben soll. Danach werden f&uuml;r jede Tabelle Felder, Indizes und Beziehungen ausgegeben (dazu sp&auml;ter mehr). Den Abschluss der Ausgabe einer Tabelle macht ein Aufruf der Methode <b>FinishPrintTable<\/b>, den Sie wiederum zum Setzen des schlie&szlig;enden XML-Tags verwenden k&ouml;nnen. Und nach dem Durchlaufen aller Tabellen folgen die Aufrufe der Methoden <b>FinishPrintTables <\/b>und <b>FinishDocumentation<\/b>.<\/p>\n<p>Danach geht es ans Eingemachte jeder einzelnen Tabelle: Felder, Indizes und Beziehungen. F&uuml;r jedes dieser Elemente werden im Normalfall vier verschiedene Methoden der Implementierung der Schnittstelle <b>IDatabaseDocumentation <\/b>aufgerufen.<\/p>\n<p>Die erste k&uuml;ndigt den Beginn der Ausgabe des jeweiligen Objekts an und gibt die Anzahl durch, damit die Implementierung gegebenenfalls auf nicht vorhandene Elemente reagieren kann (<b>StartPrintFields<\/b>, <b>StartPrintIndexes<\/b>, <b>StartPrintRelations<\/b>).<\/p>\n<p>Die letzte Methode bereitet jeweils auf das Ende eines der Bereiche zur Ausgabe von Feldern, Indizes oder Beziehungen vor (<b>FinishPrintFields<\/b>, <b>FinishPrintIndexes<\/b>, <b>FinishPrintRelations<\/b>).<\/p>\n<p>Dazwischen folgen f&uuml;r jedes Element je zwei Aufrufe: F&uuml;r Felder <b>StartPrintField <\/b>und <b>FinishPrintField<\/b>, f&uuml;r Indizes <b>StartPrintIndex <\/b>und <b>FinishPrintIndex <\/b>und f&uuml;r Beziehungen <b>StartPrintRelation <\/b>und <b>FinishPrintRelation<\/b>.<\/p>\n<p>Der Aufruf der entsprechenden Methoden f&uuml;r die Felder einer Tabelle sieht beispielsweise so aus:<\/p>\n<pre>For Each fld In tdf.Fields\r\n    objDoku.StartPrintField fld.Name, fld.Type,\r\n    fld.Size, fld\r\n    objDoku.FinishPrintField\r\nNext fld<\/pre>\n<p>Die Implementierung der entsprechenden Methoden k&ouml;nnen Sie sich im Modul <b>clsDatabaseDocumentation_DebugWindow <\/b>ansehen &#8211; diese enthalten letztlich eine einfache Ausgabe der Informationen zum Datenmodell in das Direktfenster.<\/p>\n<p><b>Zwischenstand<\/b><\/p>\n<p>Wir haben also nun eine Prozedur, welche die Ausgabe der Tabellen, Felder et cetera steuert und die einzelnen Objekte dazu durchl&auml;uft und entsprechende Methoden der Implementation einer Schnittstelle aufruft, um die Informationen im Direktfenster auszugeben.<\/p>\n<p><b>Andere Ausgabeformate<\/b><\/p>\n<p>Wie geht es nun weiter Immerhin hilft uns die Ausgabe ins Direktfenster nicht wirklich weiter. Schauen wir uns also gleich am Beispiel eines XML-Dokuments an, wie einfach es ist, die Ausgabe woanders hin umzuleiten. Im Prinzip m&uuml;ssen Sie nur die folgenden Schritte durchf&uuml;hren:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie kopieren die Vorlage <b>clsDatabaseDocumentation_Template <\/b>in eine neue Klasse, beispielsweise <b>clsDatabaseDocumentation_XML<\/b>.<\/li>\n<li class=\"aufz-hlung\">Sie f&uuml;llen die Methoden der noch leeren Klasse mit den Anweisungen, um die mit den Parametern &uuml;bergebenen Daten in ein XML-Dokument zu schreiben. <a href=\"#anker-20-anchor\">Listing 3<\/a> zeigt einige der notwendigen Methoden, einschlie&szlig;lich der letzten, die den XML-Code in eine entsprechende Datei schreibt.<\/li>\n<li class=\"aufz-hlung\">&auml;ndern Sie die Zeile in der Prozedur <b>TabellenUndFelderDokumentieren<\/b>, welche die Objektvariable <b>objDoku <\/b>instanziert, um. Ersetzen Sie <b>clsDatabaseDocumentation_Debugwindow <\/b>nun durch den Namen der neuen Implementierung <b>clsDatabaseDocumentation_XML<\/b>.<\/li>\n<\/ul>\n<p class=\"listingueberschrift\">Listing 3: Diese Schnittstelle definiert alle Methoden f&uuml;r die Ausgabe des Datenmodells.<\/p>\n<pre>Implements IDatabaseDocumentation\r\nDim strXML As String\r\nPrivate Sub IDatabaseDocumentation_StartDocumentation(strDatabase As String, strPath As String, db As DAO.Database)\r\n    strXML = strXML &amp; &quot;&lt;database name=''&quot; &amp; strDatabase &amp; &quot;'' path=''&quot; &amp; strPath &amp; &quot;''&gt;&quot; &amp; vbCrLf\r\nEnd Sub\r\nPrivate Sub IDatabaseDocumentation_StartPrintTables(intTableCount As Integer, cancel As Boolean)\r\n    strXML = strXML &amp; &quot; &lt;tables&gt;&quot; &amp; vbCrLf\r\nEnd Sub\r\nPrivate Sub IDatabaseDocumentation_StartPrintTable(strTablename As String, strDescription As String, tdf As DAO.TableDef)\r\n    strXML = strXML &amp; &quot; &lt;table name=''&quot; &amp; strTablename &amp; &quot;''&gt;&quot; &amp; vbCrLf\r\nEnd Sub\r\n''... weitere Methoden zum Schreiben von Informationen &uuml;ber Felder, Indizes und Beziehungen\r\nPrivate Sub IDatabaseDocumentation_FinishPrintTable()\r\n    strXML = strXML &amp; &quot; &lt;\/table&gt;&quot; &amp; vbCrLf\r\nEnd Sub\r\nPrivate Sub IDatabaseDocumentation_FinishPrintTables()\r\n    strXML = strXML &amp; &quot; &lt;\/tables&gt;&quot; &amp; vbCrLf\r\nEnd Sub\r\nPrivate Sub IDatabaseDocumentation_FinishDocumentation()\r\n    strXML = strXML &amp; &quot;&lt;\/database&gt;&quot;\r\n      Open CurrentProject.Path &amp; &quot;\\DBDoku.xml&quot; For Output As #1\r\n    Print #1, strXML\r\n    Close #1\r\nEnd Sub<\/pre>\n<p>Fertig! Sie brauchen nun nur noch <b>TabellenUndFelderDokumentieren <\/b>aufzurufen und erhalten eine XML-Datei mit einer rudiment&auml;ren Beschreibung des Datenmodells. Das Ergebnis k&ouml;nnen Sie in Bild 6 betrachten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_05\/TabellenDokumentieren_5-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Ausgabe der Datenbankinformationen im XML-Format<\/span><\/b><\/p>\n<p><b>Ausgabe in ein Word-Dokument<\/b><\/p>\n<p>Richtig interessant wird es nat&uuml;rlich, wenn wir die Informationen zum Datenmodell in ein Format bringen k&ouml;nnen, das wir direkt in die Dokumentation der Entwicklung einer Software einbringen. In diesem Falle liegt Microsoft Word nahe. Einschlie&szlig;lich der Vorbereitung entsprechender Absatz- und Zeichenformate w&uuml;rde dies jedoch den Rahmen dieses Beitrags sprengen, sodass wir gegebenenfalls sp&auml;ter auf dieses Thema zur&uuml;ckkommen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Wir haben mit diesem Beitrag die Grundlage daf&uuml;r gelegt, die Informationen &uuml;ber das Datenmodell einer Datenbank automatisiert zu dokumentieren. Der gro&szlig;e Vorteil der Reproduzierbarkeit der Dokumentation ist, dass Sie sich bei &auml;nderungen im Datenmodell keine gro&szlig;en Sorgen zu machen brauchen &#8211; Sie starten einfach erneut die hier vorgestellte Prozedur und erstellen den Teil der Dokumentation, der die Tabellen, Felder, Indizes und Beziehungen betrifft, einfach neu.<\/p>\n<p>Es fehlen allerdings noch zwei wesentliche Punkte, die noch auf unserer Liste stehen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Ausgabe der Informationen sollte in anspruchsvolleren Formaten wie einem Word- oder einem HTML-Dokument erfolgen. Gegebenenfalls sollten sich sogar mehrere HTML-Dokument erstellen lassen, auf denen man dann eine Hilfedatei aufbauen kann.<\/li>\n<li class=\"aufz-hlung\">Auch die Vorbereitung der Ausgabe sollte noch steuerbar gemacht werden. Bislang werden einfach die Informationen &uuml;ber alle Tabellen mit Ausnahme von Systemtabellen ausgegeben &#8211; dies sollte sich &uuml;ber eine entsprechende Benutzeroberfl&auml;che einstellen lassen.<\/li>\n<li class=\"aufz-hlung\">Schlie&szlig;lich sollte man festlegen k&ouml;nnen, welche der Informationen ausgegeben werden. Dies ist wiederum ein Fall f&uuml;r die Implementierung der Methoden der Klasse <b>IDatabaseDocumentation<\/b>: Dort stehen die wichtigsten Eigenschaften aller relevanten Datenbankelemente gleich als Parameter zur Verf&uuml;gung, die &uuml;brigen k&ouml;nnen Sie aus den Eigenschaften der Objektverweise auf die einzelnen Tabellen, Felder et cetera ermitteln, denn auch diese werden als Parameter &uuml;bergeben.<\/li>\n<\/ul>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TabellenDokumentieren.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{FD2B15CA-5A12-4B2C-92E7-1C99E253EBBA}\/aiu_738.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Dokumentation von Datenbankanwendungen ist bei den meisten Entwicklern nicht besonders beliebt. M&ouml;glicherweise liegt der Grund schlicht darin, dass die Programmierarbeiten meist schon erledigt sind, wenn einem einf&auml;llt, dass der Kunde noch um eine ausf&uuml;hrliche Dokumentation bat. Der vorliegende Beitrag soll zumindest die Dokumentation von Tabellen, Feldern und Co. so weit vereinfachen, dass Sie keinen Grund mehr haben, die Dokumentation an das &auml;u&szlig;erste Ende des Projekts zu verschieben.<\/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,66052010,44000021,44000025],"tags":[],"class_list":["post-55000738","post","type-post","status-publish","format-standard","hentry","category-662010","category-66052010","category-Tabellen_und_Datenmodellierung","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Tabellen und Felder dokumentieren - 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\/Tabellen_und_Felder_dokumentieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tabellen und Felder dokumentieren\" \/>\n<meta property=\"og:description\" content=\"Die Dokumentation von Datenbankanwendungen ist bei den meisten Entwicklern nicht besonders beliebt. M&ouml;glicherweise liegt der Grund schlicht darin, dass die Programmierarbeiten meist schon erledigt sind, wenn einem einf&auml;llt, dass der Kunde noch um eine ausf&uuml;hrliche Dokumentation bat. Der vorliegende Beitrag soll zumindest die Dokumentation von Tabellen, Feldern und Co. so weit vereinfachen, dass Sie keinen Grund mehr haben, die Dokumentation an das &auml;u&szlig;erste Ende des Projekts zu verschieben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:07:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Tabellen und Felder dokumentieren\",\"datePublished\":\"2020-05-22T22:07:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/\"},\"wordCount\":3296,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8ff110a74ea647e584818ddba4674597\",\"articleSection\":[\"2010\",\"5\\\/2010\",\"Tabellen und Datenmodellierung\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/\",\"name\":\"Tabellen und Felder dokumentieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8ff110a74ea647e584818ddba4674597\",\"datePublished\":\"2020-05-22T22:07:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8ff110a74ea647e584818ddba4674597\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/8ff110a74ea647e584818ddba4674597\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Tabellen_und_Felder_dokumentieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tabellen und Felder dokumentieren\"}]},{\"@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":"Tabellen und Felder dokumentieren - 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\/Tabellen_und_Felder_dokumentieren\/","og_locale":"de_DE","og_type":"article","og_title":"Tabellen und Felder dokumentieren","og_description":"Die Dokumentation von Datenbankanwendungen ist bei den meisten Entwicklern nicht besonders beliebt. M&ouml;glicherweise liegt der Grund schlicht darin, dass die Programmierarbeiten meist schon erledigt sind, wenn einem einf&auml;llt, dass der Kunde noch um eine ausf&uuml;hrliche Dokumentation bat. Der vorliegende Beitrag soll zumindest die Dokumentation von Tabellen, Feldern und Co. so weit vereinfachen, dass Sie keinen Grund mehr haben, die Dokumentation an das &auml;u&szlig;erste Ende des Projekts zu verschieben.","og_url":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:07:14+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Tabellen und Felder dokumentieren","datePublished":"2020-05-22T22:07:14+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/"},"wordCount":3296,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597","articleSection":["2010","5\/2010","Tabellen und Datenmodellierung","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/","url":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/","name":"Tabellen und Felder dokumentieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597","datePublished":"2020-05-22T22:07:14+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/8ff110a74ea647e584818ddba4674597"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Tabellen_und_Felder_dokumentieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Tabellen und Felder dokumentieren"}]},{"@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\/55000738","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=55000738"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000738\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}