Avatar billede iko Nybegynder
04. oktober 2004 - 09:36 Der er 2 kommentarer og
1 løsning

FindFirst metode! DAO Access

Hej Eksperten.

Jeg er ked af at jeg poster så meget kode, men jeg tror det er nødvendigt for at løse mit spørgsmål.

Dette er min form1:


Private Sub Form_Load()
Dim dbMyDB As Database, rsMyRS As Recordset, kopisvar As String
   
'Sørger for at password står med stjerner'
txtPas.PasswordChar = "*"
'Gør at man kan se form1 før den tjekker om database filen er tilgængelig (gøres for syns skyld'
Form1.Visible = True
'Tjekker om database filen er tilgængelig, er der ikke nogen Dir på c:\data.mdb skal reagere på det'
If Dir$("c:\data.mdb") = "" Then
   
   
    MsgBox "Du skal vælge en databasenfilen som fulgte med pogrammet! (data.mdb)"
           
            'Jeg skal sætte det at man vælge en fil ind i en løkke,
            'da man ellers bare kan trykke anuller og ikke vælge nogen fil,
            'dette vil give problemer længere i koden,
            'hvor man skal oprette forbindelse til databasen'
            Do
                'Dette er objektstyret kommando objektet hedder Commondialog1 dette er et objekt som gør dialogbokse i den form jeg vil have det mulige
                'Først opretter jeg et filter som sørger for at man kun kan vælge filer som hedder 'data.mdb'
                CommonDialog1.Filter = "Database(*.mdb)" & "|data.mdb"
                'Åbning af selve dialogboksen'
                CommonDialog1.ShowOpen
                'Tjekker om man har valgt noget i dialogboksen'
                If CommonDialog1.FileName = "" Then
                    'Har man ikke valgt noget, kommer den med en fejl, hvorefter dialogboksen kommer frem igen'
                    MsgBox "Du skal vælge en fil!(data.mdb)"
               
                End If
            'Den kører løkken lige indtil at man har valgt en fil'
            Loop Until CommonDialog1.FileName <> ""
        'En dialogbox spørger om det er okay at kopiere filen over til c:\data.mdb'
        kopisvar = MsgBox("Programmet vil nu ligge databasefilen på c:\data.mdb", vbYesNo, "Kopier database")
            'Hvis man svarer ja ligger den kopiere den filen'
            If kopisvar = vbYes Then
                       
                FileCopy CommonDialog1.FileName, "c:\data.mdb"
            'Svarer man nej, lukker programmet'
            Else
       
                End
       
            End If

   
End If

End Sub

Private Sub cmdLog_Click()
Dim dataload As Boolean

'Opretter forbindelse til databasen'
Set dbMyDB = OpenDatabase("c:\data.mdb")
Set rsMyRS = dbMyDB.OpenRecordset("data", dbOpenDynaset)

'Kører databasen igennem og slutter først når den er EOF (End of file), dvs. har læst alt'
Do While Not rsMyRS.EOF
      'Tjekker om brugernavn er ens med et fra databasen'
      If rsMyRS!BruNav = txtLog.Text Then

   
      'Er bruger navn korrekt, tjekkes der om password er korrekt til det brugernavn'
      If rsMyRS!Password = txtPas.Text Then
      'Nu finder koden ud af om der er tale om en almindelig "bruger" eller en "Admin"
            Select Case rsMyRS!Status
     
                Case "admin"
           
                    Form3.Visible = True
                    Form1.Visible = False
           
                Case "bruger"
           
                    Form1.Visible = False
                    Form3.Visible = True
                   
            End Select
           
        'Hvis ikke både bruger navn og adgangskode er korrekt, fortæller den dette i et label felt'
        Else
           
            lblLog.Caption = "Du har indtastet forkert brugernavn/adgangskode"
            txtLog.Text = ""
            txtPas.Text = ""
            txtLog.SetFocus
   
       

    End If
    End If
            'Nu sørger koden for at når man har kørt løkken gennem en gang, går den til næste ID i løkken og tjekker om brugernavn/password passer dèr'
            rsMyRS.MoveNext
Loop

End Sub
'Viser form2 hvor man kan oprette ny bruger'
Private Sub cmdNy_Click()
Form2.Visible = True
Form1.Visible = False

End Sub
'Afslutnings knap'
Private Sub cmdAfs_Click()
End
End Sub

'Timer delen et objekt som hedder 'Timer1' på form1. Tager 'stikprøver' hvorvidt der står noget i txtLog'
'og i txtPas, som er de 2 tekstboxe på form1, er de tommer er login kanpper inaktiv'
Private Sub Timer1_Timer()

If txtLog <> "" And txtPas <> "" Then
    cmdLog.Enabled = True
Else
    cmdLog.Enabled = False
End If

End Sub

'Denne kode tjekker for hver gang man taster en tast i tekstfeltet'
Private Sub TxtLog_KeyPress(keyascii As Integer)
    lblLog.Caption = ""
      'Denne kode sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
    If Not keyascii > 47 And keyascii < 58 Then 'Man kan bruge fra 0 - 9'
                keyascii = 0
                lblLog.Caption = "Ugyldigt tegn!"

    End If
    End If
    End If
    End If
End Sub

'Denne kode tjekker for hver gang man taster en tast i tekstfeltet'
Private Sub txtPas_keypress(keyascii As Integer)
    lblLog.Caption = ""
      'Denne kode sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
    If Not keyascii > 47 And keyascii < 58 Then 'Man kan bruge fra 0 - 9'
                keyascii = 0
                lblLog.Caption = "Ugyldigt tegn!"

    End If
    End If
    End If
    End If
End Sub
Overstående kode logger jeg ind, dette virker fint!



Dette er min form2:


Private Sub Form_Load()
'Sørger for at de 2 password felter står med stjerner'
txtPas1.PasswordChar = "*"
txtPas2.PasswordChar = "*"

End Sub

Private Sub cmdGem_Click()
Dim tingOk As Boolean
'Opretter forbindelse til databasen'
Set dbMyDB = OpenDatabase("c:\data")
Set rsMyRS = dbMyDB.OpenRecordset("data", dbOpenDynaset)

'koden tjekker om brugernavn er over 4 tegn'
If Len(txtBru) < 4 Then
    lblfej = "Brugernavn skal være mere end 4 tegn"
   
'Koden tjekker at password er over 4 tegn, er det dette vil den se om de 2 passwords stemmer overens'
ElseIf Len(txtPas1) < 4 Then
        lblfej = "Dit password skal være over 4 tegn"
        txtPas1.Text = ""
        txtPas2.Text = ""
        txtPas1.SetFocus
       
ElseIf txtPas1.Text <> txtPas2.Text Then
            lblfej = "Password stemmer ikke overens"
            txtPas1.Text = ""
            txtPas2.Text = ""
            txtPas1.SetFocus
Else
'Hvis alle disse 'regler' til password og brugernavn er opfyldt sætter den tingOK = true'
                lblfej = ""
                tingOk = True
End If

'Tjekker om brugernavnet er optaget er det ikke det, sætter den tingOK = false'
Do While Not rsMyRS.EOF
      If rsMyRS!BruNav = LCase(txtBru.Text) Then
          lblfej = "Du skal indtaste andet brugernavn, da dette er optaget"
          tingOk = False
    Else
   
    End If
          rsMyRS.MoveNext
Loop
    'Hvis brugernavnet ikke er optaget har den stadig tingOk = true fra da den testede om password og brugernavn var korrekt skrevet,
    'og derefter ligger den informationen ind i databasen'
    If tingOk = True Then
           
            rsMyRS.AddNew
            rsMyRS!BruNav = LCase(txtBru.Text)
            rsMyRS!Password = LCase(txtPas1.Text)
            rsMyRS!forNav = LCase(txtFor.Text)
            rsMyRS!eftNav = LCase(txtEft.Text)
            rsMyRS!Telefon = LCase(txtTel.Text)
            rsMyRS!Status = "bruger"
            rsMyRS.Update
           
            'Sletter alle felter så de er tomme'
            RydFelter
                       
            'Når den har oprette brugeren, kommer der en msgBox, samt at den går tilbage til form1 (login)'
            MsgBox "Du har nu oprettet en bruger, og er klar til at logge på!", vbInformation, "Bruger oprettet"
            Form2.Visible = False
            Form1.Visible = True

Else
'Hvis ikke at tingOK = true laver den en fejl'
lblfej = lblfej.Caption & Chr(10) & "Ikke alle krav er opfyldt og derfor er det ikke muligt at skrive til databasen"
End If
End Sub
Private Sub cmdRyd_Click()

    RydFelter
    txtBru.SetFocus

End Sub

Private Sub Form_LostFocus()
    RydFelter
End Sub

Private Sub timer_Timer()
'Dette er en timer som i et interval tjekker om der er skrevet noget i de 6 textfelter og hvorefter den vil sætte gem-knappen til at være aktiv'
If txtFor <> "" And txtBru <> "" And txtPas1 <> "" And txtPas2 <> "" And txtEft <> "" And txtTel <> "" And Len(txtTel) = 8 Then
    cmdGem.Enabled = True
Else
    cmdGem.Enabled = False
End If

End Sub

Private Sub cmdLuk_Click()
'Går tilbage til form1'
Form1.Visible = True
Form2.Visible = False

End Sub


Private Sub TxtBru_KeyPress(keyascii As Integer)
    'Denne kode sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
    If Not keyascii > 47 And keyascii < 58 Then 'Man kan bruge fra 0 - 9'
                keyascii = 0

    End If
    End If
    End If
    End If
End Sub

Private Sub TxtEft_KeyPress(keyascii As Integer)
    'Denne kode sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
          keyascii = 0
 
    End If
    End If
    End If
End Sub

Private Sub txtFor_KeyPress(keyascii As Integer)
    'Denne koder sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
          keyascii = 0
 
    End If
    End If
    End If

End Sub

Private Sub txtPas1_keyPress(keyascii As Integer)
    'Denne koder sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
    If Not keyascii > 47 And keyascii < 58 Then 'Man kan bruge fra 0 - 9'
                keyascii = 0

    End If
    End If
    End If
    End If

End Sub
Private Sub txtPas2_keyPress(keyascii As Integer)
    'Denne koder sørger for man kun kan bruge nogle forsellige taster på tastaturet'
    If Not keyascii = 8 Then    'man kan bruge backspace (Slette knap)'
    If Not keyascii > 64 And keyascii < 91 Then  'man kan bruge fra A - Z'
    If Not keyascii > 96 And keyascii < 123 Then 'Man kan bruge fra a - z'
    If Not keyascii > 47 And keyascii < 58 Then 'Man kan bruge fra 0 - 9'
                keyascii = 0

    End If
    End If
    End If
    End If
End Sub

'Sørger for at man skal indtaste først tal i telefonnummer og derefter tester den for at der skal være 8 tegn'
Private Sub txtTel_LostFocus()
 
  If Not IsNumeric(txtTel) Then
     
      lblfej = "Indtast telefonnummer med tal."
      txtTel.SetFocus
 
  ElseIf Not Len(txtTel) = 8 Then
     
      lblfej = "Der skal være 8 tal i dit telefonnummer"
      txtTel.SetFocus
 
  Else
     
      lblfej = ""
 
  End If
End Sub

Public Sub RydFelter()
'Rydder felter'
For Each Control In Form2
    If TypeOf Control Is TextBox Then
        Control.Text = ""
    End If
Next

End Sub

Den overstående kode virker også fint!


Dette er min form3, dette skal være en form hvor hvis man er admin, kan man logge ind og derefter se noget information om brugerne. Men her sker fejlen, jeg kan ikke skrive:
rsMyRS.Findfirst den metode eksisterer ikke, og hvorfor det? Det må være fordi jeg har defineret noget i nogen andre forms eller noget, jeg ved det ikke og vil meget håbe nogen kan hjælpe mig!


Private Sub vis()

Set dbMyDB = OpenDatabase("c:\data")
Set rsMyRS = dbMyDB.OpenRecordset("data", dbOpenDynaset)
listBox.Clear

Do While Not rsMyRS.EOF
    listBox.AddItem rsMyRS!BruNav
    listBox.ItemData(listBox.NewIndex) = rsMyRS!Id
    rsMyRS.MoveNext
    Debug.Print listBox.ItemData(listBox.NewIndex)
Loop


End Sub

Private Sub CmdVis_Click()
vis
End Sub


Private Sub listBox_Click()

rsMyRS.FindFirst "ID=" & Str(lstRecords.ItemData(lstRecords.ListIndex))

TxtPas.Text = rsMyRS!Telefon
End Sub


Jeg håber meget nogen kan hjælpe mig! Igen undskyld for alt den kode-.
04. oktober 2004 - 09:45 #1
Det er lidt svært at gennemskue. Men har du sikret dig, at du har reference til Microsoft DAO? Hvis der også er en reference til ADO, kan Dim rsMyRS As Recordset godt fortolkes som en ADODB.Recordset i stedet for DAO.Recordset.

Brug derfor altid:
rsMyRS As DAO.Recordset '(så der ingen tvivl er)

Du kan evt checke om det er det, som er fejlen ved at udskifte .FindFirst med .Find (som er den tilsvarende syntaks i ADO)
Avatar billede iko Nybegynder
04. oktober 2004 - 10:02 #2
Jeg har ikke lige nu mulighed for at teste det, men jeg ved at jeg godt kan skrive rsMyRS.find den metode kan den godt finde, så jeg tror måske nok det er det! Men du får lige point om 20 min eller noget hvis det er det!
04. oktober 2004 - 10:36 #3
ok, hvis den kan finde .find, men ikke .FindFirst, så er der vist ingen tvivl om at VB betragter recordsettet som et ADODB.recordset i stedet for er DAO.Recordset.

Jeg synes heller ikke, at jeg kan se, at du erklære rsMyRS nogle steder på Form3.

Då du bør erklære objektet øverst i modulet:

Option Explicit

Dim dbMyDB as Database
Dim rsMyRS As DAO.Recordset
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