Home > Artikel > Ausgabe 1/2019 > Berechnete Felder in Tabellen

Berechnete Felder in Tabellen

  PDF ansehen

  Download PDF und Beispieldatenbank

Berechnete Felder in Tabellen sind ein Feature, das mit der Version 2010 von Access hinzugekommen ist. Dabei handelt es sich um die Möglichkeit, die Inhalte der übrigen Felder in einem Feld wie in einem berechneten Feld in einer Abfrage zusammenzuführen. So können Sie etwa den Nettopreis und den Mehrwertsteuersatz eines Artikels in zwei Feldern angeben und in einem dritten Feld, das als berechnetes Feld ausgelegt wird, den Bruttopreis speichern. Dieser Artikel zeigt, wie berechnete Felder funktionieren und welche Vor- und Nachteile diese haben.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1901_BerechneteFelder.accdb.

Berechnete Felder

Wenn Sie ohne den Einsatz berechneter Felder Informationen aus mehreren Feldern zusammenführen wollen, verwenden Sie eine Abfrage. Wenn wir etwa eine Tabelle namens tblKunden mit den Feldern AnredeID, Vorname und Nachname verwenden und diese über das Feld AnredeID mit der Tabelle tblAnreden verknüpft ist, die wiederum das Feld Anrede besteuert, dann können wir mit einer Abfrage leicht berechnete Felder mit Inhalten wie , oder hinzufügen. Dies sieht dann in der Entwurfsansicht etwa wie in Bild 1 aus.

Abfrage mit berechneten Feldern

Bild 1: Abfrage mit berechneten Feldern

Die passende Datenblattansicht finden Sie in Bild 2.

Berechnete Felder in einer Abfrage

Bild 2: Berechnete Felder in einer Abfrage

Kundennamen in Tabelle zusammenstellen

Können wir das auch mit berechneten Feldern in einer Tabelle erreichen? Teilweise auf direktem Wege, teilweise sind Einschränkungen vorhanden.

Wir schauen uns das an genau den beiden berechneten Feldern der Abfrage aus dem vorherigen Beispiel an, in dem wir zunächst zwei Felder der aktuellen Tabelle zusammengeführt und um ein zusätzliches Literal ergänzt haben (ein Komma und ein Leerzeichen zwischen Nachname und Vorname) und dann in einem weiteren berechneten Feld noch den Wert des Feldes Anrede aus einer verknüpften Tabelle ermittelt haben – auch hier mit zwei zusätzlichen Literalen, in diesem Fall mit zwei Leerzeichen.

Berechnetes Feld anlegen

Ein neues berechnetes Feld legen Sie zunächst wie jedes andere Feld an, indem Sie den Feldnamen in einer neuen, leeren Zeile der Entwurfsansicht der betroffenen Tabelle hinzufügen.

In diesem Fall geben wir den Namen Kunde in die Tabelle tblKunden ein und wählen dann als Datentyp den Wert Berechnet aus (siehe Bild 3).

Auswählen des Datentyps Berechnet

Bild 3: Auswählen des Datentyps Berechnet

Danach erscheint der Ausdrucks-Generator, der im Gegensatz zum Ausdrucks-Generator etwa für Kriterien in Abfragen einige Einträge weniger aufweist (siehe Bild 4).

Eingabe des zu berechnenden Ausdrucks mit dem Ausdrucks-Generator

Bild 4: Eingabe des zu berechnenden Ausdrucks mit dem Ausdrucks-Generator

Wir benötigen in diesem ersten Beispiel die beiden Felder Nachname und Vorname, die wir jeweils per Doppelklick hinzufügen. Der Inhalt des oberen Fensters sieht dann so aus:

[Nachname] «Ausdr» [Vorname]

Den mittleren Teil ersetzen Sie dann wie im Bild, sodass das Ergebnis wie folgt aussieht:

[Nachname] & ", " & [Vorname]

Schließen wir den Ausdrucks-Generator mit einem Klick auf die OK-Schaltfläche, landet der Ausdruck in der Eigenschaft Ausdruck des berechneten Feldes im Tabellenentwurf. Auch wenn die Tabelle bereits zuvor einige Datensätze enthielt, wird die Berechnung der Inhalt für das neue Feld ausgeführt, sodass die Datenblattansicht nun wie in Bild 5 aussieht.

Das erste berechnete Feld der Tabelle

Bild 5: Das erste berechnete Feld der Tabelle

Berechnete Felder im Praxiseinsatz

Bevor wir das zweite berechnete Feld anlegen, wollen wir uns anschauen, was das berechnete Feld macht. Wenn wir die vorhandenen Daten in den beiden Feldern Vorname und Nachname eines Datensatzes ändern, wird der Inhalt des berechneten Feldes Kunde direkt nach dem Verlassen des jeweiligen Feldes aktualisiert. Das Komma zwischen Nachname und Vorname wird sogar direkt nach dem Beginn der Bearbeitung eines neuen Datensatzes hinzugefügt. Auch wenn erst eines der Felder Vorname oder Nachname ausgefüllt ist, landet das Komma im berechneten Feld. Das sieht dann etwa wie in Bild 6 aus.

Nicht komplett ausgefüllte Datensätze sehen im berechneten Feld nicht gut aus.

Bild 6: Nicht komplett ausgefüllte Datensätze sehen im berechneten Feld nicht gut aus.

Wir können allerdings dafür sorgen, dass, wenn der Benutzer noch nicht für die beiden Felder Vorname und Nachname einen Wert eingetragen hat, gar kein Ergebnis im berechneten Feld angezeigt wird. Dazu verwenden wir den folgenden Ausdruck für die Eigenschaft Ausdruck des berechneten Feldes:

[Nachname]+", "+[Vorname]

Im Gegensatz zum &-Operator, der die verknüpften Elemente auch zum Teil ausgibt, obwohl eines der Elemente den Wert Null hat, sorgt der +-Operator dafür, dass der Wert Null zurückgegeben wird, wenn mindestens eines der beiden verknüpften Elemente den Wert Null hat. Das Ergebnis sieht schon besser aus (siehe Bild 7).

Das berechnete Feld wird nur noch gefüllt, wenn alle benötigten Daten vorhanden sind.

Bild 7: Das berechnete Feld wird nur noch gefüllt, wenn alle benötigten Daten vorhanden sind.

Berechnete Felder mit Lookup-Daten?

Können wir auch Lookup-Daten wie etwa das Feld Anrede aus der verknüpften Tabelle tblAnreden in berechnete Felder integrieren? Wenn wir uns den Ausdrucks-Generator ansehen, finden wir nur die aktuelle Tabelle, also tblKunden, in der Liste der verfügbaren Elemente. Wir können also nur Felder der aktuellen Tabelle in berechneten Feldern verwenden. Ein Weg könnte eine Domänenfunktion wie DLookup sein. Wenn wir im Ausdrucks-Generator in die Liste der integrierten Funktionen schauen, finden wir diese Funktion allerdings nicht vor.

Im Falle der Tabelle tblAnreden, deren Werte sich im Laufe des Lebens der Anwendung nicht verändern dürften, können wir allerdings einen Workaround anbieten. Wir kennen ja den Primärschlüsselwert des verknüpften Datensatzes der Tabelle tblAnreden und wissen, welche Werte im Feld Anrede des jeweiligen Datensatzes stecken. Also können wir dies auch in den Entwurf der Tabelle übernehmen und die Anrede über das Feld AnredeID mit der Wenn-Funktion ermitteln. Wir ermitteln dann mit der Wenn-Funktion den passenden Wert zum Wert von AnredeID, und zwar Herr für den Wert 1 und Frau für die anderen Werte – wobei es aktuell nur noch den Wert 2 gibt (siehe Bild 8). Solange wir nur zwei Werte haben, ist das ausreichend.

Zusammenstellen einer Wenn-Bedingung

Bild 8: Zusammenstellen einer Wenn-Bedingung

Wenn die Tabelle tblAnreden mehr Werte enthalten würde, wie es in Bild 9 der Fall ist, könnten wir die andere im Ausdrucks-Generator unter Programmablauf angebotene Funktion Wahl verwenden. Die Funktion Wahl erwartet einen Index sowie eine Liste von möglichen Werten als Parameter. Der 1-basierte Index gibt an, welcher der folgenden möglichen Werte zurückgegeben wird.

Anreden-Tabelle mit mehr als zwei Anreden

Bild 9: Anreden-Tabelle mit mehr als zwei Anreden

Einem neuen Feld, wiederum mit dem Datentyp Berechnet, weisen wir den folgenden Ausdruck für die Eigenschaft Ausdruck zu:

Wahl([AnredeID];"Herr";"Frau";"Firma")+" "+[Vorname]+" "+[Nachname]

Dies führt zu den Ergebnissen aus Bild 10. Hier sehen wir, dass die Funktion Wahl gut funktioniert, solange das Feld AnredeID einen Wert enthält. Falls nicht, liefert das Feld mit dieser Funktion allerdings das Ergebnis #Typ! zurück. Die Wahl-Funktion funktioniert also nicht mit dem Null-Wert im ersten Parameter. Also sorgen wir dafür, dass statt des Null-Wertes eine leere Zeichenkette geliefert wird:

Kunden mit mehr als zwei verschiedenen Anreden

Bild 10: Kunden mit mehr als zwei verschiedenen Anreden

Wahl(IstNull([AnredeID]);"Herr";"Frau";"Firma")+" "+[Vorname]+" "+[Nachname]

Genau das macht die IstNull-Funktion. Enthält AnredeID den Wert Null, liefert IstNull eine leere Zeichenkette. Damit liefert die Wahl-Funktion zumindest keinen Fehler.

Bruttopreis ermitteln

Ein weiteres Beispiel ist die Ermittlung des Bruttopreises aus dem Nettopreis und dem Mehrwertsteuersatz. In der Tabelle aus Bild 11 haben wir diesen Ausdruck für das berechnete Feld angegeben:

Artikel mit berechnetem Bruttopreis

Bild 11: Artikel mit berechnetem Bruttopreis

[Nettopreis]*(1+[Mehrwertsteuersatz]/100)

Damit erhalten wir rechnerisch schon die gewünschten Ergebnisse, allerdings wollen wir diese auch noch im richtigen Format anzeigen. Dazu stellen wir im Entwurf der Tabelle tblArtikel für die Eigenschaft Ergebnistyp den Wert Währung ein (siehe Bild 12).

Bruttopreis mit richtigem Format

Bild 12: Bruttopreis mit richtigem Format

Damit erhalten wir auch das gewünschte Ergebnis (siehe Bild 13).

Format Währung im der Datenblattansicht

Bild 13: Format Währung im der Datenblattansicht

Vor- und Nachteile der berechneten Felder

Wenn man normalisierte Tabellen in seiner Datenbank verwenden will, sind die berechneten Felder eigentlich ein Tabu. Wenn Sie solche Felder selbst berechnen würden, hätten Sie abhängige Daten, die inkonsistent werden können, wenn etwa ein Benutzer den Bruttopreis ändert und den Nettopreis nicht entsprechend anpasst.

Nun steckt hinter den berechneten Feldern allerdings offensichtlich ein Mechanismus wie ein Trigger, der automatisch dafür sorgt, dass der berechnete Wert immer auf Basis der an der Berechnung beteiligten Felder angepasst wird. Und das berechnete Feld selbst ist schreibgeschützt, dass heißt, Sie können auf dieser Seite der Gleichung keine Inkonsistenz erzeugen.

Sollten Sie berechnete Felder also nun nutzen oder nicht? Für den Fall, dass das berechnete Feld auf anderen Feldern basiert, die selten oder gar nicht geändert werden, spricht nichts dagegen. Die Alternative wäre, die Berechnung, wie zu Beginn des Artikels aufgezeigt, durch eine Abfrage erledigen zu lassen. Dann müsste die Berechnung allerdings bei jedem Aufruf der Daten durchgeführt werden, was je nach Menge der Daten Zeit in Anspruch nimmt.

Sollten Sie jedoch glühender Verfechter der Regeln der Normalisierung von Datenmodellen sind, kommt der Einsatz von berechneten Feldern für Sie nicht in Frage, denn damit wird in der Regel gegen die erste Normalform verstoßen. Diese besagt, dass alle Informationen in einer Tabelle atomar vorliegen müssen, also dass etwa Vorname, Nachname und Anrede in eigenen Spalten gespeichert werden müssen.

Wenn die Tabelle ein Feld enthält, das mehrere dieser Informationen zusammenfasst, ist das nicht mehr der Fall.

Mit berechneten Feldern erhalten Sie also eine Möglichkeit, die Berechnung (oder auch das Zusammenführen von Daten aus verschiedenen Feldern oder das Aufführen von geänderten Inhalten von Feldern), die Sie sonst in einer Abfrage durchführen würden, direkt in die Tabelle zu programmieren.

Wenn irgendwann einmal geplant ist, die Datenbank etwa zum SQL Server zu migrieren, müssen Sie hier natürlich besonderes Augenmerk auf berechnete Felder legen, denn ihre Funktion dürfte nicht automatisch in Form von Triggern in die Zieldatenbank übernommen werden.