PDA

View Full Version : [vb] report & e-mail


disumano
25-05-2004, 10:57
ho creato un report con il datareport di vb6 e vorrei aggiungere queste 2 possibilità:

1) vorrei che a piè pagina del report ci fossero data e n° di pagina del report (nella sezione apposita del report non è possibile inserire controlli se non label);

2) vorrei poter spedire il report per e-mail (semplicemente creare un nuovo messaggio che abbia come corpo o come allegato il report, non voglio inviarlo direttamente da vb, insomma come "mailto:[email protected]").

:confused:

ringrazio in anticipo per i suggerimenti

disumano
25-05-2004, 11:11
mi serve poi anche poter fare il refresh del recordset sul quale è basato il report, ma non trovo il metodo refresh...:(

matpez
25-05-2004, 13:20
Allora facciamo una cosa per volta... per visualizzare il numero delle pagine devi creare una label che contenga il testo "%p", in questa maniera ti va a leggere il numero della pagina corrente!

Per il resto mangio e poi mi metto al lavoro :)

matpez
25-05-2004, 13:22
Originariamente inviato da disumano
mi serve poi anche poter fare il refresh del recordset sul quale è basato il report, ma non trovo il metodo refresh...:(

Per fare il metodo di refresh se la tua varibile recordset si chiama rs, devi fare così: rs.Requery(adCmdText)

disumano
25-05-2004, 14:25
ovviamente tutto ok con il numero di pagina ;)

in
rs.Requery(adCmdText)
adcmdtetxt sarebbe uno dei controlli del report?

matpez
25-05-2004, 14:28
No è un parametro che passi alla funzione per fare il refresh del recordset.

Naturalmente il report va riaperto da capo.

disumano
25-05-2004, 14:36
io ho un pulsante che fa:
Private Sub stampa_Click()
report_forn.Show
data1.rsfornitori.Requery (adCmdText)
End Sub

però mi dice "L'operazione non è consentita se l'oggetto è chiuso".
ha a che fare con la gestione pessimistica?

matpez
25-05-2004, 14:41
Ma tu mica usi il controllo data per fare la gestione del database?

:( brutta cosa....

Se ti posso dare un consiglio impara a lavorare con ADO a mano... ti posto un esempio che ho trovato (perchè nn mi va di crearlo io) :p

PS: io intanto sto cercando per la mail, ci sono quasi riuscito, devo solo superare ancora qlc ostacolo :)

matpez
25-05-2004, 14:42
...dimenticavo... :oink:

disumano
25-05-2004, 14:52
non uso il controllo data, in genere uso il controllo ado, e in questo caso ho usato il dataenvironment.

il fatto è che preferisco avere un riferimento visuale nei miei progetti, quindi vedendo il controllo ado sul form capisco a cosa serve quel form in quel progetto :p

in ogni caso ora ho bisogno di ultimare un programma che mi sta prendendo da un mesetto, e mi manca solo la gestione delle stampe.
le prime + imbecilli le ho fatte con printform (te ne ricorderai perché anche lì ci sei andato a finire di mezzo:D );
queste ultime che sono + complesse le ho fatte con i report.

adesso anche se si tratta di usare un artificio (nella mia "carriera" ne ho usati di tutti i colori, a fondamenti 2 il professore mi stava per sputare in faccia :D), mi basta che se apro un report, lo richiudo, modifico i dati nel db e poi apro di nuovo il report, questo visualizzi i dati aggiornati.

matpez
25-05-2004, 14:57
Bhe infatti è quello che devi fare, rifai la query e rilanci il report e lui rivisualizza i dati aggiornati :D

disumano
25-05-2004, 15:05
ma le query che uso sono dei command del dataenvironment.
come faccio a rifare la query?
con il controllo ado facevo
ado.refresh
e mi passava la paura:D
ora pare che io non possa...

matpez
25-05-2004, 15:07
Bhe io nn ho mai usato quel controllo che usi tu, ma credo che se tu chiudi il recorset e rilanci la query e riapri il report dovrebbe essere aggiornato...

disumano
25-05-2004, 15:09
il discorso è che il recordset non lo istanzio io, viene istanziato (credo) all'avvio, e non ho modo di chiuderlo e riaprirlo tramite codice...

matpez
25-05-2004, 15:13
Bhe ma io ripeto...usare ADO come tutti i cristiani? :p

disumano
25-05-2004, 15:22
dai, non mi fare una schifezza solo perché sono pigro...:D

cmq sei stato fin troppo gentile, vedrò come fare per aggirare il problema.

aspetto con ansia notizie per l'email (sto provando da stamattina ma nisba)

matpez
25-05-2004, 15:25
Bhe le librerie ADO sono + potenti del controllo e soprattutto le tratti come vuoi :D

Cmq per la mail, come mai ti serve esterna a VB ?

disumano
25-05-2004, 15:32
xché credo sia + facile implementare un semplice link che non tutto l'invio, e siccome non mi è stato chiesto di inviare email, ma lo faccio di mia iniziativa, mi basta una cosa semplice, tanto è un di più.

matpez
25-05-2004, 15:47
Allroa io ho trovato un metodo per farlo... sai cosa è la CDONTS ?

disumano
25-05-2004, 16:04
ho appena letto che è un oggetto com e che per utilizzarlo serve iis, giusto?

matpez
25-05-2004, 16:16
Bhe che serva IIS no, diciamo che è usato su IIS, per mandare le mail tramite ASP, ecco, per facilitare il tutto se utilizziamo questa dll esterna, è un figata della madonna...

Se ti interessa ti mando un esempio che ho fatto :p

disumano
25-05-2004, 16:19
manda manda :oink:

matpez
25-05-2004, 16:23
Devi includere nelle references la: Microsoft CDO for NTS 1.2 Library .... se per caso nn c'è in elenco, caricala la dll CDONTS dal browse (si trova in system32)


Dim miaEmail As CDONTS.NewMail

Set miaEmail = New CDONTS.NewMail

miaEmail.From = "[email protected]"
miaEmail.To = "[email protected]"
miaEmail.Subject = "Prova"
miaEmail.BodyFormat = 0
miaEmail.MailFormat = 0
miaEmail.Importance = 1
miaEmail.AttachFile ("G:\Y2K\stcascad.reg")

miaEmail.Body = "<B>ciao</B>"

miaEmail.Send

Set miaEmail = Nothing

disumano
25-05-2004, 16:36
mi mandi anche la dll per favore?
mi sa che non ce l'ho sul pc...

disumano
25-05-2004, 16:37
come non detto, l'ho appena presa da internet...

disumano
25-05-2004, 16:43
non per minare la tua onniscenza, ma siamo sicuri che funge?
non ho alcun risultato...
deve esserci qualche conferma?
deve succedere qlcs?

matpez
25-05-2004, 17:42
Bhe postami il tuo codice...

Al massimo la dll (che deve essere messa in system32), prova a registrarla così... in esegui scrivi: REGSVR32 CDONTS.DLL

disumano
03-06-2004, 11:59
Originariamente inviato da matpez
Se ti posso dare un consiglio impara a lavorare con ADO a mano...

mi sto cimentando ad usare ADO solo da codice, come mi hai consigliato, e voglio farti una piccola domanduccia:
una volta istanziato rs1 come recordset, con il comando

text1.DataSource=rs1

va tutto bene, ma se scrivo

DataGrid1.DataSource=rs1

mi da l'errore 7004: 'Impossibile assegnare segnalibri al gruppo di righe'.
ne sai qlcs?:confused:

matpez
03-06-2004, 12:11
Solitamente non uso un datagrid perchè è poco manovrbile, solitamente tendo ad usare il controllo ListView in modalità report

disumano
03-06-2004, 12:26
ma per il listview non c'è un datasource? i record li linki manualmente?

matpez
03-06-2004, 12:28
Si certo, devi popolarteli a mano :)

disumano
03-06-2004, 12:31
ma allora che rottura di marroni:D

matpez
03-06-2004, 12:32
Questa è una funzione che ti potrebbe venire utile:

Private Sub AddListViewLine(objLvw As ListView, ParamArray items() As Variant)

Dim nI As Integer


With objLvw.ListItems
With .Add(, , items(0)).ListSubItems
nLenVet = UBound(items)
For nI = 1 To nLenVet
.Add , , items(nI)
Next
End With
End With

End Sub

Il primo parametro è il nome della tua listview e dopo sono tutte le colonne della prima riga

es:

AddListViewLine lvwPianificazione, sVetAux(1), sVetAux(2), sVetAux(3)

Se la richiami lui riempe la seconda riga, e così via...

matpez
03-06-2004, 12:33
Originariamente inviato da disumano
ma allora che rottura di marroni:D

Bhe, tutti dicono che VB è facile da usare, io dico, certo, finchè si usano le cose già pronte si, ma le cosee già pronte non sempre rispecchiano quello che si vuole cercare di fare :)

disumano
03-06-2004, 12:33
sempre gentilissimo;)

matpez
03-06-2004, 12:36
Ti posto anche questo esempio che utilizza i record:

While Not rs.EOF
Call AddListViewLine(lvwRisultati, rs!IDPaziente, rs!Cognome, rs!Nome, Format$(rs!DataDimissione, "dd/mm/yyyy"), Format$(rs!DataRicovero, "dd/mm/yyyy"))
rs.MoveNext
Wend

Ti conviene infatti utilizzare la prima colonna della lista salvando l'ID, così poi è + facile da recuperare. ;)