ADO Recordset.find met meer dan één criterium?

Pagina: 1
Acties:

  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
Hey,

Ik ben bezig in MS Access 2000 en ADO, en nu wilde ik op 2 termen zoeken. Met 1 term gaat dit prima, maar omdat ik niet weet hoe je termen scheidt kan ik niet op meerdere termen zoeken.

oa deze code gebruikt:
code:
1
"(ProductID = " + ID + ") AND (Zijde = " + Zijde + ")"


Dit werkt echter niet. Hoe los ik dit op?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MichielPH schreef op dinsdag 13 december 2005 @ 15:13:
code:
1
"(ProductID = " + ID + ") AND (Zijde = " + Zijde + ")"
Is Zijde een string? Zo ja:

code:
1
"(ProductID = " + ID + ") AND (Zijde = '" + Zijde + "')"


Overigens, ik neem aan dat je met VB(A), VBS of ASP bezig bent? Dan is de string-concatenator & te prefereren boven de +...

code:
1
"(ProductID = " & ID & ") AND (Zijde = '" & Zijde & "')"


Daarnaast wil ik je adviseren voortaan wat completer te zijn in je openingspost, want nu is het maar gissen naar wat je bedoelt, wat je al geprobeert hebt en wat er eventueel fout zou kunnen gaan. Dat had je beter meteen kunnen vermelden.

[ Voor 68% gewijzigd door RobIII op 13-12-2005 15:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • remco_k
  • Registratie: April 2002
  • Laatst online: 20:51

remco_k

een cassettebandje was genoeg

^^ hierboven zal de oplossing wel zijn, maar voor het geval dat niet zo is:

Wil je zoeken op product ID EN zijde?
-of-
Wil je zoeken op product ID OF zijde?

Alles kan stuk.


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
Ik wil zoeken op ID én Zijde. Ze zijn beide numeriek. 't was mss. een domme hersenkronkel, maar voor het overzicht heb ik de string wat kleiner gemaakt. Origineel was de code:
code:
1
"(ProductID = " + Trim(Str(rsProducten.Fields("ID").Value)) + ") AND (Zijde = " + Trim(Str(Zijde)) + ")"
Dit levert de volgende string op:
code:
1
(ProductID = 234567) AND (Zijde = 1)


Het vervangen van de plus-tekens door &-tekens levert niets op.

[ Voor 18% gewijzigd door MichielPH op 13-12-2005 15:36 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nogmaals: De & is te preferen boven de + omdat de + is bedoeld om op te tellen (1+2=3) en de & om strings aan elkaar te plakken ("1" & "2" = "12"). De + werkt inderdaad net zo goed omdat VBA begrijpt dat je strings aan elkaar probeert te plakken, maar is gewoon niet zo netjes.

Als je zegt dat beide numeriek zijn heb je (inderdaad) bij "zijde" de enkele quote ' dus niet nodig. Maar zeg dan eens wat er fout gaat? En werkt je query wel als je hem uitvoert in het query scherm?

Ik neem aan dat je de string die je "maakt" plakt achter een WHERE clause? Dus:
code:
1
2
3
Select bla, bla, bla
From mytable
Where (ProductID = 234567) AND (Zijde = 1)


Kun je in dat geval eens de hele (relevante stukken) code laten zien?

Je bent nog steeds onduidelijk en het is (mij for one) al helemaal niet duidelijk wat je probleem nu is. Levert je query geen resultaat op? Of ongewenste resultaten? Of een error? Wat is het probleem nu precies? Wees wat duidelijker.

[ Voor 81% gewijzigd door RobIII op 13-12-2005 15:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
Ik merk weer dat ik nu zelf zo'n type ben waar ik zelf altijd zo aan erger, door het gebrek aan informatie.

De string die ik nu dus heb is:
code:
1
2
3
4
5
6
strSQL = "SELECT * FROM tblZijde"
Set rsZijde = New Recordset
rsZijde.Open strSQL, conDatabase, adOpenDynamic, adLockOptimistic

rsZijde.MoveFirst
rsZijde.Find "(ProductID = " & Trim(Str(rsProducten.Fields("ID").Value)) & ") AND (Zijde = " & Trim(Str(Zijde)) & ")"
Als ik bijvoorbeeld dit gebruik, werlt het wel.
code:
1
rsZijde.Find "(ProductID = " & Trim(Str(rsProducten.Fields("ID").Value)) & ")"

Als foutmelding geeft Access: De argumenten zijn van het verkeerde type, vallen buiten het toegestande bereik of zijn in conflict met elkaar.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En "Zijde" is ook van het type INT in je tabel? Als 'ie daar namelijk VARCHAR is (of weet ik het hoe Access het noemt), dan moet je dus wél de quotes gebruiken.

En waarom doe je een .MoveFirst en dan een .Find als je meteen een WHERE kunt meegeven? :?

code:
1
2
3
4
Set rsZijde = New Recordset
rsZijde.Open strSQL, conDatabase, adOpenDynamic, adLockOptimistic

strSQL = "SELECT * FROM tblZijde Where (ProductID = " & rsProducten.Fields("ID").Value & ") AND (Zijde = " & Zijde & ")"


Die "Trim" is alleen nodig als er overbodige spaties voor/na de waardes staan. En die "Str" hoef je in principe alleen te gebruiken als je een INT ofzo cast naar een string. Als het veld dus al een String is hoef je niet nog eens te casten. En omdat je nu netjes & gebruikt hoef je in principe al helemaal niet meer te casten, ook al is het een INT, omdat VBA nu begrijpt dat je strings gebruikt (door het gebruik van & dus).

Hoe dan ook, de error geeft duidelijk aan dat er ergens een int/string conversie scheef gaat. Ik zet er mijn geld op dat het "Zijde" veld in je DB een non-numeriek type is (zoals een varchar (tekst onder Access toco?) ofzo). Dit omdat je aangeeft dat de string wel netjes opgebouwd wordt.

[ Voor 171% gewijzigd door RobIII op 13-12-2005 15:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
RobIII schreef op dinsdag 13 december 2005 @ 15:48:
En waarom doe je een .MoveFirst en dan een Find als je meteen een WHERE kunt meegeven? :?

code:
1
2
3
4
Set rsZijde = New Recordset
rsZijde.Open strSQL, conDatabase, adOpenDynamic, adLockOptimistic

strSQL = "SELECT * FROM tblZijde Where (ProductID = " & Trim(Str(rsProducten.Fields("ID").Value)) & ") AND (Zijde = " & Trim(Str(Zijde)) & ")"
Omdat er nog stukken code tussen staan die wel de rest willen zien. Excuses dat ik ook dit niet gemeld heb.
RobIII schreef op dinsdag 13 december 2005 @ 15:48:
En "Zijde" is ook van het type INT in je tabel? Als 'ie daar namelijk VARCHAR is (of weet ik het hoe Access het noemt), dan moet je dus wél de quotes gebruiken.
Beiden zij integer; apart van elkaar werken ze wel. Ik merk dat ik het nog niet eens gevraagd heb :$, hoe 'plak' ze aan elkaar? Met AND of een komma werkt niet.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MichielPH schreef op dinsdag 13 december 2005 @ 15:54:
[...]
Omdat er nog stukken code tussen staan die wel de rest willen zien. Excuses dat ik ook dit niet gemeld heb.
[...]
Beiden zij integer; apart van elkaar werken ze wel. Ik merk dat ik het nog niet eens gevraagd heb :$, hoe 'plak' ze aan elkaar? Met AND of een komma werkt niet.
Ik weet niet of de Find methode AND ondersteund, maar volgens mij wel :?

Na nader onderzoek op http://msdn.microsoft.com...tm/mdmthfindmethodado.asp weet ik dat echter niet zo zeker...
Parameters
Criteria
A String value that contains a statement specifying the column name, comparison operator, and value to use in the search.
En na nog wat meer onderzoek weet ik het zeker:
Remarks
Only a single-column name may be specified in criteria. This method does not support multi-column searches.
Ik zou toch voor de WHERE clause gaan. Desnoods de query opnieuw uitvoeren op dat moment inc. de Where clause.

[ Voor 54% gewijzigd door RobIII op 13-12-2005 15:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

als je de sql pas correct definiëert nadat je de recordset al geopend hebt, bevat die waarschijnlijk de volledige tabel, vandaar de movefirst & de find. mss dan zoiets uiteindelijk:
code:
1
2
3
Set rsZijde = New Recordset
strSQL = "SELECT * FROM tblZijde Where (ProductID = " & rsProducten.Fields("ID").Value & ") AND (Zijde = '" & Zijde & "')"
rsZijde.Open strSQL, conDatabase, adOpenDynamic, adLockOptimistic
ik ga er vanuit dat het veld zijde van het type tekst(=varchar) is, productid autonummering.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 december 2005 @ 16:08:
als je de sql pas correct definiëert nadat je de recordset al geopend hebt, bevat die waarschijnlijk de volledige tabel
Hij voert gewoon een select * from uit ja, dus die bevat sowieso de hele tabel omdat er geen WHERE clause opgegeven is. Maar wat bedoel je met "correct definiëert" :?
En dat kan dus, zoals ik al meermalen heb aangegeven, worden opgelost met een WHERE, want zoals je in mijn vorige reply kunt lezen ondersteund .Find maar max. 1 kolom.
Verwijderd schreef op dinsdag 13 december 2005 @ 16:08:
ik ga er vanuit dat het veld zijde van het type tekst(=varchar) is, productid autonummering.
Lees de draad effe ;) Je komt hier niet echt met iets nieuws ;) De eerste reply zegt al hetzelfde ;)

[ Voor 8% gewijzigd door RobIII op 13-12-2005 16:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
RobIII, bedankt!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat was het nou? Het is altijd wel fijn als de oplossing ook even gepost wordt voor mensen die ook (ooit) tegen dit probleem aan zouden (kunnen) lopen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Het was wat je schrijft: de AdoRs.find methode is beperkt in zijn functionaliteit.
klik

offtopic:
Al met al heeft het probleem niets met SQL te maken, dus dat sloop ik even uit de titel ;) Sowieso zegt "sql syntax" weinig over het probleem.@MichielPH: let ajb er zelf op dat je een dekkende titel verzint en voldoende informatie geeft in je startpost.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
Ik zal er de volgende keer beter op letten. Zoals Niesje zei, bedankte ik voor je moeiteen voor de oplossing om de query opnieuw te openen of .Find meerdere keren uti te voeren.

Via een andere weg kreeg te horen dat .Filter wel meerdere criteria accepteert, dit gebruik ik nu.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
d:)b
Je beseft dat .Filter hetzelfde effect heeft als een WHERE clause? Met .Find verplaats je de huidige "recordpointer" (of je positie in de recordset) en met .Filter verklein je je recordset tot alleen de records die voldoen aan het filter. In principe haal je dus eerst de hele tabel op om vervolgens de resultaatset te verkleinen. Als je eerst de hele tabel nodig hebt, dan kon het wel eens nut hebben (misschien :P ) maar anders vind ik het toch zonde van je resources. Overigens kun je wel weer, nadat je klaar bent met het filter het filterproperty op "" instellen om weer de hele recordset terug te krijgen. Het effect is echter dat je (achter de schermen, zolang je recordset niet disconnected is) die query gewoon telkens opnieuw uitvoert.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MichielPH
  • Registratie: Februari 2005
  • Laatst online: 02-04 21:03
Ik ging er wel vanuit dat het in principe wel hetzelfde zou zijn, ja :). Ik heb de hele tabel nodig, ik kijk namelijk met een loop grotendeels de hele tabel door. Daarom zette ik het filter ook naderhand weer op "".
Pagina: 1