Avatar billede ravnkilde Nybegynder
08. august 2006 - 11:44 Der er 26 kommentarer og
2 løsninger

Vis ikon/URL (QueryString) ved udtræk fra DB

Jeg har en produktliste. Til hvert produkt er der knyttet brochure, picture, video, PPT, poster og "JPP". Jeg bruger QueryString til at forbinde hvert produkt med den respektive brochure, picture osv. Nedenstående kode genererer dog et QueryString link uanset om der er en brochure til det pågældende produkt. Jeg vil gerne have det således at linket kun vises, såfrem der er en brochure eller picture til det pågældende produkt. Ellers kommer brugeren til at klikke forgæves for mange gange (QueryString-linket viser en nye side med indhold eller beskeden om at der ikke findes nogen brochure til det valgte produkt).

Brochure tabellen hedder Brochures og består af felterne Bro_ID, Bro_Name (join fra tabellen Products), Bro_Language (join fra tabellen Language) og Bro_URL.

Jeg har altså brug for en stump kode der checker om det en (eller flere) brochure tilknyttet et produkt. Hvis det er tilfældet skal ikon/QueryString vises. Hvis produktet ikke har nogen brochure vises bare blankt felt.

Jeg har forsøgt med noget lign.:
--------------------------------------
If isnull(objRs("Bro_URL")) Then
strXXX = ""
Else
strXXX = "<a href=""brochure.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/jpeg.jpg"" border=""0"">"
End If
------------------------------------------

Men fik det ikke til at virke. Gav for mange produktlinier for det samme produkt.

Håber der nogen, der gider hjælpe!


--- start kode ---

<%
'Dim variabler
Dim objConn
Dim objRs
Dim strSQL, strName, strChapter, strBGColor, strProducts, strPro_ID
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, Products.Pro_ID, Chapters.Chapter, Competences.Competence_ID FROM Competences INNER JOIN (Chapters INNER JOIN Products ON (Chapters.Chapter_ID = Products.Chapter_ID) AND (Chapters.Chapter_ID = Products.Chapter_ID)) ON Competences.Competence_ID = Products.Competence_ID WHERE (((Competences.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")
        strPro_ID = objRs("Pro_ID")
                           
        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 
       
   
    strProducts = strProducts & "<tr bgcolor="""& strBGColor &"""><td>"&strName&"</td><td><a href=""brochure.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/pdf_ikon_lille.gif"" border=""0""></a></td><td><a href=""picture.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/jpeg.jpg"" border=""0""></a></td><td><a href=""video.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/videokam.gif"" border=""0""></a></td><td><a href=""ppt.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/zip.jpg"" border=""0""></a></td><td><a href=""poster.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/pdf_ikon_lille.gif"" border=""0""></a></td><td><a href=""jpp.asp?Pro_ID=" & strPro_ID & """><img src=""../../images/icons/zip.jpg"" border=""0""></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

'Luk databaseforbindelse
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 produktliste
--><%
Response.Write strProducts
%>
</body>
</html>






--- stop kode ----
Avatar billede keysersoze Ekspert
09. august 2006 - 13:00 #1
må vel hellere kaste en kommentar afsted som ønsket.

Det lyder som om du har forsøgt at arbejde brochure-tabellen ind i din nuværende sql med det resultat at du får flere linier med samme produkt. Det eneste du måske mangler her at en distinct på produktid?
Avatar billede ravnkilde Nybegynder
09. august 2006 - 13:17 #2
Det lyder rigtigt, kaysersoze!
Avatar billede keysersoze Ekspert
09. august 2006 - 13:30 #3
lyder det så rigtigt at du kan eksperimentere videre selv eller?
Avatar billede ravnkilde Nybegynder
09. august 2006 - 13:40 #4
jeg har nok brug for lidt mere hjælp, keysersoze....
Avatar billede ravnkilde Nybegynder
09. august 2006 - 14:03 #5
Jeg skal altså bruge DISTINCT i min SQL på Products.Pro_ID til kun at lave én linie pr. produkt, korrekt?

Kan jeg så bruge denne kode

If isnull(objRs("Bro_URL")) Then
  strBroPic = ""
Else
  strBroPic = "<img src=""../../images/icons/brochure.jpg"" alt=""Brochure"" />"
End If

til at indsætte ikon, hvis der er nogen brochure for det pågældende produkt?
Avatar billede keysersoze Ekspert
09. august 2006 - 14:11 #6
korrekt.

jeg kan ikke liiige i hovedet gøre det men prøv dig lidt frem og ellers må jeg lige få en kopi af basen hvis muligt.
Avatar billede ravnkilde Nybegynder
09. august 2006 - 14:55 #7
keysersoze: Jeg troede jeg var på rette vej, men ak nej! Nedenstående SQL giver mig hele 32 linier for det første produkt! Hvad har jeg gjort forkert?

strSQL = "SELECT DISTINCT Products.Pro_ID, Products.Pro_Name, Chapters.Chapter, Competences.Competence_ID, Brochures.Bro_ID, Pictures.Pic_ID, Videos.Video_ID, PPT.PPT_ID, Posters.Poster_ID, JPP.JPP_ID FROM ((((((Competences INNER JOIN (Chapters INNER JOIN Products ON (Chapters.Chapter_ID = Products.Chapter_ID) AND (Chapters.Chapter_ID = Products.Chapter_ID)) ON Competences.Competence_ID = Products.Competence_ID) LEFT JOIN Brochures ON Products.Pro_ID = Brochures.Pro_ID) LEFT JOIN Pictures ON Products.Pro_ID = Pictures.Pro_ID) LEFT JOIN Videos ON Products.Pro_ID = Videos.Pro_ID) LEFT JOIN PPT ON Products.Pro_ID = PPT.Pro_ID) LEFT JOIN Posters ON Products.Pro_ID = Posters.Pro_ID) LEFT JOIN JPP ON Products.Pro_ID = JPP.Pro_ID WHERE (((Competences.Competence_ID)=2));"
Avatar billede ravnkilde Nybegynder
09. august 2006 - 15:54 #8
de 32 linier svarer til 4 brochurer, 2 picture, 1 video, 2 PPT, 2 poster og 1 JPP (4x2x1x2x2x1) for det første produkt.
Avatar billede keysersoze Ekspert
09. august 2006 - 17:53 #9
du skal formentlig hen i noget a la

select DISTINCT(Products.Pro_ID),...

og så noget group by til sidst. Kan ikke lige overskue det uden selv at sidde med basen.
Avatar billede ravnkilde Nybegynder
09. august 2006 - 18:43 #10
Kan jeg generere SQL'en i Access på en eller anden måde? Ellers er du interesseret i databasen?
Avatar billede keysersoze Ekspert
09. august 2006 - 19:04 #11
tør ikke sige om du bare ved et par klik kan gøre det - men prøv at eksperimenter lidt med GROUP BY og distinct
Avatar billede ravnkilde Nybegynder
09. august 2006 - 22:28 #12
Jeg prøver mig lidt frem...
Avatar billede keysersoze Ekspert
13. september 2006 - 11:36 #13
kommet videre?
Avatar billede ravnkilde Nybegynder
13. september 2006 - 12:39 #14
Nej, keysersoze. Desværre ikke. P.t. kører siden med at den viser ikoner for alle og alt, trods at der måske ikke er eks. en brochure for det valgte produkt. Jeg har ikke haft tiden/modet til at gå i gang med group by og distinct endnu, men jeg skal have det løst, for det er ikke en holdbar løsning på længere sigt. Det giver for mange forgæves klik.
Avatar billede keysersoze Ekspert
26. oktober 2006 - 13:05 #15
er der så noget mere vi kan komme med så du måske kan komme videre?
Avatar billede ravnkilde Nybegynder
31. oktober 2006 - 09:07 #16
keysersoze: jeg er ikke kommet videre. Men jeg skal have løst problemet, i det produktkataloget skal udvides, og det helst med den rigtige opstilling. Jeg har bare ikke tiden p.t. til at prøve mig frem. Jeg skal give lyd fra mig når jeg er kommet videre. Jeg får måske brug for lidt mere hjælp...
Avatar billede ravnkilde Nybegynder
06. november 2006 - 13:46 #17
keysersoze:

Jeg har prøvet nogle forskellige ting, bl.a. med Distinctrow og GROUP BY. Min nedenstående kode kan måske bruges på en eller anden måde. Dog tager den ikke de produkter med, som der ikke findes brochure til. Men produktet skal med alligevel, i det der måske er video eller billede til produktet.

Kan du hjælpe med hvordan jeg får den til at tage produkterne med som ikke har nogen brochure. Problemet er jo nok at det produkt, der ingen brochure har, ikke står i tabellen med brochurer - ikke engang som 0 (nul) eller falsk el. lign.

Kan denne kode bruges på en eller anden måde? Hvis bare den kunne tælle de produkter uden brochure med som eks. 0, så kunne det jo bruges til at bestemme om der skal være link eller ej med "If isnull(objRs("Bro_ID")) Then" osv.

SELECT DISTINCTROW Products.Pro_Name, Count(Brochures.Bro_ID) AS AntalOfBro_ID
FROM Products INNER JOIN Brochures ON Products.Pro_ID = Brochures.Pro_ID
GROUP BY Products.Pro_Name
ORDER BY Products.Pro_Name DESC;
Avatar billede ravnkilde Nybegynder
22. november 2006 - 14:20 #18
keysersoze:

Jeg er kommet lidt videre med denne gl. sag:
Jeg starter lige med nogle forespørgsler:

fsp_brochure:
SELECT p.Pro_Name, Count(b.Bro_ID) AS antalBro
FROM Products AS p LEFT JOIN Brochures AS b ON p.Pro_ID=b.Pro_ID
GROUP BY p.Pro_Name;

fsp_video:
SELECT p.Pro_Name, Count(Videos.Video_ID) AS AntalVideo
FROM Products AS p LEFT JOIN Videos ON p.Pro_ID=Videos.Pro_ID
GROUP BY p.Pro_Name;

fsp_poster:
SELECT p.Pro_Name, Count(Posters.Poster_ID) AS AntalPoster
FROM Products AS p LEFT JOIN Posters ON p.Pro_ID=Posters.Pro_ID
GROUP BY p.Pro_Name;

Ovenstående indgår i denne samlede forespørgsel:
SELECT b.*, v.antalVideo, p.AntalPoster
FROM (fsp_brochure b INNER JOIN fsp_video v
ON b.Pro_Name = v.Pro_Name) bv
INNER JOIN fsp_poster p
ON bv.Pro_Name = p.Pro_Name
ORDER BY bv.Pro_Name

Den melder fejl om "Syntax error in FROM clause". Kan du se den fejl?

Hvis det bliver for svært at lave en samlet forespørgsel, kan jeg så bruge de tre øverste koder til at tælle antal for brochure, video, poster, picture osv. - evt. i en stored procedure eller lign. og så lave en en SQL på siden kombineret med at hvis der er 1 eller flere brochure (osv.) så indsæt ikon. Hvis der er 0 brochure (osv.) så lav blank. Forstår du?
Avatar billede keysersoze Ekspert
23. november 2006 - 10:11 #19
bygger du disse joins selv eller lader du access hjælpe dig?
Avatar billede keysersoze Ekspert
23. november 2006 - 10:24 #20
hov - glemte svaret.
Avatar billede ravnkilde Nybegynder
06. december 2006 - 21:41 #21
Jeg har fået hjælp andetsteds fra til disse joins, men mangler altså lidt endnu for at "komme helt i mål".
Avatar billede keysersoze Ekspert
06. december 2006 - 22:01 #22
ja?
Avatar billede ravnkilde Nybegynder
06. december 2006 - 22:25 #23
Se Kommentar: ravnkilde
22/11-2006 14:20:10
Avatar billede keysersoze Ekspert
06. december 2006 - 22:37 #24
men - er det samme problem selvom du skriver du har fået hjælpe? Jeg fik heller ikke svar på mit spørgsmål om hvorvidt du lod access hjælpe dig eller om det var "hjemmelavede" sql's. Er FROM-statementet det samme som ovenstående selvom resten af sql'en er lavet om?
Avatar billede ravnkilde Nybegynder
07. december 2006 - 21:24 #25
Hjemmelavede SQL's. Statementet er det samme som ovenstående.

Hvis det bliver for kompliceret, er det så muligt at bruge de tre øverste fsp_ koder til at tælle antal for brochure, video, poster, picture osv. - evt. i en stored procedure eller lign. og så lave en en SQL på siden kombineret med at hvis der er 1 eller flere brochure (osv.) så indsæt ikon. Hvis der er 0 brochure (osv.) så lav blank.
Avatar billede keysersoze Ekspert
09. december 2006 - 12:43 #26
i og med at du bruger access vil jeg foreslå at du forsøger dig med at lave nogle forespørgsler i programmet - det vil nemlig kunne give dig dine SQLs uden at du (som udgangspunkt) behøver at tænke overhovedet. Du skriver godt nok lidt om forespørgsler i dine indlæg så måske taler vi bare forbi hinanden :)

anyway - kan ikke umiddelbart forklare hvad der går galt, men måske kan access give dig nogle muligheder hvis du sætter SQL'en ind i en forespørgsel.
Avatar billede ravnkilde Nybegynder
20. december 2006 - 10:23 #27
Så blev det alligevel jul! Opgaven er løst, keysersoze.

Jeg lavede forespørgsler for hver gruppe, dvs. brochure, video, etc. og samlede dem alle i en samlet forespørgsel, som du kan se koden til nedenfor. Det fungerer fint med at indsætte ikon ved 1 eller flere og ingenting ved 0.

Tak for din hjælp og glædelig jul!

SELECT Products.Pro_Name, fsp_brochure.antalBro, fsp_jpp.AntalJPP, fsp_picture.AntalPicture, fsp_poster.AntalPoster, fsp_ppt.AntalPPT, fsp_video.AntalVideo
FROM (((((Products INNER JOIN fsp_brochure ON Products.Pro_Name = fsp_brochure.Pro_Name) INNER JOIN fsp_jpp ON Products.Pro_Name = fsp_jpp.Pro_Name) INNER JOIN fsp_picture ON Products.Pro_Name = fsp_picture.Pro_Name) INNER JOIN fsp_poster ON Products.Pro_Name = fsp_poster.Pro_Name) INNER JOIN fsp_ppt ON Products.Pro_Name = fsp_ppt.Pro_Name) INNER JOIN fsp_video ON Products.Pro_Name = fsp_video.Pro_Name
GROUP BY Products.Pro_Name, fsp_brochure.antalBro, fsp_jpp.AntalJPP, fsp_picture.AntalPicture, fsp_poster.AntalPoster, fsp_ppt.AntalPPT, fsp_video.AntalVideo;
Avatar billede keysersoze Ekspert
20. december 2006 - 23:16 #28
glædelig jul selv :)
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