Tarief berekenen

Status
Niet open voor verdere reacties.

aromijn99

Gebruiker
Lid geworden
9 sep 2013
Berichten
39
Hoi, Ik ben een beginnend Access gebruiker zonder programmeerervaring. Gelukkig staat er heel wat hulp op het internet waar ik verder mee kom.
Ik heb nu een inschrijfformulier gemaakt voor gasten die komen logeren. Het tarief hangt af van de aankomst datum (Nacht-datum-van) of deze tussen twee data vallen. Dan wordt het een H (hoogseizoen), M (midden) en L (laag). Hierna wordt aan de hand van de letter het tarief bepaald.
Met mijn kennis kom ik niet veel verder dan het in een query te zetten, maar dat kan weer niet onbeperkt zijn in aantallen IIf volgens mij en daarbij wordt de database zeker in mijn inschrijfformulier er niet echt snel van. Daarbij komt het nieuwe jaar eraan en kan ik de data van de oude niet wegdoen anders kun je geen oude inschrijvingen meer goed bekijken. Ik vrees echter dat alles nog trager wordt als ik eindeloos data toevoeg om te vergelijken.

Dit is mijn query om het seizoen te bepalen:

Seizoen1: IIf([Nacht-datum-van]>=#1-1-2019# And ([Nacht-datum-van]<#7-1-2019#);"H";IIf([Nacht-datum-van]>=#7-1-2019# And ([Nacht-datum-van]<#15-2-2019#);"L";IIf([Nacht-datum-van]>=#15-2-2019# And ([Nacht-datum-van]<#11-3-2019#);"M";IIf([Nacht-datum-van]>=#11-3-2019# And ([Nacht-datum-van]<#12-4-2019#);"L";IIf([Nacht-datum-van]>=#12-4-2019# And ([Nacht-datum-van]<#6-5-2019#);"H";IIf([Nacht-datum-van]>=#6-5-2019# And ([Nacht-datum-van]<#27-5-2019#);"M";IIf([Nacht-datum-van]>=#27-5-2019# And ([Nacht-datum-van]<#2-9-2019#);"H";IIf([Nacht-datum-van]>=#2-9-2019# And ([Nacht-datum-van]<#31-10-2019#);"M";IIf([Nacht-datum-van]>=#31-10-2019# And ([Nacht-datum-van]<#4-11-2019#);"H";IIf([Nacht-datum-van]>=#4-11-2019# And ([Nacht-datum-van]<#18-11-2019#);"M";IIf([Nacht-datum-van]>=#18-11-2019# And ([Nacht-datum-van]<#16-12-2019#);"L";IIf([Nacht-datum-van]>=#16-12-2019# And ([Nacht-datum-van]<#20-12-2019#);"M";IIf([Nacht-datum-van]>=#20-12-2019# And ([Nacht-datum-van]<#1-1-2020#);"H";"Fout")))))))))))))

Na wat Googlen kwam ik ook bij DLookup maar volgens mij is dat het ook niet. Heeft iemand een oplossing voor een leek als ik om te bepalen welke datum welk seizoen heeft zonder de database te vertragen met eindeloze berekeningen? Liefst een tabel met data met de seizoenen waaruit gekozen kan worden.

Is er iemand die dat in niet-te-technische-taal kan uitleggen?
Alvast super bedankt!

Groetjes, Astrid
 
Dag Astrid, ik zou in elk geval een tabel aanmaken met de seizoenen. Als er iets verandert moet je dan in elk geval je formules niet aanpassen. Misschien een tabel met gegevens zoals (ID is een autonumber maar ik heb geen opeenvolgende nummers gegeven omdat anders het idee zou kunnen ontstaan dat dit opeenvolgende nummers zijn)

ID Vakantiejaar Begindatum Einddatum Periode
15 2019-2020 15-2-2019 11-3-2019 L
17 2019-2020 12-3-2019 12-4-2019 M

120 2020-2021 20-12-2019 05-01-2020 H

Dan kan je het seizoen er uithalen aan de hand van de periode in de tabel en steeds dezelfde formule gebruiken, en voor een nieuw jaar voeg je gewoon nieuwe lijnen toe aan je kalendertabel.

Succes
 
Voor de formule hangt het dan af of je ook vakantieperiodes hebt die in meer dan één periode vallen en hoe je daar mee omgaat: prijs = prijs laagste periode of we splitsen de dagen op naar de verschillende periodes.
 
Tarief zoeken ipv seizoen

Hallo Noella,

Bedankt voor je antwoord. De tabel kan ik maken, ook met Autonumber Id. Maar hoe doe ik dit: "Dan kan je het seizoen er uithalen aan de hand van de periode in de tabel"?

Voor de formule hangt het dan af of je ook vakantieperiodes hebt die in meer dan één periode vallen en hoe je daar mee omgaat: prijs = prijs laagste periode of we splitsen de dagen op naar de verschillende periodes.

Op dit moment heb ik in mijn query ook nog de vertrekdatum op dezelfde manier laten testen voor het seizoen. Als dan de aankomst en de vertrekdatum niet in dezelfde periode vallen dan geeft de query aan "SPLIT" zodat ik weet dat ik zelf de verblijfsdata moet spitsen in twee dezelfde periodes.

En nu ik verder denk. Is het misschien ook wijs om niet het seizoen te laten uitzoeken maar direct het tarief. Want de tarieven wijzigen in de jaren natuurlijk ook.
Dus eigenlijk zoek ik dit: welke tarief hoort bij deze aankomstdatum en welk tarief bij de vertrekdatum (is deze niet gelijk dan spitsen, maar dat komt niet veel voor dus dat mag handmatig).

Groetjes, Astrid
 
Kijk eens in de Access curses, daar heb ik dit vraagstuk uitgebreid behandeld (met uiteraard oplossingen :)).
Sowieso is de oplossing gebaseerd op een tabel met de tarieven (en de geldigheidsdatums. Daarnaast gebruik je een Cartesisch Product in je query om het juiste tarief op te zoeken. Daarbij maakt het niet uit of de volledige termijn in één tarief, twee tarieven of drie tarieven valt.

Maar voor een snél antwoord, hebben we uiteraard een voorbeeldje nodig :).
 
Hallo,
het is heel eenvoudig om aan de prijzentabel een extra veld met de prijs per dag toe te voegen, of zelfs meer kolommen: prijs/dag, prijs voor een midweek, prijs voor een weekend, prijs voor een volledige week. In je boekingstabel kan je een veld toevoegen dat aangeeft om welke boeking het gaat: midweek/weekend/ hele week/per dag. Je kan ook nog kortingkolommen toevoegen. Als het meer complex wordt zou ik wel een VBA formule creëren die de prijs gaat berekenen.
Probeer in elk geval zonder cartesisch product te werken, dat is traag en lomp. Op het werk verbieden we de developers om dat te doen.

Het algoritme kan er dan een als volgt uitzien:
- maak de werktabel leeg (delete from [tablename]
- selecteer alle prijslijnen die binnen de begin- en einddatum liggen en voeg die toe aan een werktabel (insert into [tablename] select …. from … where ...)
- indien meerdere prijslijnen splits de boekingsdagen per prijslijn en update de werktabel met de boekingslijnen (update [tablename] set …. from … inner join …)
- bereken het tarief aan de hand van het type boeking en eventuele korting in een query
- schrijf de prijs weg naar de boekingstabel. Op deze manier heb je een prijs die ook kan gebruikt worden als je de factuur genereert.

dat kan allemaal in één procedure, ik denk dat het de moeite loont om dit via VBA te doen, en je vind hier trouwens ook wel een handleiding VBA.

Vriendelijke groeten
Noëlla
 
Probeer in elk geval zonder cartesisch product te werken, dat is traag en lomp. Op het werk verbieden we de developers om dat te doen.
Welnee, ik doe het regelmatig en het werkt supersnel en makkelijk. Wellicht met hele grote databases dat het minder goed werkt, maar voor een simpele prijzentabel is er niks mis mee. Niet met een sloophamer gaan slaan als je alleen een spijker in een muur wilt hebben :).
 
Kijk eens in de Access curses, daar heb ik dit vraagstuk uitgebreid behandeld (met uiteraard oplossingen :)).
Ik zal eens zoeken naar die Access cursus. Hier in het forum?

Sowieso is de oplossing gebaseerd op een tabel met de tarieven (en de geldigheidsdatums. Daarnaast gebruik je een Cartesisch Product in je query om het juiste tarief op te zoeken. Daarbij maakt het niet uit of de volledige termijn in één tarief, twee tarieven of drie tarieven valt.

Maar voor een snél antwoord, hebben we uiteraard een voorbeeldje nodig :).

Ik heb een inschrijfformulier waar je gasten kunt inschrijven die een camperplek willen hebben. Je hebt dan een aankomstdatum en een vertrekdatum. Men blijft één of meerdere dagen. Ik heb 3 verschillende periodes maar sommige komen vaker voor. Er kunnen periodes van Hoogseizoen zijn met een Middenseizoen ertussen bijvoorbeeld.

Ik heb het gesplitst in een aankomst met begin en einddatum en dan daarbij de verschillende producten die afgenomen worden zoals de plaats, stroom, personen met en zonder TB (toeristenbelasting), broodjes etc.
Als men het verblijf met een nacht of meer verlengt dan wijzig ik de vertrekdatum en betaalt men bij. De producten per nacht kunnen onderling verschillen (persoon meer of minder oid). Er zijn alleen nachtprijzen. En alleen het tarief van de plaats (product 1) is afhankelijk van het seizoen. De andere producten zijn het hele jaar door hetzelfde. De registratie van kentekens heb ik in een aparte tabel. Zo kan een inschrijvingen gemaakt worden voor bijvoorbeeld 3 campers tegelijk. En een terugkerende klant kan een andere camper bij zich hebben dan de vorige keer.

Ik kan een factuur (rapport) maken. En na iedere inschrijving print ik een afdruk van de inschrijving voor in de map (bij een inschrijving met meerdere campers krijgt iedere camper een eigen blad, want die zitten in de map gesorteerd op PL (plaats). Mocht de database fout gaan heb ik alle gegevens op papier....

Ik heb een voorbeelddatabase gemaakt. Maar ik zie dat .accdb niet bij geldige bestandsextensies staat vermeld bij beheer bijlagen. Hoe kan ik deze uploaden voor je?

Alvast bedankt voor de genomen tijd en moeite. Sorry voor mijn gebrek aan kennis. Maar in principe werkt mijn database voor ons prima maar eens kom je op een punt dat er verbetering nodig is....

Groetjes, Astrid
 
Hallo,
het is heel eenvoudig om aan de prijzentabel een extra veld met de prijs per dag toe te voegen, of zelfs meer kolommen: prijs/dag, prijs voor een midweek, prijs voor een weekend, prijs voor een volledige week. In je boekingstabel kan je een veld toevoegen dat aangeeft om welke boeking het gaat: midweek/weekend/ hele week/per dag. Je kan ook nog kortingkolommen toevoegen. Als het meer complex wordt zou ik wel een VBA formule creëren die de prijs gaat berekenen.

We hebben maar 1 tarief, dat is per nacht, maar wel afhankelijk van het seizoen. Zie voor meer uitleg van mijn database de tekst bij OctaFish

Het algoritme kan er dan een als volgt uitzien:
- maak de werktabel leeg (delete from [tablename]
- selecteer alle prijslijnen die binnen de begin- en einddatum liggen en voeg die toe aan een werktabel (insert into [tablename] select …. from … where ...)
- indien meerdere prijslijnen splits de boekingsdagen per prijslijn en update de werktabel met de boekingslijnen (update [tablename] set …. from … inner join …)
- bereken het tarief aan de hand van het type boeking en eventuele korting in een query
- schrijf de prijs weg naar de boekingstabel. Op deze manier heb je een prijs die ook kan gebruikt worden als je de factuur genereert.

dat kan allemaal in één procedure, ik denk dat het de moeite loont om dit via VBA te doen, en je vind hier trouwens ook wel een handleiding VBA.


Eh...dat is mijn gebrek aan kennis VBA...ik lukt mij soms om wat VBA te wijzigen naar mijn wensen hetgeen andere gemaakt hebben maar daar houdt mijn kennis op. Ik kan jouw bovenstaande aanwijzingen helaas niet volgen... Ik dacht eigenlijk aan een vervanger voor mijn IIF maar het blijkt dus wat gecompliceerder te zijn heb ik begrepen.
Zoals ik zei, een tabel kan ik maken bijvoorbeeld:
datumId
productId
datum van
datum tot
tarief

Maar dan? Hoe krijg ik mijn inschrijfformulier, denk n.a.v. een query, zo ver dat hij bij een bepaald product het juiste tarief opgeeft? Zodat hij verder kan rekenen met het aantal nachten etc.

En als dat lukt kan ik ook hetzelfde toepassen aan de ander producten aangezien deze prijzen natuurlijk ook jaarlijks wijzigen (zeker de toeristenbelasting...).

Heel erg bedankt alvast voor je tijd.

Met vriendelijke groet,

Astrid
 
Kijk eens in de Access curses, daar heb ik dit vraagstuk uitgebreid behandeld (met uiteraard oplossingen :)).

Cursus gevonden..nog een tip welk hoofdstuk en onderdeel aangezien ik niet weet naar wat ik moet zoeken..

Bedankt!

Groetjes, Astrid
 
Da's een goeie :). Zal ik eens rustig opzoeken, want ik kan 'm zo snel niet vinden. Het ging in ieder geval over het opzoeken van brandstofprijzen.
Om je eigen voorbeeldje te posten, moet je het bestand zippen (eerst comprimeren en herstellen) en dan posten. Een accdb bestand wordt namelijk niet geaccepteerd.
 
Tarieven

Dag Aromijn, hierbij vind je een voorbeeld om de tarieven te berekenen. Als je het formulier frmBoekingen opent staat daarin een knop die via VBA de prijs invult. De code is heel simpel en opent gewoon een paar actiequeries na elkaar. Je kan dat ook in een macro doen als je dat liever doet.

code onder de knop:
Code:
Private Sub cmdCalc_Click()
On Error GoTo Err_cmdCalc_Click

    DoCmd.SetWarnings False 'schakel de automatische waarschuwingen actiequeries uit
    DoCmd.OpenQuery "qdelOudeBerekening"
    DoCmd.OpenQuery "qappVulWerktabelBerekeningen"
    DoCmd.OpenQuery "qupdBerekenPrijs"
    Me.txtBerekendBedrag = DSum("wcaPrijs", "wrkBereken", "wcaBoekingID = " & Me.txtID)

Exit_cmdCalc_Click:
    DoCmd.SetWarnings True 'schakel de automatische waarschuwingen actiequeries terug in
    Exit Sub
    
Err_cmdCalc_Click:
    MsgBox Err.Number & ": " & Err.Description
    Resume Exit_cmdCalc_Click

End Sub
 

Bijlagen

  • Prijslijst.zip
    95 KB · Weergaven: 28
Dag Aromijn, hierbij vind je een voorbeeld om de tarieven te berekenen. Als je het formulier frmBoekingen opent staat daarin een knop die via VBA de prijs invult. De code is heel simpel en opent gewoon een paar actiequeries na elkaar. Je kan dat ook in een macro doen als je dat liever doet.

Heel erg bedankt. Maar liever niet zo'n knop. De klant wil meekijken naar de gedetailleerde prijzenopbouw tijdens het inschrijven.
Dan zie je wat voor effect het heeft wanneer je wel of geen stroom afneemt, broodjes, aantal dagen etc.

Zo gaat mijn voorbeelddatabase zoals ik er nu mee werk. Bovenin het inschrijfformulier maak je een nieuwe klant aan (klant kijkt mee). Dan de boeking zelf heb ik (voor het gemak) de werkvolgorde genummerd. Stap 1 aangeven dat ze gearriveerd zijn (staat automatisch al op gearriveerd bij nieuw record) Opgeven aankomsttijd en dan vertrekdatum (aankomstdatum is vandaag maar kan gewijzigd worden ivm reservering). Stap 2: eerst knop verversen dan stap 3: invoeren kenteken. Dan stap 4 naar subform Inschrijving: te beginnen bij het kenteken (bij de 1 intoetsen krijg je al het laatst ingevoerde kenteken) dan pl is plaatsnr opgeven (alleen bij product 1 de plaats) dan mb (dat is het mobielnr van het hek dat iedereen ontvangt). Het selectiehokje is als het mobiel retour komt. Dat data worden nu automatisch opgeven (kunnen gewijzigd worden indien er bijvoorbeeld een persoon minder is op de 2e nacht, of dat men alleen maar 1 ochtend broodjes wil van de 3). Het Seizoen wordt hierna berekend (blijft alleen in zicht bij product 1). Dan het product beginnend meestal met 1 (de plaats) dan het aantal. De rest wordt direct uitgerekend (daarom is ie niet zo snel...). Zo de regels zoals in het voorbeeld invullen naar wens.
Bovenin komt het totaal te staan en het openstaand bedrag nadat stap 6 de betaling is ingevuld. Is er geen openstaand bedrag dan stap 7 formuliertje uitprinten.
Bij het * zijn nog opmerkingen te plaatsen. Je kunt een factuur uitprinten indien gewenst. Of als het een reservering betreft een formulier voor de reservering en een e-mailbijlage in GB, NL of D.

Bovenin het formulier heb ik verschillende zoekmogelijkheden om snel een klant of aankomst te vinden. Bij Plaats kun je snel zien welke huidige plaatsen bezet zijn (we hebben maar 48 plaatsen).

Dat is het wel zo'n beetje de belangrijkste dingen denk ik...

Ik wilde mijn voorbeeld uploaden maar met maar 3 records voor inschrijvingen heb ik 66mb... Ik heb productplaatjes maar verwijderd, dat scheelde 10mb...had ik nog steeds 54,4mb en ik mag niet eens 2 mb uploaden...De achtergrond van mijn inschrijfformulier inruilen voor een grijze achtergrond leverde gek genoeg geen extra ruimte op. Al mijn rapporten verwijderd werkt ook niet.
Ik heb geklikt op comprimeren en herstellen en gezipt. Maar blijf met meer dan 50mb zetten. Hoe krijg je dat naar minder dan 2 mb??? Zo kan ik geen voorbeeld geven...

Groetjes Astrid


Alvast bedankt weer!

Groetjes, Astrid
 
... moet je het bestand zippen (eerst comprimeren en herstellen) en dan posten. Een accdb bestand wordt namelijk niet geaccepteerd.

Zie het antwoord bij NoellaG...heb nogal problemen met uploaden...

Bedankt weer, groetjes Astrid
 
Heb je objecten ingesloten in je db? Dat zou de grootte verklaren. Probeer anders eens een fileshare; in het magazine wordt uitgerekend dát onderwerp deze maand besproken.
Je procedure lijkt me voor verbetering vatbaar :).
 
Heb je objecten ingesloten in je db? Dat zou de grootte verklaren. Probeer anders eens een fileshare; in het magazine wordt uitgerekend dát onderwerp deze maand besproken.
Je procedure lijkt me voor verbetering vatbaar :).

Bedankt! hierbij de link voor de database via WETRANSFER: https://we.tl/t-t9xxNnqotD

En alsjeblieft...hoe lief bedoeld ook...gelieve niet mijn database te herschrijven. Ik ben absoluut geen professional maar een echte beginneling en ben trots op wat ik gemaakt heb. Een verbetering, zoals gevraagd voor de tariefberekening, is echter welkom.

Maar alsjeblieft steek geen tijd in het totaal verbouwen van mijn database. Meer dan dit is voor mij toch niet haalbaar. Veel meer tijd kan ik er ook niet insteken aangezien ik al 7 dagen in de week werk, 52 dagen in het jaar..;-)
Bedankt voor alle moeite alvast.

Groetjes, Astrid
 
Dag Astrid, ik vind het tof dat je als beginneling zoiets in elkaar kunt boksen. Probeer echter niet in te valkuil te vallen dat je veel tijd steekt in wat niet je core business is. Er bestaan reeds veel professionele boekingspakketten voor B&B's en hotels. Ook webtoepassingen die je eventueel vanop je smartphone kan invullen als je dat zou willen. Een klassiek pakket bv. [url]https://roomraccoon.com/boekingssoftware/ . [/URL] , https://www.123boeken.nl/complete-website/
En er zijn er nog veel meer.
Het is niet nodig om steeds zelf terug het warm water uit te vinden.
 
En alsjeblieft...hoe lief bedoeld ook...gelieve niet mijn database te herschrijven. Ik ben absoluut geen professional maar een echte beginneling en ben trots op wat ik gemaakt heb.
Dat riekt een beetje naar pamperen :). En je weet: zachte heelmeesters maken smerige wondeen :D. Maar ik snap dat je trots bent op je db. Desalniettemin: als hij niet goed is, zal toch iemand dat tegen je moeten zeggen ;).
Om te beginnen: de grootte kan dus echt wel omlaag, kijk maar naar de bijlage. Ik zal vanmiddag, als ik meer tijd heb, wel wat meer tips geven.
 

Bijlagen

  • HelpForum-2.zip
    184 KB · Weergaven: 32
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan