Oprettet ons. d. 22. september 2004 kl. 00:24:06

ravnkilde
ravnkilde (6.670 point. Point ude: 550)

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

arne_v
arne_v (1.005.403 point)
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

ravnkilde
ravnkilde (6.670 point)
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

arne_v
arne_v (1.005.403 point)
Og der bliver returneret en aDato i den query/SP ?

Skrevet ons. d. 22. september 2004 kl. 08:24:09| #4

arne_v
arne_v (1.005.403 point)
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

bernhof
bernhof (22.328 point)
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

bernhof
bernhof (22.328 point)
@arne_v > nå, too slow :)

Skrevet ons. d. 22. september 2004 kl. 08:56:13| #7

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
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

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
Er du 100% sikker på du har kolonnen aDato i arrangement tabellen ?

Skrevet ons. d. 22. september 2004 kl. 11:34:31| #11

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
Er fejlen væk og nu manger der noget i mailen eller?

Skrevet ons. d. 22. september 2004 kl. 11:46:27| #13

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
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

ravnkilde
ravnkilde (6.670 point)
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

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
og prøv evt. også det samme med  customers.*

Skrevet ons. d. 22. september 2004 kl. 13:57:08| #19

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
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

ravnkilde
ravnkilde (6.670 point)
notat felter? Jeg ved ikke rigtig, eagleeye...

Skrevet ons. d. 22. september 2004 kl. 21:17:10| #22

ravnkilde
ravnkilde (6.670 point)
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

eagleeye
eagleeye (330.000 point)
www.eagleeye.dk
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


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Udskrive mappens navn

Oprettet den 8. februar 2012 kl. 13.32
no_doubt giver 60 point for svar | Giv et svar »

Flere tæller/counter SQL og ASP!

Oprettet den 7. februar 2012 kl. 20.09
denny giver 30 point for svar | Giv et svar »

hjælp til fejl

Oprettet den 1. februar 2012 kl. 10.54
sth giver 100 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger