Hallo zusammen,
ich tüftel zur Zeit an einer AccesDB zur Zimmer und Betten Verwaltung und stoße mittlerweile an meine VHS Acces Kenntnis Grenzen. :-\ Ich würde mich über eure Unterstützung / Denkanstöße freuen.
Die Ausgangslage ist die folgende:
Ich habe eine Tabelle tblZimmer mit den Feldern ZimmerID, Bezeichnung, Anzahl_Betten und ein Freitextfeld Besonderheit.
Soweit so gut. Über ein Formular können beliebig viele Zimmer mit beliebigen Namen/Bezeichnungen angelegt werden.
In einer weiteren Tabelle tblZimmerBelegung habe ich die Felder BelegungsID (PK), Barcode, ZimmerID (FK), Bemerkung als Freitext. Das Feld Barcode gehört zur tblStammdaten und lässt das Zimmer somit einem Gast belegen.
Nun habe ich ein Formular, in welchem ich hinterlegen kann welcher Gast (also welcher Barcode) in welchem Zimmer (ZimmerID) untergebracht wird.
Meine Herausforderung ist nun eine übersicht zu haben, in welchem Zimmer noch wie viele Betten frei sind. Das ganze sollte so dynamisch angelegt sein, dass auch neu hinzugefügte Zimmer berücksichtigt werden. Mir gelingt die Umsetzung nur für eine vorher fest definierte Zahl von Zimmern (ich erstelle dann für jedes Zimmer eine eigene Abfrage)
Hi,
Zitatich erstelle dann für jedes Zimmer eine eigene Abfrage
upps - das dürfte nicht nötig sein. Zeig doch mal den SQL-Code einer solchen Abfrage, damit man dir einen Alternativvorschalg machen kann.
Ist das immer nur eine "Momentaufnahme", d.h. gibt es keine Belegungszeiträume/Buchungsdaten, die berücksichtigt werden müssten?
Den SQL Code habe ich nicht, da ich es nur so lösen würde...Es aber leider so ja nicht funktioniert :-[
Es handelt sich nur um eine Momentaufnahme. Die Gäste müssen einmalig auf die Zimmer verteilt werden.
Ich möchte also beliebige Zimmer mit beliebigen Bezeichnungen anlegen können, jedes Zimmer hat eine bestimmte Anzahl an Betten. Diese wird beim anlegen der Zimmer abgefragt [Funktioniert]
Nun möchte ich ein Gast einem Zimmer zuordnen. Das soll so lange möglich sein bis die dem Zimmer zugeordnete Anzahl an Betten belegt ist.
Aktuell habe ich zwar festgelegt das ein Zimmer z.B. 8 Betten hat. Ich kann aber 100 Personen in dieses Zimmer buchen.
Weiterhin wäre es schön wenn ich einsehen könnte wie viele Betten in welchem Zimmer frei sind.
ZitatMir gelingt die Umsetzung nur für eine vorher fest definierte Zahl von Zimmern (ich erstelle dann für jedes Zimmer eine eigene Abfrage)
Daraus habe ich geschlossen, dass du diesen Weg bereits gegangen bist, also solltest du auch den Code einer solchen Abfrage zeigen können.
Ansonsten war deine Frage verständlich genug, du hättest sie nicht wiederholen müssen. Es fehlen aber Detailinformationen, um dir einen konkreten Vorschlag machen zu können. Du könntest bspw. erst einmal etwas genauer schildern wie du bei der Zimmerbelegung vorgehst. Ich gehe mal davon aus, das geschieht über ein Formular. Wie wählst du das Zimmer aus, was passiert nach Eingabe einer Belegung? Es gibt Formularereignisse die man nutzen könnte um bspw. die Belegerzahl mit der Bettenzahl zu vergleichen. Sinnvoll wäre auch, nur die Zimmer anzubieten, die noch frei Kapazitäten haben.
Was sind deine Vorkenntnisse, wo sollen wir dich abholen?
Mit einer Beispiel-DB von dir kämen wir sicher leichter voran.
Entschuldigt bitte :) Ich glaube ich bin selber noch so verknotet im Kopf das ich glaube mein Problem schlecht beschrieben zu haben :D :D
Anlegen von Zimmern:
Erfolgt über ein Formular welches die Daten direkt in die Tabelle tblZimmer schreibt
Zimmerzuteilung:
Erfolgt über ein Formular in dem zum einen der Gast über einen Barcode ausgewählt wird und dann erfolgt die Zuteilung auf einer Zimmer über ein Kombinationsfeld in dem alle Zimmer aus der tblZimmer auswählbar sind.
Ich "entbrande" die Datenbank mal so weit und versuche diese hochzuladen.
Meine Kenntnisse stammen aus zwei VHS Kursen und ich würde mich als Fortgeschritten bezeichnen. Stelle ruhig euren Lösungsansatz vor, bei Fragen frage ich dann nochmal
Zitatund dann erfolgt die Zuteilung auf einer Zimmer über ein Kombinationsfeld
Da wäre dann wohl als erstes anzusetzen, damit dort nur Zimmer mit freier Kapazität angezeigt werden. Und nach jeder Eingabe muss das Kombifeld aktualisiert werden.
So ich habe soweit mal alle Logos etc. entfernt und lade die ezentiellen Tabellen und Formulare mit hoch.
Edit:
Leider ist die Dateigröße begrenzt, ich stelle es daher hier online:
https://www.dropbox.com/s/ungdf3e8057p205/Muster.accdb?dl=0
In dem Formular frmZimmerZuteilen bzw. dem auf der Abfrage abFreieBetten bassierenden Unterformular würde ich gerne die freien Betten anzeigen lassen.
Das der Anwender zum Beispiel wenn er eine 8 Köpfige Familie einbuchen möchte sieht, dass Zimmer1 noch entsprehend frei ist.
ZitatLeider ist die Dateigröße begrenzt
Komprimieren und Zippen heißen hierzu die Lo(e)sungsworte.
Zitat von: MaggieMay am November 10, 2015, 16:20:39
ZitatLeider ist die Dateigröße begrenzt
Komprimieren und Zippen heißen hierzu die Lo(e)sungsworte.
Auch dann ist die DB leider minimal größer als die zulässigen 1000KB. Selbst mit 7Zip
Nachtrag:
Manchmal muss man auch die verbliebenen Objekte in eine neue, leere DB importieren, um alten Ballast loszuwerden.
Was die DB betrifft, so gäbe es eine Menge dazu zu sagen. Als erstes solltest du die VBA-Option "Variablendeklaration erforderlich" anhaken und an den Anfang eines jeden Moduls den Eintrag "Option Explicit" schreiben. Dann kompilieren und Fehler bereinigen - aber komm bitte nicht auf die Idee, die vermeintlich fehlende Variable "Cancel" zu deklarieren, sondern entferne den Befehl, da er an den angemäkelten Stellen sinnlos ist.
Für die Abfrage der belegbaren Zimmer kommen folgende Möglichkeiten in Frage:
SELECT z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, b.anz_belegt
FROM tblZimmer AS z INNER JOIN (SELECT ZimmerID, Count(*) AS anz_belegt FROM tblZimmerbelegung GROUP BY ZimmerID) AS b ON z.ZimmerID = b.ZimmerID
WHERE b.anz_belegt < z.Anzahl_Betten;
oder
SELECT z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, (select count(*) from tblZimmerbelegung As b Where b.ZimmerID = z.ZimmerID) AS anz_belegt
FROM tblZimmer AS z
WHERE (select count(*) from tblZimmerbelegung As b Where b.ZimmerID = z.ZimmerID) < z.Anzahl_Betten;
Das Zuteilungsformular halte ich vom Aufbau her für falsch, das Hauptformular sollte an die Tabelle "tblZimmer" gebunden werden, die davon abhängenden Belegungen dazu in einem Unterformular. Die Stammdaten sollten an anderer Stelle gepflegt werden.
Zitat von: MaggieMay am November 10, 2015, 17:14:48
Nachtrag:
Manchmal muss man auch die verbliebenen Objekte in eine neue, leere DB importieren, um alten Ballast loszuwerden.
Was die DB betrifft, so gäbe es eine Menge dazu zu sagen. Als erstes solltest du die VBA-Option "Variablendeklaration erforderlich" anhaken und an den Anfang eines jeden Moduls den Eintrag "Option Explicit" schreiben. Dann kompilieren und Fehler bereinigen - aber komm bitte nicht auf die Idee, die vermeintlich fehlende Variable "Cancel" zu deklarieren, sondern entferne den Befehl, da er an den angemäkelten Stellen sinnlos ist.
Für die Abfrage der belegbaren Zimmer kommen folgende Möglichkeiten in Frage:
SELECT z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, b.anz_belegt
FROM tblZimmer AS z INNER JOIN (SELECT ZimmerID, Count(*) AS anz_belegt FROM tblZimmerbelegung GROUP BY ZimmerID) AS b ON z.ZimmerID = b.ZimmerID
WHERE b.anz_belegt < z.Anzahl_Betten;
oder
SELECT z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, (select count(*) from tblZimmerbelegung As b Where b.ZimmerID = z.ZimmerID) AS anz_belegt
FROM tblZimmer AS z
WHERE (select count(*) from tblZimmerbelegung As b Where b.ZimmerID = z.ZimmerID) < z.Anzahl_Betten;
Das Zuteilungsformular halte ich vom Aufbau her für falsch, das Hauptformular sollte an die Tabelle "tblZimmer" gebunden werden, die davon abhängenden Belegungen dazu in einem Unterformular. Die Stammdaten sollten an anderer Stelle gepflegt werden.
Die Stammdaten werden dort auch nicht gepflegt, sondern nur zur Kontrolle angezeigt. Es soll sichergestellt werden, dass es sich um die richtige Person handelt.
Wie verhält es sich mit dem z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, b.anz_belegt
muss ich z durch den Tabellennamen ersetzen oder kann ich das so in die Abfrage einbauen?
Sind dir noch drastische Fehler aufgefallen oder nur so "er wusste es nicht besser Fehler"?
ZitatDie Stammdaten werden dort auch nicht gepflegt, sondern nur zur Kontrolle angezeigt.
Dazu könnten evtl. auch weniger Daten genügen?
ZitatWie verhält es sich mit dem z.Bezeichnung [...]
Wenn du mal genau hinschaust kannst du sehen, dass z und b als Aliasnamen für die Tabellen eingesetzt wurden.
Es wäre für die Helfer einfacher, wenn du ein wenig mehr Testdaten eingepflegt hättest, mit jeweils einem Datensatz kann man wenig anfangen und auch deine Buchungsproblematik nicht nachstellen.
ZitatAktuell habe ich zwar festgelegt das ein Zimmer z.B. 8 Betten hat. Ich kann aber 100 Personen in dieses Zimmer buchen.
Ehrlich gesagt verstehe ich nicht, wie das funktionieren soll.
Wie gehst du damit um, wie gehst du da vor? Wie buchst du 100 Personen auf ein Zimmer?
Das mit den 100 Personen war nur als Beispiel gemeint, dass ich zwar sagen kann das Zimmer hat nur 8 Plätze aber so wie ich es konfiguriert hatte war es möglich, mehr als 8 Personen auf ein Zimmer zu buchen.
Bei deiner nun eingefügten Lösung verschwindet das Zimmer aus der Liste wenn es voll belegt ist. Zusätzlich nutze ich die Abfrage abFreieBetten für das Kombinationsfeld und erlaube nur werte aus der Liste. Somit ist es nicht mehr möglich ein volles Zimmer weiter zu belegen.
ZitatDas mit den 100 Personen war nur als Beispiel gemeint
Das war mir schon klar... ;-)
ZitatZusätzlich nutze ich die Abfrage abFreieBetten für das Kombinationsfeld
Welches Kombinationsfeld meinst du da?
ZitatSomit ist es nicht mehr möglich ein volles Zimmer weiter zu belegen.
Ich wüsste weiterhin gern, wie du die Buchungen überhaupt vornimmst.
BTW:
Gebundene Kombifelder in einem nicht ausschließlich zur Datenerfassung angelegten Formular sind keine gute Wahl.
Hallo Passenger,
Schau Mal hier:
http://www.prof-horst-guenther.de/?s=belegplan (http://www.prof-horst-guenther.de/?s=belegplan)
gruss ekkehard
Ich wüsste weiterhin gern, wie du die Buchungen überhaupt vornimmst.
[/quote]
Bei einer Buchung rufe ich das Formular frmZimmerZuteilen auf, wähle in dem Kombinationsfeld zuerst einen Barcode eines Gastes aus und wähle anschließend in dem Kombinationsfeld ZimmerID das Zimmer aus, in welchem der Gast nächtigen soll.
Durch deine Lösung kann ich in dem Feld jetzt nur die Zimmer auswählen, in welchen auch tatsächlich noch ein Bett frei ist. Sind alle Betten verlegt ist das Zimmer nicht mehr sichtbar.
Schön wäre es wenn man es so einstellen könnte, dass im UFO Untergeordnet28 aber die Zimmer stehen bleiben würden und halt nur in dem Kombinationsfeld nicht mehr sichtbar sind.
Verstehst du wie ich das meine?
ZitatBei einer Buchung rufe ich das Formular frmZimmerZuteilen auf
Wird das Formular im Anfügemodus geöffnet, d.h. stehst du sofort auf einem neuen Datensatz?
Zitatdass im UFO Untergeordnet28 aber die Zimmer stehen bleiben würden
Dann binde das Ufo an eine andere Abfrage oder direkt an die Zimmer-Tabelle.
Ja genau. Beim öffnen des Formulars wird direkt ein neuer Datensatz angelegt. Ein hin und her springen zwischen den bestehenden Datensätzen ist ausgeschlossen.
Bzgl. des UFO. Aktuell greift das ja auf die mittels deines SQL Codes erzeugte Abfrage zurück. Das ist auch wirklich super, da mir so die Anzahl der belegten Betten angezeigt wird und ich die Anzahl der freien Betten berechnen kann. Kannst du den SQL Code so umschreiben, dass die vollen Zimmer nicht ausgeblendet werden? Wenn ich das UFO auf eine andere Abfrage verknüpfe fehlen mir ja wieder die Betten zahlen
Zitat von: Passenger89 am November 11, 2015, 14:53:04Kannst du den SQL Code so umschreiben, dass die vollen Zimmer nicht ausgeblendet werden?
Rate mal was du hier ändern musst, um auch voll belegte Zimmer zu sehen:
SELECT z.Bezeichnung, z.Anzahl_Betten, z.Besonderheit, b.anz_belegt
FROM tblZimmer AS z INNER JOIN (SELECT ZimmerID, Count(*) AS anz_belegt FROM tblZimmerbelegung GROUP BY ZimmerID) AS b ON z.ZimmerID = b.ZimmerID
WHERE b.anz_belegt < z.Anzahl_Betten;ZitatWenn ich das UFO auf eine andere Abfrage verknüpfe fehlen mir ja wieder die Betten zahlen
Wer sagt denn, dass "eine andere Abfrage" das nicht liefern kann?