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

--- 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 ---
Avatar billede arne_v Ekspert
22. september 2004 - 06:32 #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 ?
Avatar billede ravnkilde Nybegynder
22. september 2004 - 08:14 #2
linie 112: strBody = strBody & "Dato for arrangement: " & rs("aDato") & vbCrLf

Se bort fra at linien er udkommenteret i kildekoden.
Avatar billede arne_v Ekspert
22. september 2004 - 08:23 #3
Og der bliver returneret en aDato i den query/SP ?
Avatar billede arne_v Ekspert
22. september 2004 - 08:24 #4
Husk at med expressions skal du AS'e som i:

SELECT ...,(a+b) AS ab,...
Avatar billede bernhof Nybegynder
22. september 2004 - 08:27 #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.
Avatar billede bernhof Nybegynder
22. september 2004 - 08:28 #6
@arne_v > nå, too slow :)
Avatar billede ravnkilde Nybegynder
22. september 2004 - 08:56 #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?
Avatar billede eagleeye Praktikant
22. september 2004 - 09:21 #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.
Avatar billede ravnkilde Nybegynder
22. september 2004 - 11:03 #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]));
Avatar billede eagleeye Praktikant
22. september 2004 - 11:23 #10
Er du 100% sikker på du har kolonnen aDato i arrangement tabellen ?
Avatar billede ravnkilde Nybegynder
22. september 2004 - 11:34 #11
100%!

Feltnavn = aDato
Datatype = Tekst

Den bliver også trukket ud i emailen (se 11:03:38) ud for "Dato for arrangement:"
Avatar billede eagleeye Praktikant
22. september 2004 - 11:37 #12
Er fejlen væk og nu manger der noget i mailen eller?
Avatar billede ravnkilde Nybegynder
22. september 2004 - 11:46 #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!
Avatar billede eagleeye Praktikant
22. september 2004 - 11:54 #14
er der noget i alle tabellerne?
Det kan måske være en tabel er tom og så kommer der ikke noget resultat.
Avatar billede ravnkilde Nybegynder
22. september 2004 - 12:03 #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.
Avatar billede ravnkilde Nybegynder
22. september 2004 - 12:14 #16
eagleeye: Kan det skyldes at både tabellen "cutomers" og "arrangement" har det samme feltnavn, nemmelig "custID"?
Avatar billede eagleeye Praktikant
22. september 2004 - 13:26 #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
Avatar billede eagleeye Praktikant
22. september 2004 - 13:27 #18
og prøv evt. også det samme med  customers.*
Avatar billede ravnkilde Nybegynder
22. september 2004 - 13:57 #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]));
Avatar billede eagleeye Praktikant
22. september 2004 - 16:59 #20
Det forstår jeg ikke helt, har du nogle notat felter som du henter ud med SQL sætningen?
Avatar billede ravnkilde Nybegynder
22. september 2004 - 20:13 #21
notat felter? Jeg ved ikke rigtig, eagleeye...
Avatar billede ravnkilde Nybegynder
22. september 2004 - 21:17 #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!
Avatar billede eagleeye Praktikant
22. september 2004 - 21:24 #23
Ok, her et svar ;)

Ja det rigtigt det med strBody= .. ovskriver det andet hvis ikke der står som strBody=strBody&... :)
Avatar billede arne_v Ekspert
22. september 2004 - 21:35 #24
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