Newsgroup: it.comp.lang.visual-basic
Titolo: AIUTO PER COLLEGAMENTO OLE

Chiedo aiuto: Dal mio prg. in VB6 ho necessità di aprire un testo Word in
cui inserire dati variabili, che ho nel mio form.
 ESEMPIO  FORM:              Cognome  Rossi          Nome        Antonio
                                                                ------------
----               ----------------------
Nel mio testo Word :
      Egregio Sig.                         ETC......
Ora io nel mio prg creo un oggetto ole di collegamento al mio testo word e
scrivo ogni volta una tabella di un dati.mdb di access97
 Nel mio documento word attraverso la 'stampa unione' creo un collegamento
al mio dati.mdb.
Così tutto va bene, cioè ogni volta che parte la ole ho i dati aggiornati.
Il problema è che così ci si mette un sacco di tempo (deve aprire
access.........).
Esiste una soluzione migliore mantendendo comunque la necessità di entrare
in word????
GRAZIE.

 in word????
Mi serve sapere ancora una cosa: il documento word cosi' ottenuto che fine
deve fare? Lo devi memorizzare in qualche modo? Oppure non serve perche' ti
serve solo per ottenere la stampa (unione, appunto)?
Ti ho fatto tutte queste domande perche' l'approccio "migliore", quello che
stai cercando, potrebbe essere diverso.
Ma andiamo con ordine:
Abbiamo un'applicazione vb che presenta un form in cui vengono immessi dati.
Da cio' che dici non sembra che questo form sia collegato ad un database
pero', ad un certo punto (quando? Quando l'utente preme un pulsante? Quando
fai doppioclic sull'oggetto ole?) scrivi in "dati.mdb" (come? Apri Access?
Apri un Recordset?) e si apre un documento Word... no, scusa. Cosi' non
riesco a seguirti. Ritento in un altro modo.
Direi che non devi usare l'oggetto ole perche' rallenta tutta l'operazione.
Se devi scrivere in un documento di word UN SOLO indirizzo penso sia piu'
conveniente che la tua applicazione apra un recordset, ne legga le
informazioni e le scriva nei segnalibri del documento che avrai predisposto
in precedenza. Mi rendo conto che posso non essere stato chiaro ma se
collabori con qualche precisazione vedrai che ne verremo fuori
splendidamente.
Se vuoi potresti leggere il thread "Buste di Word" di qualche giorno fa ma,
ad ogni buon conto, per spiegarmi meglio e darti un'idea un po' piu' precisa
di cio' che intendo, considera questo esempio (predisponi un modello con del
testo ed in mezzo i segnalibri "PrimoCampo" e "SecondoCampo" e salva col
nome CartellaCheVuoi & "\Prova.dot" poi chiudi, quindi nuovo documento e
metti il codice seguente in un modulo e salva il documento come
CartellaCheVuoi & "\App.doc"):
Option Explicit
Public Sub ProvaSegnalibri( _
)
Dim s_DotFullName           As String
Dim s_DocFullName           As String
Dim wdApp                   As Word.Application
Dim wdDoc                   As Word.Document
Dim b_SavePropertiesPrompt  As Boolean
  Let s_DotFullName = CartellaCheVuoi & "\Prova.dot"
  Let s_DocFullName = CartellaCheVuoi & "\Prova.doc"
  Set wdApp = Application
  With wdApp
    With .Options
      Let b_SavePropertiesPrompt = .SavePropertiesPrompt
      Let .SavePropertiesPrompt = False
    End With
    Set wdDoc = .Documents.Add(Template:=s_DotFullName)
    With wdDoc
      Call .SaveAs(FileName:=s_DocFullName)
      With .Bookmarks
        Let .Item(Index:="PrimoCampo").Range.Text = "Pippo"
        Let .Item(Index:="SecondoCampo").Range.Text = "Pluto"
      End With
      Call .Close(SaveChanges:=wdSaveChanges)
    End With
    Set wdDoc = Nothing
    Let .Options.SavePropertiesPrompt = b_SavePropertiesPrompt
    If Not (Application Is Word.Application) Then Call .Quit
  End With
  Set wdApp = Nothing
End Sub
--
Ciao.
Maurizio

Forse non sono stata chiara. Mi scuso.
Svuoto ogni volta la mia tabella 'stp' già esistente (di dati.mdb)
e scrivo un record.
Lo scopo della stampa unione è scrivere una lettera a tizio o caio unendo
tutta una serie di altri dati
che corrispondono al tracciato record della mia tabella ('stp' di dati.mdb).
I dati variabili di cui parlo sono anagrafiche già presenti in una tabella
'informa' di anag.mdb.
Il documento word non deve essere memorizzato.
Nel mio form da vb ho:
- un txtbox dove viene immesso il codice della persona per la quale si vuole
avere il documento
- un oggetto ole con SourceDoc "c.\prg\lettera.doc"   (invisibile)
- il pulsante di lancio.
Dopo aver digitato il codice di Tizio e premuto il pulsante di lancio,
scrivo tutti i dati di Tizio dalla tabella 'informa' di anag.mdb' nella
tabella 'stp' di dati.mdb e lancio la ole.
ESEMPIO:
Private Sub lancio_Click()
 '''''           Dopo aver svuotato la tabella e cercato da 'informa' di
anag.mdb quello che mi serve
 ' scrivo il mio record
 Set db = Workspaces(0).OpenDatabase("C:\prg\dati.mdb")
 Set tp = db.OpenRecordset("stp", dbOpenTable)
 tp.AddNew
 tp("cognomep") = ......
 tp("nomep") = .......
........
tp.update
 tp.close
'  lancio la ole
 OLE1.Action = 7
End Sub
La domanda era: come posso fornire a un testo word (attraverso la stampa
unione) dati preimpostati che scrivo da vb. (forse scrivendo un file .rtf?)
Con questo sistema va tutto bene ma ovviamente ad ogni lancio della ole si
apre access, che si richiude poi
con la chiusura di word.
Non posso usare report perchè l'utente vuole poter intervenire attivamente
su word, vale a dire spostare i campi di unione o rettificarli.

 su word, vale a dire spostare i campi di unione o rettificarli.
"Spostare" capisco. "Rettificare" invece mi preoccupa: cosa intendi?
In conclusione credo che il metodo piu' "leggero" sia quello di sfruttare le
proprieta' personalizzate del documento. Hai presente come funzionano o vuoi
che ne parliamo? Forse l'argomento puo' essere di qualche interesse anche
per altri.
--
Ciao.
Maurizio

 selezionare il file mdb.
Ho provato a fare la stampa unione col pulsante msquery (se ho ben capito)
solo che non riesco a dirgli che l'origine è c:\prg\dati.mdb perchè cerca
estensioni .dsn e .dqy.
Per caso c'entra l'ODBC?
-----
Vista la tua estrema pazienza e gentilezza, ne parlerei. grazie

 estensioni .dsn e .dqy. Per caso c'entra l'ODBC?
Si'. Ora provo a dettagliare i passi, sperando tutto funzioni perche' il pc
che ho sottomano adesso e' un po' arruffato causa lavori in corso.
Apri il file doc, quindi:
Strumenti; Stampa unione...; 1. Documento principale, Crea; Lettere tipo...;
Finestra attiva; 2. Origine dati, Dati; Apri origine dati...; MS Query...
(si dovrebbe aprire "Microsoft Query" col dialogo "Scegli origine dati");
Database: "MS Access 97 Database*"; [V] Usa Autocomposizione Query per
creare/modificare query; Ok (dovrebbe comparire il dialogo "Seleziona
database"); (Selezioni il tuo database); Ok (si dovrebbe aprire la finestra
"Query 1 da MS Access 97 Database" e l'"Autocomposizione Query - Scegli
colonne". Seleziona quanto ti e' necessario, anche nelle pagine successive,
premendo sempre "Avanti" fino alla pagina "Autocomposizione Query -
Termina"); Ritorna dati a Microsoft Word; Fine.
Poi operi come sai.
--------
Riguardo le proprieta' personalizzate di un documento di Word potresti,
intanto, farti un'idea visitando la pagina "Personalizza" del dialogo
"Proprieta'" che appare selezionando l'opzione "Proprieta'" del menu'
"File".
Qui trovi le proprieta' predefinite non valorizzate. Ma puoi anche
aggiungere proprieta' personalizzate che, nel tuo caso, potrebbero chiamarsi
come i campi della tabella/query alla quale ti connetteresti con stampa
unione.
Prova ad aggiungere due o tre proprieta' assegnando un valore, quindi Ok e
inserisci nel testo tali valori:
Inserisci; Campo...; Categorie: Informazioni documento; Nomi dei campi:
DocProperty; Opzioni...; Proprieta': (seleziona un campo fra quelli appena
aggiunti); Aggiungi al campo; Ok; Ok.
Compare il valore relativo al campo scelto. Visualizza il codice di campo
(Maiusc+F9) e vedrai che e' stato inserito qualcosa tipo: {DOCPROPERTY
"NomeDelCampo"  \* MERGEFORMAT}.
A questo punto il documento, senza essere legato ad alcun database (anzi,
potremmo dire che, se lo salvassimo, sarebbe come salvare un nuovo record di
una base dati fatta di documenti di Word...) contiene gli stessi valori che
avrebbe con la stampa unione (ovviamente relativi ad un solo record) e la
tecnica d'uso e' abbastanza simile a quella di stampa unione (l'utente
potrebbe essere agevolato aggiungendo un pulsante dalle funzionalita'
analoghe a "Inserisci campo unione" della barra "Stampa unione").
Ovviamente tutto questo dovremo farlo da codice, non manualmente come ora.
Potresti cosi' risparmiarti la tabella alla quale ti connetti con la stampa
unione e quando apri il documento questo non avevdo legami ne' con Access
ne' con MSQuery si aprirebbe piu' velocemente.
Intanto facci sapere cosa ne pensi e se tutto va bene, poi potremmo vedere
come operare da codice.
--
Ciao.
Maurizio


Mi scuso per il ritardo nella risposta.
Ho eseguito la procedura da due pc. In uno sono riuscita a farlo, tutto
funziona, mettendo il collegamento ole nel mio form di VB il documento viene
aggiornato correttamente e non carica più access. Risultato raggiunto!
Nell'altro pc (dove ho installato VB4)  però quando cerco l'origine dei dati
(dopo aver aperto MS Query) mi propone solo PCOM DB2MVS - 32 bit e non MS
ACCESS 97 DataBase. Ho pensato fosse un problema di installazione di Access,
ma non era così (cioè ho fatto l'installazione completa e non è cambiato
nulla!). Cosa mi sono persa? Dove mi trovo i Driver 0DBC? (La mia ignoranza
è estrema!)
---------
Riguardo alle proprietà personalizzate del documento Word ho provato e tutto
funziona (su entrambe i pc),
Se hai modo di dirmi come operare da codice.... Grazie
---------
Marilena

 Se hai modo di dirmi come operare da codice....
Quello che segue e' un esempio abbastanza completo. Manca la parte relativa
al database, ma mi sembra di capire che non sia un problema per te. Giusto?
Option Explicit
Sub Main()
' Const msoPropertyTypeNumber = 1
Const MyDocFullName As String = "c:\docs\doc1.doc"
Dim wdDoc ' As Word.Document
  Set wdDoc = GetObject(PathName:=MyDocFullName)
  With wdDoc
    With .CustomDocumentProperties
      ' Lettura di proprieta' esistenti.
      '
      With .Item(Index:="Campo1")
        Debug.Print .Name, .Value
      End With
      With .Item(Index:="Campo2")
        Debug.Print .Name, .Value
      End With
      With .Item(Index:="Campo3")
        Debug.Print .Name, .Value
      End With
      ' Modifica dei valori di proprieta' esistenti.
      '
      Let .Item(Index:="Campo1").Value = 2
      Let .Item(Index:="Campo2").Value = "Descrizione 2"
      Let .Item(Index:="Campo3").Value = #4/14/00#
      ' Aggiunta di una nuova proprieta' e del relativo
      ' valore.
      '
      Call .Add( _
          Name:="Campo4" _
        , LinkToContent:=False _
        , Type:=msoPropertyTypeNumber _
        , Value:=1234)
      ' Lettura dei nuovi valori.
      '
      With .Item(Index:="Campo1")
        Debug.Print .Name, .Value
      End With
      With .Item(Index:="Campo2")
        Debug.Print .Name, .Value
      End With
      With .Item(Index:="Campo3")
        Debug.Print .Name, .Value
      End With
      With .Item(Index:="Campo4")
        Debug.Print .Name, .Value
      End With
      ' Ovviamente, se e' necessario conservare
      ' le modifiche bisogna salvare il doc.
    End With
    Call .Application.Quit
  End With
  Set wdDoc = Nothing
End Sub
--
Ciao.
Maurizio