Home > Artikel > Ausgabe 9/2016 > Rezepte verwalten

Rezepte verwalten

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Die wichtigste Information eines Kochrezepts ist seine Zutatenliste mit ihren Mengenangaben. Diese basiert auf verschiedenen Lebensmitteln, die bereits in der Nährwertdatenbank dieser Ausgabe vorliegen. Es liegt also nahe, diese Datenbank um einen Rezepteteil zu erweitern. Dabei kümmern wir uns hier lediglich um diese Liste und lassen die Zubereitungsanleitungen außen vor.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1609_Rezepte.accdb

Rezepttabellen

Das Datenmodell der Nährwertdatenbank hatten wir schon vorgestellt. Es enthielt bereits die Tabellen zur Rezepteverwaltung. Werfen Sie nochmals einen Blick darauf (Bild 1). Die Tabelle tblRezepte besteht aus einem Primärschlüssel ID als Autowert zur eindeutigen Identifizierung und aus der Bezeichnung des Rezepts im Feld Rezept. Portionen ist ein Long-Wert, der darüber Auskunft gibt, für wie viele Personen die Mengenangaben des Gerichts gedacht sind.

Das Modell der Rezepteverwaltung ist gleich wie das der Nährwertdatenbank

Bild 1: Das Modell der Rezepteverwaltung ist gleich wie das der Nährwertdatenbank

Die Tabelle tblRezepteZutaten stellt die Verbindung zur Nährwertetabelle her und verknüpft sie n:m. Also bezieht sich das Feld IDRezept jeweils auf einen Datensatz der Rezepttabelle und IDNahrungsmittel auf einen in tblNaehrwerte. Ist diese Verbindung für eine Zutat hergestellt, braucht es zusätzlich die zu verwendende Menge des Lebensmittels, die im gleichnamigen Feld festgehalten wird. Rufen Sie die Tabelle in der Datenblattansicht auf, so zeigt sie bereits eine sprechende Übersicht über die Rezepte und deren Zutaten an (Bild 2). Obwohl es sich bei den Feldern IDRezept und IDNahrungsmittel um indizierte Zahlenwerte handelt, finden sich der Ansicht hier die zugehörigen Bezeichnungen der verwiesenen Tabellen. Das wird durch Ändern der Feldeigenschaften erreicht.

Die Tabelle tblRezepteZutaten in Datenblattansich

Bild 2: Die Tabelle tblRezepteZutaten in Datenblattansich

Im Entwurf der Tabelle ist etwa für das Feld IDRezept der Reiter Nachschlagen aktiviert und dort unter Steuerelement anzeigen der Typ von Textfeld auf Kombinationsfeld geändert worden (siehe Bild 3). Für dessen Datensatzherkunft ist eine Abfrage als SQL-String eingetragen, die aus der Rezeptetabelle nur die beiden Felder ID und Rezept herausholt. Spaltenanzahl steht folglich auf 2, während die Gebundene Spalte die erste, also die ID, ist. Diese wird in der Datenblattansicht dann automatisch ausgeblendet.

Details zum Entwurf der Tabelle tblRezepteZutaten für das Feld IDRezept

Bild 3: Details zum Entwurf der Tabelle tblRezepteZutaten für das Feld IDRezept

Ähnlich wird mit dem Feld IDNahrungsmittel verfahren, nur dass die Abfrage sich dann hier auf die Nährwertetabelle bezieht.

Für die Tabelle tblRezepte ist in ihren Eigenschaften als Unterdatenblatt eben die Tabelle tblRezepteZutaten eingetragen. Das wäre dezidiert eigentlich nicht nötig, weil die Voreinstellung (Automatisch) dies selbständig vornimmt. Es ergibt sich aus der angelegten Verknüpfung im Beziehungsfenster. Öffnen Sie die Tabelle und klappen Sie ein Unterdatenblatt aus, so zeigt sich eine Ansicht, wie in Bild 4. Der Datensatz Grünkernbratlinge listet alle Zutaten auf. Eine Zutat können Sie ihrerseits ausklappen, weil für die Tabelle tblRezepteZutaten als Unterdatenblatt die Tabelle tblNaehrwerte spezifiziert ist. Damit können Sie auch gleich die Kennzahlen dieser Zutat ablesen.

Die Tabelle tblRezepte zur Laufzeit mit ihrem ausgeklappten Unterdatenblatt

Bild 4: Die Tabelle tblRezepte zur Laufzeit mit ihrem ausgeklappten Unterdatenblatt

Nun möchten Sie die Rezepte sicher nicht in Datenblättern verwalten. Anschaulicher wird das erst mit einem Formular.

Rezepteformular

Folgende Anforderungen werden an das Formular gestellt: Es soll pro Datenseite nur ein Rezept anzeigen. Zu einem Rezept soll sich über ein Auswahlkombinationsfeld navigieren lassen. Die Zutaten listen sich in einem Unterformular auf. Und alles soll editierbar sein.

Bild 5 stellt das fertige Formular zur Laufzeit dar. Hier zeigen sich noch einige Zusatzfunktionen. Der Button Mengen auf 1 Portion umrechnen ermöglicht es, alle Zutatenmengen so zu ändern, dass die Angaben für genau eine Portion stimmen. Der Button ist nur dann aktiv, wenn im Rezept für Portionen eine Zahl abweichend von 1 eingetragen ist.

Das Formular zur Rezepteverwaltung weist einige zusätzliche Features auf

Bild 5: Das Formular zur Rezepteverwaltung weist einige zusätzliche Features auf

Im Formularfuß sind zwei Schaltflächen untergebracht, die zum einen das bekannte Nährwerteformular aufrufen lassen, zum anderen den Kalorienrechner zur Ermittlung des täglichen Energiebedarfs. Beide werden im Beitrag Nährwertdatenbank dieser Ausgabe erläutert.

Ist der Energiebedarf ermittelt worden, so zeigt ein Label unter der Zutatenliste zusätzlich an, welchen Anteil das aktuelle Rezept an Ihrem Tagesbedarf haben kann.

Und schließlich erwirkt ein Klick auf die Schaltfläche Nährwertdaten des Rezepts das Öffnen einer Abfrage, die weitere Kennzahlen zu den Inhaltsstoffen des Gesamtrezepts ausgibt. Dazu später mehr. Schauen wir uns zunächst Schritt für Schritt den Aufbau und die Code-Teile des Formulars frmRezepte an.

Das Unterformular für die Zutaten kommt aus dem Formular sfrmRezepte (Bild 6), welches an eine Abfrage auf Basis der Tabelle tblRezeptezutaten gebunden ist. Es enthält ein Kombinationsfeld für das Nahrungsmittel, gebunden an das Feld IDNahrungsmittel, und eine Textbox für die Mengenangabe. Als Standardansicht ist Datenblatt eingestellt. Die Abfrage qry_sfrmRezepte als Datenherkunft dieses Unterformulars gibt allerdings noch mehr Felder zurück, als aus diesen beiden Steuerelementen ersichtlich wird (siehe Bild 7).

Für Unterformular der Zutatenliste ist das Formular sfrmRezepte in Datenblattansicht zuständig

Bild 6: Für Unterformular der Zutatenliste ist das Formular sfrmRezepte in Datenblattansicht zuständig

Die Abfrage qry_sfrmRezepte stellt die Datenherkunft des Unterformulars dar

Bild 7: Die Abfrage qry_sfrmRezepte stellt die Datenherkunft des Unterformulars dar

Wichtig ist vor allem das Feld IDRezept, weil es zur Verknüpfung des Unterformulars mit der ID des Hauptformulars dient. Das Feld Energie berechnet die Kalorienzahl für den Zutatendatensatz gemäß seiner Menge nach dieser Formel:

[Kcal]*[Menge]/100 AS Energie

Dieser Wert wird später dafür benötigt, um die Summe der Kalorien des Rezepts zu bestimmen und damit auch seinen Anteil am Tagesbedarf.

Zu einem Rezept navigieren Sie über das Kombinationsfeld rechts oben im Hauptformular. Seine Daten bezieht es aus der Rezeptetabelle.

Eine Auswahl in ihm zeitigt das Ereignis AfterUpdate (Nach Aktualisierung). Hier ist der folgende Code hinterlegt:

Private Sub cbRezept_AfterUpdate()

   Me.Filter="ID=" & Me!cbRezept.Value

   Me.FilterOn=True

End Sub

Die Datenherkunft des Formulars (tblRezepte) wird damit nach der gewählten ID gefiltert. Nicht nur im Hauptformular wirkt sich dies aus, sondern auch im über die ID verknüpften Unterformular, welches nun nur jene Zutaten auflistet, die dem Rezept zueigen sind.

Kommen wir zur Funktion der Umrechnung der Mengen für eine Portion, die über den entsprechenden Button cmdRecalc ausgelöst wird. Wie erwähnt ist dieser Button nur dann aktiv, wenn der Portionen-Wert von eins abweicht. Dafür ist eine Zeile im Current-Ereignis (Beim Anzeigen) des Formulars verantwortlich:

Me!cmdRecalc.Visible = _

(Me!Portionen.Value <> 1)

Die Sichtbarkeit wird über den Vergleich des Feldinhalts Portionen mit 1 als Booleschem Ausdruck gesteuert.

Die Umrechnungsroutine zeigt Listing 1. Zuerst gestattet eine Sicherheitsabfrage über eine Msgbox dem Benutzer den Abbruch des Vorgangs. dann wird der Umrechnungsfaktor in der Double-Variablen factor bestimmt. Er ergibt sich aus dem Kehrwert der eingetragenen Portionenmenge. Dann wird eine Kopie des Unterformular-Recordsets über die Methode RecordsetClone der Objektvariablen rs zugewiesen. Es enthält dann alle angezeigten Datensätze, die nun in einer Do-While-Schleife alle durchlaufen werden. Jeder Datensatz wird editiert und das Feld Menge verändert, wobei sein Wert mit dem in factor multipliziert wird. Damit ist die eigentliche Umrechnung erledig. Die Änderungen sollen sich jedoch auch im Hauptformular reflektieren. Dazu wird seine Dirty-Eigenschaft (Geändert) auf False gesetzt, was ein Trick ist, um sein Current-Ereignis anzustoßen. In dieser Ereignisprozedur wird dann etwa der Energieanteil neu berechnet und außerdem der Umrechnungs-Button wieder auf Unsichtbar geschaltet.

Private Sub cmdRecalc_Click()

     Dim factor As Double

     Dim rs As DAO.Recordset

     

     If MsgBox("Möchten Sie die Mengenangaben unwiderruflich verändern?", _

         vbExclamation Or vbYesNo, "Bestätigen") = vbYes Then

         

         factor = 1 / Me!Portionen.Value

         Me!txtPortionen.Value = 1

         Set rs = Me!sfrmZutaten.Form.RecordsetClone

         If rs.EOF And rs.BOF Then Exit Sub

         rs.MoveFirst

         Do While Not rs.EOF

             rs.Edit

             rs!Menge.Value = Round(rs!Menge.Value * factor, 0)

             rs.Update

             rs.MoveNext

         Loop

         Me!txtRezept.SetFocus

         Me.Dirty = False

     End If

End Sub

Listing 1: Umrechnen der Zutatenmengen nach Klick auf den Button cmdRecalc

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!