De administratie van hotel Zeelucht

Bij deze oefening voeren we eerst een analyse uit. Bovendien gebruiken we VBA in plaats van macro's.

Opmerking: automatisch aanvullen in VBA = Ctrl-Spatiebalk.

1. De opgave

Familie Den Otter is sinds vijf jaar eigenaar van hotel Zeelucht. In deze 5 jaar is er veel gebeurd.
Hoewel er bij de start nauwelijks voldoende gasten waren voor de kamers, behoort hotel Zeelucht nu tot één van de populairste hotels in de regio.
Één van de redenen achter dit succes is de stiptheid van de service. Fouten bij de boekingen werden eigenlijk nooit gemaakt. Aan speciale wensen van de gasten wordt zoveel mogelijk tegemoet gekomen.

Maar naarmate de populariteit van het hotel stijgt, wordt het runnen ervan steeds complexer.
Administratie van de reserveringen, annuleringen en het in- en uitchecken van gasten vraagt steeds meer tijd.
Het komt steeds vaker voor dat er door gebrek aan overzicht slordige fouten gemaakt worden.
Bijhouden hoeveel kamers in gebruik zijn (bezettingsgraad), werkschema's opstellen voor de poetsvrouwen, beoordelen van klantenloyaliteit ("goede" klanten), het wordt bijna onmogelijk.

Daarom willen ze overschakelen naar een geautomatiseerd informatiesysteem.

Als goede vriend van de familie en computerkenner wordt jouw hulp gevraagd: er staat een sterke computer bij de receptie (waar ook de administratie gebeurt), met o.a. Access erop.
Kan dat programma gebruikt worden om orde te scheppen in de vele administratieve gegevens?

Je krijgt om te beginnen een voorbeeld van een reservering: reservering.png.

Bovendien neem je een interview af van de eigenaar: interview.pdf.

Opdracht:

Tracht deze opdracht eerst volledig zelf uit te voeren en ga daarna pas verder met de rest van de oefening.

2. De tabelstructuur

De tabelstructuur die in deze oefening gebruikt wordt is: Tabellen

We beginnen met tabel KAMERTYPE:

Vul de vier records in:

Type-IDFaciliteitAantalPersonenKamerprijs
1pddouche1€ 40,—
1pbbad1€ 50,—
2pddouche2€ 64,—
2pbbad2€ 74,—

Vervolgens tabel KAMER:

Vul de records in:

Dan tabel GAST:

Voeg een eerste proefrecord toe: Jan Grevink, NL, geboren op 20/03/1974, paspoortnr 423-1234699-2

Tabel RESERVERING:

Vul als proefrecord in: 18 maart van het huidige jaar, Jan Grevink, opmerking met Van Hees

Uiteindelijk tabel BEZETTING:

Open het relatievenster en leg de link tussen ReserveringID in tabel Reservering naar Reserveringnr in tabel Bezetting.

Geef als voorbeeldrecord in: reservering 1, kamer 9, aankomst 14/06 om 16:00, vertrek 21/06

3. De formulieren

Pas allereerst de eigenschappen aan: vink bij de opties op tabblad Huidige Database de optie Overlappende Vensters aan. Sluit de database en open ze opnieuw, zodat de optie actief wordt.

3.1. De gastgegevens

Maak formulier Gastform: Gasten

3.2. De reservering

In formulier Reserveerform moet ook de voornaam van de gast verschijnen, dus beginnen we met een query.

Reserveringen
  1. Maak query qrVoornaam met alle velden uit Reservering en de voornaam uit gast.
  2. Gebruik de query als basis voor formulier Reserveerform: alle velden uit de query, volgens Reservering, kolomvorm.
  3. Formulierbijschrift: Reserveringen.
  4. Pas aan tot de layout van het voorbeeld. Hier komt later nog een subformulier onder.
  5. Veld Voornaam is vergrendeld en heeft geen tabstop. Veld ReserveringID heeft evenmin een tabstop.
  6. We willen nieuwe gasten kunnen bijmaken vanuit dit formulier. Schuif de formuliervoettekst open en teken er een knop: Formulierbewerking – Formulier Openen, tekst Nieuwe gast, naam knopGast.
  7. Sectie Details heeft geen alternatieve achtergrondkleur, de voettekst krijgt een eigen achtergrondkleur.

Die knop moet nog wat aangepast: we willen dadelijk een venster om een gast toe te voegen, niet een bestaande aan te passen en na sluiten van het venstertje moet de keuzelijst in Reserveerform vernieuwd worden, zodat de nieuwe gast er ook in staat.

Punt 1: converteren naar VBA

Open het formulier in ontwerpweergave. Helemaal rechts op hulplint Ontwerp staat knopje Formuliermacro's Converteren Naar Visual Basic, klik OK en klaar.

Gelukt? Nee? In het eerste geval kan je vereenvoudigen tot de versie hieronder, in het tweede geval heb je wat meer werk:

  1. Open het eigenschappenvenster van de knop en activeer tab Gebeurtenis
  2. Klik in vak Bij Klikken en kies Gebeurtenisprocedure
  3. Klik vervolgens op de 3 puntjes en je zit in het VBA-blad dat bij het formulier hoort.
  4. Vul de inhoud van de procedure aan, zoals hieronder.

Private Sub knopGast_Click()
On Error GoTo recordToevoegenError
  DoCmd.OpenForm "gastForm", acNormal, , , acFormAdd
  Exit Sub
recordToevoegenError:
  Beep
  MsgBox Err.Description, vbOKOnly, "Fout bij toevoegen gast"
End Sub

Punt 2: keuzelijst vernieuwen

  1. Open het formulier in ontwerpweergave en activeer het eigenschappenvenster van de keuzelijst Gast-ID.
  2. Activeer tab Gebeurtenis en klik in vak Bij Focus.
  3. Kies Gebeurtenisprocedure en klik op de drie puntjes.
  4. Vul de procedure aan met volgend statement: Gast_ID.Requery.
  5. Sla de code op, schakel over naar de database en sluit het formulier zodat het opgeslagen is.

Test uit: open Reserveerform, klik op de knop, geef jezelf als nieuwe gast in, sluit gastform en kijk in de keuzelijst. Sta je erin? Zou moeten ...

3.3. Kamerbezetting

Maak formulier Bezettingform:

  1. met tabel Bezetting behalve de ID, in tabelvorm
  2. Wis de titel en label ReserveringID en label + veld Kamerstatus
  3. Maak veld ReserveringID heel smal en verberg het (Zichtbaar: Nee)
  4. Maak label Kamernr precies breed genoeg en geef het veld dezelfde breedte.
  5. Zorg dat alle labels en velden breed genoeg zijn en schik ze t.o.v. elkaar.
  6. Beide uurveldjes krijgen label uur en zijn 1 cm breed, gecentreerd.
  7. Velden + labels Korting en Meerprijs zijn 1,6 cm breed en rechts uitgelijnd.
  8. Sluit het formulier en sla op.

De kamerprijs moet ook in het formulier verschijnen.

  1. Maak query qrprijs met alle velden uit Bezetting en de Kamerprijs uit tabel Kamertype.
    Opm: vergeet tabel Kamer niet, voor de relatie
  2. Voeg een berekend veld Nachten toe: =[Vertrekdatum]-[Aankomstdatum]
  3. Vervolgens veld Kamertotaal: ([Kamerprijs]-[Korting]+[Meerprijs])*[Nachten]
  4. Sla de query op en sluit.
  5. Open formulier Bezettingform en zet qrprijs als recordbron. Zet de nodige velden bij in de detailsectie en de labels in de koptekst.
  6. Vak Kamertotaal staat in notatie Euro.
  7. Vakken Korting en Meerprijs krijgen als standaardwaarde 0, zodat je ermee kan rekenen.
  8. Schuif de ruimte voor de voettekst open. Zet daarin een tekstvak met als label Totaal: en als expressie in het vak =Som([Kamertotaal])
  9. Het vak heeft als notatie Euro, is vergrendeld en heeft geen tabstop.
  10. Pas aan tot de layout hiernaast: Bezetting
  11. ReserveringID en Kamerprijs hebben geen tabstop. Kamerprijs is ook vergrendeld. Controleer de tabvolgorde.
  12. Het formulier heeft geen recordkiezers en geen navigatieknoppen.
  13. Pas het formaat van het formulier aan, zodat de velden en titels er precies in passen. Sla op en sluit.

Nu zetten we Bezettingform in het reserveringsformulier:

  1. Open Reserveerform in ontwerpweergave en schuif de detailsectie verder open.
  2. Voeg daar een subformulier in: Bezettingform, de koppeling is van ReserveringID naar Reserveringnr.
  3. Wis het label bij het subformulier.
  4. Voeg de nieuwe reservering uit het voorbeeldvenster hieronder toe:
Reservering

We zitten nog met een probleem: je mag een kamer niet tweemaal reserveren voor dezelfde periode.

  1. Maak query qrKamer met Kamernr en Type-ID uit tabel Kamer en Aankomstdatum, Vertrekdatum en Kamerstatus uit Bezetting.
  2. Pas het jointype van de relatie aan: alle records uit Kamer, enkel de overeenstemmende uit Bezetting.
  3. Zet qrKamer als rijbron bij Kamernr in formulier Bezettingform. Alleen Lijst = Ja. Sla op en sluit.
  4. Open Reserveerform en pas dan de query qrKamer aan: gebruik de opbouwfunctie om als criterium bij Aankomstdatum en Vertrekdatum volgende expressie te zetten: Not between Formulieren![Reserveerform]![Bezettingform].Form![Aankomstdatum] and Formulieren![Reserveerform]![Bezettingform].Form![Vertrekdatum]
  5. Nog in qrKamer, ook bij Aankomstdatum en Vertrekdatum komt op de OF-rij: Is Null. Sluit de query.
  6. Geef een derde reservering in op 20 april: jezelf als gast, van 20 juni tot 9 juli, eenpersoonskamer met bad.
  7. De kamerlijst moet tijdens de ingave bijgewerkt worden: gebeurtenis Bij Focus: Kamernr.Requery
  8. In het interview staat: vb 3: Op 20 maart belt mevrouw De Groot. Ze wordt op 14 april 75 jaar en wil dit met haar twee kinderen, hun partners en haar kleindochter vieren in het hotel. Ze wil daarom een 1p-kamer met bad reserveren voor haarzelf, twee 2p-kamers met douche en nog een 1p-kamer met douche voor haar kleindochter. Zijzelf en haar kinderen arriveren op 13 april; haar kleindochter zal pas op 14 april aankomen. Iedereen vertrekt op 15 april. Geef deze reservering in.
    Gegevens mevrouw De Groot: Alice De Groot, Belgische, 14/04/1929, 482 963215 77

De keuzelijst van kamers klopt nog niet; we gebruiken beter een gebeurtenisprocedure om ze te vullen met de vrije kamers voor de gekozen periode.

  1. Maak een nieuwe tabel Vrij met twee velden:
    • veld Kamernr: Numeriek, Lange Integer, sleutel
    • veld Type-ID: Korte Tekst, lengte 3
  2. Open Bezettingform in ontwerpweergave en kijk in het eigenschappenvenster van Kamernr, tab Gegevens. Type Rijbron wordt Lijst met waarden en Rijbron is leeg.
  3. Formuliergebeurtenis Bij Laden initialiseert de database:
    Set werkruimte = DBEngine(0)
    Set db = CurrentDb
  4. Declareer wel eerst bovenaan in het moduleblad de variabelen:
    Dim werkruimte As DAO.Workspace
    Dim db As DAO.Database
    Dim bezet As DAO.Recordset
    Dim kamers As DAO.Recordset
    Dim vrij As DAO.Recordset
    Dim sql As String
    Dim aankomst As Date
    Dim vertrek As Date
  5. Formuliergebeurtenis Bij Sluiten ruimt op:
    werkruimte.Close
    Set db = Nothing
    Set werkruimte = Nothing
  6. Pas de gebeurtenisprocedure Bij Focus aan:
    VBA
  7. Wis query qrKamer.

4. De gast arriveert

Wat moet er gebeuren als de gast het hotel binnenkomt?

Sommige gasten kennen misschien het nummer van hun reservering, maar eigenlijk toveren we beter een lijst met lopende reserveringen op het scherm, de receptionist(e) kiest de juiste eruit en past de gegevens van die reservering aan.
Daarvoor moeten we wél weten, welke reserveringen "lopend" zijn.

Welke status kan een reservering hebben?

4.1. De lopende reservaties

  1. Voeg een veld Reserveerstatus toe aan tabel Reservering: lengte 12, standaard reservatie, keuzelijst: reservatie;verblijf;afgehandeld;annulatie
  2. Pas de gegevens aan: overal reservatieReservaties
  3. Maak query qrReservaties met tabellen Reservering, Gast en Bezetting
  4. Eerste vak: Lopend: "Reservering " & [ReserveringID] & " van " & [Reserveerdatum]
  5. Tweede vak: Naam: "op naam van " & [Voornaam] & " " & [Familienaam]
  6. Derde vak is de Reserveerstatus met criterium: reservatie OF verblijf, niet zichtbaar
  7. Vierde vak: Kamernr. Maak er een totalenquery van: Aantal van Kamernr. Geef dat vak titel Aantal
  8. Vergelijk met het resultaat:
Reservaties

Nu maken we een formulier voor de lopende reservaties:

  1. De recordbron voor formulier Reservatiesform is qrReservaties. Het is een formulier in tabelvorm.
  2. Bijschrift Lopende reservaties
  3. Geen formulierkoptekst.
  4. In plaats van vak Aantal komt als expressie: =[aantal] & IIf([Aantal]=1;" kamer";" kamers")
  5. De drie vakken zijn vergrendeld en hebben geen tabstop.

4.2. De aankomst registreren

Op Reservatiesform, rechts van de bestaande vakken, zullen we een knop plaatsen die het volgende moet doen:

Begin met een subformulier Aankomstsubform: aankomst

  1. op basis van tabel Bezetting: Kamernr, Aankomstdatum en -uur, Vertrekdatum en -uur, Kamerstatus, tabelvorm, naam Aankomstsubform
  2. Layout zie hiernaast.
  3. Het eerste vak is een tekstvak zonder label, vergrendeld, geen tabstop, transparante omtrek.
  4. De uurvakjes zijn 1 cm breed, de datumvakken 2 cm. Alle tekst zwart.
  5. Het formulier heeft geen recordkiezers en geen navigatieknoppen, geen toevoegingen toestaan.

Vervolgens maken we formulier Aankomstform: Aankomst

  1. Voeg velden ReserveringID en Opmerking toe aan query qrReservaties.
  2. Maak formulier Aankomstform in ontwerpweergave, met als recordbron qrReservaties.
  3. Het eerste vak in het formulier bevat Lopend, een spatie en Naam. Het is vergrendeld, zonder tabstop.
  4. Onder het tekstvak komt de opmerking en ergens onzichtbaar, zonder tabstop, ReserveringID.
  5. Daaronder komt Aankomstsubform: koppeling van ReserveringID naar Reserveringnr, geen label.

Nu kunnen we de aankomst afwerken:

  1. Open Reservatiesform in ontwerpweergave. Zet een knop in de detailsectie, rechts van de velden: Formulier Openen, Aankomstform, tekst Aankomst, naam knopAankomst.
  2. Vervang de ingesloten macro Bij Klikken door een gebeurtenisprocedure
  3. Declareer bovenaan in het moduleblad de variabelen:
    Dim werkruimte As DAO.Workspace
    Dim db As DAO.Database
    Dim tabel As DAO.Recordset
    Dim nr As Long
  4. Vul subroutine knopAankomst_Click() in:
    On Error GoTo Fout
      Set werkruimte = DBEngine(0)
      Set db = CurrentDb
      Set tabel = db.OpenRecordset("Reservering", dbOpenDynaset)
      nr = [ReserveringID] 'ID uit formulier
      tabel.FindFirst "[ReserveringID]=" & nr 'ID uit tabel
      If tabel.NoMatch Then
        MsgBox "Record niet gevonden"
      Else
        tabel.Edit
        tabel.Fields("Reserveerstatus") = "verblijf"
        tabel.Update
        DoCmd.OpenForm "Aankomstform", acNormal, , "ReserveringID = " & nr
        Form_Aankomstform.Aankomstsubform.SetFocus
      End If

    Opruimen:
      werkruimte.Close
      Set tabel = Nothing
      Set db = Nothing
      Set werkruimte = Nothing
      Exit Sub

    Fout:
      MsgBox "Er is een fout opgetreden" & vbCrLf & "Fout nummer " & Err.Number & ": " & Err.Description, vbCritical
      Resume Opruimen
  5. Test uit: open Reservatiesform, laat Alice De Groot aankomen. Kamer 6 wordt bezet om 13:30 uur.

4.3. Reservering aanpassen en annuleren

De reservering aanpassen kan je gewoon door Reserveerform op te roepen en de gegevens te wijzigen.
Een kamer uit de reservering wissen moeten we wel nog voorzien:

  1. Open Bezettingform in ontwerpweergave.
  2. Teken een klein knopje in de details, rechts van het kamertotaal: Recordbewerking – Record Verwijderen, afbeelding Prullenbak, naam knopWis
  3. Controleer dat het subformulier in Reserveerform nog breed genoeg is.
  4. Zet als laatste regel in subroutine Kamernr_GotFocus set bezet = Nothing - anders klopt die recordset niet meer na het wissen.

Als de hele reservering gewist wordt, moeten ook de bijhorende kamers terug vrijgegeven worden.

  1. Zet een knop in de formuliervoettekst van Reserveerform: Recordbewerking – Record Verwijderen, tekst Reservering wissen.
  2. Geef de knop een duidelijke naam en probeer uit op de eerste reservering: de kamerbezetting blijft bestaan. Verwijder die manueel.
  3. Vervang de macro door een gebeurtenisprocedure. (opm: je kan het ook oplossen met referentiële integriteit)
    VBA
  4. Declareer de nodige variabelen bovenaan in de module.
  5. Test uit: verwijder je eigen reservering

5. Een eerste menustructuur

Om het overzicht op de zaken niet te verliezen, maken we nu misschien best een eerste menustructuur.
We tonen Mr. Den Otter het tot nog toe behaalde resultaat en overleggen met hem wat er nog moet gebeuren, wat de toepassing allemaal moet bieden.
Dat geeft volgend resultaat:

Input (formulieren):

Output (rapporten):

5.1. Kamerprijzen aanpassen

Maak een formulier Kamerprijsform: kamerprijs

  1. Op basis van tabel Kamertype, alle velden, tabelvorm.
  2. Alle velden behalve Kamerprijs zijn vergrendeld en hebben geen tabstop.
  3. Formulierbijschrift Kamerprijs aanpassen. Geen toevoegingen toestaan.

5.2. Meer gastgegevens

Pas tabel Gast aan:

  1. Voeg velden Gaststraat (lengte 60), Gastpostnr (lengte 7), Gastgemeente (lengte 50) en Gastland (lengte 20) toe.
  2. Voeg ook een Ja/Nee-veld Verbleven toe, met standaardwaarde Nee.
  3. Schakel over naar de gegevensweergave en pas het laatste veld aan naar Ja voor de bestaande gasten. Vul ook de landen in.

Vervolgens passen we formulier Gastform aan, zie voorbeeld hiernaast. Verblijf

Nog even Reserveerform aanpassen: als je vanuit dit formulier een nieuwe gast maakt, krijgt die voor het groepsvak standaard Ja.
Open reserveerform in ontwerpweergave, klik op de knop Nieuwe Gast en pas de bestaande gebeurtenisprocedure aan: onder Docmd.Openform enz. komt een extra regel: Form_Gastform.Kader16 = -1 (controleer de naam van het kader in het formulier).

Geef een nieuwe reservering in: op 22/03 belt mevrouw Kristel Andriessen (Kerkstraat 29 te 4320 VN Venlo, geboren op 8/11/1968) voor de reservatie van een 1p-kamer met bad voor de nacht van 23 op 24 juni. Reserveer kamer 7.

5.3. Een opstartscherm

Een formulier dat automatisch geopend wordt bij het openen van de database is handig om de publieke variabelen in kwijt te kunnen.

  1. Maak een nieuw, leeg formulier en zet hotel.wmf als achtergrondfiguur erin. Afbeeldingsformaatmodus: Uitrekken.
  2. Zet er linksboven een label op met Hotel Zeelucht in, in een cursief lettertype, groot, donkere kleur.
  3. Eronder komt het adres, in hetzelfde lettertype en dezelfde kleur: logo
    Sla het formulier op, bv. met naam Beginform.
  4. Ga naar Bestand – Opties – Huidige Database en kies het formulier dat je net maakte bij Formulier Weergeven.
  5. Activeer de formuliergebeurtenissen en maak een gebeurtenisprocedure Bij Laden.
  6. Maak een algemene module menuOpties en zet daar bovenaan twee publieke variabelen in:
    Public werkruimte As DAO.Workspace
    Public db As DAO.Database
  7. De code bij Form_Load van Beginform wordt:
    Set werkruimte = DBEngine(0)
    Set db = CurrentDb
    Docmd.Maximize
  8. Maak ook een gebeurtenisprocedure Bij Uit Geheugen:
    Set db = Nothing
    Set werkruimte = Nothing
  9. Controleer alle modules, zodat nergens anders meer werkruimte en db gedeclareerd, geïnitialiseerd of gesloten worden.

5.4. Een eerste menu

De output (rapporten) zijn nog niet gemaakt, maar de meeste menu-items kunnen we al voorzien.

  1. Voeg de systeemtabel USysRibbons toe (zie VBA: navigatie 11.2) en geef het lint een naam, bv. Hotel
  2. Typ de XML voor de menu-opties in een teksteditor en sla op als een bestand met extensie .xml:
    XML
  3. Open het XML-bestand in een browser. Komt er niets te voorschijn? Dan heb je ergens een fout getypt.
  4. Alles OK? Kopieer de hele XML-inhoud en plak die in veld RibbonXml van tabel USysRibbons. Sluit de tabel.
  5. Kies in menu Bestand – Opties – Huidige Database. Scroll naar de Lint- en WerkbalkOpties.
  6. Bij Naam Lint: kies je nu de naam van je zelfgemaakte lint. Schakel de beide opties eronder uit.
  7. Sluit de database en open ze opnieuw. Je krijgt een nieuw lint met twee tabs: Zeelucht en Afdrukvoorbeeld.

Sluit de database en open ze via de bestandsverkenner: houd Shift in terwijl je dubbelklikt op het bestand, anders kan je niet meer aan de gewone menu's.
Nu voegen we de VBA-code toe:

  1. Open de algemene module menuOpties (die je in punt 5.3 maakte).
  2. Kies in het VBA-menu Extra – Verwijzingen en zet een vinkje aan Microsoft Office 16.0 Object Library.
  3. Vul de algemene module in voor de bestaande opties:
    menu
  4. In de formulieren die vanuit het menu geopend worden zet je eigenschap Pop-Up (tabblad Overige) op ja, anders worden ze gemaximaliseerd geopend.
  5. Herstart de database (of kies Bestand – Info – Database Comprimeren En Herstellen) en controleer de opties: openen ze allemaal de juiste vensters?
  6. Voeg de volgende reserveringen toe:
    • op 18 maart reserveren de heren Grevink en Van Hees een tweepersoonskamer met douche voor de week van 14 tot en met 21 juni.
    • Mr Appeltans (Beukenlaan 40, 3800 Sint-Truiden) reserveert op 24 maart twee 2p-kamers met douche voor 15 en 16 juni.

5.5. Verblijf zonder reservering

Gemakkelijkste manier: laat een nieuwe Reserveerform invullen op datum van vandaag en toon een knop Aankomst erop.

  1. Open Reserveerform in ontwerpweergave en geef de titel als Naam: Reserveertitel.
  2. Teken een knop in de formuliervoettekst van Reserveerform (niet Bezettingform!). Naam: knopAankomst, Zichtbaar: Nee, Bijschrift: Aankomst.
  3. Sla Reserveerform op en sluit.
  4. Kies Maken – Visual Basic en open de algemene module menuOpties.
  5. Pas subroutine menuKies aan:
    Select Case control.Id
      Case "keuzeAankomst"
        Select Case keuze
          Case "metRes"
            DoCmd.OpenForm "Reservatiesform", acNormal
          Case "zonderRes"
            DoCmd.OpenForm "Reserveerform", acNormal, , , acFormAdd 'openen in toevoegmodus
            Form_Reserveerform.Reserveertitel.Caption = "Aankomst zonder reservering"
            Form_Reserveerform.knopAankomst.Visible = True
        End Select
    End Select
  6. En nu in Reserveerform, bij klikken op knop knopAankomst: zorg dat recordset tabel en lange integer nr gedeclareerd zijn en vul aan:
    VBA

5.6. Testen

Tijd voor een uitgebreide test. Open de database 'normaal', d.w.z. met het aangepaste menu.

  1. Mevrouw De Groot en haar familie (behalve de kleindochter) arriveren op 13 april om 13:30.
  2. Mr Jaak Lammens uit Apeldoorn reserveert op 22 mei een 1p-kamer met douche voor 24 mei, voor één nacht. Hij kondigt aan dat hij er pas om 23:30u kan zijn.
    Zijn reservering wordt vastgehouden; hij betrekt de kamer om 23:45u. Hij krijgt een korting van 8 euro op de standaardprijs.
  3. Greet Peetermans komt op 26 mei om 17:00 met haar vriendin aan de balie. Ze krijgen een tweepersoonskamer met douche. Ze weten nog niet hoe lang ze blijven (reserveer voor 1 nacht) ; omdat het hotel niet erg vol is, is dat geen probleem. In de loop van de volgende ochtend informeren ze de receptionist dat ze nog een nacht blijven. Op 28 mei om 10:00u vertrekken ze.
  4. Twee Nederlandse studenten, Els Plessers en Dieter Ordingen, reserveren op 29 mei de goedkoopst mogelijke 2p-kamer voor drie nachten vanaf 5 juni.
    Ze komen op de afgesproken datum om 6 uur 's middags aan. 's Nachts wordt Els ziek; ze besluiten 's morgens de rest van hun verblijf te annuleren en gaan naar huis.

6. De rapporten

Stel om te beginnen de opties in: Bestand – Opties – Clientinstellingen: alle marges 2 cm.

6.1. De gastenlijst

Mr. Den Otter wil een gastenlijst waarop de niet-ingevulde gegevens gemarkeerd worden.

  1. Rapport op basis van tabel Gasten, alles behalve de ID, sorteren op familienaam, kolomvorm, naam Gastenlijst.
  2. In de rapportkoptekst komen in labels de gegevens van het hotel, zie voorbeeld.
  3. De titel en de labels met de hotelgegevens staan in hetzelfde cursieve lettertype (bv: Monotype Corsiva), donkerste tint goud.
  4. Rechts staat de afbeelding hotel.wmf
  5. Schik de velden volgens het voorbeeld. Geen alternatieve achtergrondkleur. Kleur idem titel.
  6. Voorwaardelijke opmaak bij elk veld: als het veld leeg is, d.w.z. expressie isNull([veldnaam]) wordt de achtergrond zachtroze.

6.2. Boekingen per gast

In voorbereiding

6.3. De rekening

In voorbereiding

6.4. Gereserveerde en bezette kamers

In voorbereiding

6.5. Opbrengsten per maand

In voorbereiding

6.6. Bezettingsgraad kamers

In voorbereiding

6.7. VBA voor rapporten

In voorbereiding