Access Query : Laatste record

Status
Niet open voor verdere reacties.

fde

Gebruiker
Lid geworden
31 aug 2017
Berichten
110
Ik gebruik doorlopend formulier : "te contacteren" met als recordbron een gekoppelde qry_sollicitant & qry_bewegingen.

Nu probeer ik het jongste record per persoon in m'n query te krijgen.
Heb van alles al geprobeerd zoals "LAST" - "FROM AS" - "GROUP BY" maar dat lukt me blijkbaar niet goed.

De sql v/d query ziet er momenteel zo uit.
Code:
SELECT tbl_sollicitant.ID_SOLLICITANT, tbl_sollicitant.NAAM_SOLLICITANT, tbl_sollicitant.VOORNAAM_SOLLICITANT, tbl_sollicitant.GEBOORTEDATUM_SOLLICITANT, tbl_sollicitant.GSM_SOLLICITANT, tbl_sollicitant.EMAIL_SOLLICITANT, tbl_sollicitant.AANGEPAST_OP, tbl_bewegingen.ID_BEWEGINGEN, tbl_bewegingen.ID_OPZOEKEN, tbl_bewegingen.ID_OPZOEKEN_OMSCHRIJVING, tbl_bewegingen.OPZOEKEN_TYPE, tbl_bewegingen.OPZOEKEN_OMSCHRIJVING, tbl_bewegingen.DATUM_BEWEGING
FROM tbl_sollicitant INNER JOIN tbl_bewegingen ON tbl_sollicitant.ID_SOLLICITANT = tbl_bewegingen.ID_SOLLICITANT
WHERE (((tbl_bewegingen.ID_OPZOEKEN)<>6) AND ((tbl_bewegingen.ID_OPZOEKEN_OMSCHRIJVING)<>11 And (tbl_bewegingen.ID_OPZOEKEN_OMSCHRIJVING)<>12) AND ((tbl_bewegingen.DATUM_BEWEGING) Between Date() And Date()-20))
ORDER BY tbl_bewegingen.DATUM_BEWEGING DESC;

Iemand enig idee hoe eraan te beginnen?
 
Doe er een voorbeeldje bij, want zo wordt het gokken. Je hebt al een datumselectie, maar dat is blijkbaar dan ook niet de bedoeling. Overigens kan deze query een stuk overzichtelijker.
PHP:
SELECT a.ID_SOLLICITANT, a.NAAM_SOLLICITANT, a.VOORNAAM_SOLLICITANT, a.GEBOORTEDATUM_SOLLICITANT, a.GSM_SOLLICITANT, a.EMAIL_SOLLICITANT, a.AANGEPAST_OP, 
b.ID_BEWEGINGEN, b.ID_OPZOEKEN, b.ID_OPZOEKEN_OMSCHRIJVING, b.OPZOEKEN_TYPE, b.OPZOEKEN_OMSCHRIJVING, b.DATUM_BEWEGING
FROM tbl_sollicitant As a INNER JOIN tbl_bewegingen As b ON a.ID_SOLLICITANT = b.ID_SOLLICITANT
WHERE (b.ID_OPZOEKEN<>6 AND b.ID_OPZOEKEN_OMSCHRIJVING Not In(11,12) AND b.DATUM_BEWEGING Between Date() And Date()-20)
ORDER BY b.DATUM_BEWEGING DESC;
 
In uw zip zitten 2 Db's; de ene is met login en paswoord (dat wij niet kennen) en de andere bevat enkel tabellen
 
SHIFT en dubbelklik op cv_opvolging heft dit op. wel via het koppelingsbeheer de tabellen uit cv_opvolging_be koppelen. Anders krijg je niets te zien.
 
Volgens mij heb je een subquery nodig in je filter.
PHP:
SELECT a.ID_SOLLICITANT, a.NAAM_SOLLICITANT, a.VOORNAAM_SOLLICITANT, a.GEBOORTEDATUM_SOLLICITANT, a.GSM_SOLLICITANT, a.EMAIL_SOLLICITANT, a.AANGEPAST_OP, 
b.ID_BEWEGINGEN, b.ID_OPZOEKEN, b.ID_OPZOEKEN_OMSCHRIJVING, b.OPZOEKEN_TYPE, b.OPZOEKEN_OMSCHRIJVING, b.DATUM_BEWEGING
FROM tbl_sollicitant AS a INNER JOIN tbl_bewegingen AS b ON a.ID_SOLLICITANT = b.ID_SOLLICITANT WHERE ((b.ID_BEWEGINGEN In 
     (Select Top 1  Dupe.[ID_BEWEGINGEN] FROM [tbl_bewegingen] AS Dupe 
     WHERE  Dupe.[ID_SOLLICITANT] = b.[ID_SOLLICITANT] Order By Dupe.[ID_BEWEGINGEN] Desc)) 
AND b.ID_OPZOEKEN<>6 AND b.ID_OPZOEKEN_OMSCHRIJVING Not In (11,12) 
AND b.DATUM_BEWEGING Between Date() And Date()-20)
ORDER BY a.ID_SOLLICITANT, b.DATUM_BEWEGING DESC;
 
Zover ik kan zien werkt deze query goed.
Doch één raar verschijnsel: het sorteren volgens bewegingsdatum wordt niet uitgevoerd. b.DATUM_BEWEGING DESC;
 
Doch één raar verschijnsel: het sorteren volgens bewegingsdatum wordt niet uitgevoerd. b.DATUM_BEWEGING DESC;
Dat lijkt mij niet meer dan logisch. Pakken we je oorspronkelijke vraag er even bij:
Nu probeer ik het jongste record per persoon in m'n query te krijgen.
Dat moet je lezen als: van elke persoon wil je het laatste record zien. Oftwel: van elke persoon zie je maar één record. De dynatabel is gesorteerd op persoonID. Van die persoon zie je dan verschillende gegevens, waaronder de datum. En te tegenvraag is dus: als je van elke persoon maar één record ziet, hoe kan je dat record dan op datum sorteren? Je kunt de sortering wel omdraaien (sorteren op datum) maar dan kun je niet meer op persoon als eerste sorteersleutel sorteren. Omdat je datums vermoedelijk wel meerdere keren voorkomen, kun je per datum dan weer wel op persoon sorteren.
 
Om het in de query te laten zien, krijg je dan deze sorteersleutel:
Code:
ORDER BY b.DATUM_BEWEGING DESC, a.ID_SOLLICITANT;
 
De aanpassing werk perfect. In jouw code heb ik ook enkele een kleine aanpassing gedaan: Not In (11,12,32,56,60) ipv Not In (11,12). Ik denk dat we nu een goede tool hebben om een degelijke opvolging te kunnen uitvoeren. Met dank hiervoor ; ook voor de uitleg die je erbij verschaft.
 
De manier waarop jij records uitsloot (tbl_bewegingen.ID_OPZOEKEN_OMSCHRIJVING)<>12 etc) werkt an sich prima, maar is erg onhandig als het gaat om veel codes. In dat geval is de optie [Not] In(#1; #2; #3 etc) een veel betere en overzichtelijkere methode. Kwestie van getalletjes toevoegen of weghalen. De extra parameter "Not" gebruik je dan om de selectie positief of negatief te maken.
 
Dat is inderdaad zo en het is überhaupt veel overzichtelijker met de NOT IN - code. Op deze wijze wordt de SQL van de query erg ingekort.
Nog een vraagje over dit stukje code: WHERE Dupe.[ID_SOLLICITANT] = b.[ID_SOLLICITANT] Order By Dupe.[ID_BEWEGINGEN] Desc)) .
Hoe moet ik ... Dupe. ... interpreteren?
 
De Dupe tabel is eigenlijk een kopie van de oorspronkelijke tabel. Je gebruikt de kopie a.h.w. om het record uit de hoofdtabel (b.[ID_SOLLICITANT]) te matchen met de kopie tabel. Zeg maar de relatie tussen de twee tabellen. Met TOP 1 haal je per match één record op. Verander je die waarde naar 3, dan zou je 3 records per persoon krijgen in de query. Omdat je 1 gebruikt, en aflopend op ID_BEWEGINGEN sorteert, is dat dus per definitie de laatste waarde, want ID_BEWEGINGEN is een autonummerveld. Je had ook aflopend kunnen sorteren op Datum, dan had je ook de laatste record gevonden.
Je mag dus elke naam gebruiken die je wilt. :)
 
Dank je voor deze verhelderende uitleg. Weeral bijgeleerd voor een leek als ik.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan