Avatar billede jens_32 Nybegynder
05. oktober 2003 - 19:43 Der er 7 kommentarer og
1 løsning

Brug af filter funktion i VB

Jeg forsøger i mit program, at sortere en database og ønsker kun at vise de poster, som har en bestemt værdi på en boolean variabel i skærmbilledet. Poster med den anden variabelværdi skal filtreres fra. Nogen der har et godt eksempel på hvordan filterfunktionen virker i VB?
Avatar billede oswald Nybegynder
05. oktober 2003 - 22:01 #1
Jeg går ud fra at du mener filter funktionen i ADO og VB60.
Filter funktionen er meget nem at bruge, du indsætter simpelthen en filter lige efter du har eksekveret dit database kald i koden. Som i følgende modificerede MS eksempel. Du skal dog være opmærksom på at du henter hele recordsettet ind hukommelsen før der filtereres. En væsentlig hurtigere (og smukkere ;)) måde er at lave en where clause i din select sætning så database kaldet bliver til "SELECT * FROM publishers Where Country = 'USA'". Når du skal lave en forspørgsel på en boolean afhænger af hvilken database du kører op imod, SQL serveren skal ha den som "BoolValue = 1".
Jeg har hentet eksemplet fra Microsoft på adressen http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdaexamples_vb01_27.asp

strCnn = "Provider=sqloledb;" & _
      "Data Source=MyServer;Initial Catalog=Pubs;User Id=sa;Password=; "
  Set rstPublishers = New ADODB.Recordset
  rstPublishers.CursorType = adOpenStatic
  rstPublishers.Open "SELECT * FROM publishers", strCnn, , , adCmdText
     
  ' Print current data in recordset.
  rstPublishers.filter = "Country = 'USA'"
  rstPublishers.MoveFirst
  Do While Not rstPublishers.EOF
      Debug.Print rstPublishers!pub_name & ", " & _
        rstPublishers!country
      rstPublishers.MoveNext
  Loop
Avatar billede jens_32 Nybegynder
06. oktober 2003 - 09:10 #2
Jeg tror ikke helt jeg forstår den kode du bruger. Den jeg anvender ser ud på følgende måde i den pågældende form:

Private Sub HentDataNaeste()
    If Data2.Recordset("JaNej") = 1 Then
        Form1.Option1.Value = True
    End If
    If Data2.Recordset("JaNej") = 2 Then
        Form1.Option2.Value = True
    End If
    If Data2.Recordset("JaNej") = 3 Then
        Form1.Option3.Value = True
    End If
    If Data2.Recordset("JaNej") = 4 Then
        Form1.Option4.Value = True
    End If
    If Data2.Recordset("JaNej") = 5 Then
        Form1.Option5.Value = True
    End If
End Sub
Private Sub FindOpretInterview()
    If Data2.Recordset.BOF = False Then
        Data2.Recordset.MoveFirst
    End If
    Do While Data2.Recordset.EOF = False
        If Data2.Recordset("ID") = Data1.Recordset("ID") Then
            Exit Sub
        End If
        Data2.Recordset.MoveNext
    Loop
    Data2.Recordset.AddNew
    Data2.Recordset("ID") = Data1.Recordset("ID")
    Data2.Recordset.Update
    FindOpretInterview
End Sub
Private Sub Command1_Click()
    FindOpretInterview
    HentDataNaeste
    Form1.Show
    Unload Me
End Sub
Private Sub Command2_Click()
    Dummy1 = Data1.Recordset("Løbenummer")
    Data1.Recordset.MoveLast
    Dummy2 = Data1.Recordset("Løbenummer")
    Dummy2 = Dummy2
    Data1.Recordset.MoveFirst
    Do While Data1.Recordset.EOF = False
        If Data1.Recordset("Løbenummer") = Dummy1 Then
            Data1.Recordset.Edit
            Data1.Recordset("Løbenummer") = Dummy2 + 1
            Data1.Recordset.Update
            Form_1.Show
            Unload Me
            Exit Sub
        End If
        Data1.Recordset.MoveNext
    Loop
End Sub
Private Sub Command3_Click()
    Form_1.Show
    Unload Me
End Sub

Det er et skærmbillede der umiddelbart viser en record i skærmbilledet. Det jeg skal frem til er, at den kun viser recorden, hvis den har en bestemt  værdi på en boolean variabel f.eks. åben/lukket. Hvis recorden på den variabel har værdien lukket, skal den gå til næste indtil den møder en der er åben og så vise den i skærmbilledet. Hvordan kan jeg få det ind i min kode? Jeg ved at der findes en funktion, som siger Data1.Recordset1.Filter, men jeg synes ikke at det kommer til at virker hvis jeg bruger det. Har du en ide?
Avatar billede martin_moth Mester
06. oktober 2003 - 11:53 #3
Det er fordi du bruger en datakontrol. Den løsning oswald giver bruger ikke en datakontrol, men henter et recordset fra en database vha. SQL.

Det er to forskellige måder at gøre det samme på - ved at bruge en datakontrol som du gør skal du bare angive et par propertiies på den datakontrol (fx. hvilken database og hvilken tabel der skal hentes data fra). Du får "foræret" navigationsknapper så du kan bladre i dit recordset.

Ved at oprette en variabel af typen Database og af typen Recordset kan du vha ADO (som oswald nævner) og vha. en connectionstring (et SQL-udtryk) hente data fra en database. Der er en lille smule mere at holde styr på, men til gengæld er det 10000 gange mere flexibelt.

Blot en kommentar for at skabe klarhed - dig og oswald taler om to forskellige ting. Hvordan man bruger filter med en datakontrol som du bruger aner jeg ikke - jeg bruger altid metoden med SQL.
Avatar billede jens_32 Nybegynder
06. oktober 2003 - 15:46 #4
Tak for svaret.
Nu bruger jeg jo datakontrol, så jeg er nødt til at have løsningen der. Nogen der ved, hvordan man bruger filterfunktionen med datakontrol?
Avatar billede martin_moth Mester
06. oktober 2003 - 16:12 #5
Jeg aner stadig intet om .Filter, men fortsætter alligevel :o)

Du kan jo loope over dit recordset indtil den viser den rigtige record - men det er måske ikke en brugbar løsning? Bare en ide - nu skal jeg nok tie stille :o)
Avatar billede jens_32 Nybegynder
06. oktober 2003 - 16:42 #6
Du er ellers mere end velkommen :-).
Nu kalder jeg jo datakontrollen for hvert skærmbillede.
Kan jeg gøre en operation i min database umiddelbart efter at skærmbilledet er loaded, dvs. inden jeg trykker på en af de forskellige knapper i skærmbilledet. Hvor skal den kode evt. skrives?
Avatar billede martin_moth Mester
06. oktober 2003 - 16:45 #7
Der er jo events som _Activate, _GotFocus osv - er det det du mener?
Avatar billede jens_32 Nybegynder
06. oktober 2003 - 17:21 #8
Jeg har lige fundet en anden måde.
Styrer sorteringen via et indeks i databasen i stedet.
Tak for budene.

Mange hilsener
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester