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
--- start min kode ---
<!-- #include file="db.asp" -->
<!-- #include file="functions.asp" -->
<%
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
'On error resume next
sqlAdd = "INSERT INTO orders(ocustomerid,odate"
sqlAdd = sqlAdd & ") VALUES("
sqlAdd = sqlAdd & Session("customerid") & ",#" & Date & "#"
sqlAdd = sqlAdd & ")"
'Response.Write sqlAdd
'Response.End
call openConn()
dbc.execute sqlAdd, intAffected
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
'Opbyg mail indhold strBody
set rs = server.CreateObject("ADODB.recordset")
set rs = cmd.Execute
strCustomer = rs("cemail")
if not rs.eof then
strBody = "Bestilling" & rs("odate") & vbCrLf & vbCrLf
strBody = strBody & "Kundeinfo:" & vbCrLf
strBody = strBody & "Navn: " & rs("cfirstname") & rs("clastname") & vbCrLf
'strBody = strBody & rs("clastname") & vbCrLf
strBody = strBody & "E-mail: " & rs("cemail") & vbCrLf
strBody = strBody & "Adresse: " & rs("caddress") & vbCrLf
'strBody = strBody & rs("caddress") & " - " & rs("caddress2") & vbCrLf
strBody = strBody & "By: " & rs("ctown") & vbCrLf
strBody = strBody & "Postnr.: " & rs("czip") & vbCrLf
'strBody = strBody & rs("cstate") & vbCrLf
strBody = strBody & "Land: " & rs("ccountry") & vbCrLf
strBody = strBody & "Telefonnr.: " & rs("cphone") & vbCrLf & vbCrLf
'strBody = "Arrangementsoplysninger:" & vbCrLf & vbCrLf
'strBody = strBody & "Dato for arrangement: " & rs("aDato") & vbCrLf
'strBody = strBody & "Tidspunkt: " & rs("aTidspunkt") & vbCrLf
'strBody = strBody & "Sted/adresse: " & rs("aSted") & vbCrLf
'strBody = strBody & "Antal personer: " & rs("aPersoner") & vbCrLf
'strBody = strBody & "Beskrivelse af arrangementet: " & rs("aBeskrivelse") & vbCrLf
'strBody = strBody & "Telt: " & rs("aTelt") & vbCrLf & vbCrLf
strBody = strBody & "Ordredetaljer:" & vbCrLf
strBody = strBody & "Artikelnr." & vbTab & "Beskrivelse" & vbTab & "Antal" & vbTab & vbCrLf
strBody = strBody & "-------------------------------------------------------" & vbCrLf
'dblOrderTotal = 0
while not rs.EOF
strBody = strBody & rs("ccode") & vbTab & vbTab & rs("cname") & vbTab & vbTab
strBody = strBody & rs("numitems") & vbTab & lineTotal & vbCrLf
rs.MoveNext
wend
strBody = strBody & "-------------------------------------------------------" & vbCrLf
strBody = strBody & vbCrLf & vbCrLf
rs.Close
set rs = nothing
set cmd = nothing
'SMTP server
Set Mail = Server.CreateObject("Persits.MailSender")
strHost = "mail.fantasyleague.dk"
Mail.Host = strHost
Mail.From = "cra@mail.dk"
' Mail.FromName = merchantmail
Mail.AddAddress "cra@mail.dk", ""
Mail.AddAddress strCustomer
' message subject
Mail.Subject = "Tilbud/bestilling"
' message body
Mail.Body = strBody
strErr = ""
bSuccess = False
' On Error Resume Next ' catch errors
Mail.Send ' send message
If Err <> 0 Then ' error occurred
strErr = Err.Description
response.write strErr
else
bSuccess = True
End If
mailMerchant=bSuccess
else
rs.Close
set rs = nothing
set cmd = nothing
mailMerchant = false
end if
end function
%>
--- slut min kode ---
Skrevet ons. d. 22. september 2004 kl. 06:32:45| #1
Jeg læser fejlen som at du har en rs("xxx") hvor xxx ikke er et validt felt
i query output.
Hvad er linie 112 ?
Skrevet ons. d. 22. september 2004 kl. 08:14:41| #2
linie 112: strBody = strBody & "Dato for arrangement: " & rs("aDato") & vbCrLf
Se bort fra at linien er udkommenteret i kildekoden.
Skrevet ons. d. 22. september 2004 kl. 08:23:32| #3
Og der bliver returneret en aDato i den query/SP ?
Skrevet ons. d. 22. september 2004 kl. 08:24:09| #4
Husk at med expressions skal du AS'e som i:
SELECT ...,(a+b) AS ab,...
Skrevet ons. d. 22. september 2004 kl. 08:27:24| #5
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.
Skrevet ons. d. 22. september 2004 kl. 08:28:09| #6
@arne_v > nå, too slow :)
Skrevet ons. d. 22. september 2004 kl. 08:56:13| #7
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).
Hvordan får jeg indholdet af qryOrderInfo, mikbj?
Skrevet ons. d. 22. september 2004 kl. 09:21:53| #8
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.
Skrevet ons. d. 22. september 2004 kl. 11:03:38| #9
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]));
Skrevet ons. d. 22. september 2004 kl. 11:23:45| #10
Er du 100% sikker på du har kolonnen aDato i arrangement tabellen ?
Skrevet ons. d. 22. september 2004 kl. 11:34:31| #11
100%!
Feltnavn = aDato
Datatype = Tekst
Den bliver også trukket ud i emailen (se 11:03:38) ud for "Dato for arrangement:"
Skrevet ons. d. 22. september 2004 kl. 11:37:46| #12
Er fejlen væk og nu manger der noget i mailen eller?
Skrevet ons. d. 22. september 2004 kl. 11:46:27| #13
Ja, oplysningerne fra "customers" mangler, dvs: disse:
strBody = strBody & "Kundeinfo:" & vbCrLf
strBody = strBody & "Navn: " & rs("cfirstname") & rs("clastname") & vbCrLf
'strBody = strBody & rs("clastname") & vbCrLf
strBody = strBody & "E-mail: " & rs("cemail") & vbCrLf
strBody = strBody & "Adresse: " & rs("caddress") & vbCrLf
'strBody = strBody & rs("caddress") & " - " & rs("caddress2") & vbCrLf
strBody = strBody & "By: " & rs("ctown") & vbCrLf
strBody = strBody & "Postnr.: " & rs("czip") & vbCrLf
'strBody = strBody & rs("cstate") & vbCrLf
strBody = strBody & "Land: " & rs("ccountry") & vbCrLf
strBody = strBody & "Telefonnr.: " & rs("cphone") & vbCrLf & vbCrLf
Dem får jeg kun med hvis jeg udkommenterer "arrangements"-delen!
Skrevet ons. d. 22. september 2004 kl. 11:54:11| #14
er der noget i alle tabellerne?
Det kan måske være en tabel er tom og så kommer der ikke noget resultat.
Skrevet ons. d. 22. september 2004 kl. 12:03:15| #15
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.
Skrevet ons. d. 22. september 2004 kl. 12:14:53| #16
eagleeye: Kan det skyldes at både tabellen "cutomers" og "arrangement" har det samme feltnavn, nemmelig "custID"?
Skrevet ons. d. 22. september 2004 kl. 13:26:44| #17
Ja det kan faktisk godt drille men jeg ville umiddelbart ikke tror de betød den ikke viste noget.
Prøv at skrive de kolonne du vil havde med ud i stedet for arrangement.*
så skrive arrangement.aDato og arrangement.Tekst
i sql sætningen
Skrevet ons. d. 22. september 2004 kl. 13:27:13| #18
og prøv evt. også det samme med customers.*
Skrevet ons. d. 22. september 2004 kl. 13:57:08| #19
Nu har prøvet at tage de kolonner/felter med i stedet for arrangement.* og customers.*.
Men i mailen mangler jeg fortsat at få customers-oplysningerne!
sql'en ser sådan ud:
SELECT orders.orderID, orders.*, products.ccode, products.cname, products.cprice, oitems.numitems, customers.cfirstname, customers.clastname, customers.cemail, customers.caddress, customers.ctown, customers.czip, customers.ccountry, customers.cphone, arrangement.aDato, arrangement.aTidspunkt, arrangement.aSted, arrangement.aPersoner, arrangement.aBeskrivelse, arrangement.aTelt, arrangement.aAndet
FROM ((customers INNER JOIN orders ON customers.custID = orders.ocustomerid) INNER JOIN arrangement ON customers.custID = arrangement.custId) INNER JOIN (products INNER JOIN oitems ON products.catalogID = oitems.catalogid) ON orders.orderID = oitems.orderid
WHERE (((orders.orderID)=[oid]));
Skrevet ons. d. 22. september 2004 kl. 16:59:14| #20
Det forstår jeg ikke helt, har du nogle notat felter som du henter ud med SQL sætningen?
Skrevet ons. d. 22. september 2004 kl. 20:13:52| #21
notat felter? Jeg ved ikke rigtig, eagleeye...
Skrevet ons. d. 22. september 2004 kl. 21:17:10| #22
Porblemet er løst!
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!
Skrevet ons. d. 22. september 2004 kl. 21:24:43| #23
Ok, her et svar ;)
Ja det rigtigt det med strBody= .. ovskriver det andet hvis ikke der står som strBody=strBody&... :)
Skrevet ons. d. 22. september 2004 kl. 21:35:07| #24