Newsgroup: it.comp.appl.access
Titolo: Estrapolazione dati da un campo memo

Buongiorno a tutti.
In una tabella ho un campo memo, in questo campo vengono raccolti dei dati, la riga finale, sempre l'ultima, è formattata in questo modo:
 
}|{COGNOME NOME}|{}|{INDIRIZZO}|{}|{CAP}|{CITTA'}|{PROVINCIA}|{NAZIONE}|{TELEFONO$|$Y}|{Y}|{Y
 
Devo "prelevare" il contenuto di questi campi racchiusi tra le graffe fino al telefono. 
Non ho idea di come fare, mi potreste indicare la "retta via?"
 
Grazie
 
Alfio

Quando parli di riga finale intendi che il contenuto del memo ha un delimitatore di riga vbCrLf...?
Se così fosse il lavoro è relativamente semplice in quanto individuare l'ultima riga è banale...
Fai uno SPLIT del contenuto in un'array usando il codice accapo(vbCrLf se usato) quindi prendi la riga di indice UBOUND dell'array.
A questo punto sfrutti la stessa tecnica... essendo l'ultima riga formattata con quei caratteri per separare i campi... fai sempre uno split in un'array Vatiant in questo caso così puoi sfruttare For each Item in Items e lo cicli  per leggere i campi.
 
Una cosa simile... scritta senza testarla ma per farti capire la logica...
 
DIM vArray As Variant
Dim sArray As String
Dim Item As Variant
Dim Items As Variant
 
Dim iLast As Long
 
VArray=SPLIT(Me!CampoMemo, vbCrLf)
sArray=vArray(Ubound(vArray))
Items=SPLIT(sArray,"}|{")
For each Item in Items
   Debug.Print item
Next
 
@Alex

 @Alex
 
La testo subito.
Intanto grazie Alex.. ;)

 Intanto grazie Alex.. ;)
 
Allora, testata, credo vada più o meno bene, dico questo perché il risultato finale è da affinare. Ottengo dei dati non desiderati quindi, descrivo meglio il campo memo che appare così in tutti i record
 
cognome nome
indirizzo
cap città (prov)
nazione
Tel. 0699999999 333999999}|{COGNOME NOME}|{}|{INDIRIZZO}|{}|{CAP}|{CITTA'}|{PROV}|{NAZIONE}|{0699999999 333999999$|$Y}|{Y}|{Y
 
Il tuo suggerimento mi ritorna:
 
 
Tel. 0699999999 333999999
nome cognome
riga vuota
indirizzo
riga vuota
cap
città
prov
nazione
0699999999 333999999$|$Y
Y
Y
 
Quindi dovrebbe saltare i primi recapiti telefonici e fermarsi all'ultimo 9 prima di $|$Y
 
Si può fare?
 
Alfio
 
 

Se quelle eccezioni sono fisse saltate...sono le prime 2 e l'ultima...
A quel punto invece di usare 
 
   For each Item in Items
 
Fai un ciclo da 
 
   For item=Lbound(Items())+2 to Ubound(Items())
 
Ovviamente apporta tu ora le customizzazione del caso.
 
@Alex

 
 
Buongiorno Alex,
perché mi ritorna errore Runtime 9 "indice non incluso nell'intervallo?".
Eppure Items contiene i valori splittati...
 
Alfio


Probabilmente devi puntare ad Ubound(Items())-1
 
Se non fai DEBUG e ci ragioni non fai 1 passo.
 
@Alex

 
Buongiorno Alex,
 
purtroppo non riesco a venirne a capo, è anche vero che con la matrici non ho mai avuto nulla a che fare. Ieri ho impiegato molto tempo nella ricerca sulle matrici per chiarirmi meglio il concetto, ma la tua soluzione non riesco proprio a comprenderla, o meglio, ho capito quello che dovrebbe fare (tu dimensioni una matrice dinamica, corretto?), allora non capisco perché mi ritorna sempre l'errore di runtime. Alla riga "For item=Lbound(Items())+2 to Ubound(Items())-1" dovrebbe indicarmi il valore iniziale e finale della matrice che dovrebbero essere 0 e 11 ma avendo specificato +2 e -1 dovremmo avere 2 - 10. Ora se fin qui la mia comprensione è corretta il mio limite é comprendere l'errore in quanto, in effetti, mi ritorna valori nulli. Ma perchè?
 
Alfio
 


Alfio, credo che tu possa aver COPIAINCOLLATO il mio codice senza metterci un po di analisi... ad esempio quando scrivo:
 
Items=SPLIT(sArray,"}|{") 
 
Dalla Guida:
Split ( expression [,delimiter] [,limit] [,compare] )
The Microsoft Access Split function will split a string into substrings 
based on a delimiter.
The result is returned as an array of substrings
 
Questo è estratto da quì:
https://docs.microsoft.com/it-it/office/vba/language/reference/user-interface-help/split-function?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dit-IT%26k%3Dk(vblr6.chm1008907)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
 
 
o questo link più corto: 
https://www.techonthenet.com/access/functions/string/split.php
 
 
I caratteri definiti come "DELIMITATORE" per effettuare lo SPLIT da Stringa ad Array che avevo ipotizzato sono "}|{"... tu hai valutato se in base alla tua realie situazione sia corretto...?
 
Siccome sai come hai la Stringa... devi ragionare sull'esempio, capirne i concetti ed applicarli in concreto al tuo caso...
 
Dovresti a mio avviso impadronirti della tecnica di DEBUG passo passo con BreackPoint e F8, che per chi scrive codice è indispensabile.
 
Eventualmente, posta la funzione COMPLETA, possiamo vedere se hai introdotto erorri individuabili ad occhio... 
 
@Alex

> Alfio, credo che tu possa aver COPIAINCOLLATO il mio codice senza metterci un po di analisi... ad esempio quando scrivo:
 
Ciao Alex, credi male. Sono un autodidatta, creo programmi per mia pura soddisfazione e per migliorare il mio lavoro in ufficio. Se copincollassi non apprenderei un tubo ma, a volte, essendo un autodidatta, le lacune pregresse non mi permettono di apprendere senza che qualcuno mi spieghi.
Tornando al problema dell'errore che ti ho segnalato e a cui non ho trovato soluzione ho comunque risolto il mio problema in questo modo, almeno al momento perché forse, in futuro, incapperò in problemi che adesso non riesco a prevedere.... Dicevo ho risolto così:
.
.
.
VArray=SPLIT(Me!CampoMemo, vbCrLf)
sArray=vArray(Ubound(vArray))
Items=SPLIT(sArray,"}|{")
.
.
.
mi sono fermato qui e con i vari items(0....1....2 ecc ecc mi sono popolato i controlli. Al momento mi va a genio, non so cosa potrà succedere in futuro, ma al momento funge, almeno finché la profondità dell'array non diventi superiore a 9, ma non so come fare per conoscere tale valore in anticipo.
 
Grazie per l'aiuto che mi hai fornito.
 
Alfio