Newsgroup: it.comp.appl.access
Titolo: Stampa unione

Ciao a tutti.
Vi porgo, da principiante della programmazione, uno dei miei tanti problemi
da risolvere:
da un una maschera, che mi visualizza i dati filtrati per mezzo di una query
a parametri, ha creato un pulsante che mi avvia il processo di stampaunione
con un documento prestabilito in Word. Il trasferimento dei dati, prelevati
dalla query a parametri precedente, funziona ed il documento si avvia
correttamente.
La finezza, o il problema è questo:
quando ad un campo, prelevato da un a data tabella "Attore" corrispondono
più campi in una seconda tabella "Convenuto", la query mi estrae un tot di
n° di recordset, in proporzione ai dati ritrovati (ad un "attore" possono
corrispondere più "convenuti" o viceversa), i quali diventeranno la base
dati inviati, con la stampaunione, a Word; questo li inserirà, nei punti
prestabiliti del verbale, (il record corrispondente all' "attore" e al
"convenuto"), ma mi creerà tanti verbali quanti sono i recorset ricavati
dalla query ( uno per ogni corrispondenza Attore-Convenuto o viceversa).
Spero di essermi imbobinato nella siegazione.
Ringrazio, anticipatamente, tutti coloro che mi sapranno aiutare.
Onir
-- 
Posted from 
smtp3.libero.it
 [193.70.192.53] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:002201c128d7$fcfb6ca0$c5501497@default...

Io ebbi lo stesso problema ai tempi di Access 2.0 e lo risolsi così, feci un
documento predisposto alla stampa unione con i dati del "convenuto" (nel tuo
caso) e il documento riultante dall'unione lo chiamavo sempre con lo stesso
nome es.: Pippo.doc, pippo.doc lo inserivo nel documento risultante dalla
stampa unione con idati dell'attore che per es. si chiamava Pluto.doc in
modo che per ogni attore venivano stampati tutti i suoi convenuto.
Ciao Robert - Syd

 ha scritto nel messaggio
news:002201c128d7$fcfb6ca0$c5501497@default...

Anche se ne abbiamo già parlato, rimbocchiamoci le maniche ed iniziamo;
il "trucco" è quello di inserire nel documento word una parola che venga
sostituita da noi con una tabella costruita record per record.
Il documento word deve essere legato alla query/tabella che ti restituisce
solo i dati dell'attore, i convenuti li selezionerai e scriverai tu.
Nel documento deve esistere (nel mio caso) una parola "Elenco" che verrà
cercata e sostituita dalla tabella. La struttura della tabella
(nell'esempio) è formata da 4 colonne.
Il codice che ti propongo prende in esame la stampa di una fattura che è
composta da una intestazione e un dettaglio, struttura simile al tuo
problema; prova ad adattarlo.
Quindi:
'----------
Sub stampaDettaglio()
'gestisco l'errore altrimenti rimango in mutande
On Error GoTo stampaDettaglio_err
'chiamiamo word e per ora non lo rendiamo visibile
Dim oApp As Word.Application
Set oApp = CreateObject("Word.Application")
oApp.Visible = False
'variabile contenente il recordset del Dettagglio
Dim rstDett As Recordset
'variabile contenente l'istruzione sql
Dim stringaSql As String
'apro il modello della fattura
oApp.Documents.Open "c:\documenti\NomeDocumento.doc"
'eseguo la stampa unione dell'intestazione con output su un nuovo documento
With oApp.Documents(1).MailMerge
    .Destination = wdSendToNewDocument
    .Execute
End With
'attivo il documento creato
oApp.Windows(2).Activate
'cerco la stringa "Elenco"
oApp.Selection.Find.ClearFormatting
With oApp.Selection.Find
    .Text = "Elenco"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
oApp.Selection.Find.Execute
'mi creo la query che mi restituisce il dettaglio della fattura
stringaSql = "Select numero, testo, data, contatore From nomeTabella Where
numero = 22"
'mi prendo il recordset
Set rstDett = CurrentDb.OpenRecordset(stringaSql)
'tanto pe' nun sape' ne' legge ne' scrive
rstDett.MoveLast
rstDett.MoveFirst
'inserisco la tabella con X colonne, intestazione Y righe
oApp.ActiveDocument.Tables.Add Range:=oApp.Selection.Range,
NumRows:=rstDett.RecordCount, NumColumns:=4
'tabella senza griglia
oApp.Selection.Tables(1).Borders.Enable = False
'scrivo l'intestazione della tabella
With oApp.Selection
    .TypeText Text:="Numero"
    .MoveRight Unit:=wdCell
    .TypeText Text:="Testo"
    .MoveRight Unit:=wdCell
    .TypeText Text:="Data"
    .MoveRight Unit:=wdCell
    .TypeText Text:="Contatore"
End With
'scrivo il dettaglio della fattura
Do While Not rstDett.EOF
    With oApp.Selection
        .MoveRight Unit:=wdCell
        .TypeText Text:=rstDett(0)
        .MoveRight Unit:=wdCell
        .TypeText Text:=rstDett(1)
        .MoveRight Unit:=wdCell
        .TypeText Text:=Format(rstDett(2), "dd mmmm yyyy")
        .MoveRight Unit:=wdCell
        .TypeText Text:=Format(rstDett(3), "#,###")
    End With
    rstDett.MoveNext
Loop
'posso visualizzare il risultato per un controllo
oApp.Visible = True
'stampo il documento appena creato
oApp.ActiveDocument.PrintOut
'chiudo il documento senza salvarlo
oApp.Windows(1).Close SaveChanges:=wdDoNotSaveChanges
'chiudo il modello della fattura senza salvarlo
oApp.Windows(1).Close SaveChanges:=wdDoNotSaveChanges
'chiudo word
oApp.Quit
'chiudo il recordset
rstDett.Close
'rilascio gli oggetti
Set oApp = Nothing
Set rstDett = Nothing
MsgBox "Stampa terminata."
stampaDettaglio_exit:
    Exit Sub
stampaDettaglio_err:
    oApp.Visible = True
    MsgBox Err.Number & ", " & Err.Description
End Sub
'----------
Ciao.

 ha scritto nel messaggio
news:9lqddv$cf9$1...@canarie.caspur.it...

Scusa la mia ignoranza in materia, ma il fatto di avere i dati dibattuti in
tabelle separate  (tabella Attore - tabella Convenuto) può essere un
vantaggio nell'addattre il codice che mia hai proposto?
Sinceramente non mi è molto chiaro, data la mia poca esperienza e conoscenza
edlla materia, ma ti ringrazio ugualmente con la speranza di ricavarne,
comunque, un ottimo prodotto.
Ciao a presto.


Il vantaggio lo trovi anche nella gestione dei dati, non solo nell'adattare
la soluzione che ti ho proposto.
Se hai detto che per ogni attore puoi avere molti convenuti (a proposito,
che sono i convenuti?), è una classica relazione uno a molti con due tabelle
(Attori - Convenuti) legate tra loro da un campo in comune che serve per
identificare quali/quanti convenuti ha quell'attore.
Se memorizzi tutto in una sola tabella e quell'attore ha tre conventuti,
devi riperete i dati dell'attore per ogni diverso convenuto. Alla fine ti
ritrovi in tabella dati doppi che potresti "riassumere" con un riferimento
(per esempio il nome e cognome) che utilizzerai per avere maggiori
informazioni per quell'attore, leggendo il nome e cognome nella tabella
Attori.
Ti consiglio di approfondire il tema dei database relazionali così da poter
strutturare meglio il tuo lavoro; senza una buona divisione dei dati
(tabelle, indici, relazioni) anche una bellissima procedura può non essere
funzionale al 100%.
Per quanto riguarda la possibilità di adattare l'esempio riportato; puoi
comunque utilizzarlo, ma io non posso adattarla alle tue esigenze perché non
hai indicato la struttura della tabella o tabelle con i nomi dei campi da
prendere in esame per la stampa unione...
Ciao.

     .Wrap = wdFindContinue     (""Variabile non definita"")
ecc. ecc,
cosa significa tutto ciò e come posso fare?
Ancora grazie pe rla pazienza e i buoni consigli. (la parte precedente, con
qualche accorgimento
funziona e quella successiva mi sembra, a prima vista abbordabile)
Ciao
Onir


Certo che ci diamo del tu;
tralasciamo per ora la struttura delle tabelle; per far "funzionare" a
dovere l'esempio devi inserire i riferimenti alla libreria di word
(strumenti - riferimenti)...
Ciao.

 ha scritto nel messaggio
news:9m0htr$nnj$1...@canarie.caspur.it...

Ed eccomi ancora a stressare il NG, ma pultroppo mi sono ancora imbobinato:
seguendo e mettento in pratica i consigli, finora ottenuti con grande
piacere, sono riuscito a impostare il codice fino a questo punto:
'mi creo la query che mi restituisce il dettaglio della fattura
stringaSql = "SELECT Convenuto.Convenuto FROM Convenuto;"
'mi prendo il recordset
Set rstDett = CurrentDb.OpenRecordset(stringaSql)
'tanto pe' nun sape' ne' legge ne' scrive
rstDett.MoveLast
rstDett.MoveFirst
'inserisco la tabella con X colonne, intestazione Y righe
oApp.ActiveDocument.Tables.Add Range:=oApp.Selection.Range,
NumRows:=rstDett.RecordCount, NumColumns:=1
'tabella senza griglia
 oApp.Selection.Tables(1).Borders.Enable = False
'scrivo l'intestazione della tabella
 With oApp.Selection
   .TypeText Text:="CONVENTO"
    .MoveRight Unit:=wdCell
  End With
'scrivo il dettaglio della fattura
 Do While Not rstDett.EOF
     With oApp.Selection
    .MoveRight Unit:=wdCell
    .TypeText Text:=rstDett
    End With
   rstDett.MoveNext
Loop
i documenti Word, richiamati dal codice qui non descritto, si aprono
correttamente con l'inserimento della tabella e la sua intestazione, resa
visibile per convenienza, ma nella fase di inserimento dei dati,ottenuti con
l'istruzione Sql,  appare un messaggio, in access, con la dicitura "13," e,
cliccanto sull'ok, appare un nuovo messaggio con la dicitura " Tipo non
corrispondente".........
Nonostante le ricerche e i tentativi fatti non sono riuscito ad arrivare a
capo di nulla, che dovrei fare a questo punto?
Spero di non essere un peso con i miei problemi.
Grazie ancora per tutto.
Ciao
Onir

     End With
cioč nella riga .TypeText e precisamente al "rstDett"; qui devi indicare il
numero o nome del campo del recordset. Visto che la stringa sql ti
restituisce solo un campo:
'----------
     .MoveRight Unit:=wdCell
     .TypeText Text:=rstDett(0)
     End With
'----------
Ciao.


Ed eccomi ancora apparire, ma non per stressare nuovamente,  ma per
ringraziare degli ottimi consigli ottenuti che mi Hanno permesso di ottenere
la prima parte del prezioso progetto di realizzare, automaticamente, dei
documenti in Word, partendo dalla base dati di access.
(Non nascondo di aver incontrato non poche difficoltà, data la poca
preparazione in informatica.)
L'uomo ambizioso, raggiunto un traguardo, deve trovarne subito un altro che
vado a descrivere.......
in un'altra lettera.
Ciao
 e ancora grazie
Onir