11.04.2002


Um Datenbanken erstellen zu können, muss man wissen, dass eine Datenbank aus mehreren Ebenen besteht. Grundsätzlich kann man drei Ebenen definieren:
 
Externe Ebene - Benutzersichten Formulare, Abfragen, Berichte
Logische, konzeptionelle Ebene Tabellen-Beziehungen, Realitätsinformation
Interne, physikalische Ebene In Access enthalten

 
Dieses Schichtenmodell ist Netzwerkern aus dem ISO-OSI-Bereich bekannt. Man trennt die einzelnen Verarbeitungsebenen miteinander.
 

Arbeiten mit Access

öffnet man MS-Access, so bietet sich ein Menü, welches sofort eine bestehende Datenbank öffnen oder eine neue erstellen lässt. Wir wählen die Neue. Daraufhin werden wir gleich nach dem Namen unserer zukünftigen Datenbank gefragt. Ist der Name vergeben, wird in Zukunft dieser u.a. in unserem "öffnen"-Dialog erscheinen. Uns bietet sich jetzt ein Fenster mit mehreren Teilbereichen der Datenbank. Als Objekte haben wir die häufigsten, nämlich Tabellen, Abfragen und Formulare, sowie auch die in erster Hinsicht nicht so gebräuchlicheren wie Berichte, Seiten, Makros und Module. Bis auf die letzten Beiden sind alle mit Assistenten versehen, oder mit Eingaben aus einer Entwurfsansicht. über diesem Fenster bieten sich uns Symbole, mit denen wir vorhandene Objekte in den Ansichten "Entwurf" bzw. "öffnen", welches die Standardansicht ist, bearbeiten können. Nebenbei können wir mit den kleineren Symbolen die Ansicht des Fensters ändern, doch darauf werde ich nicht weiter eingehen... In der Access-Leiste sind neben den Standardsymbolen ("Neu", "öffnen", usw.) auch die Symbole "Analyse" und "Beziehungen" farbig hervorgehoben. Die Analyse bearbeitet Tabellen aufgrund der Normalformen, und macht auf Fehler aufmerksam. Das Beziehungssymbol öffnet ein dazugehöriges Fenster, womit wir unsere Tabellen in Beziehungen stellen, diese bearbeiten und anschauen können. Zum anderen verschafft uns das auch einen grösseren überblick über die Tabellen. Später dazu mehr.

Datenbanktabellen, die Grundlage einer Datenbank

öffnen wir eine Tabelle in der Entwurfsansicht, so kann man dort die Tabellenspalten definieren. Ihren Namen und die Feldeigenschaften. Die Namen sollte man in der gesammten Datenbank einmalig vergeben. Als Felddatentyp gibt es folgende: Text, Memo, Zahl, Datum/Uhrzeit, Währung, AutoWert, Ja/Nein, OLE-Objekt, Hyperlink und der Nachschlageassistent. Die Datentypen sind entscheidend für die Grösse einer Datenbank. Momentan machen wir uns zwar keine Gedanken darüber, doch geht man mal von einer Datenbank von OTTO, oder QUELLE aus, können wir uns mal ungefähr vorstellen, was an Datensätzen alles in Tabellen soll. Im Textfeld werden im Normalfall 50 Zeichen gespeichert, maximal sind 255 möglich. Beim AutoWert ist die Eigenschaft des Feldes auf LongInteger oder auf Replikations-ID gestellt. Speichert man eine Zahl, so hat man folgende Auswahlmöglichkeiten im Bezug auf den Zahlentyp:

Bytespeichert ganze Zahlen von 0-255, keine dezimale Genauigkeit, Grösse 1Byte
Dezimalspeichert in mdb-Dateien Zahlen im Bereich von -10 hoch 28 -1 bis 10 hoch 28 -1, mit einer dez. Genaigkeit von 28 und der Grösse von 12 Byte
Integerspeichert ganze Zahlen von -32.768 bis 32.767, keine dez. Genauigkeit, Grösse 2Byte
Long Integer(Standard)speichert ganze Zahlen von -2.147.483.648 bis 2.147.483.647, keine dez. Genauigkeit und einer Grösse von 4 Byte
Singlespeichert Zahlen von -3,402823E38 bis -1,401298E-45 für negative und 1,401298E-45 bis 3,4702823E38 für positive Werte, dez. Genauigkeit von 7 und einer Grösse von 4 Bytes
Doublespeichert Zahlen von -1,79769313486231E308 bis -4,94065645841247E-324 für negative und 1,79769313486231E308 bis 4,94065645841247E-324 für positive Werte, mit einer dez. Genauigkeit von 15 und einer Grösse von 8 Bytes
Replikations-IDspeichert die GUID (Globale unique identifier) mit einer Grösse von 16 Bytes

Deshalb sollte man die kleinstmögliche Einstellungsgrösse nehmen, da kleinere Datenmengen schneller verarbeitet werden können. Memo-Felder werden aus demselben Grund meist in eigenen Tabellen verwaltet.

Man kann Feldern auch Primärschlüsseln zuweisen. Markiert man mehrere Felder und wählt aus der Symbolleiste das Primärschlüsselsymbol, werden beide Felder zu Primärschlüsselfeldern. Das heisst, nur beide in Kombination stehenden Felder sind ein Primärschlüssel. Da dieser eindeutig ist in der Tabelle, kann also die Kombination kein zweites Mal auftauchen.

Haben wir unsere Felder definiert, können wir uns die Tabelle in der Standardansicht anschauen. Das AutoWert-Feld füllt sich hierbei selbstständig, wir können nicht eingreifen. Ein Doppelklick auf die Tabelle des Datenbankfensters führt uns ebenfalls zu dessen Ansicht. Da man miteinander in Verbindung stehende Tabellen in Beziehung setzen muss, öffnen wir als nächstes, nachdem wir mindestens 2 Tabellen erstellt haben, das Beziehungsfenster. Hier lassen sich Tabellen und Abfragen hinzufügen. Zieht man die Spalte einer Tabelle zu einer anderen, öffnet sich ein Dialog, der uns entscheiden lässt, in welcher Beziehung die Felder miteinander stehen. So kommt es, dass in der Tabelle POSITIONEN das Feld PS_AT_NR in Verbindung steht mit in der Tabelle ARTIKEL befindlichem Feld AT_NR.

Abfragen, das Fenster zu den Daten

Es gibt mehrere Abfragetypen. Die gebräuchlichste, und die, welche von Access vorgegeben wird, ist die Auswahlabfrage, welche es uns ermöglicht, Daten aus mehreren Tabellen zusammenzufassen, um eine übersicht zu behalten. Auf die Kreuztabellenabfrage gehe ich ein wenig später noch ein. Die Tabellenerstellungsabfrage erstellt, wie ihr Name schon sagt, Tabellen. Somit lassen sich Daten sichern und später wieder abbilden, beispielsweise, um fertig erstellten Rechnungen keine nachfolgenden Preiserhöhungen zu übergeben. Die Aktualisierungsabfrage aktualisiert Datensätze. So lassen sich beispielsweise alle Preise auf einen Schlag, oder besser gesagt auf einen Doppelklick, um beispielsweise 1% erhöhen. Die Anfügeabfrage fügt einer Tabelle Datensätze hinzu, allerding müssen diese schon irgendwo korrekt eingegeben worden sein. Die Löschabfrage bewirkt das Gegenteil, sie löscht aus einer Tabelle angegebene Daten. Wir haben zum Beispiel eine Tabelle mit allen Artikeln erstellt, alle Rasierer gelöscht und sie nachträglich wieder angefügt.

In einer Auswahlabfrage (zumindest in dessen Entwurfsmodus) kann man Tabellen oder andere Abfragen in das Fenster oberhalb der Abfrage einfügen. So hat man auch Beziehungen im Blick. Die Spalten lassen sich einfach nach unten ziehen. Das Feld Sortierung, welches dort auch vorhanden ist, tritt nur bei Auswahlabfragen auf. Doch dazu später mehr. Hier können wir Kriterien eingeben, nach denen die Daten nachträglich aufgelistet werden. Wollen wir alle Firmen sehen, die Elektroartikel anbieten, lassen wir uns die Kundentabelle anzeigen und geben in dem Feld KU_FIRMA_UNTERTITEL als Kriterium "elektroartikel" ein. Access setzt automatisch Anführungszeichen um das Wort. Somit wird in Zukunft ein String gekennzeichnet. Programmierer dürften damit keine Probleme haben... Beim öffnen der Abfrage oder Wechseln des Ansichtenmodus erscheinen nun alle Firmen, die das Wort "Elektroartikel" als Untertitel haben. Nicht mehr und nicht weniger. Wir möchten aber alle Elektrofirmen sehen, also ändern wir das Kriterium und schreiben in das Feld: wie "ele?tro*". Das wie bedeutet, dass alles herausgeholt wird, was mit diesem String zu tun hat. Das Fragezeichen in dem Wort ersetzt ein Zeichen, und der Stern beliebig viele Zeichen. Ebenfalls bekannt ist dieses Machwerk bei Microsoft aus DOS-Zeiten... Theoretisch heisst das, dass alle Firmen mit Electro- und Elektro- im Untertitel auftauchen, aber auch andere Zeichen könnten bei einer Fehleingabe erscheinen (elegtro...). Will man solche Fehleingaben nicht auf der Liste sehen, muss man statt dessen "ele[ck]tro*" eingeben. Das heisst, alle Firmen, die mit Elektro- oder mit Electro- anfangen, werden ausgegeben. Die eckigen Klammern geben also eine Auswahl von Zeichen an, wovon aber immer nur eines auftauchen darf. Wir haben das am Namen Meier praktiziert und haben folgende Syntax benutzt: wie "*m[ae][ijy][er]*". Nebenbei haben wir auch die Möglichkeit, Operatoren einzusetzen. Das sind ODER, UND und NICHT. Ein Beispiel verdeutlicht dies: alle Kunden aus Eidelstedt und Winterhude auflisten! Hier ist ein Fehler enthalten! Da kein Kunde in Winterhude UND in Eidelstedt wohnen kann, sollte man hier schlauerweise ODER einsetzen. In der Auswahl sieht die Syntax wie folgt aus: wie "*eidels*" ODER wie "*winterhude*". Wir wollen noch weitere Kriterien kennenlernen, eine davon ist die Möglichkeit, Datensätze ab einem bestimmtem Datum auszugeben. Wir haben das Feld RE_DATUM benutzt und als Kriterium folgendes eingegeben: #03.07.2000#. Die Rauten setzt MS-Access mittlerweile alleine dazu. In dieser Abfrage sieht man alle Rechnungen vom 3.7.2000. Alle Rechnungen zwischen bestimmten Daten holt man so aus den Tabellen hervor: >=#03.07.2000# UND <=#13.07.2000#, oder ZWISCHEN #03.07.2000# UND #13.07.2000#. Der Grund, warum es wichtig ist, in der gesammten Datenbank eindeutige Feldnamen in Tabellen zu vergeben, ist folgender: Access speichert alle Feldnamen in einem Array ab, also einer Art temporären Speicher. Gibt man als Kriterium einen Feldnamen ein, erkennt Access dies meistens und setzt eine eckige Klammer darum. Ist der Name allerdings falsch geschrieben, gibt Access beim Ausführen der Abfrage (das Ausrufezeichen in der Symbolleiste oder Doppelklicken) eine Dialogbox mit dem falsch geschriebenen Namen aus und erwartet an dieser Stelle eine Eingabe. Ein Parameter ist also falsch gesetzt. Das kann man sich zunutze machen, indem man mit Absicht falsche Werte in eckige Klammern setzt und daraufhin zur Parametereingabe aufgefordert wird. Wir geben in dem Feld RE_DATUM als Kriterium einer Abfrage folgendes ein: [Bitte geben Sie das Wunschdatum ein:]. Access bietet uns beim Ausführen eine Dialogbox mit genau diesem Hinweis, wir geben das Datum ein, welches ebenfalls automatisch als Datum erkannt wird (die Rauten müssen also nicht mit eingegeben werden) und Voila! erscheinen alle Rechnungen zu diesem Datum.

öffnet man eine Abfrage in der Entwurfsansicht, bietet sich im Menü Ansicht der Punkt "Funktionen", welcher für das nächste Beispiel, nämlich für Aggregatfunktionen verwendet wird. Aggregatfunktionen sind Funktionen, deren Wirkung über mehr als eine Tabellenzeile herausreicht, teilweise sich über die gesammte Tabelle erstrecken. Die Bekanntesten sind zum Beispiel "Summe", "Anzahl" oder "Mindestwert". Wir haben eine Abfrage definiert, welche die Artikel mit ihren dazugehörigen Artikelgruppen anzeigt. Mit folgenden Zusätzen: Es soll die Anzahl der Artikel pro Gruppe aufgelistet werden, beginnend mit der Grössten. Weiterhin soll der Preis des billigsten Artikels, der Preis des teuersten Artikels, und der Durchschnittspreis aller Artikel pro Gruppe angezeigt werden, jeweils in einer eigenen Spalte. Wichtig ist hierbei, dass in der ersten Spalte, wo der Artikelgruppenname erscheint, die Funktion Gruppierung aufgerufen wird.

Ein weiteres Problem ergibt sich, wenn man die Summe aller Artikel pro Rechnung sehen möchte. Wir erstellen dazu eine Abfrage, lassen uns aus der Tabelle POSITIONEN das Feld PS_RE_NR mit der Funktion Gruppierung anzeigen, und definieren daneben ein Feld, welches die Funktion Ausdruck hat und wie folgt heisst: Postensumme: SUMME([AT_PREIS]*[PS_ANZAHL]). Der Teil vor dem Doppelpunkt gibt uns den zukünftigen Feldnamen. Das ganze für Euro-preise sähe dann so aus: Postensumme: SUMME([AT_PREIS]*[PS_ANZAHL])/1,95883.

Ein weiteres Beispiel: Liste alle Kunden auf, denen Rechnungen ausgestellt wurden, beginne mit der Rechnung, welche die höchste Summe hat! Ganz einfach: Wir stellen einfach die PS_RE_NR und die POSTENSUMME aus der Abfrage POSITIONENKLARTEXT, die KU_NR und die KU_FIRMA aus der Tabelle KUNDEN dar. In der Abfrage verknüpfen wir die Felder PS_RE_NR und RE_NR wie in einer Beziehung, geben der Postensumme die Funktion Summe und sortieren Absteigend, fertig.

Liste alle Artikel auf, die verkauft worden, beginne mit dem, welcher am meisten Umsatz brachte! Aus der Tabelle ARTIKEL die Felder AT_NAME und AT_NR anzeigen, dazu aus der Abfrage POSITIONENKLARTEXT die POSTENSUMME, eine Beziehung zwischen den Feldern AT_NR und AT_NR herstellen, und der Postensumme die Funktion Summe übergeben, absteigend sortiert.

Liste alle Monate und deren Umsätze auf! Wir definieren eine Abfrage, welche folgende Tabellen beinhaltet: RECHNUNGEN,POSITIONEN und ARTIKEL. Das erste Feld erhält als Ausdruck die Formel MONAT([RE_DATUM]), und die zweite Spalte: SUMME([AT_PREIS]*[PS_ANZAHL]) mit der Funktion Ausdruck.

Formulare, das Interface für den Benutzer

Mit Formularen macht man es dem letztendlichen Anwender einfacher, sich mit der Datenbank abzufinden, schliesslich arbeiten wir ja auch nicht ständig am Quelltext einer Software. Wir erstellen also mit Formularen ein FrontEnd, welches Design mit Funtionalität koppelt und dem Benutzer effizientes Arbeiten ermöglicht. Formulare basieren auf Abfragen oder Tabellen. Der Assistent zur Erstellung fordert uns auf, die Felder von Abfragen oder Tabellen auszuwählen, welche auf dem Formular angezeigt werden. Danach fragt er uns nach der zukünftigen Ansicht der Daten und nach dem Layout. Die Ansicht ist eine Form, Daten mehr oder weniger übersichtlich darzustellen. Somit kann man eine Adresse so darstellen, wie sie ausgedruckt in einem Formular als Anschrift stehen könnte. Es gibt mehrere Felder und noch viel mehr kleine Einstellungen, welche das Formular bestimmen. Am Häufigsten sind Text-, Bezeichnungs- und Kombinationsfelder. Erstere stellen Daten dar, während Bezeichnungsfelder nur dazu geeignet sind, Formularteile oder andere Felder zu beschriften. Kombinationsfelder bieten entweder die Möglichkeit einer Eingabe oder die einer Auswahlliste. Die Formulareigenschaften lassen uns eine Datenherkunft bestimmen, also eine Tabelle oder Abfrage. Desweiteren kann man über die Eigenschaften fasst das gesammte Aussehen und Verhalten des Formulars einrichten.

Textfelder können ungebunden, oder an Daten gebunden sein. Im letzteren Fall werden die Daten, die das Feld beinhaltet, angezeigt. Will man Textfelder verschieben, so kann man einfacherhalber die Kombination STRG+Pfeiltasten benutzen. Zum Vergrössern ist Shift+Pfeiltasten empfehlenswert.