Newsgroup: it.comp.appl.access
Titolo: inviare mail da codice con docmd.sendobject inserendo nel testo i record di una query

Buongiorno NG,
voglio creare un automatismo per cui quando stampo un DDT mi venga inviata una mail con il testo i record della maschera, generata da una query.
Quindi in modo molto semplice nell'evento click del pulsante ho inserito queste poche righe:
 
Dim Corpo As String
Dim key As String
 
If Me.[2key] = 0 Then
    key = "1 key"
    Else
    key = "2 key"
End If
 
Corpo = Me.Posizione & " - " & key & " - " & Me.Model & " - " & Me.Stock_number & " - " & Me.License_plate & " - " & Me.VIN
 
DoCmd.SendObject acSendNoObject, , acFormatTXT, "indirizzo-email-to", "indirizzo-email-Cc", , "Oggetto-mail", Corpo, False
 
e ottengo nel corpo della mail ricevuto questo:
C01 - 2 key - Panda 0.9 - RR42227 - EV659SX - ZFA31200003302603 
 
Perfetto!, anzi no... perchè così ottengo solo il primo record della maschera (query) , mentre io voglio ottenere il testo con l'elenco degli "n" record che ho nella maschera in quel momento, ottenendo una mail di questo tipo:
C01 - 2 key - Panda 0.9 - RR42227 - EV659SX - ZFA31200003302603
A04 - 1 key - Peugeot 208 - QW12445 - FC223GB - 1PKFR504403202678
...
...
 
Come devo modificare il tutto per arrivare a questo?
 
Grazie mille per il Vostro immenso aiuto.
 
Andrea


ti crei un recordset con le righe del tuo ddt
 
e poi te lo cicli
 
while not tuoRecordset.eof
	corpo=corpo &  tuoRecordset.fields("posizione") & " - " & 
tuoRecordset.fields("posizione") & ...bla bla bla    & vbcrlf
 
	tuoRecordset.movenext
wend
 
 
'a questo punto fuori dal ciclo il tuo corpo contiene tutte le righe
 
BFS
 
 
 


Scusami tanto, ma non ne esco (porta pazienza non sono programmatore). Io ho cambiato il codice in questo modo (e logicamente non va, perchè NON avrò fatto esattamente ciò che mi hai detto di fare)
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Corpo As String
Dim strSQL As String
 
Set db = CurrentDb
strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin" 
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
While Not rs.EOF
Corpo = Corpo & rs.Fields(pickin.Posizione) & " - " & rs.Fields(pickin.[2key]) & " - " & rs.Fields(pickin.Model) & " - " & rs.Fields(pickin.Stock_number) & " - " & rs.Fields(pickin.License_plate) & " - " & rs.Fields(pickin.VIN) & vbCrLf
rs.MoveNext
Wend
 
(quando va in esecuzione mi torna l'errore runtime 424 - necessario oggetto)
 
Ti ringrazio in anticipo per l'immenso aiuto che vorrai darmi.


i nomi dei campi vanno tra apici
 
Corpo = Corpo & rs.Fields("pickin.Posizione") & " - " & 
rs.Fields("pickin.[2key]") ...etc etc
 
 
poi il tuo sql estrae tutte le righe dalla tabella pickin...credo ti 
serva anche la parte where per limitare alle sole righe del picking corrente
 
 
per il resto mi pare corretto
 
BFS
 
 


Si, ho volutamente tolto io il where per non appesantire il messaggio.
 
Grazie per ora, correggo e la provo 
 
Andrea 

Spero di non sbagliare, mi pareva ci fosse un LIMITE di Caratteri... 255, ma non ho trovato letteratura.
 
@Alex

 @Alex
Questo è esattamente ciò che sto eseguendo:
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Corpo As String
Dim key As String
Dim strSQL As String
 
Set db = CurrentDb
strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin WHERE (((pickin.NrDDT)=[Maschere]![M_StampaBollaDaSchedaAutoIDAuto1]![NrDDT]))"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
While Not rs.EOF
Corpo = Corpo & rs.Fields("pickin.Posizione") & " - " & rs.Fields("pickin.[2key]") & " - " & rs.Fields("pickin.Model") & " - " & rs.Fields("pickin.Stock_number") & " - " & rs.Fields("pickin.License_plate") & " - " & rs.Fields("pickin.VIN") & vbCrLf
rs.MoveNext
Wend
DoCmd.SendObject acSendNoObject, , acFormatTXT, "destinatario_mail", , , "PORTA STA MACCHINA!!!! E DATE NA MOSSA!!!", Corpo, False
 
ma mi esce l'errore di run-time 3061 - Parametri insufficienti. Previsto 1.
Cliccando Debug nel messaggio errore, mi evidenzia in giallo la riga Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) e posizionando il cursore del mouse sopra a dbOpenDynaset mi compare l'indicazione [dbOpenDynaset = 2],
se lo sposto sopra a strSQL mi appare tutta la stringa strrSQL = "SELECT pickin.stock_number..............ecc"
 
Dove posso concentrare la ricerca della soluzione?
Andrea

 Andrea
 
 
Metti il contenuto della strSql nell'editor di query di Access e lavori 
la' dentro finche' ti spara fuori il risultato che ti aspetti di vedere
 
Quando ci riuscirai allora avrai capito quale parte non e' stata 
composta correttamente, torni nel codice e sistemi
 
 
 

 E DATE NA MOSSA
 
Venessia, Mirano, Oriago e dintorni?  :)
 
 


io provincia di Vicenza ai confini con Padova. La mail era diretta al mio capetto che è di Verona


L'ho già testata come query ed escono i 2 record che devono uscire. La query è giusta.


Altra segnalazione che posso fare è che sopra a rs.EOF mi fa vedere il messaggio "variabile oggetto o variabile del blocco With non impostata"
ma che vuole???


Ma la riga 
Corpo = Me.Posizione & " - " & me.[2key] & " - " & Me.Model & " - " & Me.Stock_number & " - " & Me.License_plate & " - " & Me.VIN
messa prima del ciclo, ci vuole o non serve più? 


Allora, ho fatto 1000 prove e alla fine non trovando alcun errore ho fatto la 1001^ prova dando in pasto anzichè la query, una tabella che carico temporaneamente con i dati che mi servono allo scopo e ho modificato il codice in questo modo:
 
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Corpo As String
Dim key As String
Dim strSQL As String
If Me.[2key] = 0 Then
    key = "1 key"
    Else
    key = "2 key"
End If
CurrentDb.Execute "DELETE * FROM t_auto_temp" 'svuotamento della cartella temporanea
DoCmd.OpenQuery ("query12") 'questa è una query di accodamento che mi va a caricare gli "n" record nella tabella temporanea appena svuotata
Set db = CurrentDb
Set rs = db.OpenRecordset("t_Auto_temp", dbOpenTable) 'mi carica il recordset che stavolta lo fa senza errori (i campi sono sempre gli stessi di prima)
While Not rs.EOF
Corpo = Corpo & rs.Fields("Posizione") & " - " & key & " - " & rs.Fields("model") & " - " & rs.Fields("stock_number") & " - " & rs.Fields("license_plate") & " - " & rs.Fields("vin") & vbCrLf
rs.MoveNext
Wend
DoCmd.SendObject acSendNoObject, , acFormatTXT, "and...@mail.como", , , "PORTA STA MACCHINA!!!! E DATE NA MOSSA!!!", Corpo, False
'ottengo la mail con nel corpo le "n" righe/record che mi aspettavo 
Ora la domanda mi sorge spontanea.... perchè con l'altro metodo via query non funziona?
mah!, sono contento lo stesso perchè in qualche maniera sono riuscito ad arrivare al mio scopo anche se forse è un po' barbaro.
 
Ciao e alla prossima e grazie a tutti comunque, non ce l'avrei fatta senza i vostri preziosi aiuti.

 strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin WHERE (((pickin.NrDDT)=[Maschere]![M_StampaBollaDaSchedaAutoIDAuto1]![NrDDT]))"
 
cambialo con
 
strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, 
pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin 
WHERE (((pickin.NrDDT)=" & 
[Maschere]![M_StampaBollaDaSchedaAutoIDAuto1]![NrDDT]))
 
BFS
 
 


scusa mi sono perso le parentesi meglio cosi
 
 
strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, 
pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin 
WHERE pickin.NrDDT=" & [Maschere]![M_StampaBollaDaSchedaAutoIDAuto1]![NrDDT]
 
 
oppure più leggibile
 
dim strNrDDTas integer
strNrDDT=[Maschere]![M_StampaBollaDaSchedaAutoIDAuto1]![NrDDT]
 
strSQL = "SELECT pickin.stock_number, pickin.vin, pickin.license_plate, 
pickin.model, pickin.[2key], pickin.NrDDT, pickin.Posizione FROM pickin 
WHERE pickin.NrDDT=" & strNrDDT
 
 
BFS