Novità

AIUTO , SE POTETE, AGGIORNAMENTO 10ELOTTO5MIN

Ciao Luigi,

per quel che riguarda le librerie esterne tutto mi torna, effettivamente nei riferimenti è presente la dll "FunzioniSpazioScript.dll" la quale contiene tutte le funzioni degli script di spaziometria.

Esiste la funzione chiamata "DownloadFromWeb" (credo Tu ti riferissi a questa) la quale gestisce il donwload dei file html dal web.

Venendo al dunque, interrogando l'archivio estrazioni si avrebbe la data dell'ultima estrazione presente in archivio, avendo come risultato l'ultima data presente ( e qui direi non solo, sarebbe da interrogare l'id estrazione e avere anche il numero dell'ultima estrazione presente, visto che vanno da 001 a 288) avendo ora questi 2 dati, si dovrebbero generare i nominativi dei "link" alle pagine html dalle quali estrarre le estrazioni.

Ad esempio gestirei la pagina ( 10eLotto | Lottomatica 20140407 <-- Questa la data da mettere in variabile ) effettivamente si hanno, come accennavi Tu, più estrazioni per file html.

Per quel che riguarda le discriminanti sarebbe solo da capire quale parola "chiave" utilizzare per poi leggere ed estrapolare i valori voluti...

Ecco un piccolo estratto di file html visto con UltraEdit:

Codice:
 <div class="popContent">
        <table summary="10eLOTTO - Numeri estratti" class="tableCnt">
                                    <tr class="white">
                                <th><div class="numeroEstrazione">001 - 07/04</div></th>
                                <td><div class="numeroEstratto">9</div></td>
                                <td><div class="numeroEstratto">11</div></td>
............

Da qui in poi, avendo l'ultima data in archivio, il ciclo sulle nuove etc... etc... basta completare l'algoritmo dell'inserimento vero e proprio in archivio.

Mi fa piacere e molto onore la Tua fiducia in me nel riuscirci, ma un conto è programmare ai Tuoi livelli e un conto è ai miei (semplice passione / hobby).


Comunque sono uno che non molla, almeno ci provo e magari con qualche Tuo piccolo aiutino potrei anche riuscirci.


Saluti


Carmine
 
Ciao Moro i discriminanti potrebbero essere piu di uno.
per esempio devi gestire tutte le righe dove compare la jparola numero estratto ma non solo ognuna delle suddette righe appartiene ad una specifica data e ad un numero estrazione. Mano mano che leggi il file questo fatto lo dovrai gestire. Come ti suggerivo andrebbe fatta una funzione che riceva il percorso del file html e che ti ritorni un array con le estrazioni lette cosi per ogni file scaricato la lancerai otterrai il tuo array con le estrazioni che poi inserirai in archivio.
Sono sicuro che ci riuscirai magari sbattendoti un po ma penso proprio che se non molli non ci saranno problemi. ..ciao
 
Aggiungo che le funzioni del linguaggio da padroneggiare per assolvere il compito sono tutte quelle di gestione e manipolazione d stringhe
instr
mid
replace
Split

l array che ti deve tornare indietro io lo farei del tipo Udt magari usando proprio il tipo che ti a evo scritto qualche messaggio fa. Poi se incontri difficolta vedremo ma non credo conoscendo le suddette funzioni l implementazione dipende solo dalla logica..ciao
 
Ciao Luigi,

una domanda: come gestivi Tu la lettura delle estrazioni per passare i dati all'array?

Mi spiego: Prelevavi dalla pagina ufficiale dove ti "mostrano" l'ultima estrazione avvenuta ----> 10eLotto | Estrazioni e vincite | 10eLotto ogni 5' ;
oppure direttamente da resoconto delle uscite oggi ---> http://www.lottomaticaitalia.it/10elotto/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.html?data=20140408 ?

E' importante perchè da qui dovrà poi nascere la funzione da richiamare....


Avendolo già fatto in passato Tu, mi aiuta non poco...


Non preoccuparti, mi sbatterò fino ad uscirne vincitore!


Grazie per una tua eventuale risposta,


Saluti
 
Allora io prima recuperavo l ultima estrazione in archivio data e id successivamente
iniziavo a scaricare le pagine a partire dalla data uguale a quella che sapevo essere l ultima
in archivio. Scaricato il fle html di quella data lo leggevo riga per riga estrapolando tutte
le estrazioni contenute e creando il famoso array che ti dicevo.
all uscita della funzione ciclavo sull array fino a trovare la prima estrazione non
presente . Appena individuata la scrivevo in archivio e aggiornavo quindi la nuova ultima estrazione poi il ciclo si ripeteva per le altre pagine fino a quando qu
e
ste esistevano. Non so se era questo che volevi sapere..
ciao
 
Ciao Luigi,

questa è la prassi step by step di come dovrà essere fatto l'interazione per aggiornare, quello che ti chiedevo invece è da dove prevedevi Tu la lettura estrazioni dal web, fra uno dei 2 esempi (link) che ti ho postato prima.

Per quel che riguarda l'UDT o meglio User Define Type effettivamente sembra essere la miglior soluzione per gestire l'array di ritorno, se non erro la struttura è :

Codice:
Type ... End Type


Non sarà facile, ma ci proverò.

P.S. Sarebbe bello essere ai tuoi livelli, a quest'ora era già bello che fatto1


Saluti
 
Ah ..non avevo capito...il link non lo ricordo da qui non posso vederlo.
su Udt tutto esatto..eventualmente usa quello fatto da me. L array lo passerai per parametro
si occupera l funzione di dimensionarlo al numero di estrazioni trovate.
per il resto vedrai che non ci saranno problemi...poi io comunque ti seguo mi fa piacere che ti stai adiperando
ciai
 
Qualche messaggio fa avevo scritto il tipo in questione. Ti basta copiarlo ma se ti trovi meglio puoi adottare anche qualche altro sistema o un udt pensato da te..ciao
 
Ciao Luigi,

la cosa è molto più complessa di quel che pensavo...propabiblmente non rientra nelle mie conoscenze.

Mi spiego, la difficoltà più grossa, per me ovviamente, è quella di scrivere tutte le routine / funzioni dei moduli .bas da richiamare poi per far eseguire le istruzioni.

L'ambiente è già di suo ok, poi avendo tutte le fuzioni di spaziometria già comprese ancora meglio, ma la difficoltà è forse proprio quella di scrivere da capo tutti moduli e far interagire il tutto assieme.

Magari con un piccolo aiuto che poi è anche insegnamento da parte Tua, con qualche piccolo esempio o bozza di codice potrebbe aiutarmi, e aiutarci se qualcun'altro stà provando come me, a cercare di fare questo plugin che tu in passato hai già studiato e sviluppato.



Ringrazio in anticipo Luigi per una Tua eventuale risposta,



Saluti
 
Ultima modifica:
Ciao Moro , ahah eventuale risposta :-) quando le domande sono sono tese all'apprendimento e non si riferiscono a cose gia dette mille volte rispondo sempre con piacere ..da casa vedro cosa posso fare per aiutarti , nel frattempo ti dico che la complessita è solo apparente in realta non è difficile ..su una scala 1 -10 io darei un 4 .. massimo 5 ..
comunque da casa vedro cosa posso fare per darti degl input .. sicuramente non scrivero io il codice ma ti forniro il metodo per capire e implementarlo da solo.
 
Ciao Moro , come promesso eccomi qui a darti degli input per aiutarti
ad implementare questa funzione dell'aggiornamento archivio.
Spesso capita che nell'intento di scrivere una routine uno non sappia bene che pesci pigliare e da dove iniziare , il motivo di cio dipende dal fatto
che non si sono formalizzati su carta i passaggi da compiere.
Quindi la prima cosa da fare è delineare i vari step del processo.

1) Recuperare la data e l'id dell'ultima estrazione in archivio
2) fare un ciclo per costruire dinamnicamente le date da passare al fine di scaricare gli html con le estrazioni
3) scrivere una funzione che legga il file html , lo interpreti e che ci ritorni le estrazioni lette
4) scrivere in archivio le estrazioni trovate
5)ciclare fino a quando le estrazioni non sono finite.


Gia formalizzando cosi i passaggi possiamo constatare che le funzioni da scrivere non sono poi molte , due forse tre.

quindi iniziamo a scrivere i prototipi delle procedure che andremio a inserire in un solo modulo o addirittura anche nello tesso form
ma meglio il modulo bas percio fai cosi.

Codice:
Sub InitAggiornamentoDL5M

End Sub

Sub LeggiFileHtmlTornaEstrazioni (sFileToRead as string , aEstrLette () as structEstrazione10L5M)

End Sub


Come si intuisce la prima funzione richiamera la seconda
la seconda procedura gestisce dei parametri , questo perche è una procedura che richiameremo piu volte su file differenti
fa sempre le stesse cose ottenendo ovviamente risultati diversi percio usiamo i parametri, per renderla astratta nel compito che deve svolgere
su file diversi ma sempre dello stesso tipo (cioe i file che contengono le estrazioni).

Nella Sub LeggiFileHtmlTornaEstrazioni vediamo anche l'uso di un tipo UDT per quanto riguarda l'array delle estrazioni che ci fara tornare indietro.
Quindi parliamo un attimo del tipo udt e dichiariamolo, ti avevo suggerito quello usato da spaziometria percio riprendiamolo da li

Codice:
Type STRUCT_DATA_EST
    nNumEstrazione As Integer
    GG As Integer
    Mm As Integer
    AA As Integer
End Type
Type STRUCT_ESTRAZIONE_10LOTTO
    idEstr As Long
    strctData As STRUCT_DATA_EST
    aNum(1 To 20) As Byte
    
End Type

il tipo che useremo sara STRUCT_ESTRAZIONE_10LOTTO che a sua volta ha un membro dichiarato del tipo STRUCT_DATA_EST
inutile preoccuparsi è tutto molto trasparente si tratta del sistema usato da spaziometria per immagazinare i
dati delle estrazioni nel file dell'archivio.

dal momento che in un modulo bas abbiamo dichiarato questi due tipi potremo poi nel codice che andremo
a scrivere dichiarare delle variabili di quel tipo , sia variabili che array


Codice:
Dim UltimaEstrazione as STRUCT_ESTRAZIONE_10LOTTO ' è una variabile 

Dim aEstrazioni()  as STRUCT_ESTRAZIONE_10LOTTO ' è un array non ancora dimensionato

ReDim aEstrazioni(1 to 10)  as STRUCT_ESTRAZIONE_10LOTTO ' è un array che contiene 10 elementi del tipo suddetto


essendo dei tipi strutturati ogni variabile ha piu membri , nel codice per riferirsi ai membri si
usa la sintassi : NomeVariabile.NomeMembro
per ora credo sia tutto chiaro.
Abbiamo definito cosa deve fare la nostrra routine e quali sono le strutture dati che utilizzeremo.

Vediamo ora quali sono gli altri punti critici che dovremo affrontare.



1) Recuperare la data e l'id dell'ultima estrazione in archivio

Questo si fa molto facilmente dato che esiste la funzione

GetInfoEstrazioneDL.

Se noi scriviamo la seguente istruzione negli script

Codice:
Sub Main
	ImpostaArchivio10ELotto (2) ' imposta l'archivio 10 e lotto 5m
	Scrivi GetInfoEstrazioneDL( EstrazioniArchivioDL  ) ' scrive la data dell'ultima estrazione in archivio
	
End Sub

otteniamo a video una stringa simile

Codice:
[01056] [192] 21.04.2013

che come vedi contiene tutte le informazioni che volevamo , ce le restituisce in un unica stringa da cui noi dobbiamo estrapolarle.

quindi gia possiamo iniziare a scrivere le prime linee di codice nella sub InitAggiornamentoDL5M



Codice:
Sub InitAggiornamentoDL5M
	Dim sDataUltimaEstr as string 
	Dim idEstr as long 
	dim numEstr as long
	dim sTemp as string 

	ImpostaArchivio10ELotto (2) ' imposta l'archivio 10 e lotto 5m

	sTemp = GetInfoEstrazioneDL( EstrazioniArchivioDL  ) ' scrive il risultato una variabile temporanea
	
End Sub


come dicevamo ora dobbiamo estrarre i singoli dati da questa variabile sTemp che contiene un valore tipo
Codice:
[01056] [192] 21.04.2013

siccome notiamo che i dati sono separati da spazio
possiamo usare la funzione Split per separarli tra di loro , ci tornera un'array con 3 elementi
poi vediamo che ci sono le parentesi quadre , dovremo eliminarle , lo faremo con la funzione Replace
la data contiene dei punti ma a noi ci serve con gli / anche in questo caso useremo la funzione replace
andiamo ad aggiungere codice a quanto abbiamo gia scritto


Codice:
Sub InitAggiornamentoDL5M
	Dim sDataUltimaEstr as string 
	Dim idEstr as long 
	dim numEstr as long
	dim sTemp as string 
	dim k as long 

	ImpostaArchivio10ELotto (2) ' imposta l'archivio 10 e lotto 5m

	sTemp = GetInfoEstrazioneDL( EstrazioniArchivioDL  ) ' scrive il risultato una variabile temporanea
	
	' leggo i dati dcontenuti nella variabile e li separo con split
	redim aV(0) as string 
	aV() = split(sTemp , " ")

	' ora so che il primo elemento dell'array è l'id estrazione 
	' il secondo elemento  è il numero estrazione
	' il terzo elemento è la data
	' so pure che gli array iniziano da 0 percio vado a memorizzare i singoli valori nelle apposite variabili
	' ricordando che dobbiamo normalizzarli togliendo parentesi quadre e sostitundo il . con /


	' levo le parentesi quadre dall'id estrazione cotenuto nell'elemento 0 dell'array aV()
	aV(0) = replace(av(0) , "[" ,"")
	aV(0) = replace(av(0) , "]" ,"")

	' levo le parentesi quadre dal numero estrazione cotenuto nell'elemento 1 dell'array aV()
	aV(1) = replace(av(1) , "[" ,"")
	aV(1) = replace(av(1) , "]" ,"")

	' sostituisco il punto con slash nell'elemento 2 dell'array aV()
	aV(2) = replace(av(2) , "." ,"/")
	

' 	' ora siamo pronti per memorizzare i dati nelle variabili
	
	idEstr = val(aV(0))
	NumEstr = val(aV(1))
	sDataUltimaEstr  = av(2)

	
	
	

	
End Sub



2) fare un ciclo per costruire dinamnicamente le date da passare al fine di scaricare gli html con le estrazioni

In questo caso sapendo che per costruire le link da scaricare dovremo passare una data dobbiamo partire della
data che abbiamo rilevato essere l'ultima in archivio e proseguire fino a data odierna.
Per farlo useremo l'istruzione DateAdd e useremo un ciclo di tipo Do .. Loop
All'interno del ciclo andremo a scaricare il file html di quella data , poi lo leggeremo , scriveremo le estrazioni trovate
e poi continuiamo finche non si verifica la condizione di uscita.

il loop sara piu o meno cosi


Codice:
do while format (sNuovaData , "yyyymmdd") <= format(now ,"yyyymmdd")
	
	sNuovaData = DateAdd("d" ,1 , sNuovaData ) ' aggiunge un giorno e ottiene una nuova data
loop

come si vede la condizione di uscita consiste nel verificare che la data appena calcolata
sia inferiore o uguale alla data corrente , appena non lo è piu esce



Codice:
Sub InitAggiornamentoDL5M
	Dim sDataUltimaEstr as string 
	Dim idEstr as long 
	dim numEstr as long
	dim sTemp as string 
	dim k as long 
	dim sNuovaData as string   

	ImpostaArchivio10ELotto (2) ' imposta l'archivio 10 e lotto 5m

	sTemp = GetInfoEstrazioneDL( EstrazioniArchivioDL  ) ' scrive il risultato una variabile temporanea
	
	' leggo i dati dcontenuti nella variabile e li separo con split
	redim aV(0) as string 
	aV() = split(sTemp , " ")

	' ora so che il primo elemento dell'array è l'id estrazione 
	' il secondo elemento  è il numero estrazione
	' il terzo elemento è la data
	' so pure che gli array iniziano da 0 percio vado a memorizzare i singoli valori nelle apposite variabili
	' ricordando che dobbiamo normalizzarli togliendo parentesi quadre e sostitundo il . con /


	' levo le parentesi quadre dall'id estrazione cotenuto nell'elemento 0 dell'array aV()
	aV(0) = replace(av(0) , "[" ,"")
	aV(0) = replace(av(0) , "]" ,"")

	' levo le parentesi quadre dal numero estrazione cotenuto nell'elemento 1 dell'array aV()
	aV(1) = replace(av(1) , "[" ,"")
	aV(1) = replace(av(1) , "]" ,"")

	' sostituisco il punto con slash nell'elemento 2 dell'array aV()
	aV(2) = replace(av(2) , "." ,"/")
	

' 	' ora siamo pronti per memorizzare i dati nelle variabili
	
	idEstr = val(aV(0))
	NumEstr = val(aV(1))
	sDataUltimaEstr  = av(2)

	
	' iniziamo il ciclo di lettura delle pagine html

	sNuovaData =sDataUltimaEstr   ' partiamo dall'ultima data disponbile
	do while format (sNuovaData , "yyyymmdd") <= format(now ,"yyyymmdd")




		sNuovaData = DateAdd("d" ,1 , sNuovaData ) ' aggiunge un giorno e ottiene una nuova data
		
	loop
	

	
End Sub


ora che abbiamo approntato il ciclo che calcola le date dobbiamo andare a scaricare le varie pagine , qui varia in funzione di ciò che richiede
il sito che usi , comunque l logica da seguire è quella che ti mostro aggiungendo codice alla procedura che stiamo scrivendo



Codice:
Sub InitAggiornamentoDL5M
	Dim sDataUltimaEstr as string 
	Dim idEstr as long 
	dim numEstr as long
	dim sTemp as string 
	dim k as long 
	dim sNuovaData as string   
	dim sLinkHtml as string , sFileLocal as string 

	ImpostaArchivio10ELotto (2) ' imposta l'archivio 10 e lotto 5m

	sTemp = GetInfoEstrazioneDL( EstrazioniArchivioDL  ) ' scrive il risultato una variabile temporanea
	
	' leggo i dati dcontenuti nella variabile e li separo con split
	redim aV(0) as string 
	aV() = split(sTemp , " ")

	' ora so che il primo elemento dell'array è l'id estrazione 
	' il secondo elemento  è il numero estrazione
	' il terzo elemento è la data
	' so pure che gli array iniziano da 0 percio vado a memorizzare i singoli valori nelle apposite variabili
	' ricordando che dobbiamo normalizzarli togliendo parentesi quadre e sostitundo il . con /


	' levo le parentesi quadre dall'id estrazione cotenuto nell'elemento 0 dell'array aV()
	aV(0) = replace(av(0) , "[" ,"")
	aV(0) = replace(av(0) , "]" ,"")

	' levo le parentesi quadre dal numero estrazione cotenuto nell'elemento 1 dell'array aV()
	aV(1) = replace(av(1) , "[" ,"")
	aV(1) = replace(av(1) , "]" ,"")

	' sostituisco il punto con slash nell'elemento 2 dell'array aV()
	aV(2) = replace(av(2) , "." ,"/")
	

' 	' ora siamo pronti per memorizzare i dati nelle variabili
	
	idEstr = val(aV(0))
	NumEstr = val(aV(1))
	sDataUltimaEstr  = av(2)

	
	' iniziamo il ciclo di lettura delle pagine html

	sNuovaData =sDataUltimaEstr   ' partiamo dall'ultima data disponbile
	do while format (sNuovaData , "yyyymmdd") <= format(now ,"yyyymmdd")

		sLinkHtml  = "http://sitocheusi.html?DataConcorso=" & snuovadata  ' costruisce la link (è solo un esempio)  
		sFileLocale = "c:\" & sNuovaData & ".html"	 ' costruuisce il percorso per il file in locale (è solo un esempio)
		call DownloadFromWeb ( sLink , sFileLocale) ' scarica il file


		sNuovaData = DateAdd("d" ,1 , sNuovaData ) ' aggiunge un giorno e ottiene una nuova data
		
	loop
	

	
End Sub


come vedi siamo arrivati a buon punto abbiamo gestito il download delle pagine html delel vare estrazioni.
ci manca la parte che legga il fle scaricato , lo interpreti e ci ritorni le colonne.

tu per ora impleenta fino a qui e dimmi se riesci a scaricare i file html

ciao
 
Ciao Luigi,

che dire, prima di tutto una piccola premessa : il mio dire nei vari post "... per una Tua eventuale risposta" lo scrivo con forma di immenso rispetto nei Tuoi confronti, daltronde come ho già detto più volte nei forum nulla è dovuto, in questo caso poi, parlando del Tuo Spaziometria, ancora men che meno.

Detto questo, passiamo ora al discorso del metodo per implementare il codice per aggiornare le estrazioni.

Per come hai esposto, illustrato e spiegato i passaggi, direi che davvero non si puo' non capire :), spiegazione degna di un insegnante ad alto livello ad un corso di vb per principianti, molto dettagliata, commentata in tutti i passaggi e completa in tutto.

Per quel che riguarda il flow chart, o meglio i passaggi da compiere per giungere al fine, me li avevi già illustrati, ed ora più che mai, sono chiari e perfettamente comprensibili per me!

1) Recuperare la data e l'id dell'ultima estrazione in archivio
2) fare un ciclo per costruire dinamnicamente le date da passare al fine di scaricare gli html con le estrazioni
3) scrivere una funzione che legga il file html , lo interpreti e che ci ritorni le estrazioni lette
4) scrivere in archivio le estrazioni trovate
5)ciclare fino a quando le estrazioni non sono finite.

Allora come primo passaggio sono andato a crearmi un modulo .bas che ho chiamato "ModStrutture" all'interno del quale ho dichiarato la struttura UDT del metodo che utilizza Spaziometria per immaganizzare i dati, che verrà poi in seguito richiamato dalla Sub LeggiFileHtmlTornaEstrazioni

Ecco il contenuto del modulo .bas ModStrutture
Codice:
' struttura per accesso al file base dati estrazioni
Type STRUCT_DATA_EST
    nNumEstrazione As Integer
    GG As Integer
    Mm As Integer
    AA As Integer
End Type
Type STRUCT_ESTRAZIONE_10LOTTO
    idEstr As Long
    strctData As STRUCT_DATA_EST
    aNum(1 To 20) As Byte
End Type

Subito dopo ho cominciato a scrivere il codice come da Te illustrato passo per passo, e ricommentandolo con "parole" mie, segno di funzione appresa e capito cosa quella riga di codice fà...

Il risultato, ovviamente è uguale a quello che tu man mano hai spiegato, eccolo sotto completo del link al sito che ho scelto per il download dei file html da leggere poi in seguito:

Codice:
Sub InitAggiornamentoDL5M()
    Dim sDataUltimaEstr As String
    Dim idEstr As Long
    Dim numEstr As Long
    Dim sTemp As String
    Dim k As Long
    Dim sNuovaData As String
    Dim sLinkHtml As String, sFileLocal As String

    ImpostaArchivio10ELotto (2) ' Con questo imposto l'archivio a quello del 10eLotto 5minuti

    sTemp = GetInfoEstrazioneDL(EstrazioniArchivioDL) ' Con questo scrivo il risultato ottenuto in una variabile temporanea
    
    ' leggo i dati contenuti nella variabile temporanea e li separo con la funzione split
    
    ReDim av(0) As String
    av() = Split(sTemp, " ")
    
    ' Formato risultato del GetInfoEstrazioneDL [01189] [208] 11.04.2014
    ' 1° Elemento Array ->[01189]
    ' 2° Elemento Array ->[208]
    ' 3°Elemento Array ->11.04.2014
    ' Gli array partono da 0 perciò memorizzo i singoli valori nelle apposite variabili
    ' ricordando che bisogna "normalizzarli" togliendo le parentesi quadre e sostitundo il punto(.) con lo slash(/)

    ' Elimino le parentesi quadre dall'id estrazione contenuto nell'elemento 0 dell'array aV()
    av(0) = Replace(av(0), "[", "")
    av(0) = Replace(av(0), "]", "")

    ' Elimino le parentesi quadre dal numero estrazione contenuto nell'elemento 1 dell'array aV()
    av(1) = Replace(av(1), "[", "")
    av(1) = Replace(av(1), "]", "")

    ' cambio il punto con lo slash nell'elemento 2 dell'array aV()
    av(2) = Replace(av(2), ".", "/")

    ' Adesso è possibile memorizzare i dati nelle variabili
    
    idEstr = Val(av(0))
    numEstr = Val(av(1))
    sDataUltimaEstr = av(2)
    
    ' Qui inizia il ciclo di lettura delle pagine html da scaricare

    sNuovaData = sDataUltimaEstr  ' La partenza avviene dall'ultima data disponbile trovata in archivio
    
    Do While Format(sNuovaData, "yyyymmdd") <= Format(Now, "yyyymmdd")

        sLinkHtml = "http://www.lottomaticaitalia.it/10elotto/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.html?data=" & Format(sNuovaData, "yyyymmdd") ' costruisce il link di base
        sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html" ' costruuisce il percorso nel quale salvare i vari file in locale
        Call DownloadFromWeb(sLinkHtml, sFileLocal) ' scarico i file
        sNuovaData = DateAdd("d", 1, sNuovaData) ' aggiunge un giorno e ottiene una nuova data
        
    Loop
    
End Sub

Come subito noterai ho dovuto modificare un pezzo del codice da Te proposto perchè non mi tornava la data in formato "normalizzato" come serve a me, in pratica nonostante sia stato dichiarato all'inizio del ciclo Do While il Format "yyymmdd" nell'esecuzione di quest'ultimo la data veniva comunque interpretata con formato "dd/mm/yyyy", da qui la mia "soluzione" di rimettere il Format nei path di sLinkHtml ed sFileLocal, non so se è la soluzione migliore, ma in questo modo forzo la routine a "normalizzare" le date per i salvataggi delle variabili. Ecco la parte di codice di cui parlo:

Codice:
sLinkHtml = "http://www.lottomaticaitalia.it/10elotto/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.html?data=" & Format(sNuovaData, "yyyymmdd") ' costruisce il link di base
sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html" ' costruuisce il percorso nel quale salvare i vari file in locale
Call DownloadFromWeb(sLinkHtml, sFileLocal) ' scarico i file
sNuovaData = DateAdd("d", 1, sNuovaData) ' aggiunge un giorno e ottiene una nuova data

Grazie ai Tuoi input, col codice parziale sopra postato, ottengo in una cartella Temp nel path dell'applicazione tutti i file "yyyymmdd.html" a partire dall'ultima data trovata in archivio fino alla data odierna, ecco sotto le immagini dei risultati ottenuti:

File-html-salvati.jpg

Ed ecco uno di questi file aperto col browser web per vederne il contenuto. (da qui poi bisognerà fare il parse dei dati che servono):

file-html-view.jpg

Ora come dicevi Tu, ci manca la parte che legga il fle scaricato , lo interpreti e ci ritorni le colonne.


Come al solito, Ti ringrazio in anticipo Luigi per una Tua eventuale risposta :)



Saluti
 
Ultima modifica:
Ciao Moro , benissimo ! Ho incollato il tuo codice in un progettino di esempio e ho visto che funziona perfettamaente.
La modifica che ti si è resa necessaria dipende dal fatto che il sito che usi vuole la data in quel formato percio hai dovuto formattarla
per rispettare cio che devi passare a lla link.
Tutto ok hai fatto benissimo.
Faccio una piccola precisazione riferita al "ProgettoPlugin" , avrai notato che il proetto parte da un template
che inserisce un form con alcuni controlli di default e una dorsale di codice che opportunamente implementata
serve per fare le statistiche.
A te tutto questo non serve percui elimina tutti i controlli dal form , poi apri la finestra del codice , e cancella tutto
e le uniche routine che devono rimanere sono

Codice:
Option Explicit
Option Compare Text
Public bFerma As Boolean

Private Sub Form_Load()
' NON MODIFICARE SE NON NECESSARIO

    Call InitSpazioScript
   
    
End Sub
Private Sub Form_Terminate()
' NON MODIFICARE SE NON NECESSARIO

    Call Deinit
End Sub

sulla form priva ormai di tutti i contollli inserisci un pulsante è da li che richiameremo la procedura che inizia l'aggiornamento.


Codice:
Private Sub Command1_Click()
    InitAggiornamentoDL5M
End Sub



ora andiamo a parlare della procedura piu importante del plugin , la procedura che si occupa di leggere il file scaricato
interpretarlo e farci tornare le estrazioni.
Ripetiamo cosa dovra fare e come ipotizziamo il funzionamento di questa procedura.

Ricevera in input il percorso di un file html (quello da leggere con le estrazioni)
Scrivera le estrazioni lette in un array

quali sono i problemi che dobbiamo affrontare per implementarne il funzioamento ?

sicuramente dovremo poter leggere il file scaricato.
Questo si fa con le operazioni di I/O (input/output) sui file.
Poi dovremmo analizzare e fare il parsing del file linea per linea ,per poterlo interpretare.

Benissimo , come hai gia fatto facciamo girare la procedura cosi com'è
poi andiamo a vedere che "faccia" c'hanno i file scaricati :-)
Li proviamo ad aprire col browser e vediamo c he sono proprio loro , ora li apriamo con ultraedit
o notepad per vedere come sono scritti al loro interno e quali sono i criteri con i quali possiamo
individuare i dati da catturare

Aprendo il file html con ultraedit ecco come si presenta nella porzione che ci interessa

Codice:
  <div class="popContent">
        <table summary="10eLOTTO - Numeri estratti" class="tableCnt">
                                    <tr class="white">
                                <th><div class="numeroEstrazione">001 - 21/04</div></th>
                                <td><div class="numeroEstratto">11</div></td>
                                <td><div class="numeroEstratto">12</div></td>
                                <td><div class="numeroEstratto">20</div></td>
                                <td><div class="numeroEstratto">27</div></td>
                                <td><div class="numeroEstratto">41</div></td>
                                <td><div class="numeroEstratto">44</div></td>
                                <td><div class="numeroEstratto">49</div></td>
                                <td><div class="numeroEstratto">53</div></td>
                                <td><div class="numeroEstratto">55</div></td>
                                <td><div class="numeroEstratto">58</div></td>
                                <td><div class="numeroEstratto">59</div></td>
                                <td><div class="numeroEstratto">60</div></td>
                                <td><div class="numeroEstratto">62</div></td>
                                <td><div class="numeroEstratto">65</div></td>
                                <td><div class="numeroEstratto">72</div></td>
                                <td><div class="numeroEstratto">78</div></td>
                                <td><div class="numeroEstratto">81</div></td>
                                <td><div class="numeroEstratto">85</div></td>
                                <td><div class="numeroEstratto">87</div></td>
                                <td><div class="numeroEstratto">89</div></td>
                            </tr>
                                    <tr class="white">
                                <th><div class="numeroEstrazione">002 - 21/04</div></th>
                                <td><div class="numeroEstratto">6</div></td>
                                <td><div class="numeroEstratto">12</div></td>
                                <td><div class="numeroEstratto">14</div></td>
                                <td><div class="numeroEstratto">19</div></td>
                                <td><div class="numeroEstratto">36</div></td>
                                <td><div class="numeroEstratto">38</div></td>
                                <td><div class="numeroEstratto">39</div></td>
                                <td><div class="numeroEstratto">41</div></td>
                                <td><div class="numeroEstratto">49</div></td>
                                <td><div class="numeroEstratto">52</div></td>
                                <td><div class="numeroEstratto">56</div></td>
                                <td><div class="numeroEstratto">61</div></td>
                                <td><div class="numeroEstratto">64</div></td>
                                <td><div class="numeroEstratto">67</div></td>
                                <td><div class="numeroEstratto">73</div></td>
                                <td><div class="numeroEstratto">79</div></td>
                                <td><div class="numeroEstratto">85</div></td>
                                <td><div class="numeroEstratto">86</div></td>
                                <td><div class="numeroEstratto">87</div></td>
                                <td><div class="numeroEstratto">88</div></td>
                            </tr>



vediamo subito che la riga che contiene i riferimeti di data e numero eestrazione si individua facilmente perche
contiene la parola <numeroEstrazione> , da notare che la data non contiene l'anno
vediamo che dopo la suddetta riga compaiono altre righe dove è presente la parola <numeroEstratto> , si tratta
delle righe che contengono i numeri estratti appartenenti a quella specifica estrazione letta nella prima riga
All'interno di queste righe dovremo estrapolare i dati che ci servono , quindi si tratta di individuare un criterio
per estrarli.

Parliamo della prima riga quella contenete la data


Codice:
<th><div class="numeroEstrazione">001 - 21/04</div></th>

dobbiamo arrivare a quel valore 001 - 21/04
come possiamo fare ? E chiaro che dovremo manipolare la stringa.
Abbiamo gia usato la funzione split.
Che succederebbe se noi splittassimo quella riga in funzione del carattere ">"
avremmo un array con i seguenti elementi

Codice:
<th
<div class="numeroEstrazione"
[b]001 - 21/04</div[/b]
</th
[code]


si nota che l'elemento con indice 2 (parte da 0) è quello che ci serve , sara sempre cosi dato che i file sono standard
ora sappiamo che dobbiamo operare sul valore che contiene la riga
[b]001 - 21/04</div[/b]
in particolare dobbiamo estrapolare il numero estrazione (001) e la data (21/04)
prima di tutto prendiamo solo la parte di stringa che ci serve , individuiamo la posizione dove
troncare la stringa grazie al  carattere "<"
quindi riusciamo a prendere la priam parte che contiene [b]001 - 21/04[/b]
da qui con split sara facile ottenere i due valori in variabili distinte

Benissimo abbiamo visto come estrapolare data e numero estrazione , ora parliamo delle righe con i numeri estratti
il concetto è identico.
Individuiamo la riga grazie alla presenza della parola "numeroEstratto"  e poi una volta individuata operiamo 
per estrarre il numero.

[code]
<td><div class="numeroEstratto">11</div></td>

Anche qui se usiamo la funzione split con il carattere separatore ">" otteniamo

Codice:
<td
<div class="numeroEstratto"
[b]11</div[/b]
</td

[code]

anche in questo caso l'elemento con indice 2 è quello che contiene il valore che ci serve

[code]
[b]11</div[/b]
[code]

dal quale dobbiamo estrapolare il dato da catturare , facilissimo anche qui tronchiamo la stinga al carattere "<"

ora che abbiamo visto come interpretare il file possiamo iniziare a vedere quali sono gli altri punti da affrontare.
Il primo è ovviamente quello di leggere il file , ci farebbe comodo una funzione che passando il path del file ci tornasse
un array contenente le righe lette dal file.
in pratica questa funzione dovrebbe leggere il file alimentare un array con le righe lette e farcelo tornare indietro
in maniera che noi poi possiamo leggere le righe e interpretarle.

questa funzione la puoi prendere pari pari è la seguente

[code]
Function LeggiFileTornaRighe(sFile As String, aRighe() As String)

    Dim f As Integer
    Dim sBuffer As String
    f = FreeFile ' apro un puntatore al file
    Open sFile For Binary As f ' apro il file in binario
    sBuffer = Space(LOF(f)) ' preparo il buffer di lettura alla dimensione del file
    Get f, 1, sBuffer ' leggo dal byte 1 l'intero file nella variabile sBuffer
    Close f ' chiudo il file
    
    ReDim aRighe(0) As String ' ridimensiono l'array delle righe 
    aRighe() = Split(sBuffer, vbLf) ' splitto il buffer con il carattere line feed in maniera da ottenere le righe
End Function

Ora direi che siamo pronti per cominciare , andiamo a vedere come implementare la sub LeggiFileHtmlTornaEstrazioni
ricordiamoci che l'anno di estrazione non compare nella pagina html percio ce lo dobbiamo portare appresso in qualche modo e
il modo piu semplice è inserire un altro parametro nella sub , il parametro nAnno

Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO , nAnno as integer)
     
End Sub

Sappiamo che questa sub riceve un parametro che poi conterra le estrazioni trovate , la prima cosa da fare
in testa al codice è azzerare questo parametro ridimensionandolo a 0 elementi , poi durante la lettura delle righe dovremo gestire
il Redim per memorizzare le estrazioni che via via troveremo.


Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno as integer)
    
    
    	dim nTrovate as long  'conteggia le estrazioni trovate
	redim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO		
    
     
End Sub

dopo avere fatto questo aggiungiamo il codice che legge il file e ci fa tornare l'array con le righe lette
e inseriamo il ciclo per leggere le righe



Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno as integer)
    	
	dim nRiga as long 'cicla sulel righe lette 

    	
	dim nTrovate as long  'conteggia le estrazioni trovate
	redim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO		
    	
    
    	ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
    	Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file
    
	for nRiga = 0 to ubound(aRighe)


	next
    
End Sub



A questo punto dobbiamo andare ad inserire il codice dentro il ciclo , ovvero dovremmo andare ad individuare e a leggere
le righe che ci servono, abbiamo gia visto come fare a livllo logico ora il tutto va implementato


Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno as integer)
    	
	dim nRiga as long 'cicla sulel righe lette 

    	
	dim nTrovate as long  'conteggia le estrazioni trovate
	redim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO		
    	
    
    	ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
    	Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file e mi tornano le righe
    
	for nRiga = 0 to ubound(aRighe)
 		If InStr(aRighe(nRiga ), "numeroEstrazione") Then
            		
			' è la riga che contiene la data ed è quella che ci indica che abiamo trovato una nuova estrazione
            
            
        	End If
		If InStr(aRighe(nRiga ), "numeroEstratto") Then
            		
            		' è la riga che contiene uno dei numeri estratti
            
        	End If

	next
    
End Sub


sappiamo che ogni estrazione che troviamo la inseriremo nel nostro array , sappiamo anche che l'array lo avevamo ridimensionato
a 0 in testa al codice , quindi appena troviamo una nuova estrazione dobbiamo certamente incrementare la dimensione del nostro array
per far spazio all'estrazione da memorizzare.
Quindi aggiungiamo il codice che gestisce il dimensionamento dell'array , quand'è che lo dobbiamo ridimensionare ? Appena troviamo
la riga con una nuova data , percio facciamo cosi


Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno as integer)
    	
	dim nRiga as long 'cicla sulel righe lette 

    	
	dim nTrovate as long  'conteggia le estrazioni trovate
	redim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO		
    	
    
    	ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
    	Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file
    
	for nRiga = 0 to ubound(aRighe)
 		If InStr(aRighe(nRiga ), "numeroEstrazione") Then
            		
			' è la riga che contiene la data ed è quella che ci indica che abiamo trovato una nuova estrazione
            		nTrovate  = nTrovate  + 1 ' incremento le estrazioni trovate
			redim preserve aRetEstr (nTrovate) As STRUCT_ESTRAZIONE_10LOTTO ' ridimension l'array preservando i valori precedenti
            
        	End If
		If InStr(aRighe(nRiga ), "numeroEstratto") Then
            		
            		' è la riga che contiene uno dei numeri estratti
            
        	End If

	next
    
End Sub

Abbiamo visto che appena troviamo la riga contenente la data estrazione incrementiamo la dimensione dell'array aRetEstr
ora all'elemento identificato dalla variabile nTrovate dovremmo andare a scrivere i valori che estrapoleremo.
Avevamo gia fatto l'analisi e abbiamo visto come fare per tirare fuori i valori di data e di numero estrazione da quella riga
ora dovremo implementarelo.
Ci farebbe comodo una procedura che passando un elemento dell'array e la stringa letta dal file contenente i valori di data e numero estr ,
la leggesse e valorizzasse i membri dell'elemento dell'array contenente l'estrazione da valorizzare.
Ecco il prototipo di questa procedurina
Codice:
Sub LeggiDataEId(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String)

End Sub

il primo paramentro è del tipo UDT , quindi potra ricevere un singolo eleento dell'array aRetEstr visdto che sono dello stesso tipo
il secondo parametro è la riga da leggere.
andiamo a scrivere il codice d i questa sub semplicemente trasformando in codice quello che avevamo visto in fase di analisi

Codice:
Sub LeggiDataEId(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nAnno As Integer)
    Dim i As Integer
    Dim sTemp As String

    ReDim aV(0) As String
    aV() = Split(sRiga, ">")
    
    i = InStr(aV(2), "<")
    sTemp = Left(aV(2), i - 1)
    
    ReDim aV(0) As String
    aV() = Split(sTemp, "-")
    
    structEstr.strctData.nNumEstrazione = Val(aV(0))
    
    ReDim avv(0) As String
    avv() = Split(aV(1), "/")
    
    structEstr.strctData.AA = nAnno
    structEstr.strctData.Mm = Val(Trim$(avv(1)))
    structEstr.strctData.GG = Val(Trim$(avv(0)))
     
     
End Sub

ora che abbiamo scrittol questa funzioncina di supporto andiamo ad usarla

Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno As Integer)
        
    Dim nRiga As Long 'cicla sulel righe lette

        
    Dim nTrovate As Long  'conteggia le estrazioni trovate
    ReDim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
        
    
    ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
    Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file
    
    For nRiga = 0 To UBound(aRighe)
        If InStr(aRighe(nRiga), "numeroEstrazione") Then
                    
            ' è la riga che contiene la data ed è quella che ci indica che abiamo trovato una nuova estrazione
            nTrovate = nTrovate + 1   ' incremento le estrazioni trovate
            ReDim Preserve aRetEstr(nTrovate) As STRUCT_ESTRAZIONE_10LOTTO  ' ridimension l'array preservando i valori precedenti
            Call LeggiDataEId(aRetEstr(nTrovate), aRighe(nRiga), nAnno)
        End If
        If InStr(aRighe(nRiga), "numeroEstratto") Then
                    
                    ' è la riga che contiene uno dei numeri estratti
            
        End If

    Next
    
End Sub

si nota che durante il ciclo di lettura delle righe ogni volta che troviamo la parola "numeroEstrazione" andiamo sia ad incrementare
la dimensione dell'array che conterra le estrazioni e inoltre contesualmente andiamo a valorizzare i membri di quel nuovo elemento appena
predisposto nell'array per quanto riguarda i valori di data e numero estrazione


ora dibbiamo gestire le righe che contengono i numeri estratti , come abbiamo visto in fase di analisi le righe con i numeri estratti
appartengono alla data letta per ultima e quindi all'elemento identificato da nTrovate nell'array aRetEstr
sappiamo gia a priori che dovremo leggere 20 righe ognuna riferita ad uno dei numeri estratti , percio introduciamo
una variabile per conteggiare le righe lette , questa variabile si deve azzerare nello stesso momento in cui troviamo una nuova
data e si deve incrementare di 1 ogni volta che troviamo un nuovo numero.
Ecco come va modificata la procedura

Codice:
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno As Integer)
        
    Dim nRiga As Long 'cicla sulel righe lette
    Dim nNumTrovati As Integer' gestisce i 20 num trovat per ogni estrazione
        
    Dim nTrovate As Long  'conteggia le estrazioni trovate
    ReDim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
        
    
    ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
    Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file
    
    For nRiga = 0 To UBound(aRighe)
        If InStr(aRighe(nRiga), "numeroEstrazione") Then
                    
            ' è la riga che contiene la data ed è quella che ci indica che abiamo trovato una nuova estrazione
            nTrovate = nTrovate + 1   ' incremento le estrazioni trovate
            ReDim Preserve aRetEstr(nTrovate) As STRUCT_ESTRAZIONE_10LOTTO  ' ridimension l'array preservando i valori precedenti
            Call LeggiDataEId(aRetEstr(nTrovate), aRighe(nRiga), nAnno)
            
            nNumTrovati = 0
        End If
        If InStr(aRighe(nRiga), "numeroEstratto") Then
                 
                    ' è la riga che contiene uno dei numeri estratti
             nNumTrovati = nNumTrovati + 1
        End If

    Next
    
End Sub

ora ogni nuovo ennesimo numero che troviamo dobbiamo andare a valorizzare il membro dell'elemento nTrovate dell'array aRetEstr
anche in questo caso ragioniamo come prima e scopriamo che ci farebbe comodo una sub alla quale passare l'elemento
dell'array aRetEstr che deve essere valorizzato , e la riga letta dal file html. Tale funzione legge la riga estrapola i dati e li scrive
nell'elemento dell'array.
ecco il prototipo

Codice:
Sub LeggiNumeroEstratto(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nIdNumeroDaValorizzare As Integer)

end sub

il primo parametro sarà l'elemento dell'array i cui membri che dovremo valorizzare
il secondo la riga contenente i dati il terzo l'indice del numero da valorizzare (da 1 a 20)
Sappiamo come interpretare la riga in base all'analisi fatta all'inizio
la procedura diventa cosi


Codice:
Sub LeggiNumeroEstratto(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nIdNumeroDaValorizzare As Integer)
    Dim i As Integer
    Dim sTemp As String

    ReDim aV(0) As String
    aV() = Split(sRiga, ">")
    
    i = InStr(aV(2), "<")
    sTemp = Left(aV(2), i - 1)
    structEstr.aNum(nIdNumeroDaValorizzare) = Val(sTemp)
     
     
End Sub



ora siamo pronti per usare questa sub all'interno di quella che legge le estrazioni che diventa

[/ode]
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno As Integer)

Dim nRiga As Long 'cicla sulel righe lette
Dim nNumTrovati As Integer ' gestisce i 20 num trovat per ogni estrazione

Dim nTrovate As Long 'conteggia le estrazioni trovate
ReDim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO


ReDim aRighe(0) As String ' preparo l'array che conterà le righe del file
Call LeggiFileTornaRighe(sFile, aRighe) ' leggo il file

For nRiga = 0 To UBound(aRighe)
If InStr(aRighe(nRiga), "numeroEstrazione") Then

' è la riga che contiene la data ed è quella che ci indica che abiamo trovato una nuova estrazione
nTrovate = nTrovate + 1 ' incremento le estrazioni trovate
ReDim Preserve aRetEstr(nTrovate) As STRUCT_ESTRAZIONE_10LOTTO ' ridimension l'array preservando i valori precedenti
Call LeggiDataEId(aRetEstr(nTrovate), aRighe(nRiga), nAnno)

nNumTrovati = 0
End If
If InStr(aRighe(nRiga), "numeroEstratto") Then

' è la riga che contiene uno dei numeri estratti
nNumTrovati = nNumTrovati + 1

Call LeggiNumeroEstratto(aRetEstr(nTrovate), aRighe(nRiga), nNumTrovati)
End If

Next

End Sub
[/code]


direi che abbiamo quasi finito , infatti il grosso del lavoro è fatto , siamo risusciti a leggere la pagina html e ci tornano indietro le estrazioni
lette.
Vediamo come richiamre la sub LeggiFileHtmlTornaEstrazioni da quella principale InitAggiornamentoDL5M


Codice:
Sub InitAggiornamentoDL5M()
    Dim sDataUltimaEstr As String
    Dim idEstr As Long
    Dim numEstr As Long
    Dim sTemp As String
    Dim k As Long
    Dim sNuovaData As String
    Dim sLinkHtml As String, sFileLocal As String

    ImpostaArchivio10ELotto (2) ' Con questo imposto l'archivio a quello del 10eLotto 5minuti

    sTemp = GetInfoEstrazioneDL(EstrazioniArchivioDL) ' Con questo scrivo il risultato ottenuto in una variabile temporanea
    
    ' leggo i dati contenuti nella variabile temporanea e li separo con la funzione split
    
    ReDim aV(0) As String
    aV() = Split(sTemp, " ")
    
    ' Formato risultato del GetInfoEstrazioneDL [01189] [208] 11.04.2014
    ' 1° Elemento Array ->[01189]
    ' 2° Elemento Array ->[208]
    ' 3°Elemento Array ->11.04.2014
    ' Gli array partono da 0 perciò memorizzo i singoli valori nelle apposite variabili
    ' ricordando che bisogna "normalizzarli" togliendo le parentesi quadre e sostitundo il punto(.) con lo slash(/)

    ' Elimino le parentesi quadre dall'id estrazione contenuto nell'elemento 0 dell'array aV()
    aV(0) = Replace(aV(0), "[", "")
    aV(0) = Replace(aV(0), "]", "")

    ' Elimino le parentesi quadre dal numero estrazione contenuto nell'elemento 1 dell'array aV()
    aV(1) = Replace(aV(1), "[", "")
    aV(1) = Replace(aV(1), "]", "")

    ' cambio il punto con lo slash nell'elemento 2 dell'array aV()
    aV(2) = Replace(aV(2), ".", "/")

    ' Adesso è possibile memorizzare i dati nelle variabili
    
    idEstr = Val(aV(0))
    numEstr = Val(aV(1))
    sDataUltimaEstr = aV(2)
    
    ' Qui inizia il ciclo di lettura delle pagine html da scaricare

    sNuovaData = sDataUltimaEstr  ' La partenza avviene dall'ultima data disponbile trovata in archivio

    Do While Format(sNuovaData, "yyyymmdd") <= Format(Now, "yyyymmdd")

        sLinkHtml = "http://www.lottomaticaitalia.it/10elotto/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.html?data=" & Format(sNuovaData, "yyyymmdd") ' costruisce il link di base
        sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html" ' costruuisce il percorso nel quale salvare i vari file in locale
        Call DownloadFromWeb(sLinkHtml, sFileLocal)  ' scarico i file
        
        ReDim aEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
        Call LeggiFileHtmlTornaEstrazioni(sFileLocal, aEstr, Year(sNuovaData))
        

        sNuovaData = DateAdd("d", 1, sNuovaData) ' aggiunge un giorno e ottiene una nuova data

    Loop


End Sub


con questo codice siamo in grado di scaricare e interpretare tutte le pagine delle estrazioni , per ogni iterazione del ciclo do loop prima di calcolare la nuova data , andremo a vedere se bisogna scrivere nell'archivio le estrazioni trovate.
Infatti ricordati che partiamo dall'ultima data gia in archivio quindi alcune estrazioni gia le abbiamo e nonostante la procedura che legge il
file html ce le faccia tornare noi quelle non dobbiamo inserirle , dobbiamo inserire solo quelle che mancano
quindi ricapitolando , lanciamo la sub LeggiFileHtmlTornaEstrazioni , questa ci trona un array con n estrazioni e nella circostanza in cui
lew estrazioni sono quelle dell'ultima data che gia abbimo dobbiamo stare attenti a saltare quelle gia in archivio.
Le possiamo riconoscere tramite NumeroEstrazione , in pratica se la data è quella dell'ultima estrazione e il numero estrazione è maggiore di quello
che avevamo letto all'inzio le dobbiamo prendere senno no.
Tuto questo solo nel caso di data uguale all'ultima data inserita , neglia ltri casi ovvero le date successive le estrazioni vanno prese tutte
Qui entri in gioco tu , qust'ultima parte del codice te la spiego in teoria e tu dovrai implemetarla.
Dopo aver lanciato LeggiFileHtmlTornaEstrazioni e prima di calcolare la nuova data dovrai implementare il codice che

1) cicli con un ciclo for sull'array aEstr da 1 a ubound(aEstr)
2) se la data attuale del file scaricato è quella uguale all'ultima in archivio gestire le estrazioni da saltare
3) scrivere l'estrazione dell'elemento identificato dalla variabile di controllo del suddetto ciclo nell'archivio 10 e lotto mediante la funzione
SalvaEstrazioneDL
4) cancellare il file locale che ormai non serve piu

per aiutarti ancora faccio un'abbozzo , è ovvio che devi scrivere tu il codice di questa procedura

Codice:
sub SalvaEstrazioni (aEstr() as STRUCT_ESTRAZIONE_10LOTTO , sDataUltimaEstrArchivio as string , sDataCorrente as string )

	dim k as long 


	for k = 1 to ubound (aEstr)
		
		SalvaEstrazioneDL 
	next

end sub


SalvaEstrazioni la dovrai chiamare dirante il ciclo Do loop subito dopo LeggiFileHtmlTornaEstrazioni e prima di calcolare la nuova data.

Ciao
 
Ciao Luigi,

che dire, grazie infinite per tutte le info e spiegazioni dettagliate che mi dai....Fai mica l'insegnante Tu ??? :)

Detto questo, torno al discorso dell'aggiornamento estrazioni.

Per quel che riguarda il Tuo primo consiglio, si lo avevo già fatto. Ho eliminato tutti i controlli caricati di default e lasciato solo il command button per lanciare la procedura che aggiorna.

Non Ti nascondo che mi piacerebbe fare un plugin che dia la possibilità di vedere anche le estrazioni magari tramite una flex grid, un po' come hai fatto Tu nel programma ufficiale...

Ma torniamo per ora al codice per aggiornare, allora come la volta scorsa ho letto attentamente tutti i passaggi e man mano ho implementato le procedure per completare il tutto, solo che questa volta mi appare un errore del quale non ho gran dimistichezza, e non nascondo che fatico un pò a capire come risolverlo.

Allego il codice che ho man mano implementato e ricommentato come da mio stile:

Codice:
Option Explicit
Option Compare Text
Public bFerma As Boolean
Private Sub Form_Load()
    Call InitSpazioScript
End Sub
Private Sub XPButton1_Click()
InitAggiornamentoDL5M
End Sub
Private Sub Form_Terminate()
    Call Deinit
End Sub
Sub InitAggiornamentoDL5M()
    Dim sDataUltimaEstr As String
    Dim idEstr As Long
    Dim NumEstr As Long
    Dim sTemp As String
    Dim k As Long
    Dim sNuovaData As String
    Dim sLinkHtml As String, sFileLocal As String

    ImpostaArchivio10ELotto (2) ' Con questo imposto l'archivio a quello del 10eLotto 5minuti

    sTemp = GetInfoEstrazioneDL(EstrazioniArchivioDL) ' scrive il risultato una variabile temporanea
    
    ' leggo i dati dcontenuti nella variabile e li separo con split
    
    ReDim aV(0) As String
    aV() = Split(sTemp, " ")
    
    ' Formato risultato del getinfoestrazionedl [01056] [192] 21.04.2013
    ' 1° Elemento Array ->[01056]
    ' 2° Elemento Array ->[192]
    ' 3°Elemento Array ->21.04.2013
    ' Gli array partono da 0 perciò memorizzo i singoli valori nelle apposite variabili
    ' ricordando che dobbiamo normalizzarli togliendo parentesi quadre e sostitundo il . con /

    ' levo le parentesi quadre dall'id estrazione contenuto nell'elemento 0 dell'array aV()
    aV(0) = Replace(aV(0), "[", "")
    aV(0) = Replace(aV(0), "]", "")

    ' levo le parentesi quadre dal numero estrazione contenuto nell'elemento 1 dell'array aV()
    aV(1) = Replace(aV(1), "[", "")
    aV(1) = Replace(aV(1), "]", "")

    ' sostituisco il punto con slash nell'elemento 2 dell'array aV()
    aV(2) = Replace(aV(2), ".", "/")

    ' ora siamo pronti per memorizzare i dati nelle variabili
    
    idEstr = Val(aV(0))
    NumEstr = Val(aV(1))
    sDataUltimaEstr = aV(2)
    
    ' iniziamo il ciclo di lettura delle pagine html

    sNuovaData = sDataUltimaEstr  ' partiamo dall'ultima data disponbile
    
    Do While Format(sNuovaData, "yyyymmdd") <= Format(Now, "yyyymmdd")

        sLinkHtml = "http://www.lottomaticaitalia.it/10elotto/estrazioni-e-vincite/popup-pdf/estrazioni-giorno.html?data=" & Format(sNuovaData, "yyyymmdd") ' costruisce il link base
        sFileLocal = App.Path & "\Temp\" & Format(sNuovaData, "yyyymmdd") & ".html" ' costruuisce il percorso per il file in locale
        Call DownloadFromWeb(sLinkHtml, sFileLocal) ' scarica il file

        ReDim aEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
        Call LeggiFileHtmlTornaEstrazioni(sFileLocal, aEstr, Year(sNuovaData)) ' richiamo la funzione "LeggiFileHtmlTornaEstrazioni"

        sNuovaData = DateAdd("d", 1, sNuovaData) ' aggiunge un giorno e ottiene una nuova data
        
        If Format(sNuovaData, "yyyymmdd") > Format(Now, "yyyymmdd") Then
        MsgBox "Aggiornamento completato"
        End If
        
    Loop
    

    
End Sub
Sub LeggiFileHtmlTornaEstrazioni(sFile As String, aRetEstr() As STRUCT_ESTRAZIONE_10LOTTO, nAnno As Integer)
    Dim nRiga As Long 'faccio il cicla sulle righe lette
    Dim nTrovate As Long  ' faccio il conteggio di tutte le estrazioni trovate
    ReDim aRetEstr(0) As STRUCT_ESTRAZIONE_10LOTTO
    ReDim aRighe(0) As String ' ora con questa funzione preparo l'array che conterà tutte le righe del file
        Call LeggiFileTornaRighe(sFile, aRighe) ' richiamo la funzione che effettua la lettura del file
    For nRiga = 0 To UBound(aRighe)
        If InStr(aRighe(nRiga), "numeroEstrazione") Then 'contiene la data, ed è quella che dice che abbiamo trovato una nuova estrazione
            nTrovate = nTrovate + 1   ' adesso faccio l'incremento delle estrazioni che ho trovato
            ReDim Preserve aRetEstr(nTrovate) As STRUCT_ESTRAZIONE_10LOTTO  ' ora ridimensiono l'array preservando i valori precedenti
            Call LeggiDataEId(aRetEstr(nTrovate), aRighe(nRiga), nAnno) ' richiamo alla funzione di "supporto" denominata "LeggiDataEId"
        End If
        If InStr(aRighe(nRiga), "numeroEstratto") Then ' è la riga che contiene uno dei numeri estratti
            nNumTrovati = nNumTrovati + 1 'variabile per conteggiare le righe lette
            Call LeggiNumeroEstratto(aRetEstr(nTrovate), aRighe(nRiga), nNumTrovati) ' richiamo alla funzione di "supporto" denominata "LeggiNumeroEstratto"
        End If
    Next
End Sub
'Con la procedura "LeggiDataEId" passo l'elemento dell'array e la stringa letta con i valori data e N° Estr e mi valorizza i membri dell' array che contiene l'estrazione da valorizzare
Sub LeggiDataEId(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nAnno As Integer)
    Dim i As Integer
    Dim sTemp As String

    ReDim aV(0) As String
    aV() = Split(sRiga, ">")
    
    i = InStr(aV(2), "<")
    sTemp = Left(aV(2), i - 1)
    
    ReDim aV(0) As String
    aV() = Split(sTemp, "-")
    
    structEstr.strctData.nNumEstrazione = Val(aV(0))
    
    ReDim avv(0) As String
    avv() = Split(aV(1), "/")
    
    structEstr.strctData.AA = nAnno
    structEstr.strctData.Mm = Val(Trim$(avv(1)))
    structEstr.strctData.GG = Val(Trim$(avv(0)))
End Sub
' Con la procedura "LeggiNumeroEstratto" passo l'elemento dell'array aRetEstr che ha bisogno anch'esso di essere valorizzato
Sub LeggiNumeroEstratto(structEstr As STRUCT_ESTRAZIONE_10LOTTO, sRiga As String, nIdNumeroDaValorizzare As Integer)
    Dim i As Integer
    Dim sTemp As String
    ReDim aV(0) As String
    aV() = Split(sRiga, ">")
    i = InStr(aV(2), "<")
    sTemp = Left(aV(2), i - 1)
    structEstr.aNum(nIdNumeroDaValorizzare) = Val(sTemp)
End Sub
Function LeggiFileTornaRighe(sFile As String, aRighe() As String)
    Dim f As Integer
    Dim sBuffer As String
    f = FreeFile ' Con questa funzione apro un puntatore al file che mi consente di ottenere un numero di file non ancora utilizzato
    Open sFile For Binary As f ' Con questa funzione apro il file in formato binario
    sBuffer = Space(LOF(f)) ' Con questa funzione mi preparo il buffer di lettura alla dimensione del file
    Get f, 1, sBuffer ' Con questa funzione leggo dal byte 1 l'intero file nella variabile sBuffer dichiarata prima
    Close f ' infine con questa funzione chiudo il file
    ReDim aRighe(0) As String ' Con questa funzione ridimensiono l'array delle righe
    aRighe() = Split(sBuffer, vbLf) ' Con questa funzione splitto il buffer con il carattere "line feed" in modo da ottenere le varie righe
End Function

Ma aihmè, Ti allego anche l'errore che ricevo all'esecuzione del progetto per come è tuttora :

errore-compilazione.jpg

Credo sia un discorso di dichiarazione di function pubbliche o del Private, ma non ne sono sicuro....

Risolto questo inghippo, mi concentrerò sulla parte finale del codice che dovrà fare i passaggi come da Te indicati:

1) cicli con un ciclo for sull'array aEstr da 1 a ubound(aEstr)
2) se la data attuale del file scaricato è quella uguale all'ultima in archivio gestire le estrazioni da saltare
3) scrivere l'estrazione dell'elemento identificato dalla variabile di controllo del suddetto ciclo nell'archivio 10 e lotto mediante la funzione
SalvaEstrazioneDL
4) cancellare il file locale che ormai non serve piu

Un' idea c'è l'ho già, poi Te la propongo e mi dici casomai se la strada è quella giusta o meno, ma prima vorrei capire quell'errore perchè mi salta fuori....


Inutile quasi dirTi ancora grazie Luigi, al di là dell'aiuto per la creazione del plugin, ma soprattutto per l'INSEGNAMENTO che mi dai, e che dai agli se leggono il post!



Grazie
 
Ciao Moro le sub e le function che usano udt se sono in un form vanno dichiarate private senno vanno spostate in un modulo bas. Un saluto
 
Ciao Luigi,

avevi ovviamente ragione Tu, bastava dichiarare le sub con udt nei form come private, ora non ricevo più quell'errore.

Mi da' invece un problemino sulla function Tua quella che ho preso "pari pari" che fa la lettura del numero estratto...

mi si ferma in debug su "structEstr.aNum(nIdNumeroDaValorizzare) = Val(sTemp)" e mi dice errore di Run Time "9" indice non compreso nell'intervallo...

Hai mica una mezza idea da che può dipendere??


Saluti
 
Ciao moro . Numtrovati va azzerato ogni volta che trovi uns nuova data...mi sembra che non ci sia questa istruzione. Verifica bene le procedure scritte da me ..partendo dalle ultme..ciao
 
nNumTrovati = 0 va messo prima di end if nel codice che individua la riga con la parola nmeroestrazione ciao
 
Ciao Luigi,

si l'avevo visto. Grazie comunque dell'info, per correttezza anche la variabile Dim nNumTrovati As Integer" va dichiarata, altrimenti risulta errore nella routine...

Ora mi manca l'ultimo passo, e cioè far diventare codice questi passaggi:

1) cicli con un ciclo for sull'array aEstr da 1 a ubound(aEstr)
2) se la data attuale del file scaricato è quella uguale all'ultima in archivio gestire le estrazioni da saltare
3) scrivere l'estrazione dell'elemento identificato dalla variabile di controllo del suddetto ciclo nell'archivio 10 e lotto mediante la funzione
SalvaEstrazioneDL
4) cancellare il file locale che ormai non serve piu

Speriamo di riuscire a farlo, cosi il tutto sarà completo.


Ciao
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 21 gennaio 2025
    Bari
    78
    09
    70
    03
    23
    Cagliari
    32
    88
    30
    13
    45
    Firenze
    87
    23
    15
    39
    86
    Genova
    71
    48
    67
    59
    23
    Milano
    58
    50
    80
    85
    29
    Napoli
    90
    81
    79
    82
    62
    Palermo
    70
    33
    90
    05
    10
    Roma
    15
    71
    55
    85
    76
    Torino
    89
    09
    18
    33
    69
    Venezia
    44
    80
    82
    73
    58
    Nazionale
    80
    25
    13
    63
    17
    Estrazione Simbolotto
    Bari
    39
    36
    34
    14
    31
Indietro
Alto