IT Fjernundervisning

Find data

Beskrivelse

Find data

Seek

Her følger en lille kodestump, der finder en bestemt post i kundekartoteket:

Public Sub Find()
    Dim db As Database
    Dim rs As Recordset
   
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("Kunder")
   
    rs.Index = "PrimaryKey"
    rs.Seek "=", 13
    If rs.NoMatch Then
        MsgBox "Blev ikke fundet"
    Else
        MsgBox "Kunde nr. 13 hedder " & rs("Firma")
    End If
    rs.Close
Set rs = Nothing
End Sub

Bemærk at seek metoden kun kan bruges på indekserede kolonner, hvilket betyder, at den kun kan bruges på table recordssets.

 

Find

Hvis man skal finde informationer i dynasets eller snapshots skal man i stedet bruge Find metoden:

  • FindFirst: starter ved begyndelsen af recordsettet og finder den første forekomst af det søgte.
  • FindLast: starter i bunden og søger baglæns
  • FindNext: Starter ved den aktuelle post og finder næste forekomst
  • FindPrevious: Starter ved den aktuelle post og finder den forrige
  • NoMatch: Returnerer True, hvis det søgte ikke blev fundet

Det kunne se sådan her ud:

rs.FindFirst "KøbIalt >= 100000"

Og selve strukturen kunne sættes sådan her op:

rs.FindFirst betingelse Do Until rs.NoMatch     Match fundet - gør noget ved det!!     rs.FindNext betingelse Loop

 

SQL

Endelig kan vi bruge en SQL sætning når vi danner vores recordset:

strSQL = "SELECT * FROM Kunder WHERE KøbIalt >= 100000"
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Do Until rs.EOF
Debug.Print rs("Firma")
rs.MoveNext
Loop

Øvelse

Opret en kopi af databasen fra forrige lektion og kald den "Find.mdb"

Prøv de forskellige metoder ovenfor.

  • Lav en procedure der lister alle kunder med køber over 100.000,-, hvor du bruger find metoden
  • Prøv at lave det samme med et SQL kald


Pak databasen sammen eller omdøb den og send den til mig.


Løsning

Du kan hente mit forslag til løsningen her.

Jeg har brygget lidt videre på koden til de enkelte eksempler, så den er kommet til at se sådan her ud:

 

Public Sub Find()     Dim db As Database     Dim rs As Recordset     Set db = CurrentDb()     Set rs = db.OpenRecordset("Kunder")     rs.Index = "PrimaryKey"     rs.Seek "=", 13     If rs.NoMatch Then         MsgBox "Blev ikke fundet"     Else         MsgBox "Kunde nr. 13 hedder " & rs("Firma")     End If     rs.Close     Set rs = Nothing End Sub
Public Sub FindAndenKunde()     Dim KundeNr     KundeNr = InputBox("Kundenummer", "Find kunde")     Dim db As Database     Dim rs As Recordset     Set db = CurrentDb()     Set rs = db.OpenRecordset("Kunder")     rs.Index = "PrimaryKey"     rs.Seek "=", KundeNr     If rs.NoMatch Then         MsgBox "Blev ikke fundet"     Else         MsgBox "Kunde nr. " & KundeNr & " hedder " & rs("Firma")     End If     rs.Close     Set rs = Nothing End Sub
Public Sub SQLList()     minbeløb = InputBox("Beløb", "List kunder med køb over")     If IsNumeric(minbeløb) Then         Dim db As Database         Dim rs As Recordset         Set db = CurrentDb()         strSQL = "SELECT * FROM Kunder WHERE KøbIalt >= " & minbeløb         Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)         Do Until rs.EOF             MsgBox rs("Firma") & " Køb ialt: " & Format(rs("KøbIalt"), "###,##0") & " kr."             rs.MoveNext         Loop         rs.Close         Set rs = Nothing     End If End Sub
Public Sub FindMetoden()     minbeløb = InputBox("Beløb", "List kunder med køb over")     If IsNumeric(minbeløb) Then         Dim db As Database         Dim rs As Recordset         Set db = CurrentDb()         Set rs = db.OpenRecordset("Kunder", dbOpenDynaset)         rs.FindFirst "KøbIalt >= " & minbeløb         Do Until rs.NoMatch             MsgBox rs("Firma") & " Køb ialt: " & Format(rs("KøbIalt"), "###,##0") & " kr."             rs.FindNext "KøbIalt >= " & minbeløb         Loop         rs.Close         Set rs = Nothing     End If End Sub 

Brug for hjælp til VBA, VSTO eller SQL?

Scient Data tilbyder professionel IT-konsulentbistand

Kontakt Scient Data →