Newsgroup: it.comp.appl.access
Titolo: Come si fa ad "interagire" con il web da vba access ? Nel senso :

Io devo scrivere una applicazione vba access che deve : 
 
- chiamare una pagina web 
 
- scriverci  la password e scrivere altre info in altri
  campi
 
- inviare la pagina cosi' compilata
 
- attendere la pagina di risposta
 
- importare la tabella che questa pagina espone
  (tabella lunghissima, XML credo) in una tabella 
   access.
 
Il tutto senza far apparire nulla all' utente. 
 
So  che si puo' fare. E fino ad aprire una pagina web 
c' arrivo (o meglio, c' arrivavo, devo rinfrescare la
memoria). 
 
Dopodiche' mi perdo. 
 
Se per favore qualcuno paziente (non sono molto perspicace)
volesse guidarmi gliene sarei molto grato. 


direi che dipende dalla pagina
la pagina web è tua?
asp? php? html?
 
BFS
 
 
 
 
 
 

radica...@gmail.com
 laid this down on his screen :

Comincia col precisare l'URL...
 
Bruno


Si certo ecco qualche esempio :    
 
http://www.consob.it/main/documenti/promotori/albo/abruzzo.xml?xsl=albopromotori.xsl
 
 
Oppure :
 
http://www.consob.it/main/documenti/promotori/albo/lazio.xml?xsl=albopromotori.xsl
 
 
Come vedi questi sono i link diretti alle tabelle. Per cui a 
questo punto dovrei importarle. Come si deve fare ? 
 
-----------------------------------------------------
P.S. seguono dubbi e ragionamenti vari :-)  
 
1)
Che succede se la Consob cambia la struttura delle sue pagine ?
Semplice : il programma salta :-) 
 
E non credo che senza un intervento manuale (andare a vedere il 
nuovo indirizzo, praticamente) la cosa si possa aggiustare. 
Sbaglio ? 
Ma pazienza, sarebbe il minimo dei problemi.
 
2)
Poi  (spero anche BFS mi legga) leggo che BFS mi chiede che *tipo* 
di  pagina  sia. Mentre  io  pensavo  (erroneamente, ovvio) che il
"trattamento" (diciamo) fatto col vba fosse uguale per ogni tipo. 
 
Mi direte : ma a che ti serve inserire campi in una pagina se accedi
direttamente all' URL della pagina con la tabella ? 
 
Il problema e' che a me serve interagire con qualsiasi pagina web. 
E certe pagine web "rispondono" con le pagine giuste solo dietro 
alcuni inputs da parte dell' utente. 
 
Questa della Consob no, ok. Ma in generale occorre inserire una 
password e qualche altro dato per ottenere risposta.
 
In questo momento preciso non ho a disposizione una pagina di 
quel tipo da esibire, ma ... magari potreste spiegarmi come 
riconoscere che tipo di pagina sia e quindi come scrivere diverse
proc in funzione del tipo. 
 
Almeno credo che la via da seguire sia questa. Boh ! 
 
Attendo ansioso
 


Che differenza fa?
Tu leggi l'output che a quanto mi consta e' html con un po di 
javascript, anzi tu leggi il DOM (document object model)
php asp jsp e tutte le "sciocchezze" a corredo non sono lato server? E 
se lo sono non le vedrai mai. Quello che vedi e' quello che vedi se si 
fa "mostra sorgente" da qualsiasi browser
 
 
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)
 
---
Questa e-mail è priva di virus e malware perché è attiva la protezione avast! Antivirus.
http://www.avast.com
 
 

Il 30/10/2014 21:50, Alessandro Cara ha scritto:
 
P.S.
Hai il vantaggio che le cose nel DOM sono organizzate e puoi "puntare" a 
quello che vuoi (se conosci come e' fatto il DOM ma per questo c'e' il 
"reference" )
 
Almeno questo fino al 2003 se poi le cose sono cambiate allora ritiro tutto.


 Attendo ansioso
 
fatti uno xanax


 sorgente" da qualsiasi browser
Io con Access 2013 leggo, importo e interagisco con gli
URL con estensione XML, HTM, HTML.
Non leggo i .XSL e quelli senza estensione, ancorché
risulti dal source della pagina trattarsi di HTML.
 
Qual è il segreto per accedervi senza limitazioni?
 
Bruno


Ciao Bruno.
E' passato un po' di tempo da quando ho "giocato" l'ultima volta con 
questa roba.
Se non ricordo male c'erano due modi di "gestire" il web uno era una 
richiesta di lettura "diretta" di un file (se non ricordo male) dal 
server, la seconda prevedeva che all'interno di Access fosse definito 
l'oggetto explorer (connettere il relativo riferimento).
Se tu hai l'oggetto explorer di fatto hai explorer a tua disposizione 
che puoi "pilotare" medianti comandi da vba e quindi quello  che dici mi 
risulta oscuro. Dal browser explorer  puoi chiamare pagina senza 
estensione (fallace, il server se non  trova estensione, in genere, va a 
cercare l'estensione di default)?Certo che lo puoi fare ed il browser 
risponde, la risposta la hai all'interno del tuo  oggetto explorer e li 
la leggi.
 
Curiosita'. File xsl? a che ti servono? se non ricordo male non sono 
altro che la "dichiarativa" della struttura dell'xml (o forse anche 
excel ha questa estensione? Ma in questo caso non c'e' un plugin che si 
occupa di interpretare l'oggetto (come per flash o puttanate simili?))


 
 
Gia'. Qual' e' ? 
Io so che da EXCEL riesce a leggere tutto. Puo' aiutare ?
 
P.S.
 
Che sfiga, leggi tutto tranne quello che serve a me :D 

 Comincia col precisare l'URL...
 
Scusami, forse puoi aiutarmi per raggiungere questo obiettivo piu'
ridotto ma molto importante per la mia attivita'. 
 
Osserva per favore questa pagina web : 
https://www.albopf.it/web/area_pubblica/servizi/albostatico
 
 
Come vedi c'e' (circa in basso a destra) una serie di files zip.
Per esempio quello della toscana, il primo in alto, ha nome : 
 
https://www.albopf.it/XXDomain/AlboStatico/html/TOSCANA.zip
 
 
Se "ci clicco" sopra questo file viene scaricato. 
 
Potresti  per  cortesia spiegarmi, se possibile, come posso 
"acchiappare" col vba quel file e scaricarmelo su una certa 
directory del mio C: ? 
 
Ti ringrazio 
 
 
 


Ah scusa ... scaricarlo "UNzippato", cioe' "espanso" ovviamente.
Altrimenti non potrei leggerlo.  
 
Oppure "unzipparlo" dopo in qualche modo.
 

 
https://www.albopf.it/XXDomain/AlboStatico/html/TOSCANA.zip
 
 
Ho  risolto tutto, ma  grazie  lo  stesso  nel caso c' avessi 
pensato perdendoci qualche tempo.
 
 

 pensato perdendoci qualche tempo.
 
Avevo solo pensato di convertire in tabella Access direttamente
https://www.albopf.it/XXDomain/AlboStatico/html/TOSCANA.html
,
anziché scaricare lo ZIP... etc.
 
Tu come hai risolto?
È buona norma (educazione) darne atto.
 
Bruno

 È buona norma (educazione) darne atto.
 
Si certo, ci mancherebbe altro. Anzi, mi fa piacere.
E' che non sapevo fossi interessato.
 
Si utilizza una funzione API che prende qualsivoglia 
file del web e te lo copia cosi' com' e' in locale. 
 
Poi si unzippa. Funziona perfettamente. Qui sotto ti metto 
il metto il codice :
 
' questa e' la funzione API :  
Public Declare Function URLDownloadToFile Lib "urlmon" Alias _
                                           "URLDownloadToFileA" ( _
                                           ByVal pCaller As Long, _
                                           ByVal szURL As String, _
                                           ByVal szFileName As String, _
                                           ByVal dwReserved As Long, _
                                           ByVal lpfnCB As Long) As Long
 
' questa e' la procedura che la utilizza 
 
Public Sub DownloadFileFromWeb()
On Error GoTo err_1
    Const strUrl As String = _
    "
https://www.albopf.it/XXDomain/AlboStatico/html/TOSCANA.zip
"
    Dim strSavePath As String
    Dim returnValue As Long
    strSavePath = "C:\prova.zip"
    returnValue = URLDownloadToFile(0, strUrl, strSavePath, 0, 0)
 
Err_Exit:
    Exit Sub
 
err_1:
    MsgBox Err.Description
    Resume Err_Exit
End Sub
 
' e questa la procedura che unzippa (l' ho messa per provarla 
' sotto l' evento click di un tasto in una form access : 
 
Private Sub Comando0_Click()
 Dim oApp As Object 'Shell32.Folder
 
 Set oApp = CreateObject("Shell.Application")
 oApp.Namespace("c:\unzippato\").CopyHere oApp.Namespace("c:\prova.zip").items
 
End Sub
 
Fammi sapere
 
 

 sarebbe l' ideale
 
(Access 2013/64)
La tabella "Toscana" ha i seguenti campi:
Cognome, Luogo di nascita, Data di nascita, Indirizzo,
Delibera d'iscrizione, Stato, Intermediario, Regione.
Tutti Short Text (255).
===============================================
Private Sub Command65_Click()
Dim dHTML As HTMLDocument, nHTML As New HTMLDocument
Dim tbl As HTMLTable, row As HTMLTableRow, cell As HTMLTableCell
Dim col As HTMLTableCol, k As Long, n As Long, m As Long
Dim RS As Recordset, NumRow As Long, NumCol As Long, tblArray()
 
CurrentDb.Execute "DELETE Toscana.* FROM Toscana;"
Set RS = CurrentDb.OpenRecordset("Toscana", dbOpenDynaset)
 
Set dHTML = 
nHTML.createDocumentFromUrl("
https://www.albopf.it/XXDomain/AlboStatico/html/TOSCANA.html
", 
vbNullString)
Do While dHTML.ReadyState <> "complete"
    DoEvents
Loop
 
m = 1
For Each tbl In dHTML.getElementsByTagName("table")
NumRow = tbl.Rows.Length
NumCol = tbl.Rows(0).Cells.Length
ReDim tblArray(1 To Int(NumRow / 9), 0 To 8)
    For Each row In tbl.Rows
        For Each cell In row.Cells
            k = k + 1
            If k > 11 And k Mod 2 Then
                'Debug.Print k, n, m, cell.innerText
                tblArray(m, n) = cell.innerText
                n = n + 1
            End If
            If n = 9 Then
                n = 0: m = m + 1
            End If
Next: Next: Next
 
For NumRow = 1 To UBound(tblArray)
    RS.AddNew
    For NumCol = 0 To 7
        RS.Fields(NumCol) = tblArray(NumRow, NumCol)
    Next
    RS.Update
Next
 
End Sub
====================================
 
Bruno

Il giorno sabato 1 novembre 2014 00:06:17 UTC+1, Bruno Campanini ha scritto:
(omissis) 
 
Ok, ho capito come hai fatto e acquisito. Grazie mille ! 

 Ok, ho capito come hai fatto e acquisito. Grazie mille ! 
 
Ho anche eseguito in un sol colpo il download di tutte
le 20 regioni, in unica tabella.
Se t'interessa...
 
Bruno

 ===============================================
 
 
(cut)
 
 
Sei in gran forma Bruno: complimenti   ;-) 
 
 


Certo, vorrei capire. Attendo.

radica...@gmail.com
 expressed precisely :

La tabella ora è LT_Regioni: stessi campi di Toscana.
=====================================================
Private Sub Command65_Click()
Dim MyHTML As HTMLDocument, tHTML As New HTMLDocument
Dim tbl As htmlTable, row As HTMLTableRow, cell As HTMLTableCell
Dim col As HTMLTableCol, k As Long, n As Long, m As Long
Dim RS As Recordset, j As Long, NumRow As Long, NumCol As Long
Dim Regioni(1 To 20) As String, T As Double, TOT As Long, i
 
DoCmd.Hourglass True
T = Timer
 
Regioni(1) = "TOSCANA":         Regioni(2) = "UMBRIA"
Regioni(3) = "LAZIO":           Regioni(4) = "SARDEGNA"
Regioni(5) = "CAMPANIA":        Regioni(6) = "MOLISE"
Regioni(7) = "MARCHE":          Regioni(8) = "ABRUZZO"
Regioni(9) = "PUGLIA":          Regioni(10) = "BASILICATA"
Regioni(11) = "CALABRIA":       Regioni(12) = "SICILIA"
Regioni(13) = "LOMBARDIA":      Regioni(14) = "PIEMONTE"
Regioni(15) = "LIGURIA":        Regioni(16) = "VALLE_D'AOSTA"
Regioni(17) = "VENETO":         Regioni(18) = "FRIULI_VENEZIA_GIULIA"
Regioni(19) = "EMILIA_ROMAGNA": Regioni(20) = "TRENTINO_ALTO_ADIGE"
 
CurrentDb.Execute "DELETE LT_Regioni.* FROM LT_Regioni;"
Set RS = CurrentDb.OpenRecordset("LT_Regioni", dbOpenDynaset)
 
For Each i In Regioni
    Dim tblArray()
    Set MyHTML = 
tHTML.createDocumentFromUrl("
https://www.albopf.it/XXDomain/AlboStatico/html/
" 
& i & ".html", vbNullString)
    Do While MyHTML.ReadyState <> "complete"
        DoEvents
    Loop
 
    k = 0: m = 1: n = 0
    For Each tbl In MyHTML.getElementsByTagName("table")
        NumRow = tbl.Rows.Length
        NumCol = tbl.Rows(0).Cells.Length
        ReDim tblArray(1 To Int(NumRow / 9), 0 To 8)
        For Each row In tbl.Rows
            For Each cell In row.Cells
                k = k + 1
                If k > 11 And k Mod 2 Then
                    'Debug.Print k, n, m, cell.innerText
                    tblArray(m, n) = cell.innerText
                    n = n + 1
                End If
                If n = 9 Then
                    n = 0
                    m = m + 1
                End If
    Next: Next: Next
    Set MyHTML = Nothing
 
    TOT = TOT + UBound(tblArray)
    For k = 1 To UBound(tblArray)
        RS.AddNew
        For j = 0 To 7
            RS.Fields(j) = tblArray(k, j)
        Next
        RS.Update
    Next
Next
DoCmd.Hourglass False
MsgBox Timer - T & "  sec." & vbCrLf & _
       Format(TOT, "# ###") & "  Records downloaded"
 
End Sub
==============================================
 
Bruno

Simone Calligaris explained :

Sarà il canto del cigno.
(scritto con la sinistra sui coglions...)
 
Bruno

Il giorno lunedì 3 novembre 2014 15:11:30 UTC+1, Bruno Campanini ha scritto:
 
(omissis) 
 
Letto tutto e salvato. Notevole, davvero. Non sapevo si potesse "fare" 
cosi'. 
 
Grazie, e alla prossima. 
 

 cosi'. 
 
Non lo sapevo nemmeno io.
 
Bruno


:-) 
 
Dove hai trovato ? Ricerca su google ? Io la ho trovato quell' ipotesi 
che t' ho mostrato. E che penso non sia da buttare : ha il vantaggio di 
essere molto veloce e "brutale" (beve tutto)  e  quindi  minimizza  il 
tempo minimo necessario di connessione al web. La miglior cosa (forse) 
e' conoscere i vari metodi per  sceglierne di  volta in  volta il piu' 
adatto. 
 
 

 For Each tbl In dHTML.getElementsByTagName("table")
 
Ecc ecc
 
Ora, in quella pagina non c'e' UNA sola tabella, quella cioe'
coi dati anagrafici. Ma ce ne sono almeno altre due piccoline
in fondo (<table> ... bla bla ... </table>) le vedi ? 
 
Allora come fai a non caricare anche quelle visto che (almeno 
cosi' mi pare di capire) il tuo codice dice *per ogni* tabella 
della pagina fai questo e quest' altro ? 
 
Mi puoi spiegare per favore ? 

radica...@gmail.com
 formulated the question :

La precedente sezione di codice:
For Each i In Regioni
    Dim tblArray()
    Set MyHTML = 
tHTML.createDocumentFromUrl("
https://www.albopf.it/XXDomain/AlboStatico/html/
" 
& i & ".html", vbNullString)
    Do While MyHTML.ReadyState <> "complete"
        DoEvents
    Loop
........
seleziona di volta in volta le 20 regioni, per cui MyHTML contiene
un solo file di regione, diciamo TOSCANA.html
 
La successiva sezione di codice:
For Each tbl In MyHTML.getElementsByTagName("table")
quella che ti crea perplessità, va a prelevare da dentro
TOSCANA.html, una alla volta, tutte le tabelle ivi esistenti.
Ma dentro TOSCANA.html c'è UNA SOLA TABELLA: quella che ci serve.
 
Sarebbe più logico riferirsi a detta unica tabella in modo diretto
anziché usare un For Each... Next.
Ma per quanto ci abbia studiato sopra non ho trovato altra via
per farlo.
Ci sarà? io credo di no. Comunque studiati anche tu quella
guida che ti ho segnalato e correggimi se sbaglio.
 
Bruno
 
PS
Quell'unica tabella non ha nome, non ha id, ha un'intestazione
centrale composta di diverse righe anche blank e fa corpo unico,
come oggetto tabella, con la tabella vera e propria contenente
i dati che preleviamo.
A completare l'oscenità del tutto ha una sola colonna e quelle
che dovrebbero essere le intestazioni dei campi in una tabella
convenzionale, si ripetono con riferimento a ciascun dato.
Per cui i 53873 record logici si sono trasformati in più del
doppio di record fisici.
Verrei essere chiaro con un esempio, un record formato da:
 
Nome     Indirizzo            Città
Piero    Via del Desiderio    Livorno
 
si trasforma in:
Nome
Piero
Indirizzo
Via del Desiderio
Città
Livorno
 
e così per 53873 volte,

Bruno Campanini pretended :

cosicché si ha una tabella monocampo di 3-400000 record da cui 
estrarre,
con una serie infinita di moccoli, i 53873 record utili, in un formato
che può chiamarsi database.
 
Buenas noches, sono las dos de la mañana.
 
Bruno

 e così per 53873 volte,
 
Si si ho visto. Evidentemente alla Consob non hanno chiaro il 
concetto di db "relazionale" :D 
(scherzo)
 

 (scherzo)
Programmatori frettolosi, direi che proprio non hanno
chiaro il concetto di database.
(non scherzo)
E chissà quanto li paga la Consob...
 
Bruno

 E chissà quanto li paga la Consob...
 
La Consob ? Niente. Li paghiamo **noi** dal momento che la Consob
e' un ente dello  Stato. E vai col butta butta di denaro pubblico, 
tanto a loro che gliene frega ?  
 
...  non  mi  ci  far pensare che mi vengono istinti omicidi. E 
adesso nemmeno io scherzo.