Enkele waarde uit een tabel in VBA

Status
Niet open voor verdere reacties.

RobertJB66

Gebruiker
Lid geworden
2 feb 2022
Berichten
132
Ik heb een probleem dat ik zelf, maar niet opgelost krijg.

Ik heb een tabel mat daar in o.a. twee kolommen: Charge en Age

een voorbeeld van de data in de tabel is:

IDChargeAge
199909122
299908122
399909121
499908120
59990687
69990686
79990686
87801251
97801250
107801249
117801249
125230210
135230210
144680010
15468009
16523029
17468008
18523028
19A12356
20523026
21A12355
22523024
23A12354
24B23684
25B23683
26A12353
27B23682
28A12352
29B23681
30A12351
31B23680
32A12350
ChargeT


ik zou graag het voor elkaar krijgen dat ik de tabel in VBA code zo kan filteren dat de meest recente Batch beschikbaar is.
Het resultaat zou er dan als hieronder uitzien echter in de volgorde waarde de Age waarde van 0 naar 121 loopt van boven naar beneden

IDChargeAge
399909121
499908120
79990686
117801249
17468008
22523025
31B23680
32A12350
ChargeT

Ik probeer het met onderstaande code voor elkaar te krijgen, maar krijg en fout melding

Run-time error '3075'
Syntax error (missing operator) in Query expression 'ON (Age) Age'


Set rs = CurrentDb.OpenRecordset("SELECT DISTINCT ON (Age) Age, Charge FROM ChargeT ORDER BY Charge DESC")

Heeft iemand een idee wat ik fout doe :rolleyes:
 
ON (...) is een onbekende SQL expressie.
Code:
SELECT DISTINCT  Age, Charge FROM ChargeT ORDER BY Charge DESC
kan wel,
of een group by expressie zoals:
Code:
SELECT Age, max(Charge) FROM ChargeT 
group by Age
ORDER BY Charge DESC
afhankelijk op welk veld je wil groeperen en welke waarde je van het ander veld wil zien (MIN, MAX, ...)
 
Ik weet niet wat de query van noella zou moeten doen, maar m.i. niet het juiste resultaat. Dat haal je hier wél mee.
Code:
SELECT ID, Charge, Age
FROM ChargeT
WHERE (ID In (SELECT Max(ID) AS MaxID FROM ChargeT GROUP BY Charge))
ORDER BY Age DESC;
 
Dank je wel voor de reactie.:d

Dit werkt echter nog niet helemaal het juiste resultaat.:confused:
Ik heb de tweede oplossing gekozen.

Ik zou graag het meest recente Charge nummer als eerste hebben dus met Age = 0
het volgende charge nummer is dan een uniek Charge nummer met de meest recente Age b.v. 0 of 1

in mijn voorbeeld zou het dan het resultaat er zo uitzien:

[FONT=&quot]A1235[/FONT][FONT=&quot]0[/FONT]
[FONT=&quot]A1235[/FONT][FONT=&quot]0[/FONT]
[FONT=&quot]52302
[/FONT]
[FONT=&quot]52302[/FONT]
[FONT=&quot]78012[/FONT]

ik heb het nu als volgt ingevuld

Set rs = CurrentDb.OpenRecordset("SELECT Charge, min(Age) FROM EECQ Group by Charge ORDER BY Charge ASC")

Alleen hierbij krijg ik niet het gewenste resultaat.:eek:

Set rs = CurrentDb.OpenRecordset("SELECT Charge, min(Age) FROM EECQ Group by Charge ORDER BY Age ASC")

krijg ik een fout melding: Your query does not include the specified expression Äge"as part of the aggregate function:eek:



[FONT=&quot]
[/FONT]
 
Is dit ook mogelijk zonder het ID deel? Hoe zou dat er dan uitzien?

Ik weet niet wat de query van noella zou moeten doen, maar m.i. niet het juiste resultaat. Dat haal je hier wél mee.
Code:
SELECT ID, Charge, Age
FROM ChargeT
WHERE (ID In (SELECT Max(ID) AS MaxID FROM ChargeT GROUP BY Charge))
ORDER BY Age DESC;
 
ID onzichtbaar maken. Waarom staat deze vraag eigenlijk in het VBA forum? Is toch gewoon een (Access) query vraag? En niet nodeloos complete berichten quoten svp.
 
Als je de ID niet nodig hebt, moet je die ook niet meenemen in de query.

de foutmelding komt doordat je sorteert op een veld dat niet in de groepering zit.

SELECT Charge, min(Age) FROM EECQ Group by Charge ORDER BY min(Age) ASC

zou moeten werken
 
Als je de ID niet nodig hebt, moet je die ook niet meenemen in de query.
Dat is natuurlijk onzin; je moet hem wél gebruiken want je hebt hem nodig om te filteren. Je hoeft hem niet te laten zien, maar dat is iets geheel anders.

Code:
SELECT Charge, Age
FROM ChargeT
WHERE ID In (SELECT Max(ID) AS MaxID FROM ChargeT GROUP BY Charge)
ORDER BY Age DESC;
 
De ID heeft alleen betekenis als uniek getal en om relaties te leggen, maar het is heel gevaarlijk om daar een andere betekenis of zelfs volgorde aan te geven. Een SQL expressie "toont" geen waarden, maar geeft een dataset als resultaat. Dus als je de ID nodig hebt om het resultaat verder te koppelen heb je die ID nodig, in elk ander geval niet. In een groepsquery is het best om alleen de nodige velden op te nemen. Als je de minimum waarde [age] per [charge] wil hebben, is er geen enkele reden om de ID op te nemen. KISS principe.
 
Voor wie schrijf je dit? Ben benieuwd of TS dit snapt. Ik kom niet verder dan het KISS principe. Daar is voldoende mee geoefend :).
 
En als je de query werkend hebt in Access, kopieer je de SQL en maak je er een VBA routine van. Dan krijg je dus dit:

Code:
    Set rs = CurrentDb.OpenRecordset("SELECT Charge, Age FROM ChargeT " _
        & "WHERE [ID] In (SELECT Max(ID) AS MaxID FROM ChargeT GROUP BY Charge) " _
        & "ORDER BY Age DESC , Charge;")
    With rs
        MsgBox .RecordCount
    End With

En dat levert dus de output zoals je hem in bericht #1 vraagt. Wat je in #4 bedoelt, kan ik niet reproduceren al was het maar omdat sommige waarden niet in je tabel voorkomen en/of dubbel in de output zitten (A12350 en 52302). Wat daar op deze manier het nut van is, weet je zelf vast beter als wij :)
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan