[VBA] .recordcount in combinatie met like query werkt niet?

Pagina: 1
Acties:

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
Hallo mensen,

Ik zit met een vreemd probleempje in een van mijn formulieren. Ik heb een formulier waarin de gebruiker zelf selecties kan maken in offertes. Dit doe ik door middel van een zgan dynamische query die wordt opgebouwd uit de verschillende criteria die de gebuikers ingeven.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim db As Database
Dim objquery As QueryDef
Dim strSQL, strWhere, strQuery As String

Set db = CurrentDb
strSQL = "SELECT o.offertenummer, o.omschrijving " & _
         "FROM offerte AS o " & _
         "WHERE o.offertenummer Is not Null"
strWhere = " "

'Status criteria bepalen
If SA = True Then
    If Not IsNull(Me!Status) And Me!Status = 1 Then strWhere = strWhere + "AND o.archief = True "
    If Not IsNull(Me!Status) And Me!Status = 2 Then strWhere = strWhere + "AND o.archief = False "
End If

'+ nog veel meer criteria, maar niet relevant

strQuery = strSQL + strWhere
Set objquery = db.CreateQueryDef("Bekijk Offertes", strQuery)
Set rsttmp = db.OpenRecordset("Bekijk offertes")
If rsttmp.RecordCount = 0 Then Msg "Geen offertes gevonden die voldoen aan de opgegeven criteria!", Sc


Dit gaat helemaal goed en werkt hartstikke mooi :)

Het vreemde is echter, als ik een like statement gebruik in de query zoals hieronder werkt bovenstaande functie niet goed meer;

Visual Basic:
1
If Not IsNull(Me!KBijz) Then strWhere = strWhere + "AND o.[bijzonderheden offerte] like '%" & Me!KBijz & "%' "


Wat er precies fout gaat weet ik niet maar ongeacht of de query wel of geen records heeft, rsttmp.recordcount is altijd 0, waardoor de gebruiker de melding krijgt dat er geen offertes zijn gevonden. Vervolgens wordt de keuzelijst die gebaseerd is op de query wel gewoon gevuld :?

Is er bij jullie iets bekend over een probleem met het like statement in combinatie met een .recordcount?

[ Voor 6% gewijzigd door Masch op 02-08-2005 10:23 ]

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


  • Pyrowired
  • Registratie: Februari 2004
  • Laatst online: 05-01-2025
code:
1
'%" & Me!KBijz & "%'

gaat niet werken, het is
code:
1
%"& variable &"%
of
code:
1
'"& variable &"'


' is voor tekst
% is voor getallen (als het goed is)
# is voor datums

edit:
tag niet afgesloten

[ Voor 26% gewijzigd door Pyrowired op 03-08-2005 00:21 ]

Zolang de zon schijnt, blijf ik binnen.


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
Pyrowired schreef op woensdag 03 augustus 2005 @ 00:19:
code:
1
'%" & Me!KBijz & "%'

gaat niet werken, het is
code:
1
%"& variable &"%
of
code:
1
'"& variable &"'


' is voor tekst
% is voor getallen (als het goed is)
# is voor datums

edit:
tag niet afgesloten
Wat je hier zegt klopt niet. Het procentteken staat namelijk voor een soort van wildcard. Bovenstaande code werkt dus ook gewoon. Het probleem zit hem echter in het feit dat als ik deze wildcards gebruik en daarna een recordset maak van deze query, de eigenschap .recordcount niet meer werkt. Deze eigenschap geeft altijd aan dat er maar 0 records in de query zitten. Het vreemde is dat er na deze count een .requery uitgevoerd wordt op een keuzelijst, waarna de gevonden records wel getoond worden. Met de query is dus niks mis.

Mijn vraag is dus; Waarom worden er door .recordcount geen records gevonden als het like statement wordt gebruikt in de query?

[ Voor 12% gewijzigd door Masch op 03-08-2005 08:29 ]

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Verwijderd

Kijk eens wat de uiteindelijke waarde van strQuery eigenlijk is (met gebruik van de like statement erin)

Ik denk dat er in je criterium na "Like" op de een of andere manier een foutje zit, waardoor de recordset inderdaad leeg blijft.

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
De waarde van strQuery met een bijzonderheden veld is zoals hieronder;

SQL:
1
2
3
4
5
SELECT o.offertenummer, k.klantnaam, o.omschrijving, o.[datum in] 
FROM offerte AS o, [klant naw] as k 
WHERE o.klantnummer =k.klantnummer 
AND o.[bijzonderheden offerte] like '%test%' 
ORDER BY o.offertenummer

Dit is dus gewoon een goede query, welke ook de goede resultaten toont in de te vullen keuzelijst. Met de query is dus niks mis, anders zou hij toch niet werken?

Edit:

Gek, tijdens het aanmaken van de recordset geeft hij 0 records, ik kan dan bijvoorbeeld ook geen .movelast uitvoeren (No Current Record). Met de onderstaande code wordt echter wel de keuzelijst goed gevuld.... Is het misschien zo dat er in recordsets en normale querys een andere syntax moet worden gebruikt :? :? 8)7

Visual Basic:
1
2
Me!OffertesKeuze.RowSource = "Bekijk Offertes"
Me!OffertesKeuze.Requery
Dit stukje werkt dus helemaal goed en geeft de records die ik wil zien.

[ Voor 36% gewijzigd door Masch op 03-08-2005 08:59 ]

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Verwijderd

d'r staat me nog iets zeer vaag bij van het cursortype dat van belang kan zijn bij dergelijke acties. maw. of je recordset alleen lezen is, of dynamisch.

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
Hmmzz ik heb even gezocht op de property cursortype en die bestaat wel, maar als ik deze probeer in te stellen op mijn recordset geeft Access aan dat deze property niet wordt ondersteund door dit object. Ik dacht het op onderstaande manier op te kunnen lossen;

Visual Basic:
1
2
3
4
Set rsttmp = db.OpenRecordset( _
                   "SELECT Count([Bekijk Offertes].offertenummer) AS Aantal " & _
                   "FROM [Bekijk Offertes]")
If rsttmp!Aantal = 0 Then Msg "Geen offertes gevonden die voldoen aan de opgegeven criteria!", Sc


Zelfs hier krijg ik altijd nul terug als er een like statement wordt gebruikt. Zet ik de SQL in een normale query van access dan krijg ik 2 terug :? Echt heel vaag en irritant dit. Moet je niet op de een of andere manier eerst de query uitvoeren ofzo? Ik ben echt even out-of-options... Wie o wie heeft de gouden tip?

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


  • Pyrowired
  • Registratie: Februari 2004
  • Laatst online: 05-01-2025
Wat ik probeerde te verduidelijken is dat als je een variabele in VB aan een sql instructie mee wilt geven, dan moet je een andere syntaxis gebruiken.

Je kan op meerdere manieren een variabele mee geven bijvoorbeeld door:

Visual Basic:
1
"WHERE [veldnaam] like 'waarde' "

of
Visual Basic:
1
"WHERE [veldnaam] like " & me!veldnaam.value

of
Visual Basic:
1
"WHERE [veldnaam] like '%' & '"& variabele &"' & '%'"

of
Visual Basic:
1
"WHERE [veldnaam] like '"& "%" & variabele & "%" &"'"


waarbij het belangrijk is hoe je je single en dubbel quotes gebruikt (en vandaar ook mijn opmerking over ', # en % aangezien die aangeven wat voor type data er in je variabele staat).

Voor wat meer info over hoe variabelen te gebruiken met MS Jet database engine zie hier

Je kan in de VB viewer ook links in de grijze balk van je code een keertje klikken zodat er een rood rondje veschijnt, hiermee bouw je een pauze in waardoor je tijdens de uitvoer van je code kan controleren wat de waarde van variabelen e.d. zijn of om te controleren of bepaalde if then else codes uitgevoerd worden.

edit:
quotes niet helemaal goed

[ Voor 28% gewijzigd door Pyrowired op 03-08-2005 16:56 ]

Zolang de zon schijnt, blijf ik binnen.


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
Pyrowired schreef op woensdag 03 augustus 2005 @ 16:53:
Wat ik probeerde te verduidelijken is dat als je een variabele in VB aan een sql instructie mee wilt geven, dan moet je een andere syntaxis gebruiken.
Ik weet zeker dat ik de juiste syntax gebruik, zoals gezegd gebruik je het procenteken als joker en de query werkt ook wel, maar ik heb het voor de zekerheid even getest.
Je kan op meerdere manieren een variabele mee geven bijvoorbeeld door:

Visual Basic:
1
"WHERE [veldnaam] like 'waarde' "
Geeft alleen gelijke resultaten weer, dus velden waarin de waarde overeenkomt. Hier kan je dus geen variabele op de plaats van waarde neerzetten.
Visual Basic:
1
"WHERE [veldnaam] like " & me!veldnaam.value
Deze zoekt ook alleen dezelfde waarde op die in de meegegeven variabele staat.
Visual Basic:
1
"WHERE [veldnaam] like '%' & '"& variabele &"' & '%'"
Werkt niet, je gebruikt hier veel te veel tekens
Visual Basic:
1
"WHERE [veldnaam] like '"& "%" & variabele & "%" &"'"
Ook deze werkt niet.
waarbij het belangrijk is hoe je je single en dubbel quotes gebruikt (en vandaar ook mijn opmerking over ', # en % aangezien die aangeven wat voor type data er in je variabele staat).
Ik weet dat de aanduidingen voor types data belangrijk zijn, maar jij maakt hier een fout. Het zit als volgt naar mijn weten;
1. " --> Gebruik je voor een string
2. & --> Gebruik je voor het samenvoegen van strings en variabelen
3. # --> Gebruik je voor datumaanduidingen
4. ' --> Gebruik je voor tekst én numerieke waarden
5. % --> Gebruik je als wildcard (meestal is dit idd *) voor een aantal tekens in een like query
6. ? --> Gebruik je als wildcard voor een teken in een like query
Voor wat meer info over hoe variabelen te gebruiken met MS Jet database engine zie hier
Heb ik al gekeken ;)
Je kan in de VB viewer ook links in de grijze balk van je code een keertje klikken zodat er een rood rondje veschijnt, hiermee bouw je een pauze in waardoor je tijdens de uitvoer van je code kan controleren wat de waarde van variabelen e.d. zijn of om te controleren of bepaalde if then else codes uitgevoerd worden.
Ja dit heb ik ook al gedaan, ik kan zelf wel debuggen hoor ;)

Zoals je hierboven in een post van mij ziet krijg ik hier gewoon een goede query terug;
Visual Basic:
1
2
3
4
5
SELECT o.offertenummer, k.klantnaam, o.omschrijving, o.[datum in] 
FROM offerte AS o, [klant naw] as k 
WHERE o.klantnummer =k.klantnummer 
AND o.[bijzonderheden offerte] like '%test%' 
ORDER BY o.offertenummer


Zoals ook al eerder aangegeven werkt deze query gewoon en krijg ik de verwachte resultaten terug. Ik krijg alleen, als ik een recordset maak van deze query, altijd nul terug als ik een .recordcount uitvoer. Als ik handmatig in access een count query van bovenstaande query uitvoer krijg ik 2 records terug (dit klopt in dat geval). Gebruik ik dezelfde query als bron voor een recordset, dan krijg ik geen record terug. Ik snap dus niet waarom dat is.

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Verwijderd

m'n cursortypecommentaar ga ik zelf eens verder uitzoeken. nog een andere opmerking:is Database/CurrentDb uit de klasse DAO of ADO (bekijk dit eens even tijdens het debuggen in het locale variabelen venster), dit zou gevolgen kunnen hebben voor de syntax van de SQL, het is namelijk zo dat JET-SQL op subtiele wijze kan verschillen van ANSI-SQL, in het bijzonder voor de wildcards.

[ Voor 3% gewijzigd door Verwijderd op 04-08-2005 11:28 ]


  • Pyrowired
  • Registratie: Februari 2004
  • Laatst online: 05-01-2025
Ik ben ook maar eens aan het testen geslagen.

Het probleem doet zich voor bij je wildcard, maak je hier een * van ipv % dan werkt het volgens de MS Jet database engine.

Mocht je een werkend (bij mij iig wel, Access 2K3) voorbeeld zien, dan kan je hier een voorbeeld vinden die een tabel maakt en er wat gegevens in gooit en vervolgens een query maakt a.d.h.v. een waarde die je ingeeft.

Je doet dit door in Access de code in een module te gooien en in de VB editor op play te drukken.

Zolang de zon schijnt, blijf ik binnen.


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 21:16
:?

Nou inderdaad het werkt met het * teken... Ontzettend bedankt voor de moeite _/-\o_ . Alhoewel het wel een vreemd 'probleem' is. Voor de overige belangstellenden, onderstaand voorbeeld is de juiste syntax;

Visual Basic:
1
If Not IsNull(Me!KBijz) Then strWhere = strWhere + "AND o.[bijzonderheden offerte] like '" "*" & Me!KBijz & "*" & "' "


Erg vreemd, ik was er voor 100% van overtuigd dat een * als joker niet werkt in vba. Hoe ik daar bij kom, geen idee.

[ Voor 36% gewijzigd door Masch op 04-08-2005 16:37 ]

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!

Pagina: 1