18. juli 1999 - 13:27Der er
22 kommentarer og 1 løsning
Søgning i Access database!
Jeg er helt ny i Visual Basic 6.0 og har lavet nogle små "programmer", som bliver illustreret i nogle begynder bøger som jeg har købt. (Start på Visual Basic 6.0 & Grundlæggende programmering med Visual Basic 6.0)
Nu vil jeg lave en "godt fungerende" søgefunktion, hvor mit lille program skal trække nogle kunde data ud fra en Access database som allerede eksisterer. Jeg har fået den til at virke, men det er ikke særlig smart, da det kører således: For at få et søgeresultat, skal jeg skrive hele kundens for- og efternavn, fuldstændig korrekt som de står i databasen. Jeg kan fx. ikke bare skrive Per, hvorefter den returnerer en liste med søgeresultater. Samtidig vil den kun søge i en tabel ad gangen, jeg håbede at jeg kunne lave en funktion så den søgte i alle tabeller; Kundenr, Navn, Adresse, Postnr, By etc. Hvis jeg skriver 2000 i søgefeltet, skulle den så gerne returnere ALLE resultater som indeholder 2000 i et af felterne. Herved ville jeg så få en liste over kunder på Frederiksberg, og måske nogle kunder som havde 2000 i evt. tlfnr. Jeg tænkte om man ikke kan lave en commandknap som er et eller andet sted med navnet: "Søg efter Kunde", og ved tryk laver den en InputBox som man kan skrive søgeord i.
Samtidig hører jeg gerne fra andre, som kunne anbefale bøger som kan hjælpe i forbindelse med database programmering, og gerne links til sider som kan give hjælp til lignende emner.
Jeg takker på forhånd og ønsker alle en god søndag.
Jeg har lavet en lille form med de forskellige felter, navn kundenr, postnr. by etc.....Der kan man oprette en kunde og nu kan man jo også søge efter en kunde :-) men den returnerer jo bare ikke resultaterne, efter man har fundet den man søgte i list boxen.
Hvilke bøger har du studeret eiland? Jeg mangler en bog som er god til databaser og lidt mere indvilket programmering.
Ja hvert enkelt felt refererer direkte til felterne i databasen, og samtidig til data1 i datasource feltet.
Samtidig kan jeg ikke få den til at returnere både og fx. tlfnr. i listboxen, da det jo gør det lidt lettere at finde en bestemt hvis man har mange søgeresultater! Hvad er den korrekte kode til det? Jeg har prøvet med dette :
List1.AddItem (Data1.Recordset("navn", "tlf"))
både med og uden komma og en del andre kombinationer.
Jeg synes hjælpefilen er lige stor nok, da den kommer med alt for mange resultater hvis man ikke er utrolig god til at skrive de rigtige søgeord. (Min hjælpefil hedder MSN Libary og fylder 800 MB)
erstat " ' List1 er en listebox du skal lave. ' Tilføger alle de navne i tabellen, der indeholder *soenavn* . Soenavn Kan også indeholde * og ? . List1.AddItem (Data1.Recordset("navn")) " med
'laver en lykke der sætter alle setningerne sammen i en variabel Oplysninger = "" For Kolonne_Igang = 0 To Antal_Kolonner - 1 Oplysninger = Oplysninger & " ;; " & Data1.Recordset(KolNavn(Kolonne_Igang)) Next ' List1 er en listebox du skal lave. ' Tilføger alle de navne i tabellen, der indeholder *soenavn* . Soenavn Kan også indeholde * og ? . List1.AddItem (Oplysninger)
' Når man har valgt en i listen (klikker på listen) eller du kan flytte det ind under en knap
Private Sub List1_Click() Dim Navn As String Dim Bukstav As Single 'len() retunere længten af ordet For Bukstav = 1 To Len(List1.Text) 'mid(teskt , start nr bukstav ,hvormange bukstaver) tager en bid text, ud af en tekst If Mid(List1.Text, Bukstav, 4) Like " ;; " Then Navn = Mid(List1.Text, 1, Bukstav - 1) Exit For End If Next Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False If Data1.Recordset("Navn") Like Navn Then Exit Do End If Loop
End Sub
Det er den samme hjælpefil jeg bruger, man kan vælge kun at bruge de dele der omhanler VB og ikke alle de andre.
Nu har jeg forsøgt at indsætte begge kodesæt som du har sendt, men ingen af dem giver noget "godt" resultat!
Kan du ikke validere begge kodesæt, og se om der er en lille bug i dem, og evt. sende den her igen.
Herunder sender jeg dig lige hele koden, dog uden det nye som jeg skulle erstatte, så kan du se om jeg lavet noget forkert!
---------------------------------
Private Sub cmdFind_Click() Dim soegenavn As String Dim Antal_Kolonner, Kolonne_Igang As Single Dim KolNavn()
' For at rydde listen List1.Clear
soegenavn = InputBox("Skriv navnet på den kunde, du ønsker at finde") ' Skriv antallet af kolonner her. Du skal ændre tallet så det passer Antal_Kolonner = 7
ReDim KolNavn((Antal_Kolonner - 1))
' Skriv navnet på første kolonne KolNavn(0) = "Num" ' Skriv navnet på anden kolonne KolNavn(1) = "Navn" ' Skriv navnet på 3. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(2) = "Adr" ' Skriv navnet på 4. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(3) = "Postnr" ' Skriv navnet på 5. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(4) = "tlf" ' Skriv navnet på 6. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(5) = "Bemærk" ' Skriv navnet på 7. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(6) = "By"
Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False ' Denne løkke vil kontrollere en række ad gangen. For Kolonne_Igang = 0 To Antal_Kolonner - 1
' Lcase() for at arbejde med små bogstaver og like fordi bedst til tekst If LCase(Data1.Recordset(KolNavn(Kolonne_Igang))) Like ("*" & LCase(soegenavn) & "*") Then
' List1 er en listebox du skal lave. ' Tilføjer alle de navne i tabellen, der indeholder *soegenavn* . ' Soegenavn Kan også indeholde * og ? . List1.AddItem (Data1.Recordset("navn"))
' For at undgå at den finder samme navn(række) flere gange. Exit For End If Next Data1.Recordset.MoveNext Loop
If List1.ListCount = 0 Then MsgBox "Kunden findes ikke i databasen!!" End If End Sub
--------------------------------------------
Jeg håber du kan smide en kode som kan overføre de fundne data over i de forskellige text bokse ved at dobbeltklik eller lign.
Jeg kan ikke lige få denne til at virke, men jeg har fundet ud af hvorfor den går ned nogengange. Jeg har hele tiden undret mig over at den nogen gange gik ned når man søgte 2 gange lige efter hinanden.
Fejlen opstår hvis man klikker på et af søgeresultaterne fra første gang man søgte hvoefter man søger igen.
den refererer bug'en til:
' Skriv navnet på 8. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(6) = "Email" *denne linje*Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False
' Denne løkke vil kontrollere en række ad gangen. For Kolonne_Igang = 0 To Antal_Kolonner - 1
det sker kun i dette tilfælde, og jeg har prøvet en del forskellige ting, men intet har givet et brugbart resultat!
JA, jeg har ICQ Alt hvad der står efter ' læser VB ikke
' Skriv navnet på 8. kolonne, gentag denne linje så mange gange som nødvendigt. KolNavn(6) = "Email" jeg tror du glemte at rette 6 tallet og anta kolonner.
har du tilføget koden: Den skulle gerne bladre data1.recordeset frem til det valte navn
Private Sub List1_Click() Dim Navn As String Dim Bukstav As Single 'len() retunere længten af ordet For Bukstav = 1 To Len(List1.Text) 'mid(teskt , start nr bukstav ,hvormange bukstaver) tager en bid text, ud af en tekst If Mid(List1.Text, Bukstav, 4) Like " ;; " Then Navn = Mid(List1.Text, 1, Bukstav - 1) Exit For End If Next Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False If Data1.Recordset("Navn") Like Navn Then Exit Do End If Loop
Dette program benyttes helt offline, dermed ikke til internet. Den henter alle informationer fra en Access 97 database, og jeg har egentlig ikke en videre kode, men er interesseret i en kode som kan søge i flere tables i databasen, samtidig med at den kan søge med wildcards, da det kan være lidt svært at huske et helt navn (både for- og efternavn). Den skulle så gerne sende resultater til en listbox eller lign. Jeg håber, at der er en venlig sjæl som vil give mig lidt kode (eller en guide) så jeg kan komme videre, da jeg vist er kommet på en lidt for stor opgave!
Jeg har taget koden fra en kommandoknap som jeg gerne vil have skulle bruges som søgefunktion:
Private Sub cmdFind_Click() Dim soegenavn As String soegenavn = InputBox("Skriv navnet på den kunde, du ønsker at finde") Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False If Data1.Recordset("navn") = soegenavn Then Exit Sub End If Data1.Recordset.MoveNext Loop MsgBox "Kunden findes ikke i databasen!!" End Sub
Dog søger den kun i en tabel i databasen, og finder kun et resultat hvis jeg har indtastet hele navnet, præcist som det står i databasen (Det er Case Sensitive :-( ) Er der ikke en simpel måde man kan lave det på, jeg er villig til at give en hel del flere point til den som kan lave en løsning som kan bruges.
Hej Lars Jeg har ændret lidt på din kode. Det er ikke hele svaret, men se om der er noget du kan bruge.
Private Sub cmdFind_Click() Dim soegenavn As String soegenavn = InputBox("Skriv navnet på den kunde, du ønsker at finde") Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False
' Lcase() for at arbejde med små bukstaver og like fordi bedst til tekst If Lcase(Data1.Recordset("navn")) like ("*" & lcase(soegenavn) & "*") Then
' List1 er en listebox du skal lave. ' Tilføger alle de navne i tabellen, der indeholder *soenavn* . Soenavn Kan også indeholde * og ? . List1.AddItem (soegenavn)
' fjernes for fortsætte søgningen i tabellen ' Exit Sub End If Data1.Recordset.MoveNext Loop MsgBox "Kunden findes ikke i databasen!!" End Sub
Men som du selv nævnte er det ikke hele svaret, da den viser det man har skrevet i listbox'en og ikke selve søgeresultatet, men nu kom jeg lidt videre, og hvis der skulle være en anden derude, som kan tilføje noget til ovenstående, er det meget velkommen.
Også tak til c_wellendorf for linket, der kan jeg sikkert hente meget hjælp :-)
svaret fra sone er godt nok, men måske bare for kort til at du kan bruge det til noget.
lad os antage at du bruger SQL til at hente dit recorset med.
så henter du formegentligt med: "SELECT * FROM tabelA" for den ene tabel, og : "SELECT * FROM tabelB" for den anden.
men det du skal bruger er i virkligheden: "SELECT * FROM tabelA, tabelB WHERE tabelA.navn like '%navn%' AND tabelB.navn like '%navn%'" og alt hvad du så behøver er en linie i stil med:
Men som nævn helt i starten er jeg HELT NYBEGYNDER i Visual Basic, og jeg kan derfor ikke lige finde ud af at bruge en lille stump SQL, da Visual Basic jo vil have mere end en det.
Jeg søger en komplet kode, som kan udføre jobbet, som jeg ønsker det?
Hej Lars Jeg ved dette ikke er den optimale måde at gøre det på. Men det skulle løse dit problem.
Private Sub cmdFind_Click() Dim soegenavn As String Dim Antal_Kolonner, Kolonne_Igang As singel Dim KolNavn()
'for at rydde listen list1.Clear
soegenavn = InputBox("Skriv navnet på den kunde, du ønsker at finde") 'skriv antallet af kolonner her. Du skal ændre tallet så det passer Antal_Kolonner = 3
ReDim KolNavn((Antal_Kolonner - 1))
'skriv navnet på første kolonne KolNavn(0) = "navn" 'skriv navnet på anden kolonne KolNavn(1) = "Kundenr" 'skriv navnet på 3. kolonne, gentag denne lignen så mange gange som nødvendigt. KolNavn(2) = "Adresse"
Data1.Recordset.MoveFirst Do While Data1.Recordset.EOF = False 'denne løkke vil kontrolere en ræke af gangen. For Kolonne_Igang = 0 To Antal_Kolonner - 1
' Lcase() for at arbejde med små bukstaver og like fordi bedst til tekst If LCase(Data1.Recordset(KolNavn(Kolonne_Igang))) Like ("*" & LCase(soegenavn) & "*") Then
' List1 er en listebox du skal lave. ' Tilføger alle de navne i tabellen, der indeholder *soenavn* . Soenavn Kan også indeholde * og ? . List1.AddItem (Data1.Recordset("navn"))
' for at undgå at den finer samme navn(ræke) flere gange. Exit For End If Next Data1.Recordset.MoveNext Loop
If List1.ListCount = 0 Then MsgBox "Kunden findes ikke i databasen!!" End If End Sub
Jeg kunne godt tænke mig at lære SQL, så sone og nero kan i ikke anbefale en bog, ligesom Lars også efterlyser.
Den fungerer efter hensigten såvidt jeg kan se - men nu mangler jeg bare at den returnerer de aktuelle felter som den har fundet i søgningen tilbage i de forskellige text bokse - er du flink lige at smide en lille forklaring til dette!!
Ellers kan jeg kun sige SUPER, tak for hjælpen eiland!!
SQL kunne jeg ikke lige få til at virke, men denne løsning kører også godt, bortset fra at jeg mangler at trække oplysningerne videre fra listen!
Synes godt om
Ny brugerNybegynder
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.