[VBA Access] Findfirst criteria probleem

Pagina: 1
Acties:
  • 317 views sinds 30-01-2008
  • Reageer

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 15:36
Ik heb een stukje code geschreven die 2 tabellen met elkaar vergelijkt. Nou gebruik ik de methode findfirst, maar volgens mij werkt dit op de e.o.a. manier niet helemaal goed. Ik kon nergens vinden hoe ik de methode findfirst kan gebruiken dus daarom zet ik het hier maar neer. Misschien dat een van jullie mij op het goede spoor kan zetten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DoCmd.RunSQL "SELECT [Contactpersonen].r_klantnr, [Contactpersonen].r_naam," & _
"[Contactpersonen].r_fax, [Contactpersonen].r_telefoon, " & _
"[Contactpersonen].r_email, '' As New, '' As Chg INTO tmp_Contacts " & _
"FROM [Contactpersonen];"
    
    Dim dbs As Database
            
    Set dbs = CurrentDb
    Set rstLC = dbs.OpenRecordset("SELECT * FROM tmp_Contacts")
    Set rstDC = dbs.OpenRecordset("SELECT * FROM Contactpersonen")
    rstLC.MoveLast
    rstLC.MoveFirst
    rstDC.MoveLast
    rstDC.MoveFirst
    
    Do While Not rstLC.EOF
    rstDC.FindFirst rstDC.Klantnummer = rstLC.R_klantnr
    Debug.Print rstDC.Klantnummer & "---" & rstLC.R_klantnr
        'Als klantnummer niet voorkomt in database dan aangeven dat het een nieuwe record is.
        If rstDC.NoMatch Then
            With rstLC
            .Edit
            !New = "1"
            .Update
            End With
        Else
            Debug.Print "Not" & rstLC.R_klantnr 'tmp
            End If
    rstLC.MoveNext
    Loop
   
    Msg "klaar", Si
    
    
End Function


stukje van het Resultaat;
16595---12418
16595---16595
Not16595
16595---69258
16595---10065
16595---10065
16595---60063
16595---60063

Hij blijft dus bij de eerste record in de recordset rstDC ?? Ik snap niet goed wat ik fout doe.. bijhoorlijk frustrerend |:( Ik ben ook een behoorlijke newbie op het gebied van recordsets e.d. Op aanraden van jullie ben ik mij daar ietwat in gaan verdiepen.

[ Voor 8% gewijzigd door Masch op 18-12-2002 12:16 ]

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


  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

Je kan eens zoeken op findprevious, findnext, findlast

[ Voor 8% gewijzigd door KO op 18-12-2002 12:14 ]

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 15:36
Die doen toch precies hetzelfde als findfirst?

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


  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

findfirst is zoals de naam zegt de eerste. De volgende records zal je moeten zoeken met findnext

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 15:36
hmmzz, ja logisch. Maar goed, ik zet hem aan het begin van de recordset;
code:
1
2
rstDC.MoveLast
rstDC.MoveFirst


Dus als ik zoek naar het eerste record die voldoet aan de criteria dan moet het toch goed zijn? Ik denk zelf dat er iets in de criteria van Findfirst fout zit. Ik zal het toch even gaan uitproberen.

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


  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

Misschien kan je eens kijken naar de voorbeeld functies die Microsoft gemaakt heeft.
Die zijn ook heel duidelijk.

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 15:36
FindNext en Findlast uitgeprobeerd, deze geven hetzelfde resultaat. In de help file van VBA staan idd voorbeelden, maar hier had ik niks aan. Ook de search hier leverde trouwens niks op.

[ Voor 1% gewijzigd door Masch op 18-12-2002 12:26 . Reden: lol :) findfast ff veranderd in findlast ]

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


  • KO
  • Registratie: December 2001
  • Laatst online: 12-11-2023

KO

Kan je dat stukje code met de findnext posten?

Yesterday Is History. Today Is A Gift. Tomorrow Is Mystery


  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
Je moet aan het begin van je recordset beginnen met findfirst en dan met findnext er zeg maar doorheenlopen totdat je .eof bent.

Je kan ook proberen het met een filter te doen. Dan filter hij alle records die aan de voorwaarde voldoen. Wanneer je dan het einde van je recordset bereikt, dan heb je alles gehad.

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 15:36
Dat is op zich niet de bedoeling.. Ik zal even uitleggen wat ik wil dat deze code doet;

-- Eerst via Runsql een tabel aanmaken met daarin gegevens die ik uit een ODBC koppeling haal. Hier 2 extra veldjes 'new' en 'chg'.
-- Daarna moet hij 2 tabellen vergelijken; de al bestaande tabel contactpersonen en de nieuw gemaakte tabel tmp_contacts
-- Nu alle records van de tabel tmp_contacts doorlopen en een 'status' (in bv het veld new) geven. Als de klantcode bijvoorbeeld al een keer voorkomt in de tabel contactpersonen dan krijgt het veld new de waarde 0, zodat ik hier later op kan selecteren als ik weer sql ga uitvoeren. Alleen de functie find werkt op de een of andere manier niet goed.

Wat hij dus moet opzoeken is of de waarde r_klantnr van de tabel tmp_contacts al voorkomt in het veld klantnummer in de tabel contactpersonen.

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


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

FindFirst kijkt niet naar waar je bent, maar zoekt echt naar de eerste keer dat iets voorkomt in een recordset. Omdat je elke keer findfirst doet, zal hij elke keer van voor af aan zoeken in de recordset. En dus elke keer het eerste record vinden. Wat veel makkelijker is in dit geval is het openen van een recordset (query) van records die allemaal aan het criterium voldoen, om vervolgens door die records heen te lopen. En dat doe je dan door de recordset te openen en vervolgens aan het einde van de procedure RecordSet.MoveNext te doen. Je gaat dan netjes naar het volgende record. Dat zou zoiets worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim dat as database
Dim rs as recordset

  set dat = currentDB
  set rs = dat.OpenRecordset("JuisteQuery")

  While not(rs.eof)
    DoeIets
    rs.MoveNext
  wend

  rs.Close
  dat.Close
  set rs = nothing
  set dat = nothing

My personal website

Pagina: 1