Novità

Mente da programmatore

i legend

Premium Member
Luigi 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:)
 
L

LuigiB

Guest
eri fuori dalla zona di confort anche la prima volta che hai visto il vbscript.. quindi non ti preoccupare..
 

Edoardo_95

Advanced Member
Luigi 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:)
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 ahaha
 

i legend

Premium Member
eri fuori dalla zona di confort anche la prima volta che hai visto il vbscript.. quindi non ti preoccupare..
🤣🤣🤣🤣🤣🤣
In realtà ero come un bambino che guarda una cosa nuova con gli occhi spalancati e la bocca spalancata 🤣🤣🤣🤣🤣
Perso in ammirazione 😲
 
L

LuigiB

Guest
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
 
L

LuigiB

Guest
inoltre nella classe archivio vanno implemetate queste due funzioni
Dal nome si capisce cosa devono fare

la prima torna true se l'estrazione è valida

la seconda non fa controlli e torna direttamente la struttura archivio sotto forma di stringa.

Notare che nella prima dovendo tornare indietro il parametro strctùEst questo va passato byref
in dotnet tutti i parametri a differenza del vb6 sono passati per default byval perciò bisogna ricordarsi quando serve che un parametro torni con le modifiche volute.


Codice:
    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
 
Ultima modifica di un moderatore:

Edoardo_95

Advanced Member
Allora per quanto concerne l'uscita dal ciclo do in caso di rilevazione errore ho risolto nel modo seguente e funziona egregiamente:

Codice:
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

Ho risolto anche in merito alla posizione archivio per mezzo dell'implementazione di alcune funzioni adhoc :

Codice:
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

e cosi nella modappconfig:

Codice:
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

Naturalmente ho omesso nei moduli che ho postato le parti di codice non modificate
 

Edoardo_95

Advanced Member
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

Va inserita nella In "AlimentaStrEstrazioni" con le opportune modiche?
 
L

LuigiB

Guest
no no quello script sopra va usato per generare il file delle estrazioni dal quale sei partito.
Qui bisogna fare una rivisitazione un po del codice e per farlo devi implementare quelle due funzioni che ho scritto sopra.
Il nome AlimentaStrEstrazioni cambialo in AlimentaArrayEstrazioni ,cosi unononsi confonde e capisce bene cosa fa.

una volta che avra iscritto quelel 2 funzioni dovremmo cambiare un po' il codice della procedura che le legge.
 
L

LuigiB

Guest
la tua funzione AlimentaArrayArchivio deve diventare cosi

ti mancano le funzioni

Private Function CalcolaIndiceMensile(sLine As String, ByRef nLastMese As Integer, ByRef nIndiceMensile As Integer) As Integer

Private Function RecordArchivioToStructArchivio(sRecord As String, IndiceMensile As Integer, ByRef strctEst As StrEstrazione) As Boolean

che dovrai implementare.



Codice:
  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
 

Edoardo_95

Advanced Member
Ho provato a scrivere la funzione "CalcolaIndiceMensile" .. ma non riesco a capire dove sbaglio:

Codice:
    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

Potresti darmi un consiglio?
 
L

LuigiB

Guest
è necessario condividere la variabile che memorizza l'ultimo mese cosi come quella che memorizza l'indice mensile con la procedura chiamante per questo è byref.
non è necessario fare tutti quei passaggi con le date , possiamo estrarre il mese dalal data sottoforma di numero.
in questa function stiamo dando per scontato che l'item 2 dell'array splittato contenga la data

per fare le conversioni si usa la classe apposita Convert.


Codice:
    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
 
Ultima modifica di un moderatore:

Edoardo_95

Advanced Member
Ecco la seconda:

Codice:
    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
 
L

LuigiB

Guest
si , va bene ma cosi ti sei perso tutti i messaggi di errore

Codice:
 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
 
L

LuigiB

Guest
nella funzione che ti alimenta gli array per i nomi della sorte ti sei sbagliato ,
nella funzione Inizializzato tu testi il numero di elementi dell'array estrazioni ma l'array parte sempre da 0 , quindi per esserci almeno un 'estrazione length deve essere > 1
nella routine che legge il file delel estrazioni bisogna mettere >= quando deve ridimensionare l'array altrimenti da errore

scrivi una funzione nella classe archivio

Private Function StructArchivioToRecordArchivio(strctEst As StrEstrazione) As String

end function
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 23 aprile 2024
    Bari
    47
    22
    34
    20
    50
    Cagliari
    33
    14
    86
    02
    62
    Firenze
    61
    22
    44
    19
    26
    Genova
    21
    12
    57
    82
    55
    Milano
    66
    05
    11
    70
    30
    Napoli
    05
    23
    25
    52
    73
    Palermo
    23
    44
    49
    71
    65
    Roma
    82
    37
    59
    34
    71
    Torino
    26
    42
    66
    15
    58
    Venezia
    57
    06
    68
    54
    84
    Nazionale
    21
    79
    49
    03
    01
    Estrazione Simbolotto
    Genova
    24
    02
    19
    03
    27
Alto