Toon posts:

[VB] .Find werkt niet, code is goed volgens immediate

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb nu dus:
Visual Basic:
1
2
3
4
5
Dim zoekactie As String
Dim zoekversie As String
zoekactie = txtPersoonsnummer.Text
zoekversie = txtVersienummer.Text
rsGegevenspersoon.Find "Leerlingen = " & zoekactie & " AND versienummer = " & zoekversie & """"


Als ik hem door de immediate haal krijg ik gewoon een normale statement, zoals:
Persoonsnummer = 12345 AND versienummer = 1

Toch krijg ik de foutmelding:
De argumenten zijn van het verkeerde type, vallen buiten het toegestane bereik of zijn in conflict met elkaar

Hoe kan dat??

[ Voor 7% gewijzigd door whoami op 30-09-2003 10:09 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Misschien moet je de strings zoekactie en zoekversie ook tussen ""''s zetten zodat Find weet waar ze beginnen en eindigen.

PS: Je post had wel wat netter gemogen. :)

/edit
whoami to the rescue!

[ Voor 16% gewijzigd door LordLarry op 30-09-2003 10:10 ]

We adore chaos because we like to restore order - M.C. Escher


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Is leerlingen en versienummer een numeriek of alfanumeriek veld?

https://fgheysels.github.io/


Verwijderd

Topicstarter
In mijn Access database staat het op gegevenstype "numeriek"

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Je hebt aan het einde van je concattenatie tweemaal een dubbele dubbel-quote staan. Hierdoor sluit je het geheel af met "" terwijl dat dus niets toevoegt. Sterker nog, ik denk dat daar de fout zit ;)

Probeer dit eens:
Visual Basic .NET:
1
rsGegevenspersoon.Find "Leerlingen = " & zoekactie & " AND versienummer = " & zoekversie

[ Voor 18% gewijzigd door OZ-Gump op 30-09-2003 11:00 ]

My personal website


Verwijderd

Topicstarter
Nope, dat is hem niet :'( Was dat maar waar;) Als ik die weghaal dan heb ik altijd nog dezelfde resultaat bij de immediate.

Ik heb nu ook de String weggelaten, omdat het beide getallen zijn :S

Ik heb nu gewoon:

[code=vb]

Dim zoekactie
Dim zoekversie
zoekactie = txtPersoonsnummer
zoekversie = txtVersienummer
rsGegevenspersoon.Movefirst

rsGegevenspersoon.Find "Persoonsnummer = " & zoekactie & " AND Versienummer = " & zoekversie

readrecords

[code=vb]

Nog geeft hij dezelfde foutmelding
Het gekke is, als ik ze splits in 2 regels, dus:

rsGegevenspersoon.Find "Persoonsnummer = " & zoekactie
rsGegevenspersoon.Find "Versienummer = " & zoekversie

Dan doet hij het wel (alleen dan op de laatste) en dan moet niet, want hij moet ze samen hebben, dus een persoon met versienummer

Wie weet het? _/-\o_

[ Voor 73% gewijzigd door Verwijderd op 30-09-2003 11:44 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Verwijderd schreef op 30 September 2003 @ 10:15:
In mijn Access database staat het op gegevenstype "numeriek"
Van beide velden ? Een van twee is een tekstveld volgens mij en dan moet je in de find instructie er accenten (') omheen zetten.

[edit]
Overigens dit
code:
1
?"Leerlingen = " & zoekactie & " AND versienummer = " & zoekversie & """"


levert in mijn immediate deze string op :

code:
1
Leerlingen = 1234 AND versienummer = 1"


Wat niet goed is zoals OZ-Gump al zei.

[ Voor 33% gewijzigd door farlane op 30-09-2003 11:46 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Ikzelf houd ook het idee dat een van de veldtypes anders is dan je aangeeft. Zou je dat nog eens kunnen controleren? En heb je misschien constraints op je velden staan die je met je zoekwaarden overschrijdt?

My personal website


Verwijderd

Topicstarter
Heb mijn tekst van hierboven even aangepast...sorry, maar wat zijn constraints *sorry als het een domme vraag is*
Ik ga even wat dingen controleren wat je net zei

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
OZ-Gump schreef op 30 September 2003 @ 11:44:
Ikzelf houd ook het idee dat een van de veldtypes anders is dan je aangeeft. Zou je dat nog eens kunnen controleren? En heb je misschien constraints op je velden staan die je met je zoekwaarden overschrijdt?
Constraints zijn enkel beperkend bij het ingeven van data (insert en update).
Bij een SELECT wordt er niet gecontroleerd.

Constraints zijn dus 'beperkingen' die je op de velden kunt leggen.
Bv veld1 mag enkel de waarde A of B bevatten. Dat is dan een 'check constraint'.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nee, heb geen beperkingen, wel relaties in de database. Ik denk dat ik maar es in de database die relaties eruit gooi en als dat niet werkt de velden Tekst maken ipv Numeriek (bij gegevenstype in Access)

/Edit

Ik heb wat controles uitgevoerd:
In database staat alles beiden op Numeriek, dus dat moet kloppen

Er staan 2 records in, beide zijn getallen (12345 en 65432)

Heb overal de haakjes en dergelijke weggehaald zodat je in de immediate:
Leerlingnummer = 12345 AND Versienummer = 1
krijgt

Zoals ik al zei, je ze scheidt, de Find wel werkt, maar dan op 1 veld

Kan geen rare dingen vinden, maar ga natuurlijk door met controleren....

Iemand nog oplossingen? :?

[ Voor 55% gewijzigd door Verwijderd op 30-09-2003 12:06 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Probeer het eens met haakjes, dus:
Visual Basic:
1
2
rsGegevenspersoon.Find "((Persoonsnummer = " & zoekactie & ") AND 
                         (Versienummer = " & zoekversie & "))"
Dit zou als resultaat moeten hebben
((Persoonsnummer = waardeZoekActie) AND (Versienummer = waardeZoekVersie))

edit:
Overigens heb ik in verband met de layout deze code over twee regels verdeeld. Doe dit in VB niet zomaar, want dat pikt 'ie niet. ;)

[ Voor 27% gewijzigd door OZ-Gump op 30-09-2003 12:07 ]

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

whoami schreef op 30 September 2003 @ 11:51:
[...]
Constraints zijn enkel beperkend bij het ingeven van data (insert en update).
Bij een SELECT wordt er niet gecontroleerd.
True.... |:(
My bad ;)

My personal website


Verwijderd

.

[ Voor 100% gewijzigd door Verwijderd op 31-10-2023 21:54 ]


  • bigben04
  • Registratie: December 2001
  • Laatst online: 05-08 22:33
Wat gebeurt er als je hard-coded de getallen erin zet? dus:
Visual Basic .NET:
1
rsGegevenspersoon.Find "Leerlingen = 12 AND versienummer = 1

Verwijderd

Topicstarter
Nog niet :'(
Als ik een rood stipje voor mijn sub zoeken() zet dan geef hij aan:
zoekactie = 12345
zoekversie = 1

Dus das wel goed...

Met die haakjes nog steeds dezelfde foutmelding.

In de Form_Load staat voor openen database:

[code=vb]

cnnPersoonsgegevens.ConnectionString = AccessConnect
cnnPersoonsgegevens.Open
comPersoonsgegevens.Commandtype = adCmdText
comPersoonsgegevens.CommandText = "SELECT * FROM Persoonsgegevens"
comPersoonsgegevens.ActiveConnection = cnnPersoonsgegevens
rsPersoonsgegevens.Locktype = adLockPessimistic
rsPersoonsgegevens.CursorType = adOpenDynamic
rsPersoonsgegevens.Open comPersoonsgegevens

[code=vb]

Dat zit toch ook wel goed :? ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Uit MSDN :
Remarks
Only a single-column name may be specified in criteria. This method does not support multi-column searches.
Dusseuh .......

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Hoe gaat ik dit dan oplossen :S Want hij moet wel zoeken op 2 velden :S

/Edit

Ik ga dit es proberen

rs.Open "SELECT * FROM jouwTabel WHERE parameter1 = " & jouwParameter1 & " AND parameter2 = " & jouwParameter2 & """, "jouwConnectionString", adOpenStatic, adLockBatschOptimistic

[ Voor 63% gewijzigd door Verwijderd op 30-09-2003 12:58 ]


Verwijderd

.

[ Voor 133% gewijzigd door Verwijderd op 31-10-2023 21:54 ]


Verwijderd

Topicstarter
das ook handig :D dat ik maar es doen :D ....Ff testen...

Verwijderd

Topicstarter
hasse_m, zo te zien ben jij the master, en de rest natuurlijk ook :D

tot nu toe ziet het er goed uit en ga nu een grotere test doen met meerdere versies :D

Code is nu:

[code=vb]

Dim zoekactie
Dim zoekversie
zoekactie = txtPersoonsnummer
zoekversie = txtVersienummer
rsGegevenspersoon.Movefirst

rsGegevenspersoon.Find "Persoonsnummer = " & zoekactie
readrecords
rsGegevenspersoon.Find "Versienummer = " & zoekversie
reeadrecords

[code=vb]

[ Voor 7% gewijzigd door Verwijderd op 30-09-2003 13:13 ]


Verwijderd

Topicstarter
:'(
Werkt toch niet wat hierboven staat...
As er twee zijn met versie 2, dan heb je een probleem...

  • Twee Dee
  • Registratie: Juli 2002
  • Laatst online: 21:27

Twee Dee

Morgen weer een ondertitel.

Waarom maak je geen gebruik van de .filter property?
Volgens mij is dat precies wat je zoekt :).

[edit]:
Maak eens gebruik van de Edit knop (Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif) als je kort achter jezelf post!

[ Voor 48% gewijzigd door Twee Dee op 30-09-2003 13:40 ]

Luister nou gewoon naar me, dat voorkomt dat ik later "zie je wel" moet zeggen.


Verwijderd

Topicstarter
nee, precies hetzelfde geval als de .Find. Je mag niet op 2 dingen filteren.

Verwijderd

Ik heb mezelf aangeleerd om zoveel mogelijk met een aparte recordset te werken voor dit soort dingen. Op die manier heb je maximale controle over de data die je op een bepaald moment wilt hebben.

Als je daarom iets op moet zoeken met die twee voorwaarden gebruikt dan gewoon
code:
1
2
3
4
5
6
7
8
9
10
dim rs as new recordset
rs.open "SELECT * FROM ... WHERE bla = " & waarde & " AND bla = " waarde2, currentproject.activeconnection, adblablabla

if rs.EOF then [ERROR NIETS GEVONDEN]
else
'pak de waarde eruit met 
rs.fields("[veldnaam]")
'sluit af
rs.close
set rs=nothing

Dit gaat allemaal vrij snel dus over performance hoef je je geen zorgen te maken.

Je zoekt op NUMMERIEKE waarden terwijl je textboxen een string teruggeven. In de SQL statement moeten strings tussen '[string]' en numerieke waarden zonder de ' haakjes. Dus in dit geval dien je het te laten staan zoals in bovenstaand voorbeeld. Als je er helemaal zeker van wilt zijn kun je zelfs in de SQL statement VAL opnemen, access laat namelijk VB functies toe in SQL statements.

[ Voor 26% gewijzigd door Verwijderd op 30-09-2003 15:15 ]


Verwijderd

Topicstarter
Hmm, op die rs.Fields crasht ie 'invalid use of property'. Wat moet je bij die veldnaam neerzetten dan? :? Ik heb nu Persoonsnummer staan. Maar hij moet dus ook die Versienummer pakken.

  • Twee Dee
  • Registratie: Juli 2002
  • Laatst online: 21:27

Twee Dee

Morgen weer een ondertitel.

Verwijderd schreef op 30 September 2003 @ 15:09:
nee, precies hetzelfde geval als de .Find. Je mag niet op 2 dingen filteren.
Ik denk persoonlijk dat je toch zelf wat meer moeite moet doen. Lees je wel eens de helpteksten door? Heb je wel eens tutorials op internet gedaan?


Uit de help voor "filter":
The criteria string is made up of clauses in the form FieldName-Operator-Value (for example, "LastName = 'Smith'"). You can create compound clauses by concatenating individual clauses with AND (for example, "LastName = 'Smith' AND FirstName = 'John'") or OR (for example, "LastName = 'Smith' OR LastName = 'Jones'").

Luister nou gewoon naar me, dat voorkomt dat ik later "zie je wel" moet zeggen.


Verwijderd

Topicstarter
Hmm, ga ik dat eens doen... Ik had al wat gezocht ja en kwam op dit:

rs.Open "SELECT * FROM jouwTabel WHERE parameter1 = " & jouwParameter1 & " AND parameter2 = " & jouwParameter2 & """, "jouwConnectionString", adOpenStatic, adLockBatschOptimistic

Hij werkt perfect, alleen nu hebben mijn knoppen 'volgende' en 'vorige' kuren.
Daarin gaat hij naar movenext en de readrecord (getvalue om tekstvelden te laten vullen) en dan weer naar dat zoek stukje, waarin die code bovenin staat. Hij blijft dan staan op de huidige record....

Verwijderd

Ik heb geen ervaring met VB en Access, maar in een "volwassen" database omgeving is deze manier van werken (select alles en laat de client vervolgens maar uitfilteren wat 'm interesseert) absoluut not done.
Dat laat je over aan de database, daar zijn ze goed in. :)

Dus een regel als
Visual Basic:
1
comPersoonsgegevens.CommandText = "SELECT * FROM Persoonsgegevens"
zou al nooit mogen voorkomen. Dat zou al iets moeten zijn als
Visual Basic:
1
2
comPersoonsgegevens.CommandText = "SELECT * FROM Persoonsgegevens " _
"where Persoonsnummer = " & zoekactie & " and Versienummer = " & zoekversie


Ik weet dat Access geen "echt" RDBMS is, en ik weet ook dat 't vaak handig is om de boel op de client af te handelen (heb jarenlang in Clipper geprogrammeerd :)), maar wanneer je ooit met je programma naar een grotere database wilt (MSSQL bijvoorbeeld), dan zijn dingen als .find, .filter, etc. niet echt aan te raden.

Verwijderd

Topicstarter
Twee Dee, sorry dat ik zei dat hij teveel op de find leek.
Dit komt omdat ik:

Sub zoeken()
Dim zoekactie
Dim zoekversie
zoekactie = txtPersoonsnummerr
zoekversie = txtVersienummer
rsPersoonsgegevens.MoveFirst
Extragegevens 'zoekt extra gegevens bij persoon

rsPersoongegevens.Filter = "Persoonsnummer=" & zoekactie & " AND Versienummer=" & zoekversie
End Sub

gebruikte, en deze doet het niet egt perfect.

Onder de 'volgende' knop heb ik dit zitten:

Sub Rechts()
rsPersoonsgegevens.Filter = ""
rsPersoonsgegevens.MoveNext
If rsPersoonsgegevens.EOF Then rsPersoonsgegevens.MoveFirst
readrecord 'zoek std gegevens bij persoon
zoeken
End Sub

Als ik eerst naar tab 2 ga, van een versie 1, dan weer terug naar tab 1, en dan volgende doe (is een versie 2) en dan weer naar tab 2 ga, staat de info van die vorige er nog...
Vandaar dat ik concludeerde dat hij het niet deed....

Verwijderd

Topicstarter
Sorry!!!!! Hij doet het.... :D :D :D :D
Ik moet Extragegevens er na plaatsen, ipv ervoor :D
En dit na 4 dagen prutsen....

Fiew.... eindelijk opgelost *hoop ik, ff flink testen ;) )

/edit

Getest, en ziet er tot nu toe goed uit :*)

Iedereen, heel erg bedankt :Y)

[ Voor 20% gewijzigd door Verwijderd op 30-09-2003 18:37 ]

Pagina: 1