Selecteer de laatste 20 records, aan de hand van een datum.

Status
Niet open voor verdere reacties.

RadboudAKF

Gebruiker
Lid geworden
3 nov 2010
Berichten
219
Ik heb een vraag over een data-base die we hebben ontwikkeld voor ons kwaliteitssysteem. In dat systeem worden bepaalde metingen opgeslagen (heeft te maken van geneesmiddel-bereiding).
Gegevens die worden opgeslagen zijn bv.: -(monster)metingen, monsterdatum, invoerdatum (automatisch), naam van de bereiding, etc.

Aan de hand van die gegevens genereren we statistische gegevens waarbij de gebruiker een eerste (monster)datum kan opgeven en een laatste (monster)datum kan opgeven. Dat werkt prachtig; zeker met een koppeling naar Excel geven de statistieken de gebruiker veel informatie.

Nu heeft de gebruiker een andere wens: hij wil niet meer opgeven een begin- en einddatum van de bemonstering...hij wil kunnen zeggen: "Toon mij de laatste 20 (of zo) metingen, gerelateerd aan de monsterdatum" Uitgaande van de laatste monsterdatum wil hij 20 records terug. Kom je dan bij een datum uit waarop meerdere monsters zijn genomen dan moeten die er ook bij worden betrokken. (dus 20 records + alle records van de oudste monsterdatum)

Ik hoop dat ik dit goed uitleg....

Ik heb verschillende dingen geprobeerd maar hij lukt mij niet om dit juist te programmeren. (Ik zeg erbij dat de records geen Id-nr hebben, er is wel een monsternummer maar dat is random uitgedeeld en zegt niets over het moment dat het record is ontstaan)

Ik zou het prachtig vinden als iemand mij een klein stukje op weg helpen?

Met vr.gr.

Jan
RadboudUMC
 
Het is een goede zaak dat het dus niet om een exact aantal records gaat, want dat had wat problematisch geworden. Nu kun je met TOP 20 het gewenste resultaat maken.
 
OctaFish... Eerlijk gezegd snap ik niet wat je bedoelt....

Wat ik hier problematisch vind is dat ik dit dus tevoren in de query instel...

Bij Queryeigenschap vul ik dus bij TOP een getal of percentage in...ik kan dit niet laten varieren middels een invulveldje op het formulier waarmee mijn gebruiker zijn selectie maakt. Ofwel Top 20 of (als hij dat wil) de Top30 of wat dan ook toont. Hoe zorg ik er voor dat ik niet steeds de queryeigenschappen hoef te veranderen maar dat de gebruiker dat in een dialoogvenstertje zelf kan doen?

Ik probeerde de query aan te passen door een statement [geef getal] :

SELECT DISTINCTROW TOP [geef een getal] Tbl_Vingerafdruk.Monsternummer, Tbl_Ruimten.Id_Ruimte, Tbl_Ruimten.RuimteNummer, [Tussen_voegsel] & " " & [Achternaam] AS Expr1, Medewerkers_AKF.P_nummer, Tbl_Ruimten.Naam, Tbl_Vingerafdruk.MonsterDatum, Tbl_Vingerafdruk.Hand_Links, Tbl_Vingerafdruk.Hand_Rechts, Tbl_Vingerafdruk.Starttijd_Bereiding, Tbl_Vingerafdruk.[KVE-7], Tbl_Ruimten.Klasse, Klassen.Vingerafdruk, Tbl_Vingerafdruk.[Resultaat kweek], Tbl_Vingerafdruk.Chargenr, Tbl_Vingerafdruk.Opmerking
FROM Klassen RIGHT JOIN (Tbl_Ruimten INNER JOIN (Tbl_Meetpunten INNER JOIN (Medewerkers_AKF INNER JOIN Tbl_Vingerafdruk ON Medewerkers_AKF.P_nummer = Tbl_Vingerafdruk.Persoon) ON etc

maar dat werkt niet.

Ik vrees dat dit niet gaat werken....
 
Laatst bewerkt:
Programmeren? Vermoedelijk niet nodig, tenzij je het aantal records variabel wilt maken. Als je een selectiequery maakt, zie je meestal alle records. Dat komt omdat in de keuzelijst <Resultaat> de waarde Alles. Hier kun je ook een getal intypen, bijvoorbeeld 20. Dan zie je 20 records. Al is dat aantal afhankelijk van de sortering die je maakt. Aflopend op een uniek nummer zal je altijd 20 records zien, maar aflopend op Datum bijvoorbeeld kan het zijn dat vanaf record 18 je een datum hebt waar 4 records in zitten. Je ziet in dat geval 22 records (18+4). En daarmee kun je dus heel goed je selectie maken, gebaseerd op [Monsterdatum].
 
Octafish...sorry...ik heb mijn antwoord aangepast.

Ik zou die 20 of 30 achter TOP door de gebruiker zelf willen laten invullen in een dialoogvenstertje? (Zie aangepast antwoord op jouw eerste reactie)
 
Ik zou alle communicatie met de gebruiker sowieso via formulieren laten lopen. En in dat geval gebruik je dus een tekstveld waarin de waarde wordt getypt om de SQL dynamisch te genereren. En met de QueryDefs collectie pas je dan de query aan.
 
Ja, mooi..zo wil ik het. Maar dan blijft mijn vraag hoe kan ik die query aanpassen via een formulier? Hoe koppel ik dat in te vullen getal (TOP) aan een formulier?

Dit gaat mij waarschijnlijk boven de pet....en ik was zo dichtbij. (verzucht hij). Dat gaat dus niet op deze manier: SELECT DISTINCTROW TOP [geef een getal] . Maar....hoe dan wel?
 
Je moet de SQL 'live' opbouwen vanuit het formulier dus. Daarbij lees je dus het tekstveld met het aantal records uit.
 
Helaas, dit begrijp ik niet.

Ik heb deze query:

SELECT DISTINCTROW TOP 43 Tbl_Vingerafdruk.Monsternummer, Tbl_Ruimten.Id_Ruimte, Tbl_Ruimten.RuimteNummer, [Tussen_voegsel] & " " & [Achternaam] AS Expr1, Medewerkers_AKF.P_nummer, Tbl_Ruimten.Naam, Tbl_Vingerafdruk.MonsterDatum, Tbl_Vingerafdruk.Hand_Links, Tbl_Vingerafdruk.Hand_Rechts, Tbl_Vingerafdruk.Starttijd_Bereiding, Tbl_Vingerafdruk.[KVE-7], Tbl_Ruimten.Klasse, Klassen.Vingerafdruk, Tbl_Vingerafdruk.[Resultaat kweek], Tbl_Vingerafdruk.Chargenr, Tbl_Vingerafdruk.Opmerking
FROM Klassen RIGHT JOIN (Tbl_Ruimten RIGHT JOIN (Tbl_Meetpunten INNER JOIN (Medewerkers_AKF RIGHT JOIN Tbl_Vingerafdruk ON Medewerkers_AKF.P_nummer = Tbl_Vingerafdruk.Persoon) ON Tbl_Meetpunten.Id_Meetpunten = Tbl_Vingerafdruk.Id_Locatie) ON Tbl_Ruimten.Id_Ruimte = Tbl_Vingerafdruk.Kamer) ON Klassen.Klasse = Tbl_Ruimten.Klasse
WHERE (((Tbl_Ruimten.Id_Ruimte)=[geef id]) AND ((Tbl_Vingerafdruk.Invoerdatum)<>Date()))
ORDER BY Tbl_Vingerafdruk.MonsterDatum DESC , Tbl_Vingerafdruk.Starttijd_Bereiding;

Ik begrijp niet hoe ik het statement TOP 43 (in dit geval) met een tekstveld op een formulier kan wijzigen. Ook niet als ik dit opbouw.... (ik werk met Access 2007...is dat misschien het punt?)
 
De versie maakt gelukkig niks uit; SQL is wat dat betreft een universele taal. Je krijgt iets als:
Code:
Dim strSQL As String
Dim qTmp As QueryDef

strSQL = "SELECT DISTINCTROW TOP " & Me.txtAantal & " Tbl_Vingerafdruk.Monsternummer, Tbl_Ruimten.Id_Ruimte, Tbl_Ruimten.RuimteNummer, " _
    & "[Tussen_voegsel] + ' ' & [Achternaam] AS Expr1, Medewerkers_AKF.P_nummer, Tbl_Ruimten.Naam, Tbl_Vingerafdruk.MonsterDatum, " _
    & "Tbl_Vingerafdruk.Hand_Links, Tbl_Vingerafdruk.Hand_Rechts, Tbl_Vingerafdruk.Starttijd_Bereiding, Tbl_Vingerafdruk.[KVE-7], " _
    & "Tbl_Ruimten.Klasse, Klassen.Vingerafdruk, Tbl_Vingerafdruk.[Resultaat kweek], Tbl_Vingerafdruk.Chargenr, Tbl_Vingerafdruk.Opmerking " _
    & "FROM Klassen RIGHT JOIN (Tbl_Ruimten RIGHT JOIN (Tbl_Meetpunten INNER JOIN (Medewerkers_AKF RIGHT JOIN Tbl_Vingerafdruk " _
    & "ON Medewerkers_AKF.P_nummer = Tbl_Vingerafdruk.Persoon) ON Tbl_Meetpunten.Id_Meetpunten = Tbl_Vingerafdruk.Id_Locatie) " _
    & "ON Tbl_Ruimten.Id_Ruimte = Tbl_Vingerafdruk.Kamer) ON Klassen.Klasse = Tbl_Ruimten.Klasse " _
    & "WHERE (((Tbl_Ruimten.Id_Ruimte) = [geef id]) And ((Tbl_Vingerafdruk.Invoerdatum) <> Date)) " _
    & "ORDER BY Tbl_Vingerafdruk.MonsterDatum DESC , Tbl_Vingerafdruk.Starttijd_Bereiding;"

Set qTmp = CurrentDb.QueryDefs("qTemp")
qTmp.SQL = strSQL
Nog wel even de namen aanpassen natuurlijk.
 
OK...enthousiast toen ik dit zag:

Dim strSQL As String
Dim qTmp As QueryDef

strSQL = "SELECT DISTINCTROW TOP " & Me.txtAantal & "

Dus ik plak jouw SQL statement als bron voor mijn formulier (en maak uiteraard een tekstveldje luisterend naar de naam txtAantal) maar dan krijg ik weer opmerkingen als "De instructie Select bevat een gereserveerd woord of is verkeerd gespeld "

Ik voel mij vreselijk dom...maar hoe gebruik ik jouw SQL nu als query-bron voor mijn formulier?

Ik plakte:

Dim strSQL As String
Dim qTmp As QueryDef

strSQL = "SELECT DISTINCTROW TOP " & Me.txtAantal & " etc

in de Recordbron voor mijn formulier...maar dat werkt niet. Waarschijnlijk begrijp ik het principe gewoon (nog) niet en moet ik eerst jouw prachtcursus afmaken.

Ik begrijp niet hoe ik mijn recordbron kan veranderen van een "gewone selectie-query" in een SQL-statement.

Wel zeer bedankt voor het meedenken maar ik vermoed dat ik te weinig kennis heb om hiermee uit de voeten te kunnen. Ik vermoed dat mijn gebruiker maar genoegen moet nemen met een tevoren gedefinieerd TOP "N" getal...ik krijg het niet dynamisch.

Zeer bedankt ...
 
Op zich kan dat wel, maar je wilt nu vermoed ik iets anders namelijk de recordbron van het actieve formulier aanpassen. En dat kan wel, maar dan moet je wat extra regels toevoegen. Probleem is namelijk dat je een formulier altijd opent met een bepaalde recordbron, en die zit dan onder het formulier ongeacht wat je later doet. Dus om de nieuwe recordbron te activeren, moet je hem opnieuw toewijzen. Iets als:
Code:
    Set qTmp = CurrentDb.QueryDefs("qTemp")
    qTmp.SQL = strSQL
    Me.RecordSource = "qTemp"
    Me.Requery
    Me.Refresh
Maar ik heb de code getest, en bij mij werkt het gewoon. Dus als je 'm niet aan de praat krijgt, ken je het recept: een voorbeeldje :).
 
Ik ga je volgende week (of misschien vanavond) een voorbeeldje sturen van één formulier waarbij dit speelt. Ik moet die database dan even 'uitkleden' en alleen de tabellen/queries en formulieren meesturen die van belang zijn. Kan een dag duren voordat ik dat heb gemaakt. Alsvast zeer veel dank...
 
Ik ben aan het klussen, dus ik heb geen haast :).
 
Octafish...Database is een flink aantal MB's groot. (zo'n 25mb...ik kijk nog of ik de zaak kleiner krijg) -zip biedt meestal geen soelaas.
Kan ik dit misschien met WeTransfer naar jou sturen? (dan heb ik uiteraard wel een email-adres nodig) Of is dat 'not done' op dit forum.
 
Mag wel; mail de link maar.
 
Laatst bewerkt:
Ik heb bestand verstuurd...

Ik hoor wel of je hier iets mee kunt. Ik zag nog geen ontvangst ...

Ik heb vanmorgen nog eens geprobeerd of ik met jouw aanwijzingen nog iets voor elkaar kreeg, maar helaas.

Voorbaat dank...
 
Bestand is binnen, maar ik heb er nog geen tijd voor gehad. Wordt morgen.
 
Is het wel de goede database? Er zitten alleen maar macro's in... Je weet (hoop ik) hoe ik denk over macro's :). Ik mis in ieder geval de query code van hierboven.
 
Ik hoop toch dat ik de juiste dB heb verstuurt. Er zit één Macro (acties) in, dacht ik.

Als het de juiste dB is dan zie je het formulier QForm_Persoon_NG. Daarin wil ik doen wat ik hierboven schetste. Ófwel vult men een start- en einddatum in, (knop monsterdata) ófwel men genereert een TOP20 door op de knop "Genereer Rapport Vingerafdrukken adh van laatste 20" te klikken. De knoppen sturen queries aan die een tabel vullen waar vervolgens in EXCEL een grafieken mee worden gemaakt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan