Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Wert berechnen / freie Betten bestimmen

Begonnen von Passenger89, November 10, 2015, 12:14:14

⏪ vorheriges - nächstes ⏩

Passenger89

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)

MaggieMay

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?
Freundliche Grüße
MaggieMay

Passenger89

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.

MaggieMay

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.
Freundliche Grüße
MaggieMay

Passenger89

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Passenger89

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

Passenger89

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.

MaggieMay

#8
ZitatLeider ist die Dateigröße begrenzt
Komprimieren und Zippen heißen hierzu die Lo(e)sungsworte.

Freundliche Grüße
MaggieMay

Passenger89

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

MaggieMay

#10
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.
Freundliche Grüße
MaggieMay

Passenger89

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"?

MaggieMay

#12
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?
Freundliche Grüße
MaggieMay

Passenger89

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.


MaggieMay

#14
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.

Freundliche Grüße
MaggieMay