Newsgroup: it.comp.appl.access
Titolo: Stampa recordset su più pagine con i bookmarks da access a word

Ciao,
ho cercato nei vari post una soluzione, ma non l'ho ancora trovata. Ho
quindi deciso di esporre il mio problema, nella speranza che qualcuno
possa darmi una mano.
Da un pulsante di una maschera ho la necessità di far stampare su un
modello di word, una lettera contente due campi il cui contenuto viene
estratto con una query parametrica tra due tabelle relazionate tra di
loro "uno a molti", in base ai dati visualizzati in quel momento nella
maschera. Le tabelle in questione sono "Corsi" il cui campo che mi
interessa è "CODINTERNO" e la tabella "Docenti" il cui campo che mi
interessa è "nomedocente". Naturalmente per ciascun corso ci sono più
docenti.
Ho provato con il metodo dei bookmarks e la procedura funziona in
parte, nel senso che mi apre correttamente il file di word
compilandolo, ma mi mette i nominativi dei docenti uno di seguito
all'altro nella stessa pagina. Voglio invece che il CODINTERNO insieme
ad un singolo docente venga stampato su una pagina, e gli altri
docenti su altre pagine.
Ho provato anche con il Mairmerge ma ho problemi nell'impostare la
stampa unione in word, dal momento che i dati si basano su una query
parametrica.
Io utilizzo Office 2007, ma lavoro su database e documenti 2003,
poichè in azienda ci sono ancora dei pc con queste versioni.
Riporto di seguito il codice utilizzato nella routine:
Private Sub SoddAllievoDocente_Click()
Dim Wrd As Word.Application, Doc As Word.Document
Dim Modello As String, NomeFile As String, i As Integer
Dim Record As String, s As String
Dim ReplSel As Boolean
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
    On Error Resume Next 'gestione errori step by step
    'cerca un'istanza di Word già aperta
    Set Wrd = GetObject(, "Word.Application")
    If Err.Number = 429 Then
        'se c'è stato un errore è perchè Word non era già aperto:
        'aprilo adesso
        Set Wrd = CreateObject("Word.Application")
    End If
    On Error GoTo 0 'ripristina la segnalazione degli errori
    'rendi visibile la finestra di Word:
    Wrd.Visible = True
    'attiva Word e portalo in primo piano:
    Wrd.Activate
    'abilita l'opzione "Sostituisci la selezione". Se non fosse
    'attiva, i campi modulo rimarrebbero all'interno del testo.
    ReplSel = Wrd.Options.ReplaceSelection
    Wrd.Options.ReplaceSelection = True
    'Apri un nuovo documento basato sul modello:
    Set Doc = Wrd.Documents.Add("F:\2006\PROCEDURE\PGQ_08_01
soddisfazione\PGQ 08_01_02 Soddisfazione_allievo_docenteREV2.dot")
    'attivalo e portalo in primo piano:
    Doc.Activate
    Doc.Bookmarks("codinterno").Select
    'e sovrascrivilo con il contenuto dei campi
    'codinterno:
    Wrd.Selection.TypeText nz(Me.CODINTERNO, "")
    'esportazione elencodocenti:
    'selezione del punto di inserimento
    'apertura del recordset
    Set dbs = CurrentDb
    Set qdf = dbs.QueryDefs("Q_docenti_corsi")
        qdf.Parameters("[Forms]![corsi]![CODINTERNO]") = Forms!corsi!
CODINTERNO
    Set rst = qdf.OpenRecordset
    Doc.Bookmarks("docente").Select
    If Not rst.BOF Then 'se il recordset non è vuoto
              'Wrd.Selection.TypeText nz(rst("Denominazione"))
        'ciclo sul recordset ed esportazione di tutte le righe
        With rst
                rst.MoveFirst  'posizionati sul primo record
            While Not .EOF 'ripeti fino alla fine del recordset:
                'costruisci la riga da scrivere nel documento:
                Wrd.Selection.TypeText nz(rst("Denominazione")) &
vbCrLf 'scrivi la riga
                rst.MoveNext 'passa al prossimo record
            Wend 'Not .EOF
        End With 'Rst
        'chiudi e azzera il recordset
        rst.Close: Set rst = Nothing
    Else 'Not Rst.BOF
        Wrd.Selection.TypeText "NESSUN DOCENTE." & vbCrLf
    End If 'Not Rst.BOF
    'ripristina il valore originario dell'opzione
    '"Sostituisci la selezione"
    Wrd.Options.ReplaceSelection = ReplSel
    'avvisa l'utente che l'esportazione è terminata
    Wrd.Application.WordBasic.MsgBox "Esportazione terminata",
"Esportazione dati da Access"
On Error GoTo Err_SoddAllievoDocente_Click
Exit_SoddAllievoDocente_Click:
    Exit Sub
Err_SoddAllievoDocente_Click:
    MsgBox Err.Description
    Resume Exit_SoddAllievoDocente_Click
End Sub
Probabilmente c'è qualche istruzione da inserire nel ciclo, ma non
conosco VBA, e non ho trovato un esempio simile neanche sul
sitocomune.
Grazie per l'aiuto

 Grazie per l'aiuto
ovvio perch� il file word lo apri fuori dal ciclo..quindi una sola volta.
dovresti invece fare qualcosa del tipo:
istanziare word
ciclare la tua query
while not tuaquery.eof
	aprire il file word
         compilare i due segnalibri
	stampare il file word
	oppure salvarlo (con nome diverso ovviamente 
es.objWord.ActiveDocument.SaveAs & nomedocente)	
	tuaquery.movenext
wend
rilasciare word
ciao
BFS

 BFS
Grazie, nel frattempo ci sono arrivata anch'io inserendo l'apertura del file nel ciclo, in questo modo però mi apre due documenti composti da una pagina ciascuno, invece vorrei che la routine mi aprisse un unico documento con due pagine.
Alla fine la soluzione l'ho trovata con il MeilMerge, anche se mi piace meno, mettendo insieme le soluzioni di più post:
1) ho creato una tabella d'appoggio dalla query parametrica (con query di creazione tabella)
2) ho trasformato la query parametrica in query di accodamento che punta alla tabella di appoggio
3) ho creato una query di eliminazione sempre per la tabella di appoggio, in modo che tale tabella venga svuotata prima dell'esecuzione della query di accodamento
4) ho preparato il file di word per la stampa unione, utilizzando come origine dati la tabella di appoggio
Riporto di seguito il codice utilizzato nel caso servisse a qualcuno:
Private Sub Comando25832_Click()
On Error GoTo Err_Comando25832_Click
DoCmd.SetWarnings False '<-- no messaggi di avviso
DoCmd.OpenQuery "Q_tab_sad_elimina" 'Cancella i dati presenti nella tabella di appoggio
DoCmd.SetWarnings False '<-- no messaggi di avviso
DoCmd.OpenQuery "Q_SADappoggio" 'Esegue la query che popola la tabella di appoggio di nuovi dati
 
Dim objWord As Word.Document
    Set objWord = GetObject("I:\DB Irecoop\PGQ 08_01_02 Soddisfazione_allievo_docenteREV2.dot", "Word.Document")
   ' Rende Word visibile.
    objWord.Application.Visible = True
    objWord.MailMerge.Destination = wdSendToNewDocument
    objWord.MailMerge.Execute
    objWord.Close False
 
Exit_Comando25832_Click:
    Exit Sub
Err_Comando25832_Click:
    MsgBox Err.Description
    Resume Exit_Comando25832_Click
 
End Sub
L'unica cosa è che quando mi apre il file di word mi appare la finestra che mi informa che all'apertura del documento verrà eseguito il comando SQL, cliccando su sì tutto funziona, ma vorrei che tale finestra non apparisse.
Ho provato a eliminarla seguendo il consiglio che ho trovato in altri post (modifica chiave di registro, modifica impostazioni di word per eseguire le macro...) ma non ci sono riuscita. Se hai qualche suggerimento...
Grazie e ciao
Raffa