Avatar billede wermelin Nybegynder
19. februar 2001 - 22:25 Der er 24 kommentarer og
1 løsning

Problem med INNER JOIN!

Hejsan!

Jeg har lavet en database med 2 tabeller! En kundereg og en vare. Jeg har lavet en en-til-en relation mellem dem - dvs. VAREID og KUNDEID. I de to tabeller er der en del kolonner! Så langt så godt...
Jeg har så lavet en søgemaskine som søger på kolonnen vare i varetabellen - men den skal samtidig kunne søge på to kolonner i kunderegtabellen (altså så søgningen bliver indskrænket for brugeren!)
Jeg har gjort følgende:

strSQL = \"SELECT * FROM VARE INNER JOIN KUNDEREG ON VARE.VAREID = KUNDEREG.VAREID WHERE\"
strSQL = strSQL & \" (VARE.VARENAVN LIKE \'%\" & strKEYWORD & \"%\')\"
strSQL = strSQL & \" OR (VARE.VAREBESKRIVELSE LIKE \'%\" & strKEYWORD & \"%\')\"

IF strKATEGORIKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (VARE.KATEGORI LIKE \'%ALLE%\')\"
ELSE
    strSQL = strSQL & \" AND (VARE.KATEGORI LIKE \'%\" & strKATEGORIKEYWORD & \"%\')\"
END IF

IF strAMTKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (KUNDEREG.AMT LIKE \'%ALLE%\')\"
ELSE
    strSQL = strSQL & \" AND (KUNDEREG.AMT LIKE \'%\" & strAMTKEYWORD & \"%\')\"
END IF
.
.
.

Men får følgende fejl:
Microsoft OLE DB Provider for ODBC Drivers fejl \'80040e10\'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

Er der nogen som kan hjælpe???

- Wermelin
Avatar billede eagleeye Praktikant
19. februar 2001 - 23:58 #1
Fejlen \"Too few parameters. Expected 1\" betyder at en kolonne ikke eksistere.

Spørgsmål: Skal VARE.KATEGORI være KUNKEREG.KATEGORI??

Du skriver du søger på to kolonner i KUNDEREG, men du har kun vist en.
Avatar billede eagleeye Praktikant
20. februar 2001 - 00:02 #2
Ellers så prøv at udskrive strSQL efter du har bygget den færdig.
Du kan benytte Response.Write strSQL Eller <%=strSQL%>

Det er let at se hvis man har glemt et \' eller måske mangler noget tekst.

Hvordan får du fat i strKATEGORIKEYWORD og strAMTKEYWORD.
med Request(\"strAMTKEYWORD\") ??
Avatar billede wermelin Nybegynder
20. februar 2001 - 10:41 #3
Okay!
I varetabellen er der følgende kolonner som der skal søges i: kategori, varenavn og varebeskrivelse og i kunderegtabellen er der følgende: amt, by og postnr.
(Og det er kun noget af koden jeg satte ind, for ellers ville spørgsmålet se for uoverskueligt ud - altså hvis hele koden var der.)
Jeg har tjekket ALT for stavefejl og manglende kolonner - og jeg har udskrevet strSQL.
strKATEGORIKEYWORD får jeg fra
strKATEGORIKEYWORD = Trim(Request.Form(\"KATEGORI\"))

Hvis du vil have hele koden så kan du godt få den?? Jeg synes efterhånden jeg har gloet mig blind på den - men jeg er næsten sikker på at fejlen ligger i INNER JOIN sætningen....!
Avatar billede gandalfthewhite Nybegynder
20. februar 2001 - 12:29 #4
Vis venligst koden hvor du skyder strSQL mod databasen.
Avatar billede wermelin Nybegynder
20. februar 2001 - 12:48 #5
SELECT * FROM VARE INNER JOIN KUNDEREG ON VARE.VAREID = KUNDEREG.VAREID WHERE (VARE.VARENAVN LIKE \'%Sko%\') OR (VARE.VAREBESKRIVELSE LIKE \'%Sko%\') AND (VARE.KATEGORI LIKE \'%Radio/TV%\') AND (KUNDEREG.AMT LIKE \'%Nordsjællands amt%\') AND (KUNDEREG.POSTNR LIKE \'%1000%\') AND (KUNDEREG.BY LIKE \'%Rønne%\') AND (VARE.UGE LIKE \'%10%\')
Avatar billede gandalfthewhite Nybegynder
20. februar 2001 - 12:51 #6
Det jeg mente var den del af koden hvor
set rs = conn.execute sSql m.m.
eller hvordan du nu engang håndtere dette.
Avatar billede wermelin Nybegynder
20. februar 2001 - 13:00 #7
Du får hele koden her!

<%
strKEYWORD = Trim(Request.Form(\"KEYWORD\"))
strKATEGORIKEYWORD = Trim(Request.Form(\"KATEGORI\"))
strAMTKEYWORD = Trim(Request.Form(\"AMT\"))
strPOSTNRKEYWORD = Trim(Request.Form(\"POSTNR\"))
strBYKEYWORD = Trim(Request.Form(\"BY\"))
strUGEKEYWORD = Trim(Request.Form(\"UGE\"))
If Len(strKEYWORD) = 0 Then
Response.Clear
Response.Redirect(\"search.asp\")
Else
strKEYWORD = Replace(strKEYWORD,\"\'\",\"\'\'\")
strKATEGORIKEYWORD = Replace(strKATEGORIKEYWORD,\"\'\",\"\'\'\")
strAMTKEYWORD = Replace(strAMTKEYWORD,\"\'\",\"\'\'\")
strPOSTNRKEYWORD = Replace(strPOSTNRKEYWORD,\"\'\",\"\'\'\")
strBYKEYWORD = Replace(strBYKEYWORD,\"\'\",\"\'\'\")
strUGEKEYWORD = Replace(strUGEKEYWORD,\"\'\",\"\'\'\")
End If

strSQL = \"SELECT * FROM VARE INNER JOIN KUNDEREG ON VARE.VAREID = KUNDEREG.VAREID WHERE\"
strSQL = strSQL & \" (VARE.VARENAVN LIKE \'%\" & strKEYWORD & \"%\')\"
strSQL = strSQL & \" OR (VARE.VAREBESKRIVELSE LIKE \'%\" & strKEYWORD & \"%\')\"

IF strKATEGORIKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (VARE.KATEGORI LIKE \'%Radio/TV%\')\"
ELSE
    strSQL = strSQL & \" AND (VARE.KATEGORI LIKE \'%\" & strKATEGORIKEYWORD & \"%\')\"
END IF

IF strAMTKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (KUNDEREG.AMT LIKE \'%Nordsjællands amt%\')\"
ELSE
    strSQL = strSQL & \" AND (KUNDEREG.AMT LIKE \'%\" & strAMTKEYWORD & \"%\')\"
END IF

IF strPOSTNRKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (KUNDEREG.POSTNR LIKE \'%1000%\')\"
ELSE
    strSQL = strSQL & \" AND (KUNDEREG.POSTNR LIKE \'%\" & strPOSTNRKEYWORD & \"%\')\"
END IF

IF strBYKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (KUNDEREG.BY LIKE \'%Rønne%\')\"
ELSE
    strSQL = strSQL & \" AND (KUNDEREG.BY LIKE \'%\" & strBYKEYWORD & \"%\')\"
END IF

IF strUGEKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (VARE.UGE LIKE \'%10%\')\"
ELSE
    strSQL = strSQL & \" AND (VARE.UGE LIKE \'%\" & strUGEKEYWORD & \"%\')\"
END IF

strDSN = \"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\"&Server.MapPath(\"varedatabase.mdb\")

Set myConn = Server.CreateObject(\"ADODB.Connection\")
myConn.Open strDSN

Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
Response.Write \"<table border=\"\"0\"\" cellspacing=\"\"0\"\" width=\"\"30%\"\" cellpadding=\"\"3\"\" align=\"\"center\"\">\"
Do While Not rs.EOF
Response.Write \"<tr align=\"\"left\"\"><td>\" & \"Varenavn:&nbsp;\" & \"<b>\" & rs(\"VARE.VARENAVN\") & \"Varebeskrivelse:\" & rs(\"VARE.VAREBESKRIVELSE\")
rs.MoveNext
Loop
Response.Write \"</td></tr></table>\"
Else
Response.Write \"<div align=\"\"center\"\">INTET RESULTAT</div>\"
End If
myConn.Close
Set myConn = Nothing
%>
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:06 #8
IF strUGEKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AND (VARE.UGE LIKE \'%10%\')\"
.....

Spørgsmål: VARE.UGE lyder i mine øre som et tal og ikke en streng?
Du har \'\' omkring 10 : SELECT * ..... AND (VARE.UGE LIKE \'%10%\')
Avatar billede wermelin Nybegynder
20. februar 2001 - 13:13 #9
UGE er et tal i db\'en, det er korrekt!
Men jeg forstår ikke helt dit spørgsmål tror jeg?
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:18 #10
Hvis det er et tak kan du ikke benytte LIKE \'%10%\' så skal du skrive LIKE %10%. Hvis man overhoved kan det.

Jeg tror ikke man kan benytte LIKE sammen med tal kolonner. Der skal man bruge = > < tegn.
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:20 #11
Der skulle vist virke med LIKE \"%10%\". Det virker internt i Access. JEg ved ikke om man kan gøre der fra SQL du kan jo evt prøve.
Avatar billede wermelin Nybegynder
20. februar 2001 - 13:24 #12
Nej man kan ikke %10%!

Hmm..... men man bør da kunne indskrænke en søgning ved også at søge i talkolonner..!?
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:26 #13
Har du prøvet med LIKE \"%10%\":

strSQL = strSQL & \" AND (VARE.UGE LIKE \"\"%10%\"\")\"
Avatar billede wermelin Nybegynder
20. februar 2001 - 13:27 #14
Jeg får en fejl når jeg prøver med \"%10%\" - men jeg benytter ellers access!
Avatar billede wermelin Nybegynder
20. februar 2001 - 13:29 #15
Nu får jeg denne fejl:
Microsoft OLE DB Provider for ODBC Drivers fejl \'80040e10\'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 3.

Jeg har også ændret det i postnr.! Dvs istedet for expected 1 så er det nu 3!!
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:41 #16
Hvis du vil havde alle tal hvorfor så ikke bare undlade den i søgningen??

eks:
IF strUGEKEYWORD <> \"ALLE\" THEN
    strSQL = strSQL & \" AND (VARE.UGE LIKE %\" & strUGEKEYWORD & \"%)\"
END IF
Avatar billede eagleeye Praktikant
20. februar 2001 - 13:55 #17
Hvis du søger på LIKE \'%1000%\' ved post nummer får du alle post numre som indeholder 1000 i tallet. Eks.vis: 1000 og 210002, men ikke 1001/1200 ovs.

Hvis du vil havde alle postnumre så skal du bare undlade at begrænse på postnummer.

Jeg har ikke mulighed for at teste noget før jeg kommer hjem, ved 16.30 tiden.
Avatar billede eagleeye Praktikant
20. februar 2001 - 16:30 #18
OK jeg har prøvet lidt af hver med LIKE sammen med et tal-felt. Det kan jeg ikke få til at virke.

Men som jeg før skrev: Hvis du ikke vil begrænse (hvade alle med) på eks.vis VARE.UGE så unlad at includere den i WHERE !!

Hvis du vil begrænse den så må du benytte (VARE.UGE > 1 AND VARE.UGE < 20) Eller (VARE.UGE BETWEEN 1 AND 20)
Avatar billede wermelin Nybegynder
21. februar 2001 - 09:38 #19
Tak for indsatsen! :o)
Jeg prøver at se på dine to alternativer - og undskyld jeg først svarer nu, men jeg måtte formatere min hd i går!!
Avatar billede wermelin Nybegynder
22. februar 2001 - 14:38 #20
Nå, nu prøver jeg at bygge hele maskinen op fra bunden.... jeg tager et led af gangen!
Og så kom jeg allerede til det første problem!
eagleeye: Du har tidligere svaret på et af mine asp-spørgsmål ang. absolutsøgning (altså hvis man søger på sko - så finder den KUN sko og ikke også skoda og skopuds osv!)
Her har jeg prøvet at skrive det du skrev til mig dengang, men det virker ikke!
strSQL = \"SELECT * FROM VARE, KUNDEREG WHERE\"
strSQL = strSQL & \" (VARE.VARENAVN=\'absolut\' LIKE \'%\" & strKEYWORD & \"%\')\"

Help?
Avatar billede eagleeye Praktikant
22. februar 2001 - 14:50 #21
Jeg gættet på det er varenavn du søger på, så prøv denne:

strSQL = \"SELECT * FROM VARE, KUNDEREG WHERE\"
strSQL = strSQL & \" (VARE.VARENAVN LIKE \'%\" & strKEYWORD & \"%\')\"

Avatar billede wermelin Nybegynder
22. februar 2001 - 14:52 #22
Ja, det er rigtigt - altså at det er varenavn jeg søger på!
Og den sætning du gav mig, er den jeg køre med nu - og den tager ALT med fx. SKO med! Skoda, skopuds, skole.... men det er jo uinteressant hvis du søger efter et par sko! :o)
Avatar billede eagleeye Praktikant
22. februar 2001 - 14:57 #23
Hvis du kun vil havde sko så:

strSQL = \"SELECT * FROM VARE, KUNDEREG WHERE\"
strSQL = strSQL & \" (VARE.VARENAVN = \'\" & strKEYWORD & \"\')\"

Den søger på varenavn = sko og ikke andet.
Avatar billede wermelin Nybegynder
22. februar 2001 - 15:21 #24
Great! Tak - du skal nok få en masse point.... meeen jeg lader lige spørgsmålet stå åbent.. det kunne jo være at jeg ramler ind i andre problemer... og du er jo en sand ekspert i asp :o)
Avatar billede eagleeye Praktikant
22. februar 2001 - 20:50 #25
:-) du skal da bare spørge.
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