Query probleemjes

Status
Niet open voor verdere reacties.

benikke

Gebruiker
Lid geworden
9 apr 2023
Berichten
11
Gegroet allemaal,
Op dit forum ben ik helemaal nieuw, ik ben een 75 jarige die o.a. acces doet als hersenen gymnastiek, in access ben ik nogal een leek,Een basis kennis heb ik wel.

Even wat informatie.
Het gaat hier over access 2013.
Dus geen ’,’ wel ’;’
En even wat waarden.
Is een Query - Vandaag is het: Date()
Is een tabel - Membership expires in days (een vaste waarde die dient om een berekening uit te voeren. (1800 dagen))
Is een tabel - Einddatum
Is een Query - Einde abo: [Einddatum]-[Vandaag is het]
Is een Query - De einddatum is dus: ([Vandaag is het]+[Membership expires in days])


De waarden die gebruikte voor de query:
(dus die wijzigen elke dag)
[Einde abo]
- -414
- -414
- 232
- 1531
- 23
- 52

query-res.jpg Het beoogde doel is;
- -414 is negatief dus…schrijf dan ’Af’.
- -414 is negatief dus… schrijf dan’Af’.
- 232 is positief en groter dan 60 en 30 dus… schrijf dan ‘Abonnement nog niet aanpassen.’
- 1531 is positief en groter dan 60 en 30 dus… schrijf dan ‘Abonnement nog niet aanpassen.’
- 23 is positief en tussen 60 en 30 dan 30 dus… De laatste 30 dagen gaan in.
- 52 is positief en tussen 60 en 30 dan 30 dus… De laatste 60 dagen gaan in.

Mijn formule is dus;

Verekening: IIf([Einde abo]<=0;"af") & IIf(IsNull([Einde abo]);"x") & IIf([Einde abo]>61;"Abonnement nog niet aanpassen") & IIf([Einde abo]>30;"De laatste 30 dagen gaan in") & IIf([Einde abo]<=60;"De laatste 60 dagen gaan in")

Verekening:
IIf([Einde abo]<=0;"af")
& IIf(IsNull([Einde abo]);"x")
& IIf([Einde abo]>61;"Abonnement nog niet aanpassen")
& IIf([Einde abo]>30;"De laatste 30 dagen gaan in")
& IIf([Einde abo]<=60;"De laatste 60 dagen gaan in")



Maar die genereerd.
Af + De laatste 60 dan gaan in.
En op regel 5 ook.
Wat doe ik verkeerd, denk ik verkeerd?
 
De uitkomst is verklaarbaar. Je plakt de resultaten van een aantal IIF-functies aan elkaar. Een negatief getal is zowel kleiner dan 0 als kleiner dan 60. Beide IIF's zijn dus waar.

Je moet hier zogenaamde geneste IIF-functies gebruiken. Iets als (kortheidshalve heb ik Einde abo vervangen door EA):
Code:
IIF(EA<0;"af";IIF(EA<=30:"laatste 30 dagen";IIF(EA<;=60;"laatste 60 dagen";"niet aanpassen")))

Je zegt dat je de einddatum in de tabel opslaat. Dat is niet de bedoeling. Je kunt de einddatum op elk moment dat je die wilt weten bereken in een query.
 
Query probleempje

Peter alvast bedankt om mee te helpen denken. Maar wat als het vak null is?
En dat niet in een tabel zetten hoe gaat dat in zijn werk?
 
Ik had geen rekening gehouden met Null omdat ik me geen situatie kan voorstellen waar dat voorkomt. Een lid zal immers altijd een startdatum hebben (of datum laatste vernieuwing van het abonnement) en dus een (te berekenen) einddatum. Voor het geval je dat toch wilt, zou het iets worden als:
Code:
IIF([COLOR=#3E3E3E]IsNull(EA);"x";IFF(EA<0;"af";IIF(EA<=30:"laatste 30 dagen";IIF(EA<;=60;"laatste 60 dagen";"niet aanpassen"))))[/COLOR]

Je zal denk ik altijd uit moeten gaan van een startdatum en van daaruit de einddatum berekenen. Voor de IIF maakt het in beginsel niet uit of EA een tabelwaarde is of een berekende waarde. Als het een berekende waarde is (zou het volgens mij dus moeten zijn), dan wordt het wel een ingewikkeld verhaal. Je zou dan telkens de berekening in moeten voegen. Je kan dat waarschijnlijk beter een functie maken om de status te bepalen.

Hoe je oplossing eruit gaat zien is mede afhankelijk van hoe je omgaat met verlengingen van abonnementen. De mooiste oplossing is denk ik om te werken met twee tabellen: lid en abonnement.
Bij een nieuw lid voeg je meteen een abonnement toe (met startdatum). Wanneer dat abonnement afloopt kan je altijd berekenen. Als het afloop zou je, als het lid wil verlengen, een nieuw abonnement met een nieuw startdatum kunnen toevoegen. Voor het signaleren van aflopende abonnementen kijk je per lid alleen naar het recentste abonnement.
 
Laatst bewerkt:
Ik snap eerlijk gezegd ook niet veel van de opzet; 1800 dagen? Dat lijkt mij een zeer onhandige manier van abonnementen afsluiten, ook voor de klant. Maandabo's snap ik, jaarabo's ook. 1800 dagen dus niet. Verder ben ik het met Peter gedeeltelijk wel eens: je zult nooit iemand een abonnement geven zonder startdatum. Dat slaat nergens op, want dan heb je dus ook nooit een einddatum. En je levert toch niet aan iemand die geen startdatum heeft?

Of je een aparte tabel nodig hebt voor de abo's, vind ik nog maar de vraag. Als het om meerdere abonnementen gaat, dan ja. Dan heb je drie tabellen nodig, geen twee. Ook één om de verschillende abonnementen in vast te leggen (naam, prijs, frequentie etc.). Gaat het om één abonnement, dan is een extra tabel niet nodig, want dan kun je alles berekenen uit Startdatum i.c.m. Looptijd (die ik dus in Jaren zou opslaan, niet in Dagen). Dus dan kun je alles in één tabel vastleggen.

Verder zou ik voor je formule geen IIF gebruiken, maar Switch. Is overzichtelijker (hoe dieper de nesting, hoe ingewikkelder de IIF wordt) en je zit niet aan een maximum van het aantal voorwaarden gebonden. Nog beter is het om een aparte tabel te gebruiken waarin je de verschillende waarden ("De laatste 30 dagen gaan in"), "De laatste 60 dagen gaan in" etc) vastlegt. Dan heb je helemaal geen vergelijkingen meer nodig, maar zoek je de juiste waarde gewoon op.

Voor het beste resultaat, is het wel zo handig om even een voorbeeldje te posten, dan kunnen we veel gerichter meedenken!
 
Query probleempje

Dat alles werkte zoals het gewenst daarover ben ik te spreken.
Een kleine tip als er nog een iemand hulp nodig heeft met access 2013.
Access 2013 verdraagt enkel punt komma in de Query.

En wat betreft de lange duur, daar zit 'black Friday' voor iets tussen.
Bij dat abonnement is het zo, als je een 'vernieuwing' doet wordt dat gelijk met vorige opgeteld. dus+,+,+,+
 
Een kleine tip als er nog een iemand hulp nodig heeft met access 2013. Access 2013 verdraagt enkel punt komma in de Query.
Dit is niet echt een tip; welk teken je nodig hebt hangt af van je landinstellingen, dat heeft dus niks met Access (of een specifieke versie) te maken. Sterker nog: als je dezelfde query in het Query venster bekijkt, of in VBA maakt, dan heb je weer het Amerikaanse teken nodig, en dat is de komma.

Verder snap ik de relatie met Zwarte Vrijdag niet. Dat is toch gewoon een normale kalenderdag? Of mis ik die dag steeds? Zou verklaren waarom ik zo jong blijf :).
 
Query probleempje

Zo leer ik nog eens wat bij. Bedankt.
Nog een vraag, als ik mijn artikel als afgehandeld beschouw.
Kan ik dat dan ergens laten weten.
En kan er ook ergens wat gedoneerd worden op deze site.
 
In #4:
Voor de IIF maakt het in beginsel niet uit of EA een tabelwaarde is of een berekende waarde. Als het een berekende waarde is (zou het volgens mij dus moeten zijn),

Ik denk dat je beter de EA daadwerkelijk in de tabel wegschrijft. Bijvoorbeeld, er worden inderdaad dikwijls acties gedaan voor Black Friday: bestel nu en je krijgt een extra maand in het abonnement. Dan wordt het wel ingewikkeld om het te berekenen. Ik zou de standaardwaarde van EA laten berekenen op het invulformulier, maar overschrijfbaar houden.
 
Nog een vraag, als ik mijn artikel als afgehandeld beschouw. Kan ik dat dan ergens laten weten.
Vragen die naar tevredenheid zijn afgehandeld kun je zelf op <Opgelost> zetten. Dat doe je met de blauwe knop rechtsboven. Donaties weet ik niet, maar je kunt uiteraard altijd lid worden. Kost niet zoveel, en je helpt de club daar meer mee :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan