Edoardo_95
Advanced Member
Qui la cosa si fa difficile ed interessante... Mi metto all'opera
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
Beh anche per me è un mondo totalmente nuovo. Basta adattarsi ...e poi con i consigli e gli aiuti di Luigi ..anche se non sa fare una cosa ..ti porta a farla ahahaLuigi vi sto seguendo.
Ho già visual studio express.
Infatti domani provo ad aprirlo.
Ringrazio edo per la sua iniziativa e te ,come sempre.
Oggi ho praticamente dormito sul divano. La giornata è stata super faticosa.
Provo a seguirvi, ma qui sono fuori dalla mia zona di comfort. Il vbscript
Ancora complimenti
eri fuori dalla zona di confort anche la prima volta che hai visto il vbscript.. quindi non ti preoccupare..
Option Explicit
Sub Main
Dim nEstrInizio,nEstrFine
Dim DataIni,DataFin
Dim sFile
Dim sChrSep
Dim sDirDest
' msgbox "Sostituisci nello script la directory dove verrà creato il file csv" & vbcrlf & "Poi elimina questo messaggio" , vbinformation
sDirDest = "C:\Users\luigi\Desktop\RicercaLunghette\Archivi\"
' sDirDest = GetDirectoryAppData
If DirectoryEsistente(sDirDest) Then
sChrSep = ";"
sFile = AddSlash(sDirDest) & "EstrazioniLotto.csv"
If EliminaFile(sFile) Then
nEstrInizio = 1
nEstrFine = EstrazioniArchivio
Call EsportaEstr(nEstrInizio,nEstrFine,sFile,sChrSep)
End If
Else
MsgBox "Directory non trovata" & vbCrLf & sDirDest
End If
End Sub
Sub EsportaEstr(nEstrInizio,nEstrFine,sFile,sChrSep)
Dim k,f,idEstr
Dim sRecord
Dim nProgr
Dim sDataCorr
Dim r,e
For k = nEstrInizio To nEstrFine
Call Messaggio("Estrazione : " & k)
idEstr = k
ReDim aNum(0)
If GetEstrazioneCompleta(idEstr,aNum) Then
nProgr = nProgr + 1
sDataCorr = Replace(DataEstrazione(idEstr),".","/")
sRecord = FormatSpace(nProgr,9,True) & sChrSep
sRecord = sRecord & FormatSpace(IndiceAnnuale(idEstr),3,True) & sChrSep
sRecord = sRecord & sDataCorr & sChrSep
For r = 1 To 11
For e = 1 To 5
sRecord = sRecord & Format2(aNum(r,e)) & sChrSep
Next
Next
sRecord = RimuoviLastChr(sRecord,sChrSep)
Call ScriviFile(sFile,sRecord,False,True)
Else
Exit For
End If
If ScriptInterrotto Then Exit For
Call AvanzamentoElab(nEstrInizio,nEstrFine,k)
Next
Call CloseFileHandle(sFile)
' Call LanciaFile(sFile)
Scrivi "Esportato file " & sFile
MsgBox "Fine",vbInformation
End Sub
Function AddSlash(s)
If Right(s,1) <> "\" Then
AddSlash = s & "\"
Else
AddSlash = s
End If
End Function
Private Function RecordArchivioToStructArchivio(sRecord As String , IndiceMensile as integer ,ByRef strctEst As StrEstrazione) As Boolean
End Function
Private Function StructArchivioToRecordArchivio(strctEst As StrEstrazione) As String
End Function
Imports System.IO
Public Class ClsArchivio
Private Estrazioni() As StrEstrazione
Private EstrBool As Boolean
Sub New(sFileArchivio As String)
ReDim Estrazioni(0)
EstrBool = True
If FileEsistente(sFileArchivio) = True Then
AlimentaStrEstrazioni(sFileArchivio)
End If
End Sub
Private Function AlimentaStrEstrazioni(File As String) As Boolean
Dim AlimentaEstrazioni As Boolean = False
Dim n, i As Integer
Dim EstrazioniTotali As Integer
Dim EstrazioniMassime As Integer
Dim StrEstrTemp As StrEstrazione
Dim DataTmp As StrDataEstrazione
Dim SingElemRiga() As String
Dim nLette As Integer
StrEstrTemp.DimensionaRuote()
EstrazioniMassime = 20000
ReDim Estrazioni(EstrazioniMassime)
Dim sLine As String
Try
Dim str As New StreamReader(File)
'leggo la riga del file csv
sLine = str.ReadLine
'eseguo un ciclo do fin quando esistono righe da leggere
Do Until sLine Is Nothing
'otteno un array di sotto stringhe formato dai singoli componenti separati da ";"
Dim aSubStringRecord() As String = sLine.Split(";", StringSplitOptions.RemoveEmptyEntries)
'pongo una condizione che verifica che la riga sia stata suddivisa in tutte le sue parti pari a 58 sottostringhe
If aSubStringRecord.Count = 58 Then
nLette += 1
If IsDate(aSubStringRecord(2)) Then
DataTmp = StrEstrTemp.Data
StrEstrTemp.Data = DataTmp
StrEstrTemp.identifier = nLette
StrEstrTemp.Data.Data = CDate(aSubStringRecord(2))
StrEstrTemp.Data.Numero = Val(aSubStringRecord(1))
End If
i = 2
For r = 1 To 11
For e = 1 To 5
'incremento di uno l'indice in modo tale da prendere il primo estratto
i += 1
'imposto il numero che andra ad alimentare la struttura
n = Val(aSubStringRecord(i))
'verifico che sia un numero valido da inserire
If NumeroValido(n) = True Then
StrEstrTemp.Ruote(r).Estratto(e) = n
Else
EstrBool = False
MessageBox.Show($"Numero non valido rilevato: {n} alla riga " & nLette, "Archivio corrotto", MessageBoxButtons.OK, MessageBoxIcon.Warning)
ReDim Estrazioni(0)
Exit Do
End If
Next
Next
Else
EstrBool = False
MessageBox.Show($"Estrazione incompleta, elementi totali: {aSubStringRecord.Count} alla riga " & (nLette + 1), "Archivio corrotto", MessageBoxButtons.OK, MessageBoxIcon.Warning)
ReDim Estrazioni(0)
Exit Do
End If
EstrazioniTotali += 1
If EstrazioniTotali > EstrazioniMassime Then
EstrazioniMassime += 1000
ReDim Preserve Estrazioni(EstrazioniMassime)
End If
If EstrazioniTotali > 0 Then
ReDim Preserve Estrazioni(EstrazioniTotali)
Estrazioni(EstrazioniTotali) = StrEstrTemp
AlimentaEstrazioni = True
End If
sLine = str.ReadLine
Loop
str.Close()
str.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)
End Try
Return AlimentaEstrazioni
End Function
'Non confondersi...non si tratta di un numero valido per il lotto ma per l'archivio ...quindi va considerato lo zero visto l'assenza in passato di alcune ruote
Private Function NumeroValido(n As Integer) As Boolean
Dim valido As Boolean
If n >= 0 And n <= 90 Then
valido = True
End If
Return valido
End Function
Friend Function Inizializzato() As Boolean
Dim ini As Boolean
If EstrBool = True Then
ini = True
End If
Return ini
End Function
Private Function IsIdEstrValido(id As Long) As Boolean
If id > 0 And id <= UBound(Estrazioni) Then
IsIdEstrValido = True
End If
End Function
End Class
Module ModFunzioni
Private Function GetFileInPath(sPathFile As String) As String()
Dim path(0) As String
path = IO.Directory.GetFiles(sPathFile)
Return path
End Function
Private Function GetNameFileFromPath(sPathFile As String) As String
Dim NameFile As String
NameFile = IO.Path.GetFileName(sPathFile)
Return NameFile
End Function
Function GetNameFile(sPathfile As String) As String
Dim path(0) As String
Dim namefile As String
path = GetFileInPath(sPathfile)
namefile = GetNameFileFromPath(path(0))
Return namefile
End Function
End Module
Module ModAppConfig
Private sFileIni As String = Application.ExecutablePath & ".ini"
Private PathCsv As String = Application.StartupPath() & "Archivio\"
Sub InizializzaFileConfig()
SalvaValoreCfg(eValoriAppConfig.Archivio, PathCsv & NomeArchivio())
End Sub
Function NomeArchivio() As String
Dim archivio As String
archivio = GetNameFile(PathCsv)
Return archivio
End Function
End Module
allora , intanto va fatta una modifica allo script che genera le estrazioni per fare in modo che l'archivio abbia i record tutti della stessa lunghezza , in modo che se vogliamo fare un edit non dobbiamo riscrivere tutto il file, ma possiamo calcolare l'offset cioè la posizione in cui dovremo andre a sovrascrivere i byte per registrare la modifica.
ecoc il nuovo script , va usato per generare l'archivio. ai fini della lettura non cambia niente e non c'è da fare modifiche.
Codice:Option Explicit Sub Main Dim nEstrInizio,nEstrFine Dim DataIni,DataFin Dim sFile Dim sChrSep Dim sDirDest ' msgbox "Sostituisci nello script la directory dove verrà creato il file csv" & vbcrlf & "Poi elimina questo messaggio" , vbinformation sDirDest = "C:\Users\luigi\Desktop\RicercaLunghette\Archivi\" ' sDirDest = GetDirectoryAppData If DirectoryEsistente(sDirDest) Then sChrSep = ";" sFile = AddSlash(sDirDest) & "EstrazioniLotto.csv" If EliminaFile(sFile) Then nEstrInizio = 1 nEstrFine = EstrazioniArchivio Call EsportaEstr(nEstrInizio,nEstrFine,sFile,sChrSep) End If Else MsgBox "Directory non trovata" & vbCrLf & sDirDest End If End Sub Sub EsportaEstr(nEstrInizio,nEstrFine,sFile,sChrSep) Dim k,f,idEstr Dim sRecord Dim nProgr Dim sDataCorr Dim r,e For k = nEstrInizio To nEstrFine Call Messaggio("Estrazione : " & k) idEstr = k ReDim aNum(0) If GetEstrazioneCompleta(idEstr,aNum) Then nProgr = nProgr + 1 sDataCorr = Replace(DataEstrazione(idEstr),".","/") sRecord = FormatSpace(nProgr,9,True) & sChrSep sRecord = sRecord & FormatSpace(IndiceAnnuale(idEstr),3,True) & sChrSep sRecord = sRecord & sDataCorr & sChrSep For r = 1 To 11 For e = 1 To 5 sRecord = sRecord & Format2(aNum(r,e)) & sChrSep Next Next sRecord = RimuoviLastChr(sRecord,sChrSep) Call ScriviFile(sFile,sRecord,False,True) Else Exit For End If If ScriptInterrotto Then Exit For Call AvanzamentoElab(nEstrInizio,nEstrFine,k) Next Call CloseFileHandle(sFile) ' Call LanciaFile(sFile) Scrivi "Esportato file " & sFile MsgBox "Fine",vbInformation End Sub Function AddSlash(s) If Right(s,1) <> "\" Then AddSlash = s & "\" Else AddSlash = s End If End Function
Private Function AlimentaArrayEstrazioni(File As String) As Boolean
Dim bRet As Boolean = True
Dim EstrazioniTotali As Integer
Dim EstrazioniMassime As Integer = 1000
Dim nIndiceMensile As Integer
Dim nLastMese As Integer
Dim sLine As String
ReDim Estrazioni(EstrazioniMassime)
Try
Dim str As New StreamReader(File)
sLine = str.ReadLine
Do Until sLine Is Nothing
EstrazioniTotali += 1
CalcolaIndiceMensile(sLine, nLastMese, nIndiceMensile)
If RecordArchivioToStructArchivio(sLine, nIndiceMensile, Estrazioni(EstrazioniTotali)) = False Then
bRet = False
Exit Do
End If
If EstrazioniTotali > EstrazioniMassime Then
EstrazioniMassime += 1000
ReDim Preserve Estrazioni(EstrazioniMassime)
End If
sLine = str.ReadLine
Loop
str.Close()
str.Dispose()
ReDim Preserve Estrazioni(EstrazioniTotali)
Return bRet
Catch ex As Exception
MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)
End Try
End Function
Private Function CalcolaIndiceMensile(sLine As String, ByRef nLastMese As Integer, ByRef nIndiceMensile As Integer) As Integer
Dim aV(0) As String
Dim nOldMese As Integer
Dim strctETmp As StrEstrazione
Dim IndMese As Integer
aV = Split(sLine, ";")
If IsDate(aV(2)) Then
strctETmp.Data.Data = CDate(aV(2))
nLastMese = Month(strctETmp.Data.Data)
If nLastMese = nOldMese Then
nIndiceMensile += 1
Else
nIndiceMensile = 1
End If
nOldMese = nLastMese
End If
End Function
Private Function CalcolaIndiceMensile(sLine As String, ByRef nLastMese As Integer, ByRef nIndiceMensile As Integer) As Integer
Dim nMese As Integer
Dim av() As String = sLine.Split(";")
Dim avv() As String = av(2).Split("/")
nMese = Convert.ToInt32(avv(1))
If nMese = nLastMese Then
nIndiceMensile += 1
Else
nIndiceMensile = 1
End If
nLastMese = nMese
End Function
Private Function RecordArchivioToStructArchivio(sRecord As String, IndiceMensile As Integer, ByRef strctEst As StrEstrazione) As Boolean
Dim aV(0) As String
Dim i, n As Integer
Dim bret = False
strctEst.DimensionaRuote()
strctEst.Data.IndiceMensile = IndiceMensile
aV = Split(sRecord, ";")
i = 2
For r = 1 To 11
For e = 1 To 5
i += 1
n = Val(aV(i))
If NumeroValido(n) = True Then
strctEst.Ruote(r).Estratto(e) = n
bret = True
Else
bret = False
End If
Next
Next
Return bret
End Function
Private Function RecordArchivioToStructArchivio(sRecord As String, IndiceMensile As Integer, ByRef strctEst As StrEstrazione) As Boolean
Dim av() As String = sRecord.Split(";")
Dim i As Integer, n As Integer
strctEst.DimensionaRuote()
Try
If av.Length = 58 Then
strctEst.identifier = Convert.ToInt32(av(0))
strctEst.Data.IndiceMensile = IndiceMensile
strctEst.Data.Numero = Convert.ToInt32(av(1))
strctEst.Data.Data = Convert.ToDateTime(av(2))
i = 2
For r As Integer = 1 To 11
For e As Integer = 1 To 5
i += 1
n = Convert.ToInt32(av(i))
If NumeroValido(n) Then
strctEst.Ruote(r).Estratto(e) = Convert.ToInt32(av(i))
Else
MessageBox.Show("Numero letto dall'archivio alla riga " & strctEst.identifier.ToString & " non valido", "errore", MessageBoxButtons.OK)
Return False
End If
Next
Next
Return True
Else
MessageBox.Show("Il record dell'archivio non è conforme", "errore", MessageBoxButtons.OK)
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)
End Try
End Function