webForumDet fria alternativet

Få ut data ur två tabeller?

ASP

25 svar · 533 visningar · startad av Sammy

Medlem sedan maj 2000202 inlägg
Frågan#1

Jag sitter här med min första webb-butik och vill nu försöka få ut en bild (färgad fyrkant) framför namnet på den kund i mitt kundregister som har gjort en order. Nu undrar hur jag ska gå tillväga för att få den funktionen visad?

Här är koden som visar kundregistret:

         <%
          Set Connect = Server.CreateObject("ADODB.Connection")
          MdbFilePath = Server.MapPath("data/db.mdb")
          Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MdbFilePath & ";"

          Set RStemp = Connect.Execute("Select * From KONTO Order by FORNAMN, EFTERNAMN, USER")
         %>

         <CENTER>
         <TABLE width="100%" border="0" cellspacing="0" cellpadding="2">
         <%
          Do Until RStemp.EOF
          cnt = cnt + 1
          strColor = "#F5F5F5" 
          If cnt Mod 2 = 0 then strColor = "#FFFFFF"
          Response.Write "<tr bgcolor='" & strColor & "' onMouseOver=this.style.backgroundColor='#c5dbff'; onMouseOut=this.style.backgroundColor='';>" &_
          "<td width=80 class=text>&nbsp;" & RStemp("FORNAMN") & "</td>" &_
          "<td width=100 class=text>&nbsp;" & RStemp("EFTERNAMN") &"</td>"
         %>

         <%
          If IsNull(RStemp("EPOST")) then
           Response.Write "<td class=text1>&nbsp;</td>"
          Else
           Response.Write "<td width=20 class=text align=left>&nbsp;<A href=mailto:" & RStemp("EPOST") & "><IMG src=""bilder/email.gif"" border=0 width=12 height=10></A>&nbsp;</td>"
          End If
         %>
         
         <%
          Response.Write "<td width=70 class=text align=left>&nbsp;" & RStemp("USER") & "&nbsp;</td>" &_
          "<td class=text align=right><i>&nbsp;" & RStemp("DATUM") &"&nbsp;</td></tr>" &_
          RStemp.MoveNext
          Loop
 
          Connect.close
          Set Connect = nothing
 
         %>
         </TABLE>

Nu vill jag alltså att bilden (fyrkanten) ska visas om kunden har en order liggandes från tabellen ORDER.

Tacksam för svar...

Medlem sedan nov. 20017 144 inlägg
#2

1. Byt namn på tabellen "Order", det kommer att skapa oreda eftersom att det är ett öronmärkt namn.
2. SQL-en kanske kan se ut så här:

 Set RStemp = Connect.Execute("Select k.*,o.Orderkolumn From KONTO k, [ORDER] o Order by k.FORNAMN, k.EFTERNAMN, k.USER")
Medlem sedan maj 2000202 inlägg
#3

Vad exakt gör den SQL-satsen?

Medlem sedan nov. 20017 144 inlägg
#4

Med en if-sats:

if len(RStemp("orderkolumn"))>0 then
' visa bild
end if
Medlem sedan nov. 20017 144 inlägg
#5

Sammy skrev:

Vad exakt gör den SQL-satsen?

Hämtar ifrån två tabeller...förhoppningsvis.

Medlem sedan nov. 20017 144 inlägg
#6
Set RStemp = Connect.Execute("Select [red]k.* [/red],[blue]o.Orderkolumn[/BLUE] From [red]KONTO k[/red],[blue] [ORDER] o [/blue]Order by [red]k.FORNAMN, k.EFTERNAMN, k.USER[/red]")

Röd = tabellen "Konto"
Blå = tabellen "Order"

bokstäverna framför kolumnnamnen är för att hålla reda på vilken kolumn som tillhör vilken tabell.
Ex select k.kontokolumn From Kontotabell k

Medlem sedan maj 2000202 inlägg
#7

Tack jesper.. förstår den principen nu..

När jag använde din IF sats sedan (valde att visa ett T för att göra det enkelt så länge) så blev resultat att T'et visades på alla även fast det bara är en order gjord för användare 1?

Medlem sedan maj 2000202 inlägg
#8

Btw.. det ska möjligtvis inte vara typ: (I SQL'en)

where anv = anv i båda tabellerna.. du förstår säkert vad jag menar ;)

Medlem sedan nov. 20017 144 inlägg
#9

Så här då:

if len(RStemp("orderkolumn"))>0 then
response.write "T"
Else 
response.write ""
end if

Tänk på att detta måste vara i loopen.

Medlem sedan nov. 20017 144 inlägg
#10

Jo, kanske det förståss:
Set RStemp = Connect.Execute("Select k.* ,o.Orderkolumn From KONTO k, [ORDER] o Where o.user = k.User Order by k.FORNAMN, k.EFTERNAMN, k.USER")

Medlem sedan maj 2000202 inlägg
#11

Det här var klurigt värre...

nu fick jag felmeddelandet:

Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][Drivrutin för ODBC Microsoft Access] Typblandningsfel i uttryck.
kundregister.asp, line 30

och det är SQL raden det

Medlem sedan dec. 200012 464 inlägg
#12

Njae, då kommer enbart de kunder som har en order med. Om samma kund har flera order så kommer den kunden flera gånger i resultatet också.

set rstemp = "select k.*,(select count(*) " & _
" from orders where user = k.user) as antalOrder " & _
" from konto "
'
'
'
if rstemp("antalOrder") > 0 then 
'har order
else
'har inte order
end if

Du har väl bytt namn på tabellen order? Jag gissar lite på övriga kolumnnamn så du får ändra så att det stämmer.

Medlem sedan maj 2000202 inlägg
#13

Jadå.. bytte namn på den till ORDERS som du använda dig av..

Hmm.. får nu felmeddelandet:

Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][Drivrutin för ODBC Microsoft Access] Det går inte att identifiera 'k.*' som ett giltigt fältnamn eller uttryck i Microsoft Jet.

Medlem sedan dec. 200012 464 inlägg
#14

Skärpning (det gäller mig alltså).

set rstemp = "select k.*,(select count(*) " & _
" from orders where user = k.user) as antalOrder " & _
" from konto k"
Medlem sedan maj 2000202 inlägg
#15

Jag kanske ska tillägga att jag INTE gjort databasen ORDERS som du tänker utan där lagras alla artiklar tillsammans med den inloggades IDNR.

i tabellen orders kan det se ut så här:

IDNR , ARTIKEL, KATEGORI, PRIS

IDNR är användarens IDNR alltså.. sedan när en kund lägger till en order så läggs den ordern på samma order ;) kan man säga så ;)

Ska väl säga att detta är den första butiken jag gör och jag har egentligen ingen aning om hur man ska göra, men så här långt fungerar den som jag tänkt mig ;)

Medlem sedan maj 2000202 inlägg
#16

så att plocka ut olika antal ordrar går nog inte i det här fallet...

Medlem sedan maj 2000202 inlägg
#17

Border inte detta fungera?

Set RStemp = Connect.Execute("Select k.* ,o.* From KONTO k, ORDERS o Where o.user = k.idnr Order by k.FORNAMN, k.EFTERNAMN, k.USER")

tillsammans med

if len(RStemp("user"))>0 then
response.write "T"
Else 
response.write "Y"
end if
Medlem sedan maj 2000202 inlägg
#18

Ska jag behöva ta om frågan eller är detta för invecklat att göra? (kanske inte jag som förstår?)

Medlem sedan dec. 200012 464 inlägg
#19

Nej, du måste ha en outer join eller använda den fråga som jag skrev tidigare.

Medlem sedan maj 2000202 inlägg
#20

Jo, men det är fel på det eftersom jag får felmeddelandet: (den tidigare du skrev)

Feltyp:
Körningsfel i Microsoft VBScript (0x800A01A8)
Objekt krävs.: '[string: "select k.*,(select c"]'

testade även att

lägga till detta:

     set rstemp = Connect.Execute("select k.\*,(select count(\*) from orders where userid = k.idnr) as antalOrder from konto k Order by k.FORNAMN, k.EFTERNAMN, k.USER" )

men då får jag felmeddelandet:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][Drivrutin för ODBC Microsoft Access] Typblandningsfel i villkorsuttryck.

Och sedan så är det egentligen INTE antal ordrar som regisistreras i tabellen ORDERS utan det är antal artiklar med referenser till ANVÄNDARID/MEDLEMSID (kan se ut så här)

USERID_____________ARTIKEL_____________KATEGORI___________PRIS
1 TV TV/VIDEO 300
2 KÖTTBULLE MAT 2
1 HÖRNSOFFA MÖBEL 1300

så även om en medlem/kund gjort flera beställningar så har det ingen betydelse.. vill bara veta om den personen har gjort en beställning/order

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)