Query informatie wijzigen via VBA

Status
Niet open voor verdere reacties.

Stef21

Gebruiker
Lid geworden
15 mrt 2021
Berichten
30
Goedendag,

Ik ben bezig met een database voor een bibliotheek (wat jullie ondertussen waarschijnlijk al weten). Ik ben bijna klaar, maar de laatste loodjes zijn altijd het zwaarst. Ik zou graag informatie willen invoeren in een query via VBA-code. Ik zal eerst even uitleggen wat de bedoeling is.

Een bibliotheek leent boeken uit. De bibliotheek waar ik de database voor maak, werkt op de volgende manier: Er worden boeken uitgeleend en pas nadat de boeken teruggebracht worden, wordt er berekend hoeveel de klant moet betalen. Deze kosten bedragen (meestal) €0,20 per 2 weken. Af en toe is het vakantie en is de Bibliotheek dicht. In deze tijd is er een ander tarief. In de tabel tVakantietarief kan dat veranderd worden. Uiteindelijk kom ik op de volgende code als ik dit samen voeg en in een tekstvak in het formulier waar de boeken ingeleverd worden (de bibliothecaris kan daar dus zien wat de klant moet betalen):
Code:
Dim Var1 As Variant
Dim Var2 As Variant
Dim Var4 As Variant
Dim Var5 As Variant

Var1 = DLookup("[Begin vakantieperiode]", "tVakantietarief")
Var2 = DLookup("[Einde vakantieperiode]", "tVakantietarief")
Var4 = DLookup("[Bedrag in die periode]", "tVakantietarief")
Var5 = DLookup("[Boete]", "qKlanten")

Forms!fBoekenUitleen!Tekst57.Value = Forms!fBoekenUitleen!Tekst57.Value + Var5 + (IIf(Var1 >= (Me.Uitleendatum.Value) And Var2 <= (Me.Innamedatum.Value), Var4 + (0.2 * (Round((DateDiff("ww", [Uitleendatum], [Innamedatum])) - (DateDiff("ww", Var1, Var2))) / 2)), 0.2 * (Round(DateDiff("ww", [Uitleendatum], [Innamedatum])))))
Deze code werkt zo dat telkens als er een nieuwe klant wordt aangeklikt (en er dus een nieuwe klant komt), het bedrag weer naar 0 wordt gezet. Als dezelfde klant 3 boeken meeneemt, wordt het volgende bedrag bij het vorige bedrag opgeteld en zo komt er een totaal te betalen bedrag voor de klant.
Nu is het de bedoeling dat er een Omzet komt. Eerder deed ik dit door een berekenend bedrag te maken in de tabel waar de Uitleendatums en Inleverdatums opgeslagen worden, deze min elkaar en dat keer 0,2. Daarna heb ik een query gemaakt die dit per week optelt en zo een omzet-overzicht maakt per week. Een probleem is nu dat ik in de berekenende kolom [Bedrag] geen rekening kan houden met het vakantietarief. Ik kan daar namelijk geen gebruik maken van de optie DLookUp wat in een formulier wel kan.

Ik heb een paar opties bedacht om dit op te lossen:
1. Direct vanuit het tekstvak [Tekst57] informatie naar een Query schrijven. Probleem hierbij is dat een query eigenlijk op een tabel gebaseerd moet zijn. Ook kan ik het tekstvak niet op een andere Query baseren (toch?). Het hele formulier is nu namelijk gebaseerd op een Query waar ik de omzet niet bij kan voegen.
2. Op de een of andere manier toch een optie DLookUp zien te vinden in de berekenende kolom [Bedrag]
3. Direct vanuit de VBA-code informatie naar de Query schrijven. Hierbij heb ik natuurlijk ook weer een probleem gevonden: Welke code zou ik moeten gebruiken in de query moet eigenlijk nog steeds op een tabel gebaseerd zijn.

Ik zou natuurlijk een tabel kunnen maken met de Omzet, waardoor een gedeelte van de problemen opgelost is, maar nog steeds niet het hele probleem. Ik heb die tabel nog niet gemaakt, want misschien is er nog een andere optie waarbij ik de hele tabel niet nodig heb.

Alvast hartelijk bedankt!

MVG,

Stef
 
1. Direct vanuit het tekstvak [Tekst57] informatie naar een Query schrijven. Probleem hierbij is dat een query eigenlijk op een tabel gebaseerd moet zijn. Ook kan ik het tekstvak niet op een andere Query baseren (toch?). Het hele formulier is nu namelijk gebaseerd op een Query waar ik de omzet niet bij kan voegen.
Je maakt een aantal enorme denkfouten, die ik hier niet allemaal ga behandelen. Sowieso haak ik bij dit soort code al af als ik Daar DLookup op deze manier gebruikt zie worden, dat is voor mij een indicatie dat het goed fout zit :).
Dat begint al hier dus: je ‘schrijft’ namelijk nooit informatie weg naar een query. ‘Probleem’ is ook niet dat een query gebaseerd moet zijn op een tabel, want een query is gebaseerd op een of meer tabellen, dat is de hele grap van queries. Tekstvakken baseer je ook nooit op queries, al is het best mogelijk om een tekstvak te vullen met één waarde vanuit een query. Waarom je dat zou doen is mij meestal onduidelijk.

Ik zou zeggen: post de meest recente versie weer eens, want ik denk dat er wel wat te verbeteren valt. Zeker als het gaat om het vastleggen van tarieven en vakantieperiodes.

Let ook eens op de naamgeving van je objecten, want Tekstvak57? Vind je dat een mooie beschrijvende naam?
 
Meestal heb ik de naamgeving van mijn objecten redelijk op orde, maar af en toe doe ik dat niet. Vooral doordat er steeds fouten in komen en ik dus iets uitprobeer, gaat die naamgeving fout. Hierbij in ieder geval weer mijn database. De database zelf openen kan door in het formulier bovenin de balk op de rechtermuisknop te klikken en op sluiten te klikken. Let op: Het kan zijn dat hij nog een backup wil maken in een map die niet bestaat
 

Bijlagen

  • Bibliotheek Helpmij.zip
    1,2 MB · Weergaven: 22
Laatst bewerkt:
Ik heb er alvast een eerste blik op geworpen; ik probeer uiteraard eerst de logica in je ontwerp te doorgronden. En waar nodig aan te passen aan mijn eigen logica :). Jouw vraag is redelijk gevorderd waar het gaat om processen. Dus ik verwachtte eigenlijk dat je de belangrijkste processen al wel had afgehandeld, maar dat blijkt dus niet helemaal het geval te zijn. Zo vind ik sommige tabellen niet geweldig ingericht, en vooral: de processen zijn niet waterdicht. En dat zou je toch als eerste moeten doen, wil je een gegarandeerd correcte bedrijfsvoering hebben. Neem nu je tabel tUitgeleendeBoeken: Daar vind ik (dit is maar een klein stukje van je tabel) deze records:
Code:
ID	UitleenID	BoekStockID	Innamedatum
88	78	7	
101	92	7	
118	114	7	
108	103	8	
111	106	8	
116	112	8	
125	121	8	
103	96	9	
119	115	9	
126	122	9	
132	128	9

Dit is dus volslagen onmogelijk in een normale bedrijfsvoering: het is namelijk onmogelijk om één boek meerdere keren tegelijkertijd uit te lenen. En jij doet dat dus probleemloos met jouw boeken. Dat zou je als eerste dicht moeten timmeren :). Boeken uitlenen kan alleen als een boek fysiek aanwezig is. Anders is het alleen mogelijk om een boek te reserveren. Ook die tabel werkt niet geweldig, omdat je in die tabel a) niet aangeeft op welke datum een persoon een boek aanvraagt, en b) niet bijhoudt of het boek ook daadwerkelijk geleend is door de aanvrager. Dus hoe weet je dan of (een exemplaar van) het boek door de volgende aanvrager kan worden geleend? En zou zo ik nog wel even door kunnen gaan :). Het is van het allergrootste belang dat je eerst je processen op orde hebt, en dan pas gaat bouwen aan het systeem. En niet andersom!
 
Hallo, ik wou me hier niet moeien, maar als eerste project als zelfstandige (in de jaren '90 dus lang geleden) heb ik een bibliotheekproject gedaan voor een school. En alle bibliotheekprojecten hebben één ding gemeen: je hebt boeken met hun gegevensen voor elk boek heb je één of meerdere exemplaren en het zijn de exemplaren die je aankoopt, uitleent en afschrijft. Aangezien één boek ook meerdere auteurs kan hebben (verhalenbundels) en 1 auteur meerdere boeken kan schrijven moet je hier een veel op veel relatie maken.
Verder heb ik het idee dat Stef als een echte programmeur alles met code wil oplossen en weinig in de database structuur investeert. Dit heb ik wel al vaker gezien en dan kan je beter via gekoppelde excel sheets werken dan met tabellen. Voor de rest: respect voor het geduld dat Octafish opbrengt.
 
Ook ik heb wel eens een bibliotheekje beheerd en in Access gemaakt :). Voorlopig heb ik, op basis van de inhoud van het boekenbestand, geconcludeerd dat zoeken op meerdere auteurs per boek in deze bibliotheek niet noodzakelijk is, dus die uitbreiding heb ik nog even niet ingebracht in het traject. Ik denk dat het zonder deze uitbreiding al lastig genoeg is voor TS. :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan