L
LuigiB
Guest
Ok Legend , hai scritto le funzioni che ti avevo chiesto e alla fine i valori li ottieni certe volte complichi le cose ...
Comunque qui i lavori sono cambiati in corso d'opera per fortuna che noi quand'è cosi non facciamo lievitare i costi ..
Dato che vogliamo accettare solo gli archivi che abbiano il ritardo massimo per estratto compatibile
con quello riscontrato sull'archivio reale purtroppo non possiamo piu usare la routine InitChiavi.
Perche quella routine creava X chiavi e di conseguenza X archivi .. però ora dobbiamo gestire il fatto
ch el'archivio prodotto non vada bene in quanto presenti il ritardo max estratto che si discosta troppo dal valore di riferimento.
Quindi mentre prima disponevamo di X chiavi fisse ora invece dobbiamo continuare a produrre una nuova chiave finche l'archivio risultante non rispetta i requisiti.
Quindi si elimina la sub InitChiavi e si modifica quella che crea l'archivio virtuale.
Proprio di questa sub parliamo ora , ineffetti l'ho scritta io e a te questa volta il compito di capire
cosa faccia.
Posto sotto lo script completo ovviamente come l'ho organizzato io prendilo a riferimento anche se le cose le hai scritte in modo diverso l'importante è che tu capisca la logica.
lo script si puo gia lanciare cosi per creare una serie di nuovi archivi virtuali
purtroppo mi sono reso conto che le funzioni turbo hanno un problema quando si usa la ApriFileBaseDati per cambiare archivio , il problema l'ho corretto ma devo ancora mettere la nuova versione , quindi in questo script per consentire di testarlo invece di statisticaformazioneTurbo ho usato statisticaformazione standard .
p.s.
nelllo script ho voluto inserire anche una routine mischianumeri per disordinare i numeri della colonna casuale non tanto perche serva quanto perche mi avevi detto di aver perso una mattinata a farne una simile.
.
Comunque qui i lavori sono cambiati in corso d'opera per fortuna che noi quand'è cosi non facciamo lievitare i costi ..
Dato che vogliamo accettare solo gli archivi che abbiano il ritardo massimo per estratto compatibile
con quello riscontrato sull'archivio reale purtroppo non possiamo piu usare la routine InitChiavi.
Perche quella routine creava X chiavi e di conseguenza X archivi .. però ora dobbiamo gestire il fatto
ch el'archivio prodotto non vada bene in quanto presenti il ritardo max estratto che si discosta troppo dal valore di riferimento.
Quindi mentre prima disponevamo di X chiavi fisse ora invece dobbiamo continuare a produrre una nuova chiave finche l'archivio risultante non rispetta i requisiti.
Quindi si elimina la sub InitChiavi e si modifica quella che crea l'archivio virtuale.
Proprio di questa sub parliamo ora , ineffetti l'ho scritta io e a te questa volta il compito di capire
cosa faccia.
Posto sotto lo script completo ovviamente come l'ho organizzato io prendilo a riferimento anche se le cose le hai scritte in modo diverso l'importante è che tu capisca la logica.
lo script si puo gia lanciare cosi per creare una serie di nuovi archivi virtuali
purtroppo mi sono reso conto che le funzioni turbo hanno un problema quando si usa la ApriFileBaseDati per cambiare archivio , il problema l'ho corretto ma devo ancora mettere la nuova versione , quindi in questo script per consentire di testarlo invece di statisticaformazioneTurbo ho usato statisticaformazione standard .
p.s.
nelllo script ho voluto inserire anche una routine mischianumeri per disordinare i numeri della colonna casuale non tanto perche serva quanto perche mi avevi detto di aver perso una mattinata a farne una simile.
.
Codice:
Option Explicit
Sub Main
Dim aKey ' array delle chiavi per creare gli archivi virtuali
Dim nQArchivi ' quantita degli archivi da creare
Dim nEstrIni ' estrazione dalla quale iniziare a creare le corrispondenti virtuali
Dim nClasseChiave ' classe per la chiave degli archivi
Dim sFileChiavi ' file che memorizza le chiavi per gli n archivi virtuali
Dim aEstAR ' matrice estrazioni archivio reale (Tot,Ruota,Pos)
Dim sDirArcVirt ' directory dove vengono creati gli archivi virtuali
Dim nRitMaxMin,nRitMaxMax ' rang emin e max per accettare il ritmax per estratto sul nuovo archivio prodotto
Dim percVarRitMax ' percentuale di variazione +/- per calcolare il range rispetto al ritmax calcolato su archivio reale
percVarRitMax = 10
nQArchivi = GetQuantitaArchivi
nClasseChiave = ScegliClasse
nEstrIni = ScegliInizio
sDirArcVirt = GetDirectoryAppData & "ArcVirtEnigma\"
If VerificaCoerenza(nQArchivi,nClasseChiave,nEstrIni) Then
' creo la directry dove salvo gli archivi
If CreaDirectory(sDirArcVirt) Then
' legge le estrazioni dell'archivio reale e le mette in memoria
If AlimentaMatriceEst(aEstAR) Then
Call GetRangeMinMaxRitardoMax(percVarRitMax,nEstrIni,nRitMaxMin,nRitMaxMax)
Call CreaArchiviVirtuali(nQArchivi,nClasseChiave,nEstrIni,aEstAR,EstrazioniArchivio,sDirArcVirt,nRitMaxMin,nRitMaxMax)
Call ScriviRitMaxPerArchivio(nClasseChiave,nQArchivi,sDirArcVirt,nEstrIni)
'Call GestioneConvergenze(aKey,nQArchivi,nClasseChiave,sDirArcVirt,nEstrIni,nQDaProc,aEstAR)
End If
End If
End If
End Sub
Function VerificaCoerenza(nQArchivi,nClasseChiave,nEstrIni)
Dim sMsg
If nQArchivi <= 0 Then sMsg = "Specificare la quantita di archivi da creare"
If nClasseChiave <= 4 Then sMsg = "Specificare la classe per le chiavi di generazione"
If nEstrIni <= 0 Then sMsg = "Specificare l'estrazione di partenza per la generazione degli archivi"
If sMsg <> "" Then
MsgBox sMsg,vbCritical
Else
VerificaCoerenza = True
End If
End Function
Function ScegliInizio()
ReDim aV(EstrazioniArchivio)
Dim k
For k = 1 To UBound(aV)
aV(k) = GetInfoEstrazione(k)
Next
ScegliInizio = ScegliOpzioneMenu(aV,1,"Inizio archivio virtuale")
End Function
Function ScegliClasse
ReDim aV(16)
Dim k
For k = 5 To 20
aV(k - 4) = k
Next
ScegliClasse =(ScegliOpzioneMenu(aV,1,"Classe chiavi di generazione")) + 4
End Function
Function GetQuantitaArchivi
GetQuantitaArchivi = Int(InputBox("Quanti archivi virtuali creare ?","Quantita archivi virtuali","25"))
End Function
Function AlimentaMatriceEst(aEst)
' alimenta la matrice con tutte le estrazioni dell'archivio reale
Dim k,r,e,nTot
nTot = EstrazioniArchivio
ReDim aEst(nTot,11,5)
For k = 1 To nTot
ReDim aNumEst(0)
Call GetEstrazioneCompleta(k,aNumEst)
aEst(k,0,0) = DataEstrazione(k,,,"/") & "-" & IndiceAnnuale(k)
For r = 1 To 11
For e = 1 To 5
aEst(k,r,e) = aNumEst(r,e)
Next
Next
Next
AlimentaMatriceEst = nTot > 0
End Function
Function GetFileCfgArchivio(sDirArc,nIdEstrIni,nClasse,nQArc)
GetFileCfgArchivio = sDirArc & "CFG_" & nIdEstrIni & "_" & nClasse & "_" & nQArc & ".dat"
End Function
Function GetFileArchivioVirt(sDirArc,nIdEstrIni,nClasse,nQArc,nIdArc)
GetFileArchivioVirt = sDirArc & "BDV" & FormattaStringa(nIdArc,"00000") & "_" & nClasse & "_" & nIdEstrIni & "_" & nQArc & ".dat"
End Function
Function GetRitardoMaxEstrattoArchivio(nRetNum,nRetRuota,nEstrInizio)
Dim n,r,nRitMax,nMax
ReDim aN(1)
ReDim aR(1)
nRetNum = 0
nRetRuota = 0
For r = 1 To 10
aR(1) = r
If r <> 11 Then
For n = 1 To 90
aN(1) = n
' usare la funzione turbo solo dalla versione 1.5.73
'Call StatisticaFormazioneTurbo(aN,aR,1,0,nRitMax,0,0,nEstrInizio,EstrazioniArchivio)
Call StatisticaFormazione(aN,aR,1,0,nRitMax,0,0,nEstrInizio,EstrazioniArchivio)
If nRitMax > nMax Then
nMax = nRitMax
nRetNum = n
nRetRuota = r
End If
Next
End If
Next
GetRitardoMaxEstrattoArchivio = nMax
End Function
Sub GetRangeMinMaxRitardoMax(PercVariazione,nEstrIni,nRetMin,nRetMax)
Dim nRitMax
Dim nValue , nRetNum ,nRetRuota
nRitMax = GetRitardoMaxEstrattoArchivio( nRetNum,nRetRuota,nEstrIni)
nValue = ProporzioneX(PercVariazione,100,nRitMax)
nRetMin = Int (nRitMax - nValue)
nRetMax = Int (nRitMax + nValue)
Call Scrivi ("Ritardo massimo su archivio reale estrazione inizio " & nEstrIni )
Call Scrivi ("Sono accettati gli archivi che si discostano del " & PercVariazione & "% rispetto al ritardo sull'archivio reale")
Call Scrivi ("Ritardo massimo Min " & nRetMin )
Call Scrivi ("Ritardo massimo Max " & nRetMax )
Call Scrivi
ReDim av(3)
av(1) = "Numero"
av(2) = "Ruota"
av(3) = "Ritardo max"
Call InitTabella(av,vbYellow)
av(1) = nRetNum
av(2) = NomeRuota(nRetRuota)
av(3) = nRitMax
Call AddRigaTabella(av)
Call CreaTabella
End Sub
Sub LeggiChiaviDaFile(sFileChiavi,aKey)
Dim k
' legge le chiavi per la creazione degli archivi virtuali
' potrebbe pure non leggere le chiavi se il file non esiste
For k = 1 To UBound(aKey)
aKey(k) = ""
Next
If FileEsistente(sFileChiavi) Then
ReDim aRighe(0)
Call LeggiRigheFileDiTesto(sFileChiavi,aRighe)
For k = 0 To UBound(aRighe)
aKey(k + 1) = aRighe(k)
Next
End If
End Sub
Sub MischiaColonna(aCol)
Dim nUpper
Dim nFatti
Dim nPos,nPosOrig
nUpper = UBound(aCol)
ReDim aB(nUpper)
ReDim aNewCol(nUpper)
Do While nFatti < nUpper
nPos = NumeroCasuale(1,nUpper)
Do While aB(nPos)
nPos = NumeroCasuale(1,nUpper)
Loop
aB(nPos) = True
nPosOrig = nPosOrig + 1
aNewCol(nPosOrig) = aCol(nPos)
nFatti = nFatti + 1
Loop
For nPos = 1 To nUpper
aCol(nPos) = aNewCol(nPos)
Next
End Sub
Sub CreaArchiviVirtuali(nQArchivi,nClasseKey,nEstrIni,aEstrArcReale,nQEstrAR,sDirArchivi,nRitMaxMin,nRitMaxMax)
Dim sFileArc
Dim k,r,e
Dim nQEstrInArcV
Dim idEstrAR,idEstrAV
Dim nPosKey
Dim nn
Dim nSalv
Dim nArcCreati
Dim bCalcRitMax
Dim nTmpNumArc
Dim nRitMax
Dim sTmpCol
Dim coll
Dim sFileChiavi
Set coll = GetNewCollection
sFileChiavi = GetFileCfgArchivio(sDirArchivi,nEstrIni,nClasseKey,nQArchivi)
ReDim aKey(nQArchivi)
Call LeggiChiaviDaFile(sFileChiavi,aKey)
' aggiorna o crea se non esistono gli archivi virtuali
nArcCreati = 0
Do While nArcCreati < nQArchivi
nSalv = 0
nTmpNumArc = nArcCreati + 1
If aKey(nTmpNumArc) = "" Then
ReDim aCol(0)
Call GetColonnaCasuale(nClasseKey,aCol)
Call MischiaColonna(aCol)
sTmpCol = StringaNumeri(aCol)
Do While AddItemColl(coll,sTmpCol,"k" & sTmpCol) = False
Call GetColonnaCasuale(nClasseKey,aCol)
Call MischiaColonna(aCol)
sTmpCol = StringaNumeri(aCol)
Loop
aKey(nTmpNumArc) = sTmpCol
bCalcRitMax = True
Else
bCalcRitMax = False
End If
ReDim aNumKey(0)
Call SplitByChar("." & aKey(nTmpNumArc),".",aNumKey)
sFileArc = GetFileArchivioVirt(sDirArchivi,nEstrIni,nClasseKey,nQArchivi,nTmpNumArc)
Call Messaggio("Archivio numero " & nTmpNumArc)
If FileEsistente(sFileArc) Then
If ApriFileBaseDati(sFileArc) Then
nQEstrInArcV = QuantitaEstrazioniInFile(sFileArc)
Else
nQEstrInArcV = 0
End If
Else
nQEstrInArcV = 0
End If
idEstrAV = nQEstrInArcV
' cicla dalla prima estrazione da aggiungere fino a quelle disponibili nell'archivio reale
For idEstrAR =((nEstrIni - 1) + nQEstrInArcV) + 1 To nQEstrAR
idEstrAV = idEstrAV + 1
nPosKey =(idEstrAV Mod nClasseKey) + 1
nn = Int(aNumKey(nPosKey))
ReDim aEstrV(11,5)
For r = 1 To 11
For e = 1 To 5
aEstrV(r,e) = Fuori90(Int(aEstrArcReale(idEstrAR,r,e)) + nn)
Next
Next
ReDim aTmp(0)
Call SplitByChar(aEstrArcReale(idEstrAR,0,0),"-",aTmp)
If SalvaEstrazione(aEstrV,aTmp(0),aTmp(1),sFileArc) Then
nSalv = nSalv + 1
Call Messaggio(nSalv)
End If
Next
Call AvanzamentoElab(1,nQArchivi,nTmpNumArc)
If ScriptInterrotto Then Exit Do
If bCalcRitMax Then
If ApriFileBaseDati(sFileArc) Then
Call Messaggio("Calcolo ritardo massimi per estratto au aexhivio numero " & nTmpNumArc)
nRitMax = GetRitardoMaxEstrattoArchivio(0,0,1)
If nRitMax >= nRitMaxMin And nRitMax <= nRitMaxMax Then
nArcCreati = nArcCreati + 1
Else
Call EliminaFile(sFileArc)
aKey(nTmpNumArc) = ""
End If
End If
Else
nArcCreati = nArcCreati + 1
End If
Loop
Set coll = Nothing
If ScriptInterrotto = False Then
Call EliminaFile(sFileChiavi)
For k = 1 To UBound(aKey)
Call ScriviFile(sFileChiavi,aKey(k),False)
Next
Call CloseAllFileHandle
End If
End Sub
Sub ScriviRitMaxPerArchivio(nClasseChiave,nQArchivi,sDirArcVirt,nEstrIni)
Dim k
Dim Inizio,Fine
Dim sFileArc
Dim nRetRitMax,nRetNum,nRetRuota
ReDim av(4)
av(1) = "Numero"
av(2) = "Ruota"
av(3) = "Ritardo max"
av(4) = "Archivio num"
Call InitTabella(av,vbYellow)
For k = 1 To nQArchivi
sFileArc = GetFileArchivioVirt(sDirArcVirt,nEstrIni,nClasseChiave,nQArchivi,k)
Call Messaggio("Calcolo ritardi massimi per estratto su archivi ")
If ApriFileBaseDati(sFileArc) Then
nRetRitMax = GetRitardoMaxEstrattoArchivio(nRetNum,nRetRuota,1)
av(1) = nRetNum
av(2) = NomeRuota(nRetRuota)
av(3) = nRetRitMax
av(4) = "Arc_" & FormattaStringa ( k , "0000")
Call AddRigaTabella(av)
End If
Call AvanzamentoElab(1,nQArchivi,k)
If ScriptInterrotto Then Exit For
Next
Call CreaTabella(3)
End Sub
Ultima modifica di un moderatore: