Avatar billede ravnkilde Nybegynder
01. august 2006 - 13:20 Der er 9 kommentarer og
1 løsning

Udtræk fra flere tabeller i database - vis i drop down

Jeg har opbygget et produktkatalog i Access. Databasen består af en række tabeller, hvoraf Products er den centrale tabel. Til hvert produkt knytter der sig brochurer (på flere sprog), billeder, video, PPT (på flere sprog), plakater (på flere sprog) og en prisliste.

Mit ønske er at lave et udtræk på en website, hvor siden opbygges med ét produkt per linie. På samme linie vises brochurer (drop down med URL til fil), billeder (URL til fil), video (URL til fil), PPT (drop down med URL til fil), plakter (drop down med URL til fil) og endelig prisliste (URL til fil).

Jeg kan lave en forespørsel i Access, men den viser flere linier for det samme produkt da den ikke viser eks. alle brochurer i en dialogboks. Dvs. hvis der er 5 sprog-versioner af brochuren bliver der også 5 liner med det samme produkt. Desuden viser min forespørgsel kun produkter, hvor der er tilknyttet brochure, billede, video, PPT, plakat og prisliste. Der kan være tilfælde hvor der eks. ikke er video med, men produktlinien skal vises alligevel.

Opgaven er altså at lave SQL'en inkl. drop down bokse i de tilfælde hvor der er mere end en brochure/PPT eller plakat.

Jeg viser min forespørgsel samt min kode til drop down boksen, så håber jeg at der nogle, der kan være behjælpelig med at lave den rigtige SQL.

--- start kode SQL ---
SELECT Products.Pro_Name, Chapters.Chapter, Products.Competence_ID, Brochures.Sprog_ID, Brochures.Bro_URL, Pictures.Pic_URL, Videos.Video_URL, PPT.Sprog_ID, PPT.PPT_URL, Posters.Sprog_ID, Posters.Poster_URL, JPP.JPP_URL
FROM ((((Chapters INNER JOIN ((Products INNER JOIN Brochures ON Products.Pro_ID = Brochures.Pro_ID) INNER JOIN JPP ON Products.Pro_ID = JPP.Pro_ID) ON Chapters.Chapter_ID = Products.Chapter_ID) INNER JOIN Pictures ON Products.Pro_ID = Pictures.Pro_ID) INNER JOIN Posters ON Products.Pro_ID = Posters.Pro_ID) INNER JOIN PPT ON Products.Pro_ID = PPT.Pro_ID) INNER JOIN Videos ON Products.Pro_ID = Videos.Pro_ID;
--- stop kode SQL ---


--- start kode drop down ---
<form>
<%
Set tempConn = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("../database/products.mdb")
tempConn.Open strDSN
strSQL = "SELECT Pro_ID, Bro_URL FROM Brochures"
Set rs = tempConn.Execute(strSQL)
Response.Write "<select name=dropdown size=1>"
Do While Not rs.EOF
  Response.Write "<option value=" & rs("Pro_ID") & ">" & rs("Bro_URL") & "</option>"
    ' Response.Write "<option value=" & rs("Bro_URL") & ">""</option>"
    rs.MoveNext
Loop
Response.Write "</select>"
tempConn.Close
Set tempConn = Nothing
%>
</form>
--- stop kode drop down ---
Avatar billede meltinis Nybegynder
01. august 2006 - 15:37 #1
OK... dette er noget af en opgave, og jeg har desværre ikke tid til at hjælpe dig hele vejen, men jeg har haft et lignende problem og kan give nogle retningslinier.
For at få de poster med hvor der ikke er en brochure skal du bruge en LEFT OUTER JOIN.
Mht. flere poster for samme produkt pga. flere brochurer kan du løse det ved at lave en løkke der gemmer produktID'et (hvad det så end er) i en temp-variabel og bliver ved man at fylde i din dropdown så længe at produktID'et er det samme. På denne måde kan du lave alle dine poster inkl. dropdowns i ét loop (eller dvs. ét loop med et nested loop i)
Avatar billede ravnkilde Nybegynder
01. august 2006 - 16:11 #2
metinis: LEFT (OUTER) JOIN virker! Nu får jeg alle produkter listet, selvom de mangler eks. en brochure. Det virker i hvert fald i Access.

Kan du hjælpe mig lidt med løkken og temp-variabel... Bemærk at jeg på samme produktlinie skal have flere drop downs (brochure, PPT og poster).

Pro_ID hentes fra den centrale Produkt-tabel og er også navnet på den tilhørende brochure. Går igen ved billeder, video, PPT, poster og prisliste.
Avatar billede meltinis Nybegynder
01. august 2006 - 18:41 #3
Har du mulighed for at skrive hvordan tabellen (tabellerne ser ud) og deres relationer? Jeg har lidt svært ved at få 'udkodet' det fra din SQL-sætning
Avatar billede meltinis Nybegynder
01. august 2006 - 18:42 #4
Ellers skal jeg bare vide hvor mange dropdown du har... (det er nemlig det samme antal loops du skal bruge)
Avatar billede ravnkilde Nybegynder
01. august 2006 - 21:46 #5
metinis: Jeg svarer i morgen formiddag når jeg ved min arbejds-PC igen. Takker foreløbigt.
Avatar billede ravnkilde Nybegynder
02. august 2006 - 09:10 #6
Hej meltinis!

På mit udtræk skal jeg på en linie have flg. data:

|Produktnavn|Produktnr.|Brochure (drop-down)|Billede (URL)|Video (URL)|PPT (dropdown)|Poster (dropdown)|Prisliste (URL)

Jeg har altså tre drop downs pr. produkt.

Hver drop down består af sprog og en URL, således at når eks. Dansk vælges, så linkes der automatisk til den danske brochurer.

Er det hjælp nok?
Avatar billede ravnkilde Nybegynder
02. august 2006 - 15:01 #7
meltinis: Hold lige hesten, jeg er kommet lidt videre på egen hånd, men får brug din hjælp med drop-down loopet. Jeg kommer tilbage med min kode...
Avatar billede ravnkilde Nybegynder
02. august 2006 - 15:58 #8
meltinis: jeg er nu kommet så langt at jeg kun mangler de tre drop-down bokse til brochurer, PPT og poster. Fra hver af disse tabeller hentes sprog og URL.

Først viser jeg SQL'en fra Access med alle dataudtræk og sidst min kode, jeg bruger på websitet (her har jeg angivet hvor de tre drop downbokse skal placeres). Jeg kan ikke lige gennemskue hvordan drop down delen kan implementeres i den øvrige kode.

Håber du kan hjælpe, jeg er næsten "i mål"...

--- start SQL fra Access ---
SELECT Products.Pro_Name, Brochures.Sprog_ID, Brochures.Bro_URL, Pictures.Pic_URL, Videos.Video_URL, PPT.Sprog_ID, PPT.PPT_URL, Posters.Sprog_ID, Posters.Poster_URL, JPP.JPP_URL
FROM ((((Chapters INNER JOIN ((Products LEFT JOIN Brochures ON Products.Pro_ID = Brochures.Pro_ID) LEFT JOIN JPP ON Products.Pro_ID = JPP.Pro_ID) ON Chapters.Chapter_ID = Products.Chapter_ID) LEFT JOIN Pictures ON Products.Pro_ID = Pictures.Pro_ID) LEFT JOIN Posters ON Products.Pro_ID = Posters.Pro_ID) LEFT JOIN PPT ON Products.Pro_ID = PPT.Pro_ID) LEFT JOIN Videos ON Products.Pro_ID = Videos.Pro_ID
WHERE (((Products.Competence_ID)=2));
--- stop SQL fra Access ---

--- start kode website ---
<%
'Dim variabler
Dim objConn
Dim objRs
Dim strSQL, strPro_Name, strChapter_ID, strBGColor, strProducts, strPic_URL, strVideo_URL, strJPP_URL, strPic, strVideoPic, strJPP_PIC
Dim blnBGColor
Dim OldChapter

'Database forbindelse
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("../../../database/products.mdb")

'SQL
strSQL = "SELECT Products.Pro_Name, Chapters.Chapter, Products.Competence_ID, Pictures.Pic_URL, Videos.Video_URL, JPP.JPP_URL FROM (((Chapters INNER JOIN Products ON Chapters.Chapter_ID = Products.Chapter_ID) LEFT JOIN Pictures ON Products.Pro_ID = Pictures.Pro_ID) LEFT JOIN Videos ON Products.Pro_ID = Videos.Pro_ID) LEFT JOIN JPP ON Products.Pro_ID = JPP.Pro_ID WHERE (((Products.Competence_ID)=2));"

Set objRs = objConn.Execute(strSQL)
If Not (objRs.BOF AND objRs.EOF) Then
    Do While Not objRs.EOF
        strName = objRs("Pro_Name")
        strChapter = objRs("Chapter")
        strPic_URL = objRs("Pic_URL")
        strVideo_URL = objRs("Video_URL")
        strJPP_URL = objRs("JPP_URL")
                       
        if OldChapter <> strChapter then
          strProducts = strProducts & "<table width=""100%"" border=""0"" cellpadding=""2"" cellspacing=""1""><tr bgcolor=""#CCCCCC""><td colspan=""7""><b>" & strChapter & "</b></td></tr><tr bgcolor=""#CCCCCC""><td width=""20%""><b>Product name</b></td><td><b>Brochure</b></td><td><b>Picture</b></td><td width=""10%""><b>Video</b></td><td><b>PPT</b></td><td><b>Poster</b></td><td><b>JPP</b></tr>"
          OldChapter = strChapter
        end if

        If blnBGColor = True Then
            strBGColor = "#FFFFFF"
            blnBGColor = False
        Else
            strBGColor = "#eeeeee"
            blnBGColor = True
        End If 
       
        If isnull(objRs("Pic_URL")) Then
  strPic = ""
Else
  strPic = "<img src=""../../images/icons/jpeg.jpg"" alt=""Picture"" border=""0"" />"
End If         
       
        If isnull(objRs("Video_URL")) Then
  strVideoPic = ""
Else
  strVideoPic = "<img src=""../../images/icons/videokam.gif"" alt=""Video"" border=""0"" /> "
End If   

        If isnull(objRs("JPP_URL")) Then
  strJPP_Pic = ""
Else
  strJPP_Pic = "<img src=""../../images/icons/zip.jpg"" alt=""JPP"" border=""0"" />"
End If     
   
strProducts = strProducts & "<tr bgcolor="""& strBGColor &"""><td>"&strName&"</td><td>brochure drop</td><td><a href="&strPic_URL&">"& strPic &"</a></td><td><a href="&strVideo_URL&">"& strVideoPic &"</a></td><td>PPT drop</td><td>Poster drop</td><td><a href="&strJPP_URL&">"& strJPP_Pic &"</a></td></tr>"

        objRs.MoveNext
        if objRs.EOF then
          strProducts=strProducts & "</table>"
        else
          if OldChapter <> objRs("Chapter") then
            strProducts=strProducts & "</table><br>"
          end if
        end if
    Loop
Else
    strProducts = "<table width=""100%"" border=""0"" cellpadding=""2"" cellspacing=""1""><tr><td>Der er ingen Produkter!</td></tr></table>"
End If

objConn.Close
Set objConn = Nothing
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Products - Flatwork</title>
<style type="text/css">
<!--
td {
    font-family: Tahoma, Arial, Geneva, Helvetica;
    font-size: small;
}
-->
</style>
</head>

<body>
<!--Start liste
--><%
Response.Write strProducts
%>
</body>
</html>
--- stop kode website ---
Avatar billede ravnkilde Nybegynder
03. august 2006 - 10:44 #9
meltinis: Tror du at du kan hjælpe?
Avatar billede ravnkilde Nybegynder
08. august 2006 - 11:25 #10
Lukker.
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