22. september 2004 - 00:24Der er
22 kommentarer og 2 løsninger
Udtræk af data fra tre tabeller i e-mail / ADODB.Recordset error
Jeg har en side, der skriver data til to tabeller i min database og trækker data ud fra i alt fire tabeller i samme database til en e-mail.
Jeg formoder fejlen skyldes at sql'en ikke sørger for at trække de korresponderende data fra de fire tabeller, men kun fra tre tabeller. Fejlen kommer på den linie, der henter data fra tabellen "arrangement". Mellem de tre tabeller "customers", "orders" og "oitems" er der Relationer (ses i database-layout) men ikke mellem tabellen arrangement.
Jeg har dog lidt svært ved at se hvor jeg får kodet den sidste tabel med i udtrækket. Tabellen "arrangement" har et felt, der hedder "custID" ligesom tabellen "customers".
Dette er sidste step i mit projekt, så jeg håber der er nogen der kan hjælpe...
PS: Jeg har tjekket at feltnavnene i databasen er korrekt skrevet i koden.
Fejlmeddelelse: ADODB.Recordset error '800a0cc1' Item cannot be found in the collection corresponding to the requested name or ordinal. process.asp, line 112
Response.Buffer = true For Each key in Request.Form strname = key strvalue = Request.Form(key) Session(strname) = strvalue Next
Dim arrCart, scartItem arrCart = Session("MyCart") scartItem = Session("cartItem") if scartItem = 0 then Response.Redirect "error.asp?msg=" & Server.URLEncode ("Din session er udløbet, eller du prøvede at sende listen igen.") end if
if dbc.Errors.count > 0 then call closeConn() Response.Redirect "error.asp?msg=" & server.URLEncode("Fejl ved skrivning til database. Kontakt os venligst.") elseif intAffected = 1 then Dim oid, sqlo sqlo = "SELECT max(orderID) FROM orders" Set rso = dbc.Execute(sqlo) oid = Cint(rso(0)) rso.Close
If oid < 1 Then call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Fejl: Ingen ordrenr.") Else 'Ordre ind i oitems table For i = 1 To scartItem sqlOItem = "INSERT INTO oitems(orderid,catalogid,numitems) VALUES(" sqlOItem = sqlOItem & oid sqlOItem = sqlOItem & "," & arrCart(cProductid,i) sqlOItem = sqlOItem & "," & arrCart(cQuantity,i) sqlOItem = sqlOItem & ")" dbc.execute sqlOItem Next If dbc.Errors.Count > 0 then call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Ikke fuldfoert. Fejl: ") & dbc.Error.Description else 'send mail to merchant, use function mailMerchant blnMail = mailMerchant("cra@mail.dk",oid,nosmtp) if blnMail = false then call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Kan ikke sende mail til merchant.") end if end if End if else call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Ordre information kan ikke skrives til database. Proev venligst igen senere.") end if If dbc.Errors.Count > 0 then call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Ikke fuldfoert. Fejl: ") & dbc.Error.Description else dbc.close set dbc = nothing Response.Redirect "thanks.asp" 'send mail to merchant, use function mailMerchant blnMail = mailMerchant("cra@mail.dk",oid,nosmtp) if blnMail = false then call closeConn() Response.Redirect "error.asp?msg=" & Server.URLEncode ("Kan ikke sende mail til merchant.") end if End If
function mailMerchant(merchantmail,orderid,smtpServer) 'Kunde info fra DB set cmd = server.CreateObject("ADODB.Command") cmd.ActiveConnection = dbc cmd.CommandText = "qryOrderInfo" cmd.CommandType = adCmdStoredProc set param = cmd.CreateParameter("oid",adInteger,adParamInput,4) cmd.Parameters.Append param cmd("oid") = orderid
Fejlen fortæller, at feltet aDato ikke eksiterer i dit recordset. Se evt. efter, om din stored procedure "qryOrderInfo" også returnerer en værdi ved navn aDato. Prøv evt. at copy/paste indholdet af qryOrderInfo herind, hvis du sidder fast.
aDato er blevet skrevet ned i db'en (arrangement-tabel) på et tidligere tidspunkt i forløbet - i øvrigt sammen med alle oplysningerne til "customers", f.eks. rs("cfirstname).
Du kan åbne access filen i access gå ind på "Forspørgelse" eller "Query" siden og åbne qryOrderInfo. Så den til at vise det SQL sætning ved at trykke på den føste kanp i tool baren (den ligner en trekant med en byant på) i listen som kommer frem vælq SQL.
Den oprindelige qryOrderInfo indeholdte selvfølgelige ikke tabellen arrangement. Jeg har tilføjet tabellen "arrangement" i qryOrderInfo (se sql nederst). Så langt så godt. Men på e-mailen kommer nu kun disse oplysninger:
Arrangementsoplysninger:
Dato for arrangement: 12-12-2005 Tidspunkt: 12.30 Sted/adresse: Vejen 111 Antal personer: 100 Beskrivelse af arrangementet: Fest Telt: True
Ordredetaljer: Artikelnr. Beskrivelse Antal ------------------------------------------------------- D1 Dug, 140x140 1 -------------------------------------------------------
Oplysningerne om kunden, dvs. fra "customers" er slet ikke med! Hvis jeg derimod udkommenterer oplysningerne om "arrangement", så kommer kunde-oplysningerne med igen!
Hvad har jeg gjort forkert?
Sådan ser den OPRINDELIGE qryOrderInfo ud: SELECT orders.orderID, orders.*, products.ccode, products.cname, products.cprice, oitems.numitems, customers.* FROM (customers INNER JOIN orders ON customers.custID = orders.ocustomerid) INNER JOIN (products INNER JOIN oitems ON products.catalogID = oitems.catalogid) ON orders.orderID = oitems.orderid WHERE (((orders.orderID)=[oid]));
sådan ser den NUVÆRENDE qryOrderInfo ud: SELECT orders.orderID, orders.*, products.ccode, products.cname, products.cprice, oitems.numitems, customers.*, arrangement.* FROM ((customers INNER JOIN orders ON customers.custID = orders.ocustomerid) INNER JOIN (products INNER JOIN oitems ON products.catalogID = oitems.catalogid) ON orders.orderID = oitems.orderid) INNER JOIN arrangement ON customers.custID = arrangement.custId WHERE (((orders.orderID)=[oid]));
Ja, der er noget i de fire berørte tabeller, måske ikke i alle felter. Men det sjove er, at jeg kan få tingene med for customers hvis jeg udkommenterer "Arrangementsoplysninger" og vice versa. Men altså ikke begge på én gang. I begge tilfælde kommer "Ordredetalje:" med.
Linien strBody = "Arrangementsoplysninger:" & vbCrLf & vbCrLf var den skyldige. Efter at jeg fik den ændret til strBody = strBody & "Arrangementsoplysninger:" & vbCrLf virker det perfekt. Jeg får alle de ønskede oplysninger med i mailen.
Men så langt var jeg slet ikke kommet hvis ikke jeg havde fået lavet den rigtige qryOrderInfo! Det har været yderst lærrigt!
Derfor er der også pts jer - smid et svar. Tak for hjælpen!
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.