Avatar billede lp Nybegynder
18. juli 1999 - 13:27 Der 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.

Med venlig hilsen


Lars
Avatar billede lp Nybegynder
19. juli 1999 - 16:28 #1
For at fherne evt. tvivl:

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.
Avatar billede eiland Nybegynder
19. juli 1999 - 17:18 #2
Er databasen og felterne forbundet via DataField ?

Hvad bøger angår har jeg læst "start på Visual Basic 5.0" væbnet mig med en masse tålmodighed, prøvet mig frem, samt hjælpefinerne.
Avatar billede lp Nybegynder
19. juli 1999 - 17:27 #3
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)
Avatar billede eiland Nybegynder
19. juli 1999 - 19:29 #4
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.
Avatar billede lp Nybegynder
19. juli 1999 - 23:11 #5
Hejsa Eiland!

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.
Avatar billede eiland Nybegynder
20. juli 1999 - 12:17 #6
List1.AddItem (Data1.Recordset("navn"))
skal være da den er forskel på store og små bukstaver.
List1.AddItem (Data1.Recordset("Navn"))


Avatar billede lp Nybegynder
20. juli 1999 - 12:21 #7
Hvordan ved den hvilket felt den skal overføre det til?
Hvor skal det stå?

Jeg har indsat dette i List1 sub'en:

List1.Text = Text1Text som medfører at kun navn overføres og ikke adresse!
Avatar billede lp Nybegynder
20. juli 1999 - 12:28 #8
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!
Avatar billede lp Nybegynder
20. juli 1999 - 12:30 #9
Eiland, har du ICQ?
Avatar billede eiland Nybegynder
20. juli 1999 - 12:42 #10
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

End Sub
Avatar billede lp Nybegynder
20. juli 1999 - 12:49 #11
Hvis jeg tilføjer den tekst sidste tekst går vb ned når jeg forsøger at compilere det for at prøve det!

derfor er den ikke med.......kontakt lige mig på icq nr. 7957330
Avatar billede sone Nybegynder
18. juli 1999 - 19:01 #12
Hej Lars

Jeg regner med at spørger i databasen via SQL.
Prøv af sende din koden med SQL, så skal jeg se hvad jeg kan gøre.
Avatar billede lp Nybegynder
18. juli 1999 - 19:06 #13
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!

/Lars
Avatar billede sone Nybegynder
18. juli 1999 - 19:11 #14
En standard SQl sætning er opbygges således:

  SELECT felt1, felt2 FROM tabelnavn WHERE felt1='bynavn'

WHERE-delen kan indeholde søgning med wildcards, f.eks.

  ...WHERE felt1 LIKE 'Per%'
  ...WHERE felt2 LIKE '%2000%'

Jeg håber du kan bruge noget af det her, ellers nå være lidt mere specifik, og sende noget at dit programkode.

/Peter
Avatar billede lp Nybegynder
18. juli 1999 - 19:15 #15
Jeg prøver lige at finde ud af hvad jeg egentlig har brug for, og hvordan jeg kan specificere det mere, jeg vender tilbage hurtigst muligt!

/Lars
Avatar billede lp Nybegynder
18. juli 1999 - 19:25 #16
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.

/Lars
Avatar billede c_wellendorf Nybegynder
19. juli 1999 - 08:26 #17
Vedlagt en god link
http://www.vb-world.net

Mvh
Avatar billede eiland Nybegynder
19. juli 1999 - 10:31 #18
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
Avatar billede lp Nybegynder
19. juli 1999 - 10:38 #19
Tak det hjalp ret meget :-)

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 :-)
Avatar billede nero Nybegynder
19. juli 1999 - 10:53 #20
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:

   if Data1.Recordset.EOF then

her er koden for ok
Avatar billede lp Nybegynder
19. juli 1999 - 10:57 #21
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?
Avatar billede eiland Nybegynder
19. juli 1999 - 16:13 #22
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.
Avatar billede lp Nybegynder
19. juli 1999 - 16:23 #23
OK!!!!!!

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!
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