Avatar billede ravnkilde Nybegynder
15. september 2004 - 00:08 Der 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

--- stlut på del af kode ---
Avatar billede eagleeye Praktikant
15. september 2004 - 21:34 #1
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
Avatar billede ravnkilde Nybegynder
15. september 2004 - 22:14 #2
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

(line 22 er: rsArr.Open sqlArrangement, dbc, adOpenForwardOnly, adLockReadOnly, adCmdText)

Skal jeg lave en relation mellem de to tabeller, eller skal jeg starte en særlig arrangements-session?
Avatar billede eagleeye Praktikant
15. september 2004 - 22:19 #3
Har du en kolonne custID i tabellen arrangement ?

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.
Avatar billede ravnkilde Nybegynder
15. september 2004 - 22:33 #4
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).

What to do, eagleeye?
Avatar billede eagleeye Praktikant
15. september 2004 - 22:38 #5
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.
Avatar billede eagleeye Praktikant
15. september 2004 - 22:42 #6
Eller indeholder arrangement alt det udstyr som kan bookes eller bliver der tilføjet en nu post for hver gang en kunde vil booke noget udstyr?
Avatar billede ravnkilde Nybegynder
15. september 2004 - 22:52 #7
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!
Avatar billede eagleeye Praktikant
15. september 2004 - 22:58 #8
>>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") & ")"
Avatar billede ravnkilde Nybegynder
15. september 2004 - 23:24 #9
Jeg har nu oprettet feltet custID i tabellen arrangement. Type er sat til tal.

På siden hvor der skrives til begge tabeller jeg en den første sql:

sqlAdd = "INSERT INTO arrangement (custID,aDato, aTidspunkt, aSted, aPersoner, aBeskrivelse, aTelt, aAndet) VALUES (" & Session("customerid") & "' & Replace(Request.Form("Dato"),"'","''") & "', '" & Request.Form("Tidspunkt") & "', '" & Replace(Request.Form("Sted"),"'","''") & "', '" & Replace(Request.Form("Personer"),"'","''") & "', '" & Replace(Request.Form("Beskrivelse"),"'","''") & "', " & Teltvalgt & ", '" & Request.Form("Andet") & "')"

som dog giver fejlen "Slut på sætning var ventet". Jeg har sandsynligvis overset en '?
Avatar billede ravnkilde Nybegynder
15. september 2004 - 23:40 #10
må i seng nu. Skal op igen kl. 06:00! Kigger videre i morgen, eagleeye
Avatar billede eagleeye Praktikant
15. september 2004 - 23:44 #11
Ok :)

Prøv at rette SQL sætningen til dette uden ' omkring id'et:

sqlAdd = "INSERT INTO arrangement (custID,aDato, aTidspunkt, aSted, aPersoner, aBeskrivelse, aTelt, aAndet) VALUES (" & Session("customerid") & ", '" & Replace(Request.Form("Dato"),"'","''") & "', '" & Request.Form("Tidspunkt") & "', '" & Replace(Request.Form("Sted"),"'","''") & "', '" & Replace(Request.Form("Personer"),"'","''") & "', '" & Replace(Request.Form("Beskrivelse"),"'","''") & "', " & Teltvalgt & ", '" & Request.Form("Andet") & "')"
Avatar billede ravnkilde Nybegynder
16. september 2004 - 00:01 #12
var ikke gået helt i seng!

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.

--- hele min kode ---

<%
Response.Buffer = true
%>
<!-- #include file="db.asp" -->
<!-- #include file="functions.asp" -->
<%


if lcase(request.form("Telt")) = "ja" then
  Teltvalgt="true"
else
  Teltvalgt="false"
end if

sqlAdd= "INSERT INTO arrangement (custID,aDato, aTidspunkt, aSted, aPersoner, aBeskrivelse, aTelt, aAndet) VALUES (" & Session("customerid") & ", '" & Replace(Request.Form("Dato"),"'","''") & "', '" & Request.Form("Tidspunkt") & "', '" & Replace(Request.Form("Sted"),"'","''") & "', '" & Replace(Request.Form("Personer"),"'","''") & "', '" & Replace(Request.Form("Beskrivelse"),"'","''") & "', " & Teltvalgt & ", '" & Request.Form("Andet") & "')"
call openConn()
dbc.execute sqlAdd

    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
%>
Avatar billede ravnkilde Nybegynder
16. september 2004 - 00:02 #13
PS: jeg håber virkelig at du har tålmodighed med mig, eagleeye. Indrømmet. Jeg er absolut ingen asp-haj. God nat!
Avatar billede eagleeye Praktikant
16. september 2004 - 00:08 #14
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?

sqlAdd= "INSERT INTO arrangement (custID,aDato, aTidspunkt, aSted, aPersoner, aBeskrivelse, aTelt, aAndet) VALUES (" & Session("customerid") & ", '" & Replace(Request.Form("Dato"),"'","''") & "', '" & Request.Form("Tidspunkt") & "', '" & Replace(Request.Form("Sted"),"'","''") & "', '" & Replace(Request.Form("Personer"),"'","''") & "', '" & Replace(Request.Form("Beskrivelse"),"'","''") & "', " & Teltvalgt & ", '" & Request.Form("Andet") & "')"
response.write sqlAdd
response.end
'call openConn()
'dbc.execute sqlAdd



men jeg under mig lidt over koden så vist jeg kan se indsætter du også en ny post i customers når du tilføre en booking i  arrangement tabellen.
Avatar billede ravnkilde Nybegynder
16. september 2004 - 11:50 #15
Her er resultatet af sql'en: INSERT INTO arrangement (custID,aDato, aTidspunkt, aSted, aPersoner, aBeskrivelse, aTelt, aAndet) VALUES (, '12-12-2005', '12.30', 'Vejen 10, Byen', '10', 'Fest', true, 'Masser af mad')

custID kommer altså ikke med.

Skyldes det mon at den hentes fra customers og den skrives senere end arrangement?
Avatar billede eagleeye Praktikant
16. september 2004 - 22:21 #16
Ja så må du bytte rundt på de to så du først laver en ny kunde for der tilføjes til arrangement.


Så det skal ind her hvor du finder CustomID og inden den laver en redirect.

        Session("customerid") = CustomID
        Response.Redirect "checkout.asp"
Avatar billede ravnkilde Nybegynder
17. september 2004 - 00:07 #17
Hej eagleeye!

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?
Avatar billede eagleeye Praktikant
17. september 2004 - 00:09 #18
Ja det kan man gøre det skal bare være True uden " omkring:

if rs("aTelt") = True then
aTelt = "Ja"
else
aTelt = "Nej"
end if

Så udskrive det sådan her:  <%= aTelt %>
Avatar billede ravnkilde Nybegynder
17. september 2004 - 00:18 #19
Perfekt! Og tusinde tak, eagleeye.
Avatar billede ravnkilde Nybegynder
17. september 2004 - 00:19 #20
smid et svar, eagleeye. Så er der 200 pts på vej...
Avatar billede eagleeye Praktikant
17. september 2004 - 00:19 #21
Ok, her er et svar ;)
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