Prijshistorie

In een verkoopdatabase willen we de historie van het prijsverloop van de artikelen vastleggen. We komen dan voor een aantal vragen te staan. Zoals: welke gegevensstructuur hebben we dan nodig? en hoe bepalen we welke prijs van toepassing is bij een bepaalde verkoop?.

We kunnen het prijsverloop vastleggen door een tabel te maken (Artikelprijs in mijn voorbeeld) waarin we de sleutel van de artikeltabel opnemen plus een veld Prijs en een veld Datum van ingang. De tabel koppelen we via een één-op-veel relatie aan de artikeltabel.
De ingangsdatum geeft aan vanaf wanneer de betreffende prijs voor het artikel van toepassing is. Een Datum tot en met hebben we niet nodig. Stel we hebben bij een artikel prijzen met als ingangsdatum 01-06-2007, 01-01-2008 en 01-01-2009. Dat betekent bijvoorbeeld dat voor een verkoop op 31-12-2007 de prijs met ingangsdatum 01-06-2007 geldt. Na 01-01-2009 gaan de verkopen tegen de prijs die vanaf die datum geldig is.

Om de op een bepaalde (verkoop)datum geldende prijs te bepalen, maken we een functie die dat voor ons doet. De functie moet weten over welk artikel het gaat en welke datum van toepassing is. De functie ziet er dan zo uit:
Function ArtikelPrijs(Art As Long, Datum As Date) As Currency
Dim hDatum As Variant
Dim DatUS As Date

DatUS = Format(Datum, "mm-dd-yyyy")
hDatum = DMax("Ingangsdatum", "Artikelprijs", "ArtikelID=" & Art & _
   " AND Ingangsdatum<=#" & DatUS & "#")

If Not IsNull(hDatum) Then
   DatUS = Format(hDatum, "mm-dd-yyyy")
   ArtikelPrijs = DLookup("Prijs", "Artikelprijs", "ArtikelID=" & Art & _
      " AND Ingangsdatum=#" & DatUS & "#")
Else
   ArtikelPrijs = 0
End If
End Function

De functie bepaalt eerst welke ingangsdatum hij moet hebben. Met de functie DMax bepalen we de hoogste ingangsdatum die ligt vóór de peildatum. Dat is de laatste keer dat de prijs voor de peildatum gewijzigd is en is daarmee dus de op de peildatum geldende prijs.
Aan de hand van de zojuist gevonden datum halen we met een DLookup de bij die datum behorende prijs op. Je moet er wel rekening mee houden dat er geen datum gevonden kon worden. Het kan zijn dat er geen prijsrecord voor het artikel bestaat of dat er alleen prijsrecords zijn met een ingangsdatum na de peildatum. In dat geval levert de functie een prijs van nul op. Op de plek waar je de functie gebruikt moet je daar dus rekening mee houden.

Klik hier om de voorbeelddatabase te downloaden.