Rnd functie werkt niet goed

Status
Niet open voor verdere reacties.

Lexie2408

Gebruiker
Lid geworden
7 jan 2008
Berichten
42
Hoi,

In mijn database heb ik een Rnd-functie.

Iedere keer als ik de database opnieuw open en formulieren creeer geeft deze functie dezelfde waarden in de dezelfde volgorde terug. De bedoeling is dat de waarden iedere keer anders zijn, daarvoor is deze functie ook bedoeld, toch..?

Iemand een idee?

Alvast dank!
 
De functie Rnd is in queries niet zo geweldig, omdat hij voor elk record hetzelfde random getal genereert; kort gezegd: aan het begin van de uitvoer wordt de functie één keer uitgevoerd, en die waarde wordt dan gebruikt voor de rest van de run. Om echt willekeurige records te selecteren, moet je een functie gebruiken, en die aanroepen in een query.
De functie maak je in de objectengroep 'Modules'. Heb je nog geen module met functies, maak je een nieuwe aan. Plak daar onderstaande code in (van Function... tot End function)

Function Randomizer() As Integer
Static AlreadyDone As Integer

If AlreadyDone = False Then Randomize: AlreadyDone = True
Randomizer = 0

End Function

Vervolgens maak je een query aan, zoals onderstaand voorbeeld. Het veld [Tabel].[Id] is uiteraard te vervangen door elk willekeurig getalveld. Met [TOP 25] geef je aan hoeveel records je wilt zien in je selectie. Kan ook elk willekeurig getal zijn.

SELECT TOP 25 [Tabel].*
FROM [Tabel]
WHERE (Randomizer()=0)
ORDER BY Rnd(IsNull([Tabel].[Id])*0+1);

Succes!

Michel
 
Mijn vorige Query zag er als volgt uit:

SELECT TOP 1 questions.questionid, questions.question, questions.answer, Rnd(Len([question])) AS Expr1
FROM chapters INNER JOIN questions ON chapters.chapterid = questions.chapterid
WHERE (((chapters.chapterid)=1))
ORDER BY Rnd(Len([question]));

Hoe moet ik deze naar jouwe voorbeeld vertalen?

Dank!
 
Dat klopt van de steeds dezelfde random waarde, dat is ook gebruikelijk bij de rnd functie. Je moet de functie tijd inbouwen om ervoor te zorgen dat er altijd een andere waarde wordt genomen.
Ik heb thuis voorbeeld code liggen. Als ik thuis ben zal ik hem opzoeken en even posten.
 
Deze code zou moeten werken:

SELECT TOP 1 questions.questionid, questions.question, questions.answer
FROM chapters INNER JOIN questions ON chapters.chapterid = questions.chapterid
WHERE (((Randomizer())=0) AND ((questions.chapterid)=1))
GROUP BY questions.questionid, questions.question, questions.answer
ORDER BY Rnd(IsNull([questions].[questionid])*0+1);

Ik neem aan, dat de functie inmiddels is ingebouwd...

Michel
 
Ik heb de code even voor je opgezocht. De code heb ik ooit gemaakt voor een dobbelsteen oefening. De bovengrens en ondergrens zijn dus vastgesteld, je kan hier uiteraard variabelen in plaatsen die overeenkomen met de aantallen van je lijst/query/recordset enz enz.

Code:
'Genereren van doppelsteen 1. De waarde moeten tussen 1 en 6 liggen
    'Int((Bovengrens - Ondergrens + 1) *RND+ondergrens)
Rem Door er randomize voor te zetten wordt de tijd gebruikt als startgetal.
    Randomize
    IntDoppelsteen1 = (Int((6 - 1 + 1) * Rnd + 1))
 
Heb zowel de functie als de SQL-oproep ingevoegd. Echter,
nog steeds hetzelfde probleem.

Ik probeer een examen samen te voegen en de database moet de volgende stappen zetten:

Selecteer een vraag uit een bepaald hoofdstuk, doe dit voor nog 6 hoofdstukken. Voeg deze samen in een tabel.

Enig idee wat ik nog kan veranderen?

Dank!
 
Ah, de vraag verschuift langzaam naar een heel ander probleem: je wilt als ik het goed begrijp voor alle hoofdstukken één vraag genereren op een formulier, en dat dan vervolgens opslaan in een tabel? Of wil je een tabel genereren met één willekeurige vraag per hoofdstuk, en het resultaat daarvan tonen op je formulier?
Beide vragen hebben een iets andere oplossing.

Kijk eerst eens in de bijgevoegde db; daarin zitten voorbeeldtabellen, queries en een formulier die het probleem kunnen oplossen.
Het gaat dan in eerste instantie om de queries, want die lossen de meeste vragen op.

Ik heb voor elk hoofdstuk een aparte query gemaakt, die één willekeurige vraag uit dat hoofdstuk genereert. Ze heten [Random Question1] tot [Random Question3].
Om de resultaten te verzamelen is een Union query nodig. Die kun je alleen met SQL code maken. Deze query heet [Random Question].
De Union query [Random Question] dient weer als basis voor het formulier [Random Vraag].

Om op het beginprobleem terug te komen: om een tabel te maken met één willekeurige vraag per hoofdstuk kun je een Tabelmaak query gebruiken, zoals [Maak Tabel Vragen] in het voorbeeld.
Deze query maakt de tabel [Vraag Per Hoofdstuk], en die zou je bijvoorbeeld ook als bron voor het formulier kunnen gebruiken i.p.v. de random query.

Komt dit in de buurt?
 

Bijlagen

Laatst bewerkt:
Op deze manier heb ik mijn db ook gemaakt. Maar zie in deze hetzelfde probleem: als ik de db open en voor de eerste keer een 3-tal vragen genereer dan is de volgorde hetzelfde.

Begint altijd met id 10, daarna 2 en 7.

Ik zou graag willen dat er iedere keer een ander examen wordt gegeneerd en naar de printer wordt verzonden.
 
Laatst bewerkt:
Heb je mijn oplossing ook al verwerkt wat dat zou het probleem van de steeds terug komende vragen moeten oplossen.
 
Floor,

Ik heb je functie bekeken en snap de werking ervan, alleen hoe ga ik deze het beste toepassen in mijn db?

Thanks!
 
Hoi Lexie,

Ik heb het formulier een paar keer geopend, gesloten en opnieuw geopend, en er komen steeds nieuwe vragen uit, dus ik snap het probleem niet helemaal meer. De Tabelmaakquery maakt ook steeds nieuwe combinaties aan, dus die werkt ook goed.
Ik vraag me af, of er geen programma-instellingen verkeerd staan, waardoor de queries niet goed worden uitgevoerd? Dat kun je controleren bij Extra, tabblad Bewerken/Zoeken. Ik zou alle vinkjes weghalen in de groep Bevestigingen.

Kijk eens of dat helpt?
 
Vinkjes weggehaald, maar hetzelfde resultaat... Na het opnieuw opstarten van Access nog steeds dezelfde antwoorden gegenereerd...
 
Echt snappen doe ik het nog steeds niet, want bij mij geeft-ie toch echt elke keer een nieuwe selectie. Er zitten uiteraard niet zo veel antwoorden in, dus daar kan je ook nog last van hebben.
Ik laat in deze versie het formulier nu automatisch openen, misschien dat dat helpt?
Met welke Office versie werk je?
 

Bijlagen

Lexie,
Thuis heb ik ook Office 2003; de voorbeeld db heb ik op m'n werk in Office 2000 gemaakt. Maar thuis doet-ie het dus ook zoals ik 'm bedoeld heb.
Een laatste poging om je te helpen, want ik ben bijna door m'n opties heen:

Probeer eens een macro te maken, met de naam AutoExec met de volgende opdrachten:
1. BerichtenInstellen, waarde Nee (standaardinstelling)
2. QueryOpenen, query: <Maak Tabel Vragen>
3. Opslaan onder de naam AutoExec

Hiermee moet, elke keer als je de db opent, op zijn minst de tabel <Vraag Per Hoofdstuk> worden ververst.

Zet, voor de zekerheid, de beveiliging van de macro's op laag, zodat je zeker weet dat alles ongestoord wordt uitgevoerd.
Kun je eventueel een db met eigen voorbeeld meenemen? Ik weet dat m'n eigen db werkt, maar daar gaat het in dit geval nou net niet om... ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan