Gå til innhold

Åpne, redigere og søke i database?


Anbefalte innlegg

1. Hvordan åpner jeg en database i en list?

2. Hvordan legger jeg til data i en tabell i databasen (feks. text1 til kolonne 1 og text2 til kolonne 2)

3. Hvordan bare vise tingene i databasen som har felles ord/tall i en bestemt kolonne?

4. Hvordan søke i databasen :>

 

Access database it is.

Endret av Blaster2k
Lenke til kommentar
Videoannonse
Annonse

Legg til en ListBox og denne koden:

Private Sub Form_Load()

List1.Clear

Set db = OpenDatabase(App.Path & "\database.mdb")
Set rstInfo = db.OpenRecordset("Info")

If Not rstInfo.RecordCount = 0 Then

   With rstInfo

       .MoveFirst

       Do Until .EOF
       
           List1.AddItem !Navn
           .MoveNext
           
       Loop
  
   End With
   
End If

End Sub

Private Sub List1_dblClick()

With rstInfo

   .MoveFirst
   .Move (List1.ListIndex)
   .Edit

   MsgBox !Om

End With

End Sub

 

For å edite den aktive (den som sist er åpnet med "List1_dblClick") raden kan du bruke denne koden:

With rstInfo
   .Edit
   !Navn = Text1.text
   !Om = Text2.text
   .Update
End With

 

For å slette den aktive raden:

rstInfo.Delete

 

For å slette den aktive raden:

With rstInfo
   .AddNew
   !Navn = Text1.Text
   !Om = Text2.Text
   .Update
End With

 

Edit: Finnes ingen ferdig lagd funksjon for å søke i databasen. Her er en meget enkel en:

Dim i
For i = 0 To List1.ListCount - 1

   If List1.List(i) = txtSøkeord.Text Then MsgBox List1.List(i)

Next i

Endret av Jonas
Lenke til kommentar
Set db = OpenDatabase(App.Path & "\bqdb.mdb") "Sub or function not defined"

Når Option Explicit står skrevet i toppen av koden, så er variabeldeklarering helt nødvendig. Derfor må du hele tiden deklarere de variabelene hvor du får denne feilmeldingen ved. I dette tillfellet må du legge denne koden i toppen:

 

Dim db As Object, rstInfo As Object

 

Skulle du oppleve flere feilmeldinger er det bare å deklarere variabelen. Hvis du ikke vet hvilken type du skal deklarere til, bruker du datatypen Variant.

Lenke til kommentar

Får samme feilmellinga nå:

Option Explicit

Dim db As Object
Dim tblTabell1 As Object

Private Sub Form_Load()

Set db = OpenDatabase(App.Path & "\bqdb.mdb")
Set tblTabell1 = db.OpenRecordset("Tabell1")

AddToList List1

End Sub

Public Sub AddToList(ListView As Variant)

On Error Resume Next

tblTabell1.MoveFirst
      
Do Until tblTabell1.EOF
  
  ListView.ListItems.Add , , tblTabell1!Navn
  tblTabell1.MoveNext
Loop

End Sub

Endret av Blaster2k
Lenke til kommentar

Du er også nødt til å referere DAO biblioteket til prosjektet ditt. Dette gjør du ved å velge Project, så References... og den høyeste versjonen av Microsoft DAO i listen. Avslutt ved å trykke på OK. Etter dette skulle koden fungere.

Lenke til kommentar

Takker og bukker.

 

Jeg "plages" litt med søkingi ListView'en, jeg fant en kode som funket ganske bra:

Private Sub Command4_Click()
Dim itm As ListItem
With ListView1
Set itm = .FindItem(Text1.Text, lvwText, , lvwPartial)
If Not itm Is Nothing Then
.ListItems(itm.Index).Selected = True
.SetFocus
End If
End With
Set itm = Nothing
End Sub

 

Men bet er mange ting i listen som begynner (og slutter med det samme) Eksempel: "bil med rød farge" <> "bil med grønn farge" Med den søkemetoden åver kan jeg ikke bare søke etter "grønn" og finne "bil med grønn farge". Og om jeg søker på "bil" så kommer bare til den første linja med som begynner med "bil", jeg vil at man skal gå til neste treff om man trykker på knappen en gang til. Noen ide'er til hvordan?

 

Litt rotete skrevet kanskje?

Endret av Blaster2k
Lenke til kommentar

Hvis du også vil gjøre det mulig å søke etter tekst i selve innholdet, og ikke bare begynnelsen, kan du prøve denne funksjonen:

 

Public Function FindItemEx(ListView As ListView, Find As String, Optional Where = "Text", Optional Index = 1, Optional Compare As VbCompareMethod = vbTextCompare) As ListItem

Dim Tell As Long

For Tell = Index To ListView.ListItems.Count

   If InStr(1, CallByName(ListView.ListItems.Item(Tell), Where, VbGet), Find, Compare) <> 0 Then
       Set FindItemEx = ListView.ListItems.Item(Tell)
       Exit Function
   End If
   
Next

End Function

 

Den fungerer omtrent som FindItem funksjonen og kalles på denne måten:

 

Set itm = FindItemEx(ListView1, Text1.Text, , lSearchIndex, vbTextCompare)

 

Koden blir dermed slik:

 

Private Sub Command4_Click()

Dim itm As ListItem, lSearchIndex&

With ListView1

   lSearchIndex = .SelectedItem.Index + 1

   If lSearchIndex < 3 Then
       lSearchIndex = 1
   End If
   
   If lSearchIndex > .ListItems.Count Then
       lSearchIndex = .ListItems.Count
   End If

   Set itm = FindItemEx(ListView1, Text1.Text, , lSearchIndex, vbTextCompare)
   
   If Not itm Is Nothing Then
       .ListItems(itm.Index).Selected = True
       .SetFocus
   End If
   
End With

Set itm = Nothing

End Sub

 

Når det gjelder formateringen av koden, vil jeg anbefale deg å lese denne guiden.

 

Lykke til!

Endret av aadnk
Lenke til kommentar

Den søksaken der var fin, men når man har "søkt seg gjennom" lista en gang kan man ikke søke på det samme ordet igjen før man har reloadet programmet eller det som står i ListView'en (i dette tilfellet en database). (=

 

Hvordan reloader jeg eller sier til ListView'en "det skjedd endringer i databasen, vis det!"?

 

 

 

Eeenda et spørsmål:

For å slette den aktive raden:

rstInfo.Delete

Vill den aktive si den som er merket? Isfall får jeg det ikke til (feilmelling -> No current record )

 

 

Huff som jeg maser :dontgetit:

Endret av Blaster2k
Lenke til kommentar

Jeg endret på prosedyren sånn at den automatisk går tilbake til utgangspunktet etter den har søkt igjennom alle elementene. Her er den nåværende koden:

 

Private Sub Command4_Click()

Dim itm As ListItem, lSearchIndex&

If ListView1.ListItems.Count <= 0 Then
   ' Ingen elementer å søke i
   Exit Sub
End If

With ListView1

   lSearchIndex = .SelectedItem.Index + 1
   
   If lSearchIndex < 3 Or lSearchIndex > .ListItems.Count Then
       lSearchIndex = 1
   End If

   ' Hvis brukeren allerde har søk gjenom listen, sett den tilbake til utgangspunktet
   If .Tag = "NoResult" Then
       lSearchIndex = 1
       .Tag = ""
   End If
   
   Set itm = FindItemEx(ListView1, Text1.Text, , lSearchIndex, vbTextCompare)
   
   If Not itm Is Nothing Then
       .ListItems(itm.Index).Selected = True
       .SetFocus
   Else
       
       If lSearchIndex < 2 Then
           ' Ingen resultater
           .Tag = "NoResult"
       Else
           ' Prøv å søk på ny
           .ListItems.Item(1).Selected = True
           Call Command4_Click
       End If
           
   End If

End With

' Fri opp variabler
Set itm = Nothing

End Sub

 

Når det gjelder sletting av poster i en tabell, så må du sjekke om det faktisk er flere elementer igjen å slette. Dette gjør du ved å se om både rstInfo.BOF og rstInfo.EOF er True. Da er det mest sannsynlig ikke flere resisterende poster, mens når bare en av disse er True kan du prøve å flytte gjeldende post til begynnelsen med funksjonen MoveFirst.

Lenke til kommentar

Nesten!

Om man søker på et ord som er i den første raden, kan man ikke finne neste rad med samme ord, med å trykke på knappen igjen.

 

 

 

Problemer med sletting:

Jeg fant et eksempel og prøvde å sette koden inn i mitt prosjekt

Her er koden

Private Sub Command5_Click()
'SLETT SJITN
' the user wants to delete the selected record.
' if there are no records in the listview: exit sub
If ListView1.ListItems.Count = 0 Then Exit Sub
'if itemindex = 0 then there is nothing selected!
If ItemIndex <> 0 Then
   'ok, there is something selected!
   'now we will get the name from the items name, and ask for delete confirmation
   Dim Ask As String
   Ask = MsgBox("Are you sure that you want to delete '" & ListView1.ListItems.Item(ItemIndex).Text & "'?", vbYesNo + vbInformation, "Delete record")
       
   If Ask = vbYes Then
       'user had pressed yes, please delete;-)
       'now we have to get the ID of the row in de database (item's tag!) and delete record from table
       Dim db As Database
       Dim tblTabell1 As Recordset
' Open database bqdb.mdb (in the same path as the application files are)
   Set db = OpenDatabase(App.Path + "\bqdb.mdb")
' Open recordset (table: People) in database DB
   Set tblTabell1 = db.OpenRecordset("Tabell1")
'we will seek the record with ID equal to item's tag
'first we set the table's index (this is the ID)
'we need this because otherwise we can't use the seek function
   tblTabell1.Index = "ID"
'we move the recordpointer to the first record, this way we can seek the whole table
   tblTabell1.MoveFirst
'here we check if the seek functions result is equal to the item's tag.
'the item's tag contains the ID from the table.
'we stored it when we were reading from the table
   tblTabell1.Seek "=", ListView1.ListItems.Item(ItemIndex).Tag
   
   If tblTabell1.NoMatch Then
'if there was no match (the ID couldn't be found in the table)
   MsgBox ("The record can't be found in the table!"), vbOKOnly + vbCritical, "Error"
'we reset itemindex to 0, this means that nothing is selected in listview1
   ItemIndex = 0
'close recordset and database
   tblTabell1.Close
   db.Close
Exit Sub

Else
'there was a match! we will now delete the record from the database
   tblTabell1.Delete
'and we will delete the row from the listview
   ListView1.ListItems.Remove (ItemIndex)
End If
       'close recordset and database
       tblTabell1.Close
       db.Close
   
   End If
   
   'we reset itemindex to 0, this means that nothing is selected in listview1
ItemIndex = 0
   
End If

End Sub

Når jeg da trykker på Command5 blir det error med meldingen "'ID' is not an index in this table". Det er en kolonne i tabellen min som heter ID, hva skal jeg gjøre?

 

By the way; jeg setter stor pris på all hjelpen dere gir og har gitt meg her :)

Endret av Blaster2k
Lenke til kommentar

Uff da .. Dumme meg .. Glemte å nevne dim'sene og referansen til DAO filen :blush:

 

Edit:

Vill den aktive si den som er merket? Isfall får jeg det ikke til (feilmelling -> No current record )

Den får du når ingen rader er aktive .. Jeg vet ikke hva du mener med "den som er merket" .. Merket i en listbox? Listbox har ingen ting å si. Det er hvilken rad i databasen som er blitt åpnet sist.

Endret av Jonas
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...