Voorkomen dat een artikel twee keer tegelijk kan worden uitgeleend

Status
Niet open voor verdere reacties.

JacobCats

Gebruiker
Lid geworden
13 jun 2014
Berichten
130
Tekst overgenomen uit Cursus voor beginners van Hepmij.nl hoofdstuk 1

Het Verhuurcentrum
Voor het verhuren van duikspullen geldt, dat we per verhuurbaar artikel meerdere exemplaren in het
magazijn zullen hebben. Bij het verhuren moeten we vastleggen wanneer een artikel aan een persoon is
verhuurd, en wanneer het weer wordt ingeleverd. We moeten uiteraard voorkomen dat een artikel twee
keer tegelijk kan worden uitgeleend, wat fysiek onmogelijk is en dus in de database moet worden
afgedwongen.
Ook voor de verhuur hebben we facturen nodig, en huurovereenkomsten.
Ik kan dit niet terugvinden op het forum of in de cursus.

Hoe kan ik dit afdwingen in de database?
Is dit met een VBA routine -waar ik overigens weinig tot geen kas van heb gegeten-
of is er wellicht een andere manier?
 
Heel eenvoudig: je hebt een tabel artikelen met de algemene artikel eigenschappen (type, omschrijving, ...) en een tabel artikelexemplaren. Deze laatste bevat de fysieke exemplaren met gegevens als prijs, aanschafdatum, staat, ... .
Dan heb je de tabel Contacten met alle personen die materialen kunnen uitlenen. Je maakt een tabel met Uitleningen met de volgende velden:
- uitleenID (PK van de tabel)
- uitgeleendAan: ID ven de persoon die het uitgeleend heeft
- uitgeleendMateriaal: ID van het uitgeleend materiaal
- UitgeleendOp: datum waarop het materiaal werd uitgeleend
- TerugOp: datum dat het teruggebracht is

Je legt dan een unieke index op de velden uitgeleendAan, UitgeleendMateriaal, UitgeleendOp. Zo kan dezelfde persoon hetzelfde materiaal niet op dezelfde datum uitlenen. Natuurlijk kan het dat de gebruiker het later, nadat het teruggebracht is nog eens nodig hebben, dus je kan er met een index niet voor zorgen dat één persoon hetzelfde artikel slachts één keer uitleent. De laatste bescherming leg je dan in de applicatie en niet op de database door bij het uitleen formulier alleen die materialen die beschikbaar zijn te tonen: dus die in stock zijn en niet gereserveerd door iemand anders.

Dus een goede bescherming is hier een combinatie van
* een database actie: een meervoudige, unieke index. Tip: zorg ervoor dat deze ook de juiste structuur (volgorde velden, included columns, ...) heeft voor eventuele zoekacties, zo vang je 2 vliegen in één klap.
* een goede opbouw/programmatie in de gebruikersapplicatie

Succes
 
Het staat dacht ik wel uitgelegd in de cursus, maar mocht dat niet duidelijk genoeg zijn geweest, dan kan ik dat uiteraard wel duidelijker maken. Bij het uitlenen van artikelen waarvan je meerdere exemplaren hebt, is het belangrijk om goed vast te leggen welke exemplaren je in huis hebt (en die je dus uit kan lenen) en welke exemplaren weg zijn (uitgeleend). In feite kun je in dit proces drie statussen onderscheiden:

1. Artikel is nooit uitgeleend geweest, en dus sowieso in huis.
2. Artikel is uitgeleend geweest, maar teruggebracht
3. Artikel is uitgeleend, maar nog bij de lener

Status 1 is een buitenbeentje, maar status 2 en 3 kun je afleiden uit de tabel Verhuurdetails. Status 2: artikel heeft een Uitleendatum, én een Retourdatum. Status 3: artikel heeft een Uitleendatum, maar nog géén Retourdatum. Daarbij kan een artikel dus meerdere keren zijn uitgeleend, dus het ArtikelID komt dan ook meerdere keren voor in de tabel.

Om te zien welke artikelen je kan uitlenen, moet je dus in de Verhuurdetails tabel kijken naar het laatste record van een uitleenexemplaar. Dát bepaalt namelijk of een exemplaar in huis is of niet. Je kijkt dus met een query naar de status van het laatste record per exemplaar, dat een ingevulde Retourdatum heeft: dat artikel is namelijk teruggebracht, en kan dus opnieuw worden uitgeleend.

Status 1 is dus een buitenbeentje, want die artikelen/exemplaren staan nog niet in de Verhuurdetails tabel. Door de artikelen tabel via een Outer Join te koppelen aan de Verhuur tabellen, kun je óók de artikelnummers laten zien die nog niet zijn uitgeleend. En ook díe artikelen zijn dus gewoon uit te geven.

Wat ik op het formulier dan doe, is na het toevoegen van een artikel in de Verhuur formulieren, de keuzelijst met beschikbare artikelen te verversen, want een vers uitgeleend artikel heeft uiteraard geen ingevulde Retourdatum, dus die valt dan weg uit de keuzelijst.

Ik heb met opzet geen seconde naar het antwoord van noella gekeken, want die heeft de cursus niet geschreven, en weet dus ook niet hoe die is bedoeld. De aangedragen oplossing is dan ook niet bruikbaar in de cursus, omdat ik dan de complete cursus moet gaan herschrijven. Laat ik dáár nou helemaal geen zin in hebben? :d
 
Tip: kijk niet alleen naar oude cursussen, maar bekijk ook steeds het bijgewerkt materiaal. Inzichten in analyse veranderen en natuurlijk worden er ook steeds nieuwe versies gecreëerd met nieuwe mogelijkheden.
 
Tip: kijk niet alleen naar oude cursussen, maar bekijk ook steeds het bijgewerkt materiaal.
Dat is dus een WAARDELOZE tip: TS volgt een (prima, want de theorie is echt niet veranderd) cursus die hier op HelpMij regelmatig met veel plezier door veel mensen gebruikt wordt, en dan zeg jij: pleurt 'm in de hoek en zoek wat anders want mijn hulp is daar niet geschikt voor? Ga nou gauw wat anders doen....
 
Hey, verdraai mijn woorden niet: ik raad gewoon aan om, naast het hier bestaande cursusmateriaal, ook andere bronnen te raadplegen. Voor elk probleem is het nuttig om het vanuit verschillende punten te bekijken. Jij bekijkt het als applicatie, ik bekijk het vanuit het database standpunt, anderen bekijken het vanuit de functionele hoek. En als tip raad ik aan om het vanuit zoveel mogelijk verschillende standpunten te bekijken.
 
Alsjeblieft.
Niet je meningsverschillen uitten op dit forum.
Daar is de vraagsteller niet meegeholpen
Beiden sowieso bedankt voor jullie reactie.
Er staan in jullie reacties gegevens waar ik mij eerst verder in ga verdiepen zodat ik weet wat het betekent.
Maar nogmaals bedankt.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan