Newsgroup: it.comp.appl.access
Titolo: Testi da word ad access (2)

Spero che questa volta Sergio Mazza possa aiutarmni.
Espongo il problema in maniera completa.
Ho il mio bel database in access 97 con tre tabelle non collegate tra di
loro.
Il mio proble è aggiornare una di queste tabelle ricavando dei dati da dei
testi in word. Ma vediamo nello specifico.
La tabella da aggiornare in access è costituita da una decina di campi:
- Codice (testo, indicizzato senza duplicati)
- Nome (testo, non indicizzato)
- Definizione (memo)
- campo4
- campo5
- etc...
In pratica io dai vari file word devo recuperare le definizioni che andranno
a riempire il campo memo di ogni record.
Questi file word sono dei testi puri e semplici senza nessun tipo di
formattazione, ma che non posso salvare come semplici txt da importare in
access perché in questo passaggio perderei tutti quei caratteri il cui
codice non è compreso nei canonici 128 (o 256 ora non ricordo bene).
Ogni file word è costituito da righe ognuna delle quali contiene i dati per
un record separati da tabulazione.
Ecco come si presenta un file word:
codice1 <TAB> nome1 <TAB> definizione1
codice2 <TAB> nome2 <TAB> definizione2
codice3 <TAB> nome3 <TAB> definizione3
codice4 <TAB> nome4 <TAB> definizione4
codice5 <TAB> nome5 <TAB> definizione5
etc...
Il mio problema è riempire il campo Definizione (memo) di ogni record con la
definizione appropriata ricavata dai file word.
Una possibile soluzione sarebbe creare in access una nuova tabella dai dati
di word e poi fare un query di agguiornamento tra le due tabelle. Il punto è
che non so creare una nuova tabella contenente i dati di tutti i file word.
Sono stata un po' prolissa, ma sono disperata... non so proprio che fare...
Heeeeeelp me!!!
Marina

 ha scritto nel messaggio
news:9r0kln$8eg$1...@lacerta.tiscalinet.it...

Speriamo di aver capito;
vuoi inserire la definizione presa dal documento word ricercandola in base
al codice?
Es.
* in tabella *
codice = '010100'
* nel file word *
010100<tab>nome1<tab>testo1 della difinizione da inserire in access
010200<tab>nome2<tab>testo2 della difinizione da inserire in access
010300<tab>nome3<tab>testo3 della difinizione da inserire in access
quindi nel record della tabella ti dovresti trovare:
* in tabella *
codice = '010100'
definizione='testo1 della difinizione da inserire in access'
E' così?
Ciao.
--
- - - - - - - - - - - - - - -
Sergio MAZZA
- - - - - - - - - - - - - - -

 ha scritto nel messaggio
news:9rbdu9$j34$1...@canarie.caspur.it...

Si, è proprio questo che voglio fare, ma senza passare per file txt.
Scusa il ritardo nella risposta ma non riuscivo a scaricare i messaggi dal
server tiscali.
Marina

 Marina
Allora, forse ci siamo;
- ho creato un tabella con codice (tipo testo) e definizione (tipo testo);
- ci ho inserito due codici di prova: codice1, codice2;
- nel documento word ho creato la struttura del testo:
codice1<tab>nome1<tab>testo1 della definizione da inserire;
questa è la routine che legge apre il documento e recordset, legge il primo
codice e lo cerca nel documento; una volta trovato si sposta alla
definizione (terza colonna della tabella), lo legge e lo scrive nel campo
del recordset.
 '---------------
On Error GoTo perMarinaPari_err
Dim oApp As Word.Application
Dim oRange As Word.Range, oRangeDefinizione As Word.Range
Dim oRset As Recordset
Set oRset = CurrentDb.OpenRecordset("t_marinaPari")
Set oApp = CreateObject("Word.application")
oApp.Documents.Open "F:\VARIE\Sergio\Ng\marinaPari.doc"
Set oRange = oApp.ActiveDocument.Content
oApp.Visible = True
'converto il testo, separate da un tab Separator:=1, in tabella con tre
colonne
With oApp.Selection
    .HomeKey Unit:=6
    .WholeStory
    .ConvertToTable Separator:=1, NumColumns:=3, _
        NumRows:=5, Format:=0, ApplyBorders:=True, ApplyShading:=True, _
        ApplyFont:=True, ApplyColor:=True, ApplyHeadingRows:=True, _
        ApplyLastRow:=False, ApplyFirstColumn:=True, ApplyLastColumn:=False,
_
        AutoFit:=False
    .MoveRight Unit:=1, Count:=1
End With
'sempre per non sapere ne leggere ne scrivere
oRset.MoveFirst
Do While Not oRset.EOF
    With oRange.Find
        .Text = oRset!codice
        .Execute
    End With
    If oRange.Find.Found Then
        'MsgBox "Trovato."
        oRange.Select
        With oApp.Selection
            .MoveRight Unit:=12
            .MoveRight Unit:=12
        End With
        'per vedere cosa trovi
        'MsgBox oApp.Selection.Text
        oRset.Edit
        oRset!definizione = oApp.Selection.Text
        oRset.Update
        'reimposto il range su tutto il documento
        Set oRange = Nothing
        Set oRange = oApp.ActiveDocument.Content
    Else
        'MsgBox "non trovato."
    End If
    oRset.MoveNext
Loop
'reimposto la formattazione dei dati (no tabella)
With oApp.Selection
    .HomeKey Unit:=6
    .Tables(1).Select
    .Rows.ConvertToText Separator:=1
    .MoveRight Unit:=1, Count:=1
End With
'imposta il flag "documento già salvato" per evitare richieste di
salvataggio del documento
'quando lo chiudo
oApp.ActiveDocument.Saved = True
oApp.ActiveDocument.Close
oApp.Quit
oRset.Close
Set oRset = Nothing
perMarinaPari_exit:
    Exit Sub
perMarinaPari_err:
    Set oRset = Nothing
    oApp.Visible = True
    MsgBox Err.Number & ", " & Err.Description
 '---------------
Tutto questo funziona se i dati sono formattati come mi hai indicato, se ci
sono "anomalie" potresti trovare nei record del testo non voluto.


 ha scritto nel messaggio
news:9rlsvc$kr2$1...@canarie.caspur.it...

Ho qualche problema. Una volta lanciata la routine questa entra in loop
(dopo aver aperto word e creato la tabella).
L'unica cosa che non coincide nell'mdb è il campo definizione che dovrebbe
essere memo anziché testo: può essere questo il problema?
La routine funziona su access 97?
Ti dispiacerebbe indicarmi dove la devo inserire e come lanciarla?
Lo so che chiedo un po' troppo... ma dato che sei stato gentilissimo...
:) Marina


Mi sono dimenticato che se non vuoi vedere word "flesciare" togli la riga
oApp.Visible = True.
Per quanto riguarda il loop, io ho preso per definizine che nella tabella ci
siano presenti già i codici che devi trovare nel documento word; quindi
leggo il codice dal recordset e lo cerco nel documento word, una volta
trovato leggo la definizione e la scrivo nel campo del recorset.


 >
[Cutto ma felice!]
Funziona tutto!
Non era un loop quello che vedevo: semplicemente usavo un testo word che
conteneva solo una minima parte dei dati e il ciclo non era altro che la
ricerca di codici che non c'erano nel testo demo.
Su access 2000 embra tutto ok. Ora cambio disco e provo sul 97.
P.S. Alcuni caratteri vengono trasformati. Per esempio gli apostrofi con la
gobba rivolta a destra e a sinistra: ' e '.
Questi diventano: ' e '.
C'è un modo per evitare questo? Altrimenti pazienza...
:-)))))
Marina


Ohi! Marě, Ohi! Marě! Quante notti aggie' perso pe te'... Ehm..
Penso che sia dovuto al fatto che nelle tabelle non gestisci i font come in
word. Word con l'autocorrezione ti cambia automaticamente il secondo
apostrofo quando ne hai aperto uno, stessa cosa con le doppie virgolette le
prime lettere del paragrafo e altri giocarelli vari.
A naso direi che cambia proprio il tipo di carattere (codice ascii) da
apostrofo "semplice" a "gobbo" e per fare ciň dovresti cercare nel testo
della definizione trovata se č presente un apostrofo (con gobba o senza?) e
sostituirlo secondo la sua posizione: a sinistra della parola/frase con
gobba a sinistra, a destra con gobba a destra.
Non credo che il gioco valga la candela.
Eppoi! Insomma! Anche Venere era strabica; dove la cerchi la perfezione?
Ciao.

 Ciao.
E no! Dato che non mi hai ancora mandato al diavolo ti pongo un'altra
piccola questione:
I file word dai quali prendere i dati sono tanti e lunghi. Non è possibile
unirli, quindi ogni volta che lancio la routine con un determinato file devo
aspettare perché essa controlla dtutti i codici del recordset.
Una soluzione potrebbe essere che la routine, invece, legga i codici dal
file (quindi solo quelli) e magari mi spunti un flag (campo da aggiungere)
nelle righe del recordset di cui ha trovato e trascritto la descrizione...
Se vuoi, comunque, puoi mandarmi al diavolo ora... :-(
Ciaoooo
M

 M
Un'altra soluzione potrebbe essere quella di aprire un recordset da
un'istruzione sql filtrando i codici che hanno il campo definizione = null:
Es.
'-----------------
Set oRset = CurrentDb.OpenRecordset("Select * From t_marinaPari Where
definizione Not Null;")
'-----------------
