Een vraag over Syntax in een VB-statement in een ACCESS-formulier

Status
Niet open voor verdere reacties.

RadboudAKF

Gebruiker
Lid geworden
3 nov 2010
Berichten
219
Ik moet in een stukje VBA-code iets toevoegen. De code is niet door mij geschreven en gebruikt tekens die ik niet begrijp. Als ik een WHERE statement wil toevoegen krijg ik steeds foutmeldingen.

Hoe kan ik hier een tweede WHERE-statement toevoegen?

Ik begrijp ook deze " _ niet. Kan iemand mij uitleggen hoe dit in elkaar zit?

Wat er gebeurt is het volgende: Er wordt een tabelletje gemaakt [DatumrangeTopN] met een Top "X" (in het formulier wordt een aantal ingevuld) vanuit een andere tabel. Aan het WHERE-statement wil ik nu een tweede criterium toevoegen, maar krijg dat niet voor elkaar.

Het twee criterium moet zoiets zijn als:

Where (Tbl_Contactplaat.InBedrijf) = [Forms]![QForm_Ruimten]![inBedrijf]

Ik begrijp hier dus niet waar ik mijn " of de _ of de &neer moet zetten.


Dim strSQL As String

DoCmd.SetWarnings False

strSQL = "SELECT TOP " & Me.AantalHistorie & " Tbl_Contactplaat.MonsterDatum AS datum INTO DatumrangeTopN " _
& "FROM Tbl_Contactplaat " _
& "WHERE (((Tbl_Contactplaat.Kamer) = [Forms]![QForm_Ruimten]![Keuzelijst met invoervak0])) " _

2e WHERE statement

& "ORDER BY Tbl_Contactplaat.MonsterDatum DESC; "

Hoop dat ik dit goed uitleg ... ben niet heel bedreven in programmeren in Access.
 
Je mag in een SQL string maar één WHERE hebben, dus een tweede er aan toevoegen gaat per definitie fout. Je moet meerde voorwaarden dus koppelen met AND of OR. Afhankelijk van wat je wilt filteren.
Dan krijg je zoiets (als je de query vanuit VBA uitvoert, heeft het bitter weinig zin om de formulierverwijzingen te gebruiken; zet dan gelijk de waarden er in).
Code:
DoCmd.SetWarnings False
strSQL = "SELECT TOP " & Me.AantalHistorie & " MonsterDatum AS datum " _
    & "INTO DatumrangeTopN FROM Tbl_Contactplaat " _
    & "WHERE Kamer = " & Me.[Keuzelijst met invoervak0] & " AND InBedrijf = " & Me.inBedrijf _
    & " ORDER BY MonsterDatum DESC; "
CurrentDb.Execute strSQL, dbFailOnError
DoCmd.SetWarnings True
De Underscore (_) gebruik je als je een string wilt verdelen over meerdere regels, zoals ik ook doe. Het is dus een Regeleinde, meer niet. Er moet ook altijd een spatie voor zitten, anders krijg je ook een foutmelding.
 
Dank...ben alweer wat wijzer geworden.

Ik wist niet dat je maar één Where-statement mag gebruiken.

Ik voer deze query uit vanuit VBA omdat ik niet weet hoe ik dit statement:

"SELECT TOP " & Me.AantalHistorie

(dus een variabele invullen op de Select TOP...)

Kan dat ook in een 'gewone' query?
 
Geen idee, maar ik denk van niet. En waarom zou je? Een query uitvoeren is een query uitvoeren... Gaat wat mij betreft net zo makkelijker (als je de code van jou vergelijkt met de mijne zou ik zelfs zeggen: makkelijker) als vanuit een gewone query. En je start toch vanaf een formulier?
 
Ik vraag dat omdat jij opmerkt: "als je de query vanuit VBA uitvoert, heeft het bitter weinig zin om de formulierverwijzingen te gebruiken; zet dan gelijk de waarden er in".

"Gelijk de waarden er in" ... dat begrijp ik dan niet. Of kletsen we 'langs elkaar heen'
 
Je kunt je query op 2 manieren maken. Het criterium ziet er dan uit zoals in één van de 2 regels.
Code:
Where InBedrijf = [Forms]![QForm_Ruimten]![inBedrijf] 
Where InBedrijf = " & Me.inBedrijf

Zou je de SQL opvragen in een MsgBox, dan zie je resp.:
Code:
Where InBedrijf = [Forms]![QForm_Ruimten]![inBedrijf]
of:
Code:
Where InBedrijf = 112

Het eerste voorbeeld heeft dus geen waarde in de string, maar het volledige criterium, de formulierverwijzing. De tweede variant bouwt de query op m.b.v. de waarde uit het formulier. Die variant heeft altijd mijn voorkeur. Al was het maar omdat ik mijn rapporten vaak baseer op een vaste query, en m.b.v. SQL de querystring ervan steeds vervang. Als je een query maakt in het ontwerpscherm, dan kun je het gewenste formulierveld dus koppelen aan het criterium, de eerste variant. Maar je query werkt dan alleen als het formulier ook geopend is, anders krijg je de parametervraag. Zet je de eigenlijke waarden in het criteriumveld, dan geeft de query altijd een resultaat. Misschien niet altijd het goede (je ziet natuurlijk altijd de laatste selectie) maar je krijgt tenminste geen foutmeldingen of lege rapporten.
 
Beste Octafish....zeer veel dank voor alle suggesties en oplossingen. Ik ga hiermee aan de slag....
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan