15. september 2004 - 00:08Der er
20 kommentarer og 1 løsning
Udtræk fra 2 tabeller i en database vises på samme side
Jeg har en access database med bl.a. de to tabeller "arrangement" og "customer". På siden "checkout" vil jeg vise de data fra de to tabeller, men p.t. kan jeg kun få det til at virke med den ene (fra customer). På en tidligere side bliver der skrevet data til de to nævnte tabeller. Jeg vil som sagt gerne kunne vise resultatet af de to tabeller - men selvfølgelig kun indtastninger for den pågældende session.
Forståeligt? HJÆLP!
Resultat af sql-forespørgslen vises på siden med de respektive "<%= rs(data) %>".
--- start på del af kode ---
<!-- #INCLUDE FILE="db.asp" --> <%
If Session("customerid") = "" Then Response.Redirect "error.asp?msg=" & Server.URLEncode ("Vi fandt ikke dine oplysninger. Udfyld dem venligst igen.") End If
scartItem = Session("cartItem") arrCart = Session("MyCart") msg = Request.QueryString ("msg") if scartItem = 0 then Response.Redirect "error.asp?msg=" & Server.URLEncode ("Din liste er tom og du kan derfor ikke checke ud.") end if
sqlCustomer = "SELECT * FROM customers WHERE custID = " & CInt(Session("customerid")) call openConn() Set rs = Server.CreateObject ("adodb.Recordset") rs.Open sqlCustomer, dbc, adOpenForwardOnly, adLockReadOnly, adCmdText
If rs.EOF then Response.Redirect "customer.asp?msg=" & Server.URLEncode("Venligst indtast dine oplysninger igen.") End If
Er de to tabeller linket samme? Så du skal lave en JOIN på de to tabeller: sqlCustomer = "SELECT * FROM customers LEFT JOIN arrangement ON customers.arrID=arrangement.ID WHERE customers.custID = " & CInt(Session("customerid"))
Eller skal det hentes ud hver for sig?
sqlCustomer = "SELECT * FROM customers WHERE custID = " & CInt(Session("customerid")) call openConn() Set rs = Server.CreateObject ("adodb.Recordset") rs.Open sqlCustomer, dbc, adOpenForwardOnly, adLockReadOnly, adCmdText
sqlArrangement = "SELECT * FROM arrangement WHERE custID = " & CInt(Session("customerid")) Set rsArr = Server.CreateObject ("adodb.Recordset") rsArr.Open sqlArrangement, dbc, adOpenForwardOnly, adLockReadOnly, adCmdText
eagleeye: Det er selvfølgelig afgørende at de viste data er fra den pågældende bruger. I tabellen med customers har jeg feltet custID som indgår i session, medens at jeg i tabellen arrangement har lavet et autogeneret felt, der hedder arrID. Min første ide var at lave en relation mellem de to tabeller, men er det nødvendigt.
Siden, dataerne skal vise på, skal bare vise data fra tabellen customers og data fra tabellen arrangement - fra den pågældende bruger.
Når jeg afvikler din kode "hver for sig" melder fejlen: Fejltype: Microsoft JET Database Engine (0x80040E10) Der er ikke angivet nogen værdi for en eller flere krævede parametre. /senf/web/checkout.asp, line 22
Om det skal laves med relation komme an på hvad du har i tabellerne og hvad du øsnker ud. Hvis du eksempelvis vil hente alle arrangemerer en kunde er meldt til er det en fordel med en relation.
Nej, jeg har ikke custID i arrangement (men en arrID = autogen. felt).
Jeg ved faktisk ikke hvad jeg skal gøre! I arrangementstabellen har jeg oplysninger om dato, tid og sted, som kunden ønsker at booke udstyr til. I cudtomers har jeg alle relevante data på kunden (navn, adr. o.l).
Det man typisk vil gøre er at gemme kunde ID'et sammen men det udstyr han vil booke. Hvis man ikke gør det har du en tabel med en massse booket udstyr men igen ide om hvem der har booket det :). Så jeg ville tilføje en kolonne i arrangement tabellen af typen tal/int og så gemme custID på samme tid man laver bookingen.
Så kan hente det udstyr som en kunde har booket med den først viste SQL dog rette lidt til :) sqlCustomer = "SELECT * FROM customers LEFT JOIN arrangement ON customers.custID=arrangement.custID WHERE customers.custID = " & CInt(Session("customerid"))
Men du kan stadig udtrække det som to SQL sætning som vist tilsidst hvis du ikke ønsker at lave det med JOIN.
svar på sidste spørgsmål: ja. Der tilføjes en ny post for hver gang. Skal jeg lave et felt custID i tabellen arrangement - og skal der i så fald laves nogen relation? Hvordan får jeg CustID fra customers over i arrangement - mange spørgsmål!
>>Skal jeg lave et felt custID i tabellen arrangement Ja.
>>og skal der i så fald laves nogen relation? Nej du behøver ikke gøre noget specielt. relation laves når man skriver SQL sætningen, hvis man briuger JOIN er relation det man skriver efter ON: customers.custID=arrangement.custID
>>Hvordan får jeg CustID fra customers over i arrangement Når du gemmer en booking er brugeren sikkert logget ind så du kan gemme Session("customerid") samme med data omkring booking. INSERT INTO arrangement (dato, enhed, custid) values (#"&dato&"#,'"&enhed&"', " & Session("customerid") & ")"
Med den nye kode indsat får jeg nu: Der er en syntaksfejl i INSERT INTO-sætningen. Måske du kan ved at se hele min kode på denne side, se fejlen? Måske lidt noget rod, men det skyldes at jeg bygger videre på en gammel kode.
For Each key in Request.Form strname = key strvalue = Request.Form(key) Session(strname) = strvalue Next
fname = Request.Form("fname") lname = Request.Form("lname") email = Request.Form("email") address = Request.Form("address") town = Request.Form("town") zip = Request.Form("zip") country = "Denmark" phone = Request.Form("phone")
'build SQL statement to insert new customer in DB sqlAdd = "INSERT INTO customers(cfirstname,clastname,cemail,caddress" If Request.Form("address2") <> "" Then sqlAdd = sqlAdd & ",caddress2" end if sqlAdd = sqlAdd & ",ctown,czip" If Request.Form("state") <> "" Then sqlAdd = sqlAdd & ",cstate" End if sqlAdd = sqlAdd & ",ccountry,cphone" If Request.Form("fax") <> "" Then sqlAdd = sqlAdd & ",cfax" End if sqlAdd = sqlAdd & ") VALUES(" sqlAdd = sqlAdd & "'" & TwoSingleQ(fname) & "'" sqlAdd = sqlAdd & ",'" & TwoSingleQ(lname) & "'" sqlAdd = sqlAdd & ",'" & TwoSingleQ(email) & "'" sqlAdd = sqlAdd & ",'" & TwoSingleQ(address) & "'" If Request.Form("address2") <> "" Then sqlAdd = sqlAdd & ",'" & TwoSingleQ(Request.Form("address2")) & "'" end if sqlAdd = sqlAdd & ",'" & TwoSingleQ(town) & "'" sqlAdd = sqlAdd & ",'" & zip & "'" If Request.Form("state") <> "" Then sqlAdd = sqlAdd & ",'" & Request.Form("state") & "'" End if sqlAdd = sqlAdd & ",'" & country & "'" sqlAdd = sqlAdd & ",'" & phone & "'" If Request.Form("fax") <> "" Then sqlAdd = sqlAdd & ",'" & Request.Form("fax") & "'" End If sqlAdd = sqlAdd & ")" 'Response.Write sqlAdd 'Response.End call openConn() dbc.execute sqlAdd, intAffected
if intAffected = 1 then sql = "SELECT max(custID) from customers" set rs = dbc.Execute(sql) CustomID = rs(0) call closeConn() Session("customerid") = CustomID Response.Redirect "checkout.asp" else call closeConn() Response.Redirect "error.asp?msg=" & server.URLEncode("Could not send customer information to database. Please try again later.") end if 'End If %>
Jeg kan ikke lige se det skullle give syntax fejl. Prøv at udskrive SQL sætningen i det forat udføre og post det her eller tjek om der malger ' omkiring tekst felter, eller der mangler et komma?
Sådan! Det var bedre. Nu skrives der til begge tabeller og jeg ryger til næste side.
Men her bliver feltet for valg af "Telt" skrevet som "True" eller False og ikke som mere på dansk forståeligt "Ja" eller "Nej" Kan jeg på den side indsætte en kode lidt a la den, vi tidligere har brugt:
if lcase(request.form("Telt")) = "ja" then Teltvalgt="true" else Teltvalgt="false" end if
Mit ufærdige bud:
if rs("aTelt") = "True" then rs("aTelt") = "Ja" ?? else rs("aTelt") = "Nej" end if
Værdien af dette felt skrives på siden inde i en tabel med <%= rs("aTelt") %>
Mon du kan hjælpe med den også... måske den skal laves helt anderledes, evt. dim'es?
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.