Avatar billede riishoj Nybegynder
29. april 2002 - 17:54 Der er 38 kommentarer og
1 løsning

Joine databaser

Er der en som kan hjælpe mig med nedenstående script. Som det er nu, kører det en forespørgsel på tabellen "biler". Jeg vil gerne have det lavet om, så det kører en forespørgsel på 4 tabeller, - lad os kalde dem "Opel", "Toyota", "Ford" og "Mazda". Tabellerne skal altså joines, men jeg ved ikke lige hvordan man skriver det ind i scriptet!

<% Response.Buffer = True %>
<html><head>
<title>Søgeresultat</title>
</head><body>
<center>
<%
' Henter værdien fra search4.htm
strBilmaerke = Trim(Request.Form("Bilmaerke"))
strModel = Trim(Request.Form("Model"))
strAargang = Trim(Request.Form("Aargang"))
strKm = Trim(Request.Form("Km"))
strPris = Trim(Request.Form("Pris"))
strForhandler = Trim(Request.Form("Forhandler"))



' Opbygger en dynamisk SQL streng
strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler  FROM biler WHERE"
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') ORDER BY Bilmaerke, Model"

' Skaber DSN forbindelse til DBen
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DSN=riishojwebsoftdkdsn"


' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
    ' Hvis der er fundet poster på søgningen
    Response.Write "<h4 align=center><font face=Verdana>Her er resultatet af din søgning</font></h4><hr><br>"
    Response.Write "<table border=0>"
   
    Response.Write "<tr bgcolor=blue><th ><font color=white face=verdana size=2>Bilmærke</font></th><th>Model</th><th>Årgang</th><th>Km</th><th>Pris</th><th>Forhandler</th></tr>"
    Do While Not rs.EOF
      Response.Write "<tr bgcolor=red><td><font color=white>" & rs("Bilmaerke") & "</font></td>"
        Response.Write "<td>" & rs("Model") & "</td>"
        Response.Write "<td>" & rs("Aargang") & "</td>"
        Response.Write "<td>" & rs("Km") & "</td>"
        Response.Write "<td>" & rs("Pris") & "</td>"
        Response.Write "<td>" & rs("Forhandler") & "</td></tr>"



       
       
       


        rs.MoveNext
    Loop
    Response.Write "</table>"
Else
    ' Hvis der ikke er fundet poster på søgningen
    Response.Write "<p>Der er ikke fundet noget på denne søgning</p>"
End If

' Rydder op efter os
myConn.Close
Set myConn = Nothing
%>


</center>


</body>

</html>
Avatar billede riishoj Nybegynder
29. april 2002 - 17:59 #1
Overskriften skulle selvfølgelig have været "Joine tabeller"
Avatar billede a1a1 Novice
29. april 2002 - 18:10 #2
hvis vi tager lidt af den.....

strSQL = "SELECT b.ID, b.Bilmaerke, b.Model, b.Aargang, b.Km , b.Pris , b.Forhandler  FROM  (( biler b inner join mazda m ON b.bilmaerke=m.ID ) inner join tbl_opel o ON b.bilmaerke=o.ID )"
strSQL = strSQL & " WHERE (b.Bilmaerke LIKE '%" & strBilmaerke & "%') ORDER BY b.Bilmaerke, b.Model"

så er der sat to tabeller på ???
Avatar billede riishoj Nybegynder
29. april 2002 - 18:19 #3
Gør det noget, at der er nogle af posterne i tabellerne, ser har samme ID?
Avatar billede a1a1 Novice
29. april 2002 - 18:26 #4
tjanaej....:)

jeg går udfra at Bilmaerke er et ID ? (der er i en anden tabel fx. mazda)
Avatar billede a1a1 Novice
29. april 2002 - 18:27 #5
nu har du vel ikke fire tabeller med hvert sit mærke i ???
Avatar billede riishoj Nybegynder
29. april 2002 - 19:27 #6
Øh, prøver lige at forklare. F.eks. skal Mazda-forhandleren kunne indtaste data i tabellen "Mazda" og Toyota-forhandleren indtaste data i tabellen "Toyota" Det vil derfor være en teoretisk mulighed, at begge kan indtaste et bilmærke, f.eks. en Toyota i hver sin tabel og at de to bilmærker så tilfældigt vil have samme ID. Hvad sker der så, når man joiner tabellerne?
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 19:51 #7
Well, Jeg går ud fra der er tale om MSSql:
Generelt tror jeg ikke jeg vil løse problemet på den måde du har gang i. Jeg synes den nuværende forespørgsel ser meget fornuftig ud, men altså:

Hvis du skal sætte 4 tabeller sammen på den måde jeg synes du forklarer det, så er der ikke tale om join, men om union.
med union kan du sætte et antal forespørgsler sammen så det ser ud somom de var en forespørgsel ex:

select 'opel' as 'Bilmaerke', ID, Aargang, Km , P....... osv from opel where ......osv
UNION
select 'Nissan' as 'Bilmaerke', ID, Aargang, Km , P....... osv from Nissan where ......osv
UNION
osv....
Order by Bilmaerke, Model

Bemærk at i en union skal man have det samme antal felter i alle de forespørgsler der bliver sat sammen.
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 19:56 #8
Når du forespørger på den måde er en bil ikke unik på dens ID, men på Bilmærke OG ID.
Så selv om 3 biler har samme ID, kan du præcis angive hvilken der er tale om da du også har adgang til Bilmærke.

mvh
/Jesper
Avatar billede riishoj Nybegynder
29. april 2002 - 20:01 #9
Jamen, jeg kan jo forestille mig en situation, omend ret teoretisk, hvor Bilmaerke og ID er identisk!!!
Avatar billede riishoj Nybegynder
29. april 2002 - 20:17 #10
Vil det sige et jeg kan gøre sådan her?

strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler  FROM Toyota WHERE"
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') "
UNION
strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler  FROM biler WHERE"
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') "
UNION
strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler  FROM Ford WHERE"
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') "
UNION
strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , Forhandler  FROM Mazda WHERE"
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (Forhandler LIKE '%" & strForhandler & "%') ORDER BY Bilmaerke, Model"
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 20:17 #11
Under følgende forudsætninger ER Bilmaerke og ID unikt:
  Hver biltabel (f.eks. toyota) har ID som unikt felt (identityfield....)
  du navngiver 'Bilmaerke' efter tabellen

Ellers vil jeg gerne høre hvordan det kan lade sig gøre at de ikke er... ogå teoretisk :-)) Jeg kan stadig ikke forstå hvorfor du vil lave 4(and counting...) tabeller med Bil-mærker. De ting du udsøger her ser rimelig fælles ud for alle biler..... Man kunne vel bare lave bilmærket om til et numerisk BilMaerkeID, og så JOINE den med en ny tabel kaldet BilMaerke. Det er så simpelt som:

SELECT ID, BM.Bilmaerke, Model, Aargang, Km , Pris , Forhandler FROM biler
inner join BilMaerke as BM
on biler.BilmaerkeId = BM.BilmaerkeId
Where..... osvosvosv and..and... and BM.Bilmaerke LIKE '%ford%'

Og jeg synes det ser ud til at du får det samme ud af det som i den anden.... bortset fra at når du skla oprettet nye bilmærker, er det i denne løsning 'bare' at indsætte en ny entry i BilMaerker..
/Jesper
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 20:19 #12
Hvis du laver en tabel til Mazda er der vel ikke nogen grund til at søge i andet end i mazda-tabellen efter Mazda eller??
Avatar billede riishoj Nybegynder
29. april 2002 - 20:30 #13
Hmm. Nu er jeg altså blevet forvirret. Jeg prøver lige at rekapitulere, hvis i stadig gider at hænge på.
Jeg har i en Access-database lavet en tabel kaldet "biler" Til denne tabel har jeg lavet scripts, som kan indsætte, slette og opdatere data i tabellen. Desuden har jeg et script, som gør det muligt at søge i tabellen. Dette script er hele kernen i systemet, altså at man skal kunne gå ind og søge på et bilmærke, model, pris etc. De forhandlere, som tilslutter sig databasen skal kunne gå ind og indsætte, slette og opdatere data, men da man ikke skal kunne slette andres biler, vil jeg ikke nøjes med 1 tabel med 4 tabeller (forudsat at der er 4 brugere=forhandlere). Når der så køres en forespørgsel fra søgesiden, skal denne søge i alle fire tabeller. Derfor troede jeg, at det kunne klares med at joine disse i søgningen.
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 20:45 #14
Tror du så ikke løsningen er at have et felt der siger noget om hvad det er for en forhandler der 'ejer' en post i databasen i stedet, og så kun lade en forhandler der 'ejer' en post slette og editere i det :-)
Avatar billede riishoj Nybegynder
29. april 2002 - 20:51 #15
Jo, jeg er frisk på en hver løsning, som går det muligt kun at ændre egne data. Men jeg har ingen anelse om, hvordan man laver det du beskriver :(
Avatar billede riishoj Nybegynder
29. april 2002 - 21:21 #16
Har I opgivet mig. Please respond hvis I ikke er med mere.
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 21:35 #17
Her kommer de skridt du skal igennem:
1) opret en tabel kaldet forhandler med forhandlerId, navn, udername, pass (så de kan logge på... mon ikke du har det et andet sted i systemet??)
2) fyld tabellen op med de forhandlere der er i systemet (eller genbrug en gammel tabel hvis den allerede eksisterer)
3) opret et nummerisk felt i biler kaldet ForhandlerId
4) Opdater ForhandlerId i biler så det passer med forhandlernes IDer
5) Nu er du i stand til KUN at vise f.eks. forhandler med forhandlerID=3's biler til ham!

Når du for eftertiden opretter biler skal du sørge for at have ForhandlerIDen med.
Avatar billede _just4fun_ Nybegynder
29. april 2002 - 21:39 #18
Når nu forhandlernavnet er blevet lagt over i en anden tabel, men har et fælles felt (forhandlerID), kan man bruge en join. Den ser så ud som flg hvis du vil vise forhandler 3's biler:

SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler
inner join forhandler as for
on biler.ForhandlerId = for.forhandlerId
WHERE..... and for.forhandlerId = 3
Avatar billede riishoj Nybegynder
29. april 2002 - 21:49 #19
OK. Jeg tror, at jeg har fattet det meste. Kan vi vende tilbage i morgen aften, så jeg har haft tid til at lave og teste dit forslag? Foreløbig mange tak for hjælpen :)
Avatar billede riishoj Nybegynder
30. april 2002 - 18:33 #20
Jeg har prøvet at arbejde med dit forslag. Desværre virker det ikke! Scriptet ser sådan ud

<% Response.Buffer = True %>
<html><head>
<title>Søgeresultat</title>
</head><body>
<center>
<%
' Skaber DSN forbindelse til DBen
Set myConn = Server.CreateObject("ADODB.Connection")
myConn.Open "DSN=riishojwebsoftdkdsn"


'  SQL forespørgsel
SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3
' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)

If Not (rs.BOF Or rs.EOF) Then
    ' Hvis der er fundet poster på søgningen
    Response.Write "<h4 align=center><font face=Verdana>Her er resultatet af din søgning</font></h4><hr><br>"
    Response.Write "<table border=0>"
   
    Response.Write "<tr bgcolor=blue><th>Id</th><th ><font color=white face=verdana size=2>Bilmærke</font></th><th>Model</th><th>Årgang</th><th>Km</th><th>Pris</th><th>Forhandler</th></tr>"
    Do While Not rs.EOF
        Response.Write "<tr bgcolor=red><td><font color=white>" & rs("Id") & "</font></td>"
        Response.Write "<td>" & rs("Bilmaerke") & "</td>"
        Response.Write "<td>" & rs("Model") & "</td>"
        Response.Write "<td>" & rs("Aargang") & "</td>"
        Response.Write "<td>" & rs("Km") & "</td>"
        Response.Write "<td>" & rs("Pris") & "</td>"
        Response.Write "<td>" & rs("Forhandler") & "</td></tr>"



       
       
       


        rs.MoveNext
    Loop
    Response.Write "</table>"
Else
    ' Hvis der ikke er fundet poster på søgningen
    Response.Write "<p>Der er ikke fundet noget på denne søgning</p>"
End If

' Rydder op efter os
myConn.Close
Set myConn = Nothing
%>


</center>


</body>

</html>

Jeg har lavet de ændringer og tilføjelser i tabellerne, som du beskrev. Kan du finde fejlen(ene)?
Avatar billede riishoj Nybegynder
30. april 2002 - 18:35 #21
Øh, jeg glemte at vise fejlmeddelelsen. Den kommer her!

Microsoft VBScript compilation error '800a03fd'

Expected 'Case'

/Biler_paa_Vestfyn/id3.asp, line 13

SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3
-------^
Avatar billede riishoj Nybegynder
30. april 2002 - 18:37 #22
Nej, der er sådan her

Microsoft VBScript compilation error '800a03fd'

Expected 'Case'

/Biler_paa_Vestfyn/id3.asp, line 13

SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join
-------^

forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 19:06 #23
hehe... jeg klippede lidt i det fordi jeg ikke ikke gad lave alle de betingelser... Men her kommer så hele strSQL:

strSQL = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , forh.Forhandler FROM biler "
strSQL =  strSQL & "inner join forhandler as forh on biler.ForhandlerId = forh.forhandlerId "
strSQL = strSQL & " (Bilmaerke LIKE '%" & strBilmaerke & "%')"
strSQL = strSQL & " AND (Model LIKE '%" & strModel & "%')"
strSQL = strSQL & " AND (Aargang LIKE '%" & strAargang & "%')"
strSQL = strSQL & " AND (Km BETWEEN " & strKm & ")"
strSQL = strSQL & " AND (Pris BETWEEN " & strPris & ")"
strSQL = strSQL & " AND (forh.Forhandler LIKE '%" & strForhandler & "%') "
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 19:07 #24
Ups....BETWEEN kræver 2 parametre og bruges som:
km Between 100 and 200

km skal være mellem 100 og 200... Samme for pris
Avatar billede riishoj Nybegynder
30. april 2002 - 19:21 #25
Din sidste kommentar forstår jeg ikke!
Avatar billede riishoj Nybegynder
30. april 2002 - 19:26 #26
Hm - Det du foreslår er jo et script med en dynamisk SQL streng. Min udgave ovenover skulle være et eksempel på hvad forhandleren med id=3 for ud af sin forespørgsel.
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 19:34 #27
aarggh sorry!! Er ved at tabe focus :-)
Pointen var at du i dit sidste eksempel skriver
-----
'  SQL forespørgsel
SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler FROM biler inner join forhandler as for on biler.ForhandlerId = for.forhandlerId WHERE..... and for.forhandlerId = 3
' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)
----
Men... hvor er strSQL ;-)
Mon ikke der skulle stå
----
'  SQL forespørgsel
strSQL  = "SELECT ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler " & _
          "FROM biler inner join forhandler as for " & _
          "on biler.ForhandlerId = for.forhandlerId " & _
          "WHERE for.forhandlerId = 3"
' Skaber et recordset udfra SQL strengen
Set rs = myConn.Execute(strSQL)
Avatar billede riishoj Nybegynder
30. april 2002 - 19:40 #28
Det prøver jeg lige
Avatar billede riishoj Nybegynder
30. april 2002 - 19:48 #29
Så siger den

ADODB.Recordset.1 error '80004005'

SQLState: S1000
Native Error Code: -3007
[INTERSOLV][ODBC SequeLink driver][ACCESS][Microsoft][ODBC Microsoft Access Driver] The specified field 'ID' could refer to more than one table listed in the FROM clause of your SQL statement.


/Biler_paa_Vestfyn/id3.asp, line 17

Er det fordi jeg har feltnavnet ID i både "biler" tabellen og i "forhandler"

Grunden er at jeg gerne vil kunne  bruge

strSQL = "Delete from biler where Id = " & replace(request.form("RecordToDelete"),"'","''")
Conn.Execute(strSQL)

når forhandleren skal ind og slette.
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 20:01 #30
Der er lige det det er :-)) Så hvis den ID du er interesseret i at få ud er den fra Bilerne  skal man angive det ved at sætte biler foran i joinen så den ikke er i tvivl:
strSQL  = "SELECT biler.ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler " & _
          "FROM biler inner join forhandler as for " & _
          "on biler.ForhandlerId = for.forhandlerId " & _
          "WHERE for.forhandlerId = 3"
Avatar billede riishoj Nybegynder
30. april 2002 - 20:21 #31
Så siger den

Microsoft VBScript compilation error '800a0408'

Invalid character

/Biler_paa_Vestfyn/id3.asp, line 12

strSQL  = "SELECT biler.ID, Bilmaerke, Model, Aargang, Km , Pris , for.Forhandler " & _
------^
Avatar billede riishoj Nybegynder
30. april 2002 - 22:15 #32
Har du nogen ide om, hvad der går galt? Hvis vi ikke kan komme videre, gider du så ikke lige sige til.
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 22:18 #33
Den eneste forskel fra deroppe hvor den kom med
Native Error Code: -3007
er at der er sat et "biler." foran ID!!! Det kan den altså ikke begynde at bitche med en
"Invalid character" over!
Avatar billede _just4fun_ Nybegynder
30. april 2002 - 22:20 #34
ligger den .asp og .mdb tilgængeligt et eller andet sted?
Avatar billede Slettet bruger
30. april 2002 - 22:27 #35
riis > Hvorfor vil du lave seperat tabel til hvert bilmærke? Det er da smartere at bruge dit første udgangspunkt med en tabel til biler, og så tilføje et felt "bilmærke" ?!
Avatar billede riishoj Nybegynder
30. april 2002 - 22:38 #36
just4fun> Jeg kunne evt. maile asp. og mdb. filerne til dig.

ezolu> Jeg vil heller ikke lave seperate tabeller til hvert bilmærke, men til hver forhandler. Det jeg forsøger at lave, er et system, så hver forhandler kan gå ind og opdatere deres egen tabel, men samtidig skal der kunne søges i alle tabellerne på en gang. Det var derfor, at jeg troede, at man kunne joine disse tabeller.
Avatar billede riishoj Nybegynder
30. april 2002 - 22:55 #37
Holder for idag. Håber at I kigger forbi i morgen! :)
Avatar billede riishoj Nybegynder
30. april 2002 - 22:57 #38
Lige inden jeg lukker. Jeg har en mistanke om, at min db på serveren ikke fungerer optimalt og at det muligvis giver fejlene. Checker med min udbyder i morgen.
Avatar billede _just4fun_ Nybegynder
01. maj 2002 - 10:01 #39
Mailme, (pak lige det hele ned i een .zip...)
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