Formulefout in query

Status
Niet open voor verdere reacties.

Japsur

Gebruiker
Lid geworden
9 apr 2004
Berichten
650
Hallo,

Ik ben weer lekker bezig met formules en dergelijke, maar ik kom niet uit de volgende formule.

Pup onderdeel: Som(IIf([Categorie]="JpA" Or [Categorie]="MpA" Or [Categorie]="JpB" Or [Categorie]="MpB" Or [categorie]="JpC" Or [categorie]="MpC";(IIf([Onderdeel 1] Between 0 And 25 Or [onderdeel 1] Between 37 And 47 Or [onderdeel 2] Between 0 And 25 Or [onderdeel 2] Between 37 And 47 Or [onderdeel 3] Between 0 And 25 Or [onderdeel 3] Between 37 And 47 Or [onderdeel 4] Between 0 And 25 Or [onderdeel 4] Between 37 And 47;(IIf([Onderdeel 1]>0 And [onderdeel 2]>0 And [onderdeel 3]>0 And [onderdeel 4]>0;4*[pup per onderdeel];(IIf([Onderdeel 1]>0 And [onderdeel 2]>0 And [onderdeel 3]>0;3*[pup per onderdeel];(IIf([onderdeel 1]>0 And [Onderdeel 2]>0;2*[pup per onderdeel];[pup per onderdeel]))))));0));0))

Wat doet deze formule?
1. Hij kijkt eerst wel categorie hiervoor in aanmerking komt? Komt ie hier niet voor in aanmerking dan krijgt ie 0
2. Dan gaat hij kijken of een bepaald onderdeel voor deze berekening aan de orde komt. Men kan uit 47 onderdelen kiezen, maar de onderdelen tussen de 26 en 36 komen hiervoor niet in aanmerking! Deze mag hij niet meeberekenen!
3. Als dat waar is gaat hij kijken hoevaak iemand zich voor een onderdeel heeft ingeschreven. Als dit 1x is dat geeft ie veld [pup per onderdeel] weer, staan er 2 onderdelen in dan 2x [pup per onderdeel] ... etc t/m 4.

Wat doet hij fout?
Bij 2 rekent hij toch de onderdelen mee die tussen de 37 en 47 liggen. Deze nummers worden ergens anders berekend en zijn niet van belang bij deze berekening.

Hoe kan ik deze formule anders maken zodat hij NIET de nummers 26 t/m 36 meeneemt in de berekening?
Alvast bedankt.
 
Laatst bewerkt:
Haal deze conditie uit je IIF constructie

Between 37 And 47

Verder raad ik je aan je gegevensstructuur te normaliseren.
Dat is die nu namelijk niet gezien het feit dat je meerdere onderdeel kolommen gebruikt.
Dat horen rijen te zijn.

Je IIF constructie gebruik je zo te zien om wegingsfactoren te bepalen.
Zet daarvoor een aparte tabel op.

Tardis
 
Haal deze conditie uit je IIF constructie

Between 37 And 47

Verder raad ik je aan je gegevensstructuur te normaliseren.
Dat is die nu namelijk niet gezien het feit dat je meerdere onderdeel kolommen gebruikt.
Dat horen rijen te zijn.

Je IIF constructie gebruik je zo te zien om wegingsfactoren te bepalen.
Zet daarvoor een aparte tabel op.

Tardis

Tardis,

Er moeten wel degelijk 4 kolommen zijn met onderdeel (onderdeel 1, onderdeel 2 enz) aangezien iemand (een kolom) zich voor 1 of meerdere onderdelen kan opgeven! Hier kunnen het geen rijen worden helaas....

Wat moet ik de plaats van between 37 and 47 plaatsen? De onderdelen tussen 26 en 36 mogen namelijk niet mee berekend worden....
Sorry, foutje van mij... dus de onderdelen tussen 26 en 36 mogen NIET mee berekend worden.
 
Hallo,
kan je even je db, gezipt, zonder vertrouwelijke gegevens hier plaatsen.
(benodigde tabellen en eventuele query)

Wellicht kan ik dit met een functie oplossen.
 
Tardis,

Er moeten wel degelijk 4 kolommen zijn met onderdeel (onderdeel 1, onderdeel 2 enz) aangezien iemand (een kolom) zich voor 1 of meerdere onderdelen kan opgeven!

Onjuist.
Je opzet klopt niet Jaspur.
Iedere deelname is een rij.
Ik raad je aan om je ontwerp aan te passen naar volgens normalisatie principes.

Tardis
 
Laatst bewerkt:
Hallo,
kan je even je db, gezipt, zonder vertrouwelijke gegevens hier plaatsen.
(benodigde tabellen en eventuele query)

Wellicht kan ik dit met een functie oplossen.

Dat zou mooi zijn. Functies zijn niet m'n sterkste kant.

Het gaat om query betalingen bruto. kolom pup onderdeel.
Per onderdeel betaalt men hier 1 euro. Voor ene record staan er 3 onderdelen, dus 3 euro. Maar voor het andere record staat er 1 onderdeel en 1 estafetteonderdeel. Bij de estafette heeft ie netjes er 10 euro neer gezet, maar bij onderdeel staat 2 euro. Dit klopt niet. Dit moet 1 zijn omdat er maar 1 onderdeel is en 1 estafette. (delen door 2 is geen optie!!)

Misschien brutaal, maar zou je ook naar de andere kolommen even willen kijken in deze query, meerkamp, estafette, loopnummer etc. Bij veel records doet hij er namelijk zeer lang om over om alles te berekenen. Het werkt eigenlijk allemaal vrij op dezelfde manier.
 

Bijlagen

Bij veel records doet hij er namelijk zeer lang om over om alles te berekenen

En dat wordt mede veroorzaakt door een onjuist ontwerp ;)
Splits je tabel Inschrijvingen op in 2 tabellen:

tblInschrijving (InschrijfID, Wedstrijddatum, PersoonID)
tblInschrijfonderdeel (InschrijfonderdeelID, InschrijfID, OnderdeelID)

PersoonID vul je middels een gebonden keuzelijst, gebaseerd op een tabel met persoonsgegevens (je potentiele deelnemers)
OnderdeelID vul je middels een gebonden keuzelijst, gebaseerd op je tabel met wedstrijdonderdelen

Deze aanpassing zorgt er voor, dat je queries minder complex en sneller worden.

Tardis
 
En dat wordt mede veroorzaakt door een onjuist ontwerp ;)
Splits je tabel Inschrijvingen op in 2 tabellen:

tblInschrijving (InschrijfID, Wedstrijddatum, PersoonID)
tblInschrijfonderdeel (InschrijfonderdeelID, InschrijfID, OnderdeelID)

PersoonID vul je middels een gebonden keuzelijst, gebaseerd op een tabel met persoonsgegevens (je potentiele deelnemers)
OnderdeelID vul je middels een gebonden keuzelijst, gebaseerd op je tabel met wedstrijdonderdelen

Deze aanpassing zorgt er voor, dat je queries minder complex en sneller worden.

Tardis

Tardis,

OK, dat snap ik, maar ik heb het hele programma verder af op een paar kleine aanpassingen en ik kwam tot de conclusie dat deze berekening niet geheel correct werkte.
En dat was ook mijn vraag hier. Ik hoop dat iemand mij kan helpen, bijv. vanhooren Lode, mbv een functie waardoor de berekeningen ook sneller verlopen, waarna de query uiteindelijk ook sneller zal gaan worden.
 
Na 2 dagen zelf maar gepuzzeld te hebben ben ik eruit. De formule wat aangepast en het werkt perfect:

(((IIf([Onderdeel 1] Between 0 And 25 Or [onderdeel 1] Between 37 And 47,(IIf([Categorie]="JpA" Or [Categorie]="MpA" Or [Categorie]="JpB" Or [Categorie]="MpB" Or [categorie]="JpC" Or [categorie]="MpC","1",0)),0))))+((IIf([Onderdeel 2] Between 0 And 25 Or [onderdeel 2] Between 37 And 47,(IIf([Categorie]="JpA" Or [Categorie]="MpA" Or [Categorie]="JpB" Or [Categorie]="MpB" Or [categorie]="JpC" Or [categorie]="MpC","1",0)),0)))+((IIf([Onderdeel 3] Between 0 And 25 Or [onderdeel 3] Between 37 And 47,(IIf([Categorie]="JpA" Or [Categorie]="MpA" Or [Categorie]="JpB" Or [Categorie]="MpB" Or [categorie]="JpC" Or [categorie]="MpC","1",0)),0)))+((IIf([Onderdeel 4] Between 0 And 25 Or [onderdeel 4] Between 37 And 47,(IIf([Categorie]="JpA" Or [Categorie]="MpA" Or [Categorie]="JpB" Or [Categorie]="MpB" Or [categorie]="JpC" Or [categorie]="MpC","1",0)),0)))*[Ingeschreven]![pup per onderdeel]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan