Newsgroup: it.comp.appl.access
Titolo: Prelevare semi-automaticamente dati dal web con form di controllo

Purtroppo sono ad un punto morto col mio DB, ho ancora troppe
incertezze sul VBA e prima di proseguire Vi sarei grato se mi daste una
conferma o delle correzioni su ciò che ho fatto fin qui. L'argomento
è complicato e da spiegarsi e da comprendersi, ho quindi preferito
suddividere questo intervento in capitoli:
SCOPO       I DATI       SOLUZIONE       IL CODICE       LE DOMANDE
SCOPO:
Raggiungta una pagina web prestabilita (contenente dati sul cinema),
evidenziare parte del testo e incollarlo in una casella di testo della
maschera principale: txtAcquisisci. Dopo la pressione del pulsante OK
Il codice dovrà separare i dati utili dal resto ed assegnarli ai vari
campi.
Per un più veloce controllo dell'utente, la maschera dovrà
assomigliare il più possibile alla pagina web e si deve avere la
possibilità di correggere i dati prima di una definitiva conferma. Il
passo successivo, una volta sistemato tutto, se non ho capito male da
alcune discussioni sul NG
(
http://groups.google.it/group/it.comp.appl.access/browse_frm/thread/3bc723f15dc230f3/cefcbdc6c7e1c220?lnk=gst&q=prelevare+dati+da+pagine+web&rnum=2#cefcbdc6c7e1c220
)
sarà automatizzare anche l'accesso alla pagina web. E' possibile,
vero? Ho capito bene?!
I DATI:
Questo è un esempio di ciò (stringa) che viene copiato dal web e
immesso in txtAcquisisci per la scansione:
_______________________________________________________________________
Harry Potter e la pietra filosofale
Titolo originale:  Harry Potter and the Sorcerer's Stone
Nazione:  Gran Bretagna/Usa
Anno:  2001
Genere:  Avventura/Fantastico
Durata:  142'
Regia:  Chris Columbus
Sito ufficiale (Usa):
http://www.leonardo.it/script/interstitial.php?destination=http://www.harrypotter.net/&identifier=opel2
Sito ufficiale (Uk):
http://www.leonardo.it/script/interstitial.php?destination=http://www.harrypotter.co.uk/&identifier=opel2
Sito italiano:  
harrypotter.it.warnerbros.com
Cast:  Daniel Radcliffe, Rupert Grint, Emma Watson, Richard Harris, Ian
Hart, Robbie Coltrane, Maggie Smith, Julie Walters
Produzione:  Heyday Films, Warner Bros.
Distribuzione:  Warner Bros.
Data di uscita:  06 Dicembre 2001 (cinema)
Trama:
Questo per Harry è il primo anno alla Scuola di Magia e Stregoneria di
Hogwarts. In occasione del suo undicesimo compleanno ha scoperto di non
essere un bambino normale, rimasto orfano dei genitori e allevato dagli
zii, Petunia e Vernon Dursley, ma di essere in realtà figlio di maghi,
Lily e James Potter...
_______________________________________________________________________
SOLUZIONE:
La soluzione che ho applicato è questa:
Una frmFilm con diverse caselle di testo. Il codice mi separa i dati
per argomenti (Titolo, Nazione, anno, ecc.) e li immette nelle varie
caselle di testo senza discernere i dati in caso di più occorrenze
(per esempio, gli attori vengono separati dagli altri dati e inseriti,
tutti insieme, separati da una virgola, nella apposita casella di
testo, risultando presentati così come sulla pagina web). Un'unica
variabile, StringaDatiVari, a turno, contiene e destina i vari "campi".
Le caselle di testo contenenti un solo dato (titolo, titolo originale,
anno, ecc.) sono associate, le altre, contenenti più dati, no.
Alla fine di questo "ciclo" ho tutti i miei dati presenti nelle
caselle, tutti correggibili e con un aspetto identico al web.
Quelli associati son già pronti alla registrazione in tabella, gli
altri vanno discerniti ed inseriti nelle apposite tabelle in relazione
uno a molti con la fonte dati della nostra frmFIlm, cioè la tblFilm.
Esse sono [tblFilm+Nazioni], [tblFilm+generi], ecc.
Per fare ciò alessandro Cara mi ha suggerito il sistema della sfrm
nascoste, solo che non sono riuscito ancora ad implementarlo per la mia
incompleta conoscenza del VBA.
IL CODICE:
Private Sub cmdAcquisisci_Click()
    Dim ACapo As String: ACapo = Chr(13) & Chr(10)
    Dim StringaDatiVari As String           'La variabile contenente, a
seconda del punto in cui ci si trova, il Titolo o
                                            'le Nazioni, o, man mano, i
dati successivi
    Dim InizioStringaDatiVari As Integer    'Posizione iniziale
(nunmero di caratteri in txtAcquisisci) di StringaDatiVari
    Dim FineStringaDatiVari As Integer      'Posizione finale (numero
di caratteri in txtAcquisisci) di StringaDatiVari
    Dim LungStringaDatiVari As Integer      'La lunghezza di
StringaDatiVari
    Dim FrasePreStrDV As String             'La frase, o i caratteri,
cercati dalla funzione InStr per stabilire l'inizio
                                        'di StringaDatiVari
    Dim FrasePostStrDV As String            'La frase, o i caratteri,
cercati dalla funzione InStr per stabilire la fine
                                        'di StringaDatiVari
    Dim SingoloDatoStringa As String        'Nel caso StringaDatiVari
contenga più dati (in caso di relazione uno a molti),
    SingoloDatoStringa = ""             'separati da virgole, ogni
singolo dato viene consecutivamente rappresentato da
                                        'questa unica variabile,
inizialmente a valore Null
    Dim nuovalet As String                  'Nella scansione di
StringaDatiVari in cerca di virgole, per discernere i vari
                                        'SingoloDatoStringa, questa è
ogni singola lettera considerata in StringaDatiVari
    Dim cont As Integer                     'Nella scansione di
StringaDatiVari in cerca di virgole, per discernere i vari
                                        'SingoloDatoStringa, questo è
il contatore pari alla lunghezza di StringaDatiVari
' Titolo '
    FrasePostStrDV = ACapo
    InizioStringaDatiVari = 1
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtTitolo.Value = StringaDatiVari
' Titolo originale '
    FrasePreStrDV = "Titolo originale: "
    FrasePostStrDV = ACapo & "Nazione: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtTitoloOriginale.Value = StringaDatiVari
' Nazione '
    FrasePreStrDV = "Nazione: "
    FrasePostStrDV = ACapo & "Anno: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtNazione.Value = StringaDatiVari
' Anno '
    FrasePreStrDV = "Anno: "
    FrasePostStrDV = ACapo & "Genere: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtAnno.Value = StringaDatiVari
' Genere '
    FrasePreStrDV = "Genere: "
    FrasePostStrDV = ACapo & "Durata: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtGenere.Value = StringaDatiVari
' Durata '
    FrasePreStrDV = "Durata: "
    FrasePostStrDV = ACapo & "Regia: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    If Right$(StringaDatiVari, 1) = "'" Then 'elimina l'apostrofo alla
fine
        StringaDatiVari = Left$(StringaDatiVari, Len(StringaDatiVari) -
1)
    End If
    Me.txtDurata.Value = StringaDatiVari
' Regia '
    FrasePreStrDV = "Regia: "
    FrasePostStrDV = ACapo & "Sito ufficiale: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtRegia.Value = StringaDatiVari
' Cast '
    FrasePreStrDV = "Cast: "
    FrasePostStrDV = ACapo & "Produzione: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtCast.Value = StringaDatiVari
' Produzione '
    FrasePreStrDV = "Produzione: "
    FrasePostStrDV = ACapo & "Distribuzione: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtProduzione.Value = StringaDatiVari
' Distribuzione '
    FrasePreStrDV = "Distribuzione: "
    FrasePostStrDV = ACapo & "Data di uscita: "
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    Me.txtDistribuzione.Value = StringaDatiVari
' Data di uscita '
    FrasePreStrDV = ACapo & "Data di uscita: "
    FrasePostStrDV = ACapo & ACapo & "Trama:" & ACapo
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = InStr(txtAcquisisci, FrasePostStrDV)
    GoSub RicavaStringaDatiVari
    'Calcola se StringaDatiVari (per la Data di uscita), è composto da
1 oppure 2 righe
    If (InStr(StringaDatiVari, ACapo)) = 0 Then
    'caso con 1 riga sola (dato X scontato "(cinema)" alla fine
        StringaDatiVari = Left$(StringaDatiVari, Len(StringaDatiVari) -
9)
    'caso con 2 righe
    Else
        Dim ini As Integer: ini = InStr(StringaDatiVari, ACapo) + 2
        Dim fin As Integer: fin = Len(StringaDatiVari) + 1
        Dim lun As Integer: lun = fin - ini
        StringaDatiVari = Mid(StringaDatiVari, ini, lun)
    'toglie da SingoloDatoStringa "(cinema)" solo nel caso sia presente
        If Right$(StringaDatiVari, 9) = " (cinema)" Then
            StringaDatiVari = Left$(StringaDatiVari,
Len(StringaDatiVari) - 9)
        End If
    End If
    Me.txtDataUscita.Value = StringaDatiVari
' Trama '
    FrasePreStrDV = ACapo & "Trama:" & ACapo
    InizioStringaDatiVari = InStr(txtAcquisisci, FrasePreStrDV) +
Len(FrasePreStrDV)
    FineStringaDatiVari = Len(txtAcquisisci) + 1
    GoSub RicavaStringaDatiVari
    Me.txtTrama.Value = StringaDatiVari
'  CLS  '
    txtAcquisisci.Value = ""    'cancella il testo
    txtAcquisisci.Requery       'contenuto in txtAcquisisci
' SCANSIONE E (abbozzo di) INVIO DATI PER LE RELAZIONI UNO A MOLTI
' Nazione '
    StringaDatiVari = txtNazione              'ripesca la stringa
comprendente le nazioni per suddividerla
    GoSub Scansione_StringaDatiVari
Exit Sub  'FINE
RicavaStringaDatiVari:
    LungStringaDatiVari = FineStringaDatiVari - InizioStringaDatiVari
    StringaDatiVari = Trim(Mid(txtAcquisisci, InizioStringaDatiVari,
LungStringaDatiVari))
    Return
Scansione_StringaDatiVari:
    For cont = 1 To Len(StringaDatiVari)
    nuovalet = Mid$(StringaDatiVari, cont, 1)
    If nuovalet <> "," Then         'La presenza della virgola
determina la fine del dato in analisi
        SingoloDatoStringa = SingoloDatoStringa + nuovalet
        If cont = Len(StringaDatiVari) Then 'Verifica se è l'ultimo
carattere di StringaDatiVari
            GoSub Invio_Dati
        End If
    Else:
        GoSub Invio_Dati
    End If
    Next cont
    Return
Invio_Dati: 'al posto del msgbox che presenta i vari dati, uno per uno,
dovrebbe esserci il codice
            'che invia i dati alle tabelle
    SingoloDatoStringa = Trim(SingoloDatoStringa)
    MsgBox "-" & SingoloDatoStringa & "-"
       SingoloDatoStringa = ""
    Return
LE DOMANDE:
La soluzione adottata può essere considerata valida o esistono metodi
molto più semplici o efficaci per raggiungere lo stesso scopo?
La sintassi utilizzata per il codice è decente o piena di refusi, per
quanto funzionante?
Il passo successivo è prelevare le stringhe con più dati (Nazioni,
attori, produttori, ecc.), separarli (funzione già prevista in
Scansione_StringaDatiVari) ed inserirli nelle rispettive tabelle con i
rispettivi ID, tutto tramite codice. Al momento non ci sono ancora
riuscito, ma datemi ancora un po' di tempo: Non ci riuscirò, ma avrò
del codice da proporre sul quale richiedere aiuto.
Per ora credo sia sufficiente, più che altro per me. Grazie di tutto!



Già è lungo, ci mancava che apparisse due volte....MAH!!!