Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Klaus Giesen Wuppertal
Jeder Mensch muss regelmäßig Flüssigkeit zu sich nehmen. Ist das nicht gewährleistet, nehmen sein Wohlbefinden und damit auch seine Arbeitsleistung deutlich ab. Je nach Größe eines Unternehmens stehen den Mitarbeitern unterschiedliche Getränkequellen zur Verfügung. In vielen Fällen handelt es sich dabei um eine selbst organisierte Getränkeausgabe, bei der Getränke von Mitarbeitern eingekauft und an Kollegen verkauft werden. Die Frage, wer nun wie viele Getränke welcher Sorte getrunken und damit auch zu bezahlen hat, ist rein organisatorischer Natur – und sicher ein Fall für eine Access-Musterlösung, wie der vorliegende Beitrag zeigen wird.
Die im Rahmen des vorliegenden Beitrags vorgestellte Musterlösung dient der Verwaltung von beliebig vielen Getränkesorten.
Die Hauptproblematik liegt darin, den Bestand auf knapp werdende Getränke zu überwachen, um rechtzeitig aufzufüllen.
Die meisten Getränke können eins zu eins weitergegeben werden – z. B. in Flaschen- oder Dosenform. Hier ist die überwachung kein Problem.
Andere Getränke wie z. B. Kaffee oder Tee müssen erst zubereitet und in Portionen ausgegeben werden. Zusätzlich variiert die Anzahl der Portionen je Packungseinheit, was die Kalkulation erschwert – z. B. durch eine sich ändernde Menge Kaffeepulver je Tasse.
Erfassung ausgegebener Getränke
Alle ausgegebenen Getränke werden unter Angabe von Empfänger, Anzahl und Preis in der Datenbank gespeichert. Das geschieht in einem übersichtlichen Formular inklusive Berechnung des aktuell offenen Betrages.
Rechnungsstellung
Die Rechnungsstellung kann zu jeder Zeit für beliebige Mitarbeiter erfolgen.
In Rechnung gestellte Getränke werden entsprechend markiert und nicht mehr angezeigt.
Da eine solche Getränkeausgabe in der Regel in überschaubarem Rahmen unter Kollegen erfolgt, wird von der sofortigen Bezahlung offener Rechnungen ausgegangen.
Dementsprechend beinhaltet die Anwendung keine Funktionalität zur Verbuchung von Zahlungseingängen usw.
Ergänzung der Getränkevorräte
Um der Problematik des variierenden Kaffeeverbrauchs gerecht zu werden, benötigt die Anwendung bei den entsprechenden Getränkesorten die Angabe eines Umrechnungsfaktors.
Dieser Faktor gibt an, wie viele Einheiten man je Bestandseinheit des Ausgangsprodukts erhält.
Kaffee
Da Kaffee in unterschiedlichen Packungsgrößen erhältlich ist, setzt die Anwendung eine denkbar kleine Bestandseinheit an: ein Gramm. Als Umrechnungsfaktor verwendet die Anwendung z. B. den Wert 0,1, was bedeutet: aus einem Gramm Kaffeepulver wird 1/10 Tasse Kaffee – also werden 10g je Tasse benötigt.
Bild 1: Die Tabelle tblPersonal in der Entwurfsansicht
Andere Getränke
Getränke wie Cola, Fanta, Mineralwasser usw. haben fest definierte Bestandseinheiten, die genau einer ausgegebenen Einheit entsprechen: eine Flasche, eine Dose usw.
Bestandsüberwachung
Damit ist die Problematik der Bestandsüberwachung geklärt. Mit festen Umrechnungsfaktoren zwischen gekauften Einheiten und ausgegebenen Portionen kann aufgrund der als verkauft gebuchten Getränke relativ zuverlässig auf notwendige Bestandsergänzungen aufmerksam gemacht werden. Dazu ist lediglich noch die Angabe von Grenzwerten für die einzelnen Getränke nötig.
Damit ist die regelmäßige Versorgung der Mitarbeiter mit Getränken gesichert. Wie wichtig das ist, erfahren Sie spätestens, wenn Sie einen Programmierer einen Tag auf Kaffeeentzug setzen …
Voreinstellungen
Als Grundlage für Berechnungen benötigt die Datenbank bestimmte Voreinstellungen, die zudem flexibel sein sollen. Dabei geht es um folgende Angaben:
Hinweis
Sie finden die Beispieldatenbanken zu dieser Musterlösung auf der Heft-CD für Access 97 (Getränke97.mdb) und Access 2000 (Getränke2000.mdb).
Das Datenmodell der Musterlösung besteht aus den vier Tabellen tblPersonal, tblGetraenkeVerbrauch, tblGetraenkeTyp und tblBestandsErgaenzung. In den folgenden Abschnitten lernen Sie die Tabellen kennen und erhalten Erläuterungen und Hinweise zu wichtigen Besonderheiten.
Die Tabelle tblPersonal
Die Tabelle tblPersonal enthält die Stammdaten der Mitarbeiter mit Kontaktinformationen (siehe Bild 1).
Die TabelletblGetraenkeVerbrauch
Die Tabelle tblGetraenkeVerbrauch (siehe Bild 2) dient zur Erfassung der ausgegebenen Getränke und einiger Zusatzinformationen wie Empfänger, Anzahl und Datum.
Die Felder TypID und PersonalID dienen als Verknüpfungsfelder zu den Tabellen tblGetraenketyp und tblPersonal.
Zur Vereinfachung der späteren Eingabe der entsprechenden Informationen werden beide Felder als Kombinationsfelder ausgeführt.
Nehmen Sie die folgenden Einstellungen im Register Nachschlagen in den Feldeigenschaften des jeweiligen Feldes vor: Als Datensatzherkunft für das Feld TypID dient die Tabelle tblGetraenketyp. Stellen Sie außerdem die Eigenschaften Spaltenanzahl und Spaltenbreite auf die Werte 2 und 0cm;4cm ein, damit nur die zweite Spalte angezeigt wird.
Bild 2: Die Tabelle tblGetraenkeVerbrauch in der Entwurfsansicht
Bild 3: Die Tabelle tblGetraenkeTyp in der Entwurfsansicht
Als Datenherkunft für das Feld PersonalID dient die Abfrage qryFullname:
SELECT tblPersonal.PersonalID, [Nachname] & ", " & [Vorname] AS Fullname FROM tblPersonal;
Die Eigenschaften Spaltenanzahl und Spaltenbreite erhalten die Werte 2 und 0cm;8cm.
Durch diese änderungen stehen die beiden Felder bei der Verwendung in Formularen ohne weitere Maßnahmen direkt als Kombinationsfelder zur Verfügung.
Neben diesen beiden Verknüpfungsfeldern sind noch Felder für das Datum der Ausgabe und die Menge der ausgegebenen Einheiten vorhanden.
Das Feld Einheiten ermöglicht sowohl die Verbuchung von Getränken als auch die Berechnung der vom Käufer zu zahlenden Summe. Es besitzt den Standardwert 1, da immer mindestens ein Getränk ausgegeben wird.
Das Feld Datum ist zur bequemen Eingabe mit der Funktion Datum() als Standardwert versehen. Diese Funktion trägt für jeden Datensatz das aktuelle Datum in das Feld Datum ein.
Wichtig für die Funktionalität der Musterlösung ist noch das boolesche Feld Bezahlt, für das der Standardwert Nein eingestellt ist.
Mit Hilfe des Feldes Bezahlt kann sichergestellt werden, dass verbrauchte Getränke nur einmal bezahlt werden.
Beim Ausdruck der Rechnung wird dieses Feld für abgerechnete Getränke auf den Wert True bzw. Ja gesetzt.
Die beiden Felder Einzelpreis und Umrechnungsfaktor haben eine besondere Bedeutung:
Feldname |
Beschreibung |
TypPreis |
Der Verkaufspreis pro ausgegebener Einheit in Euro. |
TypMindestbestand |
Zahlenwert, der die Mindestvorratsmenge für einen Getränketyp festlegt. |
TypUmrechnungsfaktor |
Ermöglicht die Ermittlung von Einheiten (Portionen) bei Halbfertigartikeln wie beispielsweise Kaffee. Limonade dagegen ist ein Fertigartikel und deshalb ist hier der Umrechnungsfaktor gleich 1. |
Tab. 1: Felder der Tabelle tblGetraenkeTyp mit Erläuterungen
Da sich während der Verwendung einer solchen Musterlösung durchaus Veränderungen bezüglich des Preises oder der Menge von ausgegebenen Portionen je Bestandseinheit ergeben können, müssen diese mit den ausgegebenen Getränken gespeichert werden. Anderenfalls können z. B. folgende Probleme auftreten:
Die Tabelle tblGetraenkeTyp
Bild 4: Die Tabelle tblBestandsErgänzung in der Entwurfsansicht
Bild 5: Das Dialogfenster Beziehungen
Die Tabelle tblGetraenkeTyp (siehe Bild 3) enthält die Stammdaten zu den einzelnen Getränketypen wie Kaffee, Limonade, Wasser usw.
In Tab. 1 finden Sie eine nähere Beschreibung zu den wichtigsten Feldern der Tabelle tblGetraenkeTyp.
Die TabelletblBestandsergaenzung
Die Tabelle tblBestandsergaenzung speichert die zugekauften Getränke (siehe Bild 4). Sie ist also quasi die Warenannahme und stellt somit das Gegenstück zur Tabelle tblGetraenkeverbrauch dar.
Die Beziehungen zwischen denTabellen
Nach der Erstellung der Tabellen legen Sie deren Beziehungen zueinander im Dialogfenster Beziehungen fest. Die Musterlösung enthält zwei 1:n-Beziehungen, bei denen sich die Tabelle tblGetraenkeVerbrauch jeweils auf der n-Seite der Beziehung befindet (siehe Bild 5).
Legen Sie für beide Beziehungen referentielle Integrität fest. Aktivieren Sie auf keinen Fall die Löschweitergabe für eine der beiden Beziehungen. Anderenfalls führt das Löschen z. B. eines Datensatzes der Tabelle tblPersonal zum Entfernen der entsprechenden Datensätze der Tabelle tblGetraenkeVerbrauch – was zu einer Verfälschung der Bestandsermittlung führen würde.
Die Getränkeverwaltung enthält insgesamt sechs Formulare, die Sie in den folgenden Abschnitten näher kennen lernen werden.
Bild 6: Das Formular frmHauptmenue
Das Hauptmenü
Das Formular frmHauptmenue ist die Schaltzentrale der Anwendung. Sie hat fünf Schaltflächen, von denen vier dem Aufrufen der weiteren Formulare dienen und eines dem Beenden der Anwendung (siehe Bild 6).
Wichtige Formulareigenschaften
Damit das Hauptformular nur über die entsprechende Schaltfläche zu schließen ist, stellen Sie einige Eigenschaften gemäß Tab. 2 ein.
Hinweis
Die Einstellung der Eigenschaften Bildlaufleisten, Datensatzmarkierer, Navigationsschaltflächen und Trennlinien werden – wie bei allen Formularen mit statischem Inhalt – natürlich auf Nein gesetzt.
Eigenschaft |
Einstellung |
Rahmenart |
Dialog |
Mit Systemfeldmenü |
Nein |
MinMax Schaltflächen |
Nein |
Schließen Schaltfläche |
Nein |
Tab. 2: Eigenschaftseinstellungen für das Formular frmHauptmenue
Praxis-Tipp
Trotz fehlender Schließen-Schaltfläche können Sie das Formular frmHauptmenue jederzeit mit der Tastenkombination Strg + F4 schließen.
Das Formular frmPersonal
Bild 7: Das Formular frmPersonal
Das Formular frmPersonal (siehe Bild 7) enthält die Informationen zu den Mitarbeitern und ein Unterformular zur Anzeige der an den jeweiligen Mitarbeiter ausgegebenen und noch nicht abgerechneten Getränke. Es enthält außerdem ein Feld zur Anzeige des Gesamtpreises der im Unterformular angezeigten ausgegebenen Getränke.
Der folgende Ausdruck verweist auf das entsprechende Feld des Unterformulars:
=frmGetraenkeverbrauch_Sub.Formular!Gesamtsumme Private Sub Form_Current() Forms!frmPersonal!btnDruck.Enabled = _ IIf(Me.RecordsetClone.RecordCount > 0, _ True, False) End Sub
Quellcode 3
Im Formularfuß befinden sich zwei Schaltflächen. Die Schaltfläche btnClose schließt das Formular frmPersonal und macht das Formular frmHauptmenue wieder sichtbar. Die dafür verantwortliche Ereignisprozedur finden Sie in Quellcode 1.
Das Schließen des Formulars löst die Prozedur aus Quellcode 2 aus, die wiederum das Formular frmHauptmenue wieder sichtbar macht.
Die Schaltfläche btnDruck: Aktiv oder nicht
Das Ausdrucken einer Rechnung soll nur möglich sein, wenn das Unterformular frmGetraenkeverbrauch_Sub nicht leer ist. Daher soll die Schaltfläche zum Starten des Druckvorgangs deaktiviert sein, wenn die Anzahl der Datensätze des Unterformulars 0 ist.
Die überprüfung der Datensatzanzahl muss immer durchgeführt werden, wenn im Hauptformular ein anderer Mitarbeiter ausgewählt wird oder wenn im Unterformular eine Aktion durchgeführt wird, die zur änderung des Status der Schaltfläche führen soll – also wenn die Anzahl der Datensätze 0 wird oder sich von 0 auf einen anderen Wert ändert.
Die Prozedur, die beim Eintreten des Ereignisses Beim Anzeigen des Unterformulars ausgelöst wird, deckt beide Fälle ab.
Private Sub btnClose_Click() On Error Resume Next DoCmd.Close acForm, Me.Name End Sub
Quellcode 1
Private Sub Form_Close() Forms!frmHauptmenue.Visible = True End Sub
Quellcode 2
Sie tritt sowohl bei einem Wechsel des Datensatzes im Hauptformular als auch bei allen änderungen der Datensatzanzahl im Unterformular in Aktion (s. Quellcode 3).
Die einzige Anweisung der Prozedur verwendet die IIf-Funktion, um abhängig von der Datensatzanzahl die Eigenschaft Aktiviert der Schaltfläche einzustellen.
Der erste Teil der Funktion ermittelt die Anzahl der Datensätze und prüft, ob diese größer als 0 ist. Ist der Ausdruck im ersten Teil wahr, gibt die Funktion den Ausdruck des zweiten Teils zurück, ansonsten den des dritten Teils.
Start des Ausdrucks einer Rechnung
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo