Avatar billede gatez Nybegynder
03. marts 2004 - 17:14 Der er 11 kommentarer og
1 løsning

Udtræk fra DB

Hejsa...

Jeg har et lille problem med at hive noget data ud af min database på den rigtige måde...

Jeg har 3 tabeller:

1. pgproducent
Indeholder alle vores producenter. fx. Nokia, Compaq osv...

2. pgprodukt
Indeholder alle vores produkter. fx. 6610, T40 osv... Under denne tabel er en celle som hedder "producentid" så man ud fra det ID kan se producenten af produktet.

3. pgfirma
Indeholder priser på produkterne... Og herunder er der en celle som hedder "produktid" så man kan se hvilket produkt prisen passer til... Her under er der flere priser på hvert produkt, men kun den laveste pris skal vises på listen.

Det skal vises på en lang liste som skal se sådan ud:

Nokia
  6610  -  1299,00
  6810  -  2587,00
  7810  -  Ingen pris

Compaq
  Test 1  -  9995,75
  Test 2  -  Ingen pris
  Test 3  -  10255,95

Altså først producent og derefter alle produkterne, så næste producent og alle produkterne osv... Men dem som har "Ingen pris" skal dog ikke vises.

Vigtigt !
Under hver producent skal produkterne stå i alfabetisk orden ;)

Her er mit forslag til systemmet. Det virker bare ikke helt.
http://bodykits.dk/testmappe/test2.asp

Min ASP kode:

<%
producentid = "0"
sogord = ""
indexid = "6"
katid = "37"

if producentid <> "0" then
strSQL = "SELECT * FROM pgprodukt WHERE producentid = "& producentid &" AND katid = "& katid &" GROUP by producentid ORDER BY produkt"
else
strSQL = "SELECT * FROM pgprodukt WHERE katid = "& katid &" GROUP by producentid ORDER BY produkt"
end if
set rs = Conn.execute(strSQL)
if rs.EOF then
Response.write "<b><font size='1' face='Verdana' color='red'>Ingen produkter</font></b>"
else
Do Until rs.EOF
strProduktId = RS("id")
strProduktProducentid = RS("producentid")



strSQL2 = "SELECT * FROM pgproducent WHERE id = "& strProduktProducentid &" ORDER BY firmanavn"
set rs2 = Conn.execute(strSQL2)
if rs2.EOF then
Response.write "<b><font size='1' face='Verdana' color='red'>Ingen produkter</font></b>"
else
strProducentId = RS2("id")
strProducentFirmanavn = RS2("firmanavn")
end if
%>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#BBC7CE" width="540" id="AutoNumber2">
  <tr>
    <td width="540" colspan="4"><b><font face="Verdana" size="2"><%=strProducentFirmanavn%></font></b></td>
  </tr>
  <tr>
    <td width="146" bgcolor="#4A525A"><b>
    <font color="#FFFFFF" size="1" face="Verdana">Model</font></b></td>
    <td width="253" bgcolor="#4A525A"><b>
    <font face="Verdana" size="1" color="#FFFFFF">Information</font></b></td>
    <td width="89" bgcolor="#4A525A">
    <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">Pris</font></b></td>
    <td width="52" bgcolor="#4A525A">
    <p align="center"><b><font face="Verdana" size="1" color="#FFFFFF">Vis</font></b></td>
  </tr>
<%
strSQL3 = "SELECT * FROM pgprodukt WHERE katid = "& katid &" AND producentid = "& strProducentId &" ORDER BY produkt"
set rs3 = Conn.execute(strSQL3)
if rs3.EOF then
Response.write "<b><font size='1' face='Verdana' color='red'>Ingen produkter</font></b>"
else
Do Until rs3.EOF
strProduktId = RS3("id")
strProduktProducentid = RS3("producentid")
strProduktProdukt = RS3("produkt")
strProduktBeskrivelse = RS3("beskrivelse")
strProduktBilid = RS3("bilid")
strProdukttommer = RS3("tommer")
strProdukthulafstand = RS3("hulafstand")

strSQL4 = "SELECT * FROM pgfirma WHERE produktid = "& strProduktId &" AND godkendt = 'True' ORDER BY pris ASC;"
set rs4 = Conn.execute(strSQL4)
if rs4.EOF then
strFirmaPris = ""
else
strFirmaPris = RS4("pris")
rs4.close
end if

If blnBGColor = True Then
    strBGColor = "#DBDBDB"
    blnBGColor = False
Else
    strBGColor = "#F1F1F1"
    blnBGColor = True
End If

strSQL5 = "SELECT * FROM pgfirma WHERE produktid = " & strProduktId
set rs5 = Conn.execute(strSQL5)
if rs5.EOF then
strpgfirmaPris = "Ingen pris"
else
strpgfirmaPris = RS5("pris")
rs5.close
end if
%>
  <tr>
    <td width="146" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"><A HREF="prisguide-produkt-vis.asp?indexid=<%=strIndexId%>&katid=<%=katid%>&produktid=<%=strProduktId%>"><font face="Verdana" size="1"><%=strProduktProdukt%></font></a></td>
    <td width="253" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"></td>
    <td width="89" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"><p align="right"><font face="Verdana" size="1"><%=strpgfirmaPris%><font></td>
    <td width="52" bgcolor="<%=strBGColor%>"></td>
  </tr>
<%
RS3.MoveNext
Loop
blnBGColor = False
end if

Response.Write "</table><br>"

blnBGColor = False
RS.MoveNext
Loop
end if
%>
Avatar billede nute Nybegynder
03. marts 2004 - 17:28 #1
hmm ... hvorfor køre du denne SQL 2 gange ??

SELECT * FROM pgfirma WHERE produktid =

/nute
Avatar billede nute Nybegynder
03. marts 2004 - 17:30 #2
du kan jo meget hurtig løse det, ved at skrive:

If( strpgfirmaPris <> "Ingen pris" ) Then
%>
  <tr>
    <td width="146" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"><A HREF="prisguide-produkt-vis.asp?indexid=<%=strIndexId%>&katid=<%=katid%>&produktid=<%=strProduktId%>"><font face="Verdana" size="1"><%=strProduktProdukt%></font></a></td>
    <td width="253" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"></td>
    <td width="89" bgcolor="<%=strBGColor%>" style="border-right-style: solid; border-right-width: 1"><p align="right"><font face="Verdana" size="1"><%=strpgfirmaPris%><font></td>
    <td width="52" bgcolor="<%=strBGColor%>"></td>
  </tr>
<%
End if

/nute
Avatar billede gatez Nybegynder
03. marts 2004 - 17:43 #3
Hmm... Ja det ved jeg godt... Trode bare der var en anden løsning...

Men hvordan får jeg produkterne til at stå i alfabetisk orden ??
Avatar billede nute Nybegynder
03. marts 2004 - 17:49 #4
du sætter ORDER BY [det felt du vil sortere på] i din SQL hvor du hiver ud produkterne.

din kode er meget uoverskuelig ... den ser ikke ud til at være kodet særlig smart. Du har nogle SQL kald som umiddelbart ser ud til at være overflødige, eller kan laves om så du slipper for så mange recordsets

/nute
Avatar billede gatez Nybegynder
03. marts 2004 - 18:00 #5
Yes... men det er fordi den kode jeg viser her bare er en "beta" kode...
Den originale kode fylder nemlig alt for meget ;)
Avatar billede gatez Nybegynder
03. marts 2004 - 18:01 #6
Men selve opbygningen er den rigtigt lavet ?
Eller er det dumt at have en "loop" inde i en anden "loop" ?
Avatar billede nute Nybegynder
03. marts 2004 - 18:03 #7
som jeg har skrevet, så ser det ikke ud til at være kodet særlig smart. Du har nogle SQL kald som umiddelbart ser ud til at være overflødige, eller kan laves om så du slipper for så mange recordsets

Loop inde i loops, kan du måske komme udenom, har ikke set så meget på koden endnu til at sige om du kan komme helt udenom det, men jeg er overbevidst om at du kan komme af med meget af det du har skrevet

/nute
Avatar billede nute Nybegynder
03. marts 2004 - 18:40 #8
efter at have "rekonstrueret" din database, så kan jeg klare at gøre nøjagtig det samme som dig, med følgende kode:

<%
producentid = "0"
sogord = ""
indexid = "6"
katid = "37"

if producentid <> "0" then
    strProducentSQL = "SELECT * FROM pgproducent WHERE producentid = " & producentid & " producentid ORDER BY firmanavn"
else
    strProducentSQL = "SELECT * FROM pgproducent ORDER BY firmanavn"
end if

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath( "db.mdb" )

Set producentRS = Conn.Execute( strProducentSQL )


while not producentRS.EOF
    Response.Write( "<table><tr><td>" & producentRS("firmanavn") & "</td></tr>" )
    Response.Write( "<tr><td>Model</td><td>Information</td><td>Pris</td><td>Vis</td></tr>" )
   
    produktSQL = "SELECT pgprodukt.producentid, pgprodukt.produkt, pgprodukt.beskrivelse, "
    produktSQL = produktSQL & "( SELECT MIN( pris ) FROM pgfirma where pgfirma.produktid = pgprodukt.id ) AS minPris "
    produktSQL = produktSQL & "FROM pgprodukt INNER JOIN pgfirma ON pgprodukt.id = pgfirma.id WHERE pgprodukt.producentid = " & producentRS( "id" )
   
    'Response.write( produktSQL )
    Set produktRS = Conn.Execute( produktSQL )
    While not produktRS.EOF
        if( produktRS("minPris" ) <> "" ) Then
            Response.Write( "<tr><td>" & produktRS("produkt")  & "</td><td>" & produktRS("beskrivelse") & "</td><td>" & produktRS("minPris") & "</td></tr>" )
        End If
        produktRS.MoveNext
    Wend
    produktRS.Close
    Response.Write( "</table>" )
    producentRS.MoveNext
wend
producentRS.Close
%>

her har jeg kun 2 Recordsets jeg operere med og jeg har sparete 60 linjer kode ;o]

/nute
Avatar billede nute Nybegynder
03. marts 2004 - 18:45 #9
du kan se en version af scriptet her:

http://xperimentum.com/xperten/472720/index.asp

og databasen ligger her:

http://xperimentum.com/xperten/472720/db.mdb

/nute
Avatar billede gatez Nybegynder
03. marts 2004 - 19:25 #10
Jamen... 1000 takker !
Smid et svar ;)
Avatar billede nute Nybegynder
03. marts 2004 - 21:08 #11
svar :)
Avatar billede nute Nybegynder
03. marts 2004 - 21:09 #12
men du bør måske tjekke at min database er "identisk" med din. jeg har jo ikke haft så meget info at bygge databasen på, så du bør tjekke om jeg har gjort det korrekt :o]
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