Option Explicit
Class clsEstrazione
Dim aNum(5)
Dim mRuota
Dim mRitardo
Sub SetNum(iPos, Num)
aNum(iPos) = Num
End Sub
Public Property Let Ruota(v)
mRuota = v
End Property
Public Property Let Ritardo(v)
mRitardo = v
End Property
Public Property Get Ritardo()
Ritardo = mRitardo
End Property
Sub NormalizzaArrayNumPerFrq(aNumPerFrq)
Dim k , j
For k = 1 To 5
If Int(aNumPerFrq(k, 1)) = 0 Then
For j = k + 1 To 5
If Int(aNumPerFrq(j, 1)) <> 0 Then
aNumPerFrq(k, 1) = aNumPerFrq(j, 1)
aNumPerFrq(k, 2) = aNumPerFrq(j, 2)
aNumPerFrq(j, 1) = 0
aNumPerFrq(j, 2) = 0
Exit For
End If
Next
End If
Next
End Sub
Sub CreaStatEstratti(Inizio, Fine)
Dim nFrq
ReDim aRuote(1)
Dim k, j, i, iPos
Const nRitDaPrendere = 10
aRuote(1) = mRuota
' frequenze
ReDim aN(1)
ReDim aNumPerFrq(5, 2)
i = 0
For k = 1 To 5
If Int(aNum(k)) > 0 Then
i = i + 1
aN(1) = aNum(k)
Call StatisticaFormazione(aN, aRuote, 1, 0, 0, 0, nFrq, Inizio, Fine)
aNumPerFrq(i, 1) = aN(1)
aNumPerFrq(i, 2) = nFrq
End If
Next
Call OrdinaMatrice(aNumPerFrq, -1, 2)
Call NormalizzaArrayNumPerFrq(aNumPerFrq)
'========================================================00
' elenco ritardi
ReDim aValori(nRitDaPrendere, 16)
i = 0
iPos = 2
For k = 1 To 5
If Int(aNumPerFrq(k, 1)) > 0 Then
aN(1) = aNumPerFrq(k, 1)
ReDim aRetRitardi(0)
ReDim aReIdEstr(0)
Call ElencoRitardi(aN, aRuote, 1, 1, Fine, aRetRitardi, aReIdEstr)
For j = 1 To nRitDaPrendere
aValori(j, 1) = j - 1
i = UBound(aRetRitardi) - (j - 1)
If i > 0 Then
aValori(j, iPos) = aRetRitardi(i)
aValori(j, iPos + 1) = GetDiffColpi(aRetRitardi, i)
aValori(j, iPos + 2) = GetPosSortita(aN(1), aReIdEstr(i) - aRetRitardi(i))
End If
Next
iPos = iPos + 3
End If
Next
Call CreaTabStatistica(aNumPerFrq, aValori, Fine)
Call GeneraGrafico(Fine)
End Sub
Function GetPosSortita(N, idEstr)
Dim k
For k = 1 To 5
If Estratto(idEstr, mRuota, k) = N Then
GetPosSortita = k
Exit For
End If
Next
End Function
Function GetDiffColpi(aRitardi, j)
Dim r
If j > 1 Then
GetDiffColpi = aRitardi(j) - aRitardi(j - 1)
Else
GetDiffColpi = "-"
End If
End Function
Sub CreaTabStatistica(aN, aValori, Fine)
Dim k, j, i, p
Dim nRitMin, nRitMax
ReDim aV(16)
ReDim aColSpan(16)
ReDim aColori(16)
ReDim aColoreFont(16)
Dim nColor
For k = 1 To 16
aColoreFont(k) = vbBlack
Next
For k = 4 To 16 Step 3
aColoreFont(k) = vbRed
Next
Call Scrivi(FormatSpace(NomeRuota(mRuota), 112) & vbCrLf, True, , vbCyan)
Call Scrivi("Formazione : " & StringaNumeriFormazione)
Call Scrivi("Ritardo : " & mRitardo)
Call Scrivi
aColori(1) = vbYellow
For k = 2 To 14 Step 3
If k Mod 2 = 0 Then
nColor = vbWhite
Else
nColor = RGB(255, 255, 192)
End If
For j = k To (k + 2)
aColori(j) = nColor
Next
Next
' titolo prima riga contiene la ruota
aV(1) = NomeRuota(mRuota)
aColSpan(1) = 16
For k = 2 To 16
aColSpan(k) = 0
Next
Call InitTabella(aV, RGB(128, 128, 255), , 6, vbWhite, "Courier New", aColSpan)
' Seconda riga Intestazione colonne
aV(1) = ""
aV(2) = "Num": aV(4) = "Frq"
aV(5) = "Num": aV(7) = "Frq"
aV(8) = "Num": aV(10) = "Frq"
aV(11) = "Num": aV(13) = "Frq"
aV(14) = "Num": aV(16) = "Frq"
aColSpan(1) = 1
For k = 2 To 14 Step 3
aColSpan(k) = 2
aColSpan(k + 1) = 0
aColSpan(k + 2) = 1
Next
aColori(1) = vbBlack
Call AddRigaTabella(aV, aColori, , , , , aColSpan)
' terza riga frequenza dei numeri
aV(1) = ""
aColSpan(1) = 1
i = 0
For k = 2 To 14 Step 3
i = i + 1
If Int( aN(i, 1))> 0 Then
aV(k) = aN(i, 1)
aV(k + 1) = ""
aV(k + 2) = aN(i, 2)
Else
aV(k) = ""
aV(k + 1) = ""
aV(k + 2) = ""
End If
Next
Call AddRigaTabella(aV, aColori, , 4, aColoreFont, , aColSpan)
' quarta riga intestazione valori di dettaglio
aV(1) = "IdRitardo"
i = 0
For k = 2 To 14 Step 3
i = i + 1
aV(k) = "Ritardo"
aV(k + 1) = "DiffColpi"
aV(k + 2) = "Posizione"
Next
Call AddRigaTabella(aV, vbYellow)
' righe dei valori
aColori(1) = vbYellow
For k = 1 To UBound(aValori)
For j = 1 To 16
aV(j) = aValori(k, j)
Next
Call AddRigaTabella(aV, aColori)
Next
' righe di riepilogo
For k = 1 To UBound(aColSpan)
aColSpan(k) = 0
Next
aColSpan(1) = 16
ReDim aV(16)
' prima riga titolo
aV(1) = "RIEPILOGO RITARDI"
Call AddRigaTabella(aV, vbYellow, , , , , aColSpan)
' seconda riga intestazione col
aV(1) = "Fascia Rit."
i = 0
ReDim aColori(16)
aColori(1) = vbYellow
For k = 1 To 5
i = ((k - 1) * 3) + 2
aV(i) = "Da Rit"
aV(i + 1) = "A Rit"
aV(i + 2) = "Quantità"
aColori(i) = RGB(223, 223, 223)
aColori(i + 1) = RGB(223, 223, 223)
aColori(i + 2) = vbWhite
Next
Call AddRigaTabella(aV, vbYellow)
' righe dei valori
nRitMin = -1
ReDim aV(16)
Do While nRitMax < 220
nRitMin = nRitMin + 1
nRitMax = (nRitMin - 1) + 18
aV(1) = aV(1) + 1
For k = 1 To 5
i = ((k - 1) * 3) + 2
aV(i) = nRitMin
aV(i + 1) = nRitMax
aV(i + 2) = CalcolaPresNellaFasciaRit(nRitMin, nRitMax, i, aValori)
Next
nRitMin = nRitMax
Call AddRigaTabella(aV, aColori)
Loop
' prima riga titolo
aV(1) = "RIEPILOGO POSIZIONI"
Call AddRigaTabella(aV, vbYellow, , , , , aColSpan)
' seconda riga intestazione col
ReDim aColSpan(16)
aV(1) = "Posizione"
i = 0
aColSpan(1) = 1
For k = 1 To 5
i = ((k - 1) * 3) + 2
aColSpan(i) = 3
aV(i) = "Presenze"
aV(i + 1) = ""
aV(i + 2) = ""
Next
Call AddRigaTabella(aV, vbYellow, , , , , aColSpan)
' righe dei valori
ReDim aColori(16)
aColori(1) = vbYellow
For p = 1 To 5
aV(1) = p & "°"
For k = 1 To 5
i = ((k - 1) * 3) + 2
aV(i) = CalcolaPresNellaPos(p, i + 2, aValori)
aV(i + 1) = ""
aV(i + 2) = ""
aColori(i) = vbWhite
aColori(i + 1) = vbWhite
aColori(i + 2) = vbWhite
Next
Call AddRigaTabella(aV, aColori, , , , , aColSpan)
Next
' prossima uscita
' prima riga titolo
ReDim aColSpan(16)
aColSpan(1) = 16
aV(1) = "USCITE SUCCESSIVE ALL'ULTIMA ESTRAZIONE ANALIZZATA "
Call AddRigaTabella(aV, vbYellow, , , , , aColSpan)
' seconda riga
aColSpan(1) = 1
ReDim aV(16)
aV(1) = "Uscita"
For k = 1 To 5
i = ((k - 1) * 3) + 2
aColSpan(i) = 2
aColSpan(i + 1) = 0
aColSpan(i + 2) = 1
aV(i) = "Colpi"
aV(i + 1) = ""
aV(i + 2) = "Pos"
Next
Call AddRigaTabella(aV, vbYellow, , , , , aColSpan)
' prossime 3 uscite
ReDim aV(16)
ReDim aProssimeUscite(5, 3, 1)
Call AlimentaArrayProssimeUscite(aN, aProssimeUscite, Fine, 3)
For p = 1 To 3
aV(1) = p
For k = 1 To 5
i = ((k - 1) * 3) + 2
aV(i) = aProssimeUscite(k, p, 0)
aV(i + 1) = ""
aV(i + 2) = aProssimeUscite(k, p, 1)
Next
Call AddRigaTabella(aV, aColori, , , , , aColSpan)
Next
Call CreaTabella
End Sub
Sub AlimentaArrayProssimeUscite(aN, aProssimeUscite, Fine, nQuscite)
Dim k, p, e, idEstr, nUscite, nColpi
Dim nEstrTot
nEstrTot = EstrazioniArchivio
For k = 1 To 5
nUscite = 0
nColpi = 0
If aN(k, 1) <> 0 Then
For idEstr = Fine + 1 To nEstrTot
nColpi = nColpi + 1
For e = 1 To 5
If Estratto(idEstr, mRuota, e) = aN(k, 1) Then
nUscite = nUscite + 1
aProssimeUscite(k, nUscite, 0) = nColpi
aProssimeUscite(k, nUscite, 1) = e
Exit For
End If
Next
If nUscite = nQuscite Then Exit For
Next
End If
Next
End Sub
Function CalcolaPresNellaPos(pos, i, aValori)
Dim k, p
p = 0
For k = 1 To UBound(aValori)
If aValori(k, i) = pos Then
p = p + 1
End If
Next
CalcolaPresNellaPos = p
End Function
Function CalcolaPresNellaFasciaRit(nRitMin, nRitMax, i, aValori)
Dim k, p
p = 0
For k = 1 To UBound(aValori)
If aValori(k, i) >= nRitMin And aValori(k, i) <= nRitMax Then
p = p + 1
End If
Next
CalcolaPresNellaFasciaRit = p
End Function
Function StringaNumeriFormazione()
Dim k, s
For k = 1 To 5
s = s & Iif(aNum(k) <> 0, aNum(k), "..") & " "
Next
StringaNumeriFormazione = "[" & s & "]"
End Function
Sub CalcolaPresenzeNeiCicli(Num, Fine, aPresenze, nQCicli)
Dim k, i
Dim nInizio
ReDim aN(1)
ReDim aRt(1)
Const cLenCiclo = 18
ReDim aPresenzeTmp(nQCicli)
aRt(1) = mRuota
nInizio = Fine + 1
i = 0
Do While nInizio > 1
aN(1) = Num
i = i + 1
nInizio = nInizio - cLenCiclo
If nInizio < 0 Then nInizio = 1
aPresenzeTmp(i) = SerieFreq(nInizio, (nInizio - 1) + cLenCiclo, aN, aRt, 1)
If i = nQCicli Then Exit Do
Loop
ReDim aPresenze(nQCicli)
For k = 1 To i
aPresenze((i + 1) - k) = aPresenzeTmp(k)
Next
End Sub
Sub GeneraGrafico(Fine)
Dim k, j
Const cQCicli = 10
ReDim aColori(5)
aColori(1) = vbBlue
aColori(2) = vbCyan
aColori(3) = vbRed
aColori(4) = vbMagenta
aColori(5) = vbGreen
Call PreparaGrafico("Grafico frequenza per gli ultimi " & cQCicli & " cicli da 18", 0, cQCicli, 0, 10, 1, 1)
For k = 1 To 5
If aNum(k) <> 0 Then
ReDim aPres(0)
Call CalcolaPresenzeNeiCicli(aNum(k), Fine, aPres, cQCicli)
ReDim aV(cQCicli, 2)
For j = 1 To cQCicli
aV(j, 1) = j
aV(j, 2) = aPres(j)
Next
Call DisegnaLineaGrafico(aV, aColori(k), "Numero " & aNum(k))
End If
Next
' scrive grafico nell'output
Call InserisciGrafico
End Sub
End Class
Sub Main
Dim Fine
Dim CollCinquine
Dim nEstrPerCalcFrq
Dim nClasse
Dim nFrzPerRt
nEstrPerCalcFrq = CInt(InputBox("Quantita estrazioni per calcolo frequenza","",104))
Fine = EstrazioneFin
ReDim aTabAnalitico(0)
nClasse = ScegliDaMenu("Classe formazione",5)
nFrzPerRt = ScegliDaMenu("Formazioni da rilevare per ruota",1)
If nClasse > 0 And nFrzPerRt > 0 And nEstrPerCalcFrq > 0 Then
Call ScriviInformazioni(nEstrPerCalcFrq,nClasse,nFrzPerRt,Fine)
Call AlimentaGrigliaEstr(aTabAnalitico,Fine)
Call CreaTabAnalitico(aTabAnalitico)
Call AlimentaCollCinquine(CollCinquine,aTabAnalitico,nFrzPerRt,nClasse)
Call EseguiStatistica(CollCinquine,nEstrPerCalcFrq,Fine)
If MsgBox("Mostrare il tabellone analitico ?",vbQuestion + vbYesNo) = vbYes Then
Call CreaTabellone(aTabAnalitico,Fine)
End If
End If
End Sub
Sub ScriviInformazioni(nEstrPerCalcFrq,nClasse,nFrzPerRt,Fine)
Dim s
s = "La seguente statistica analizza per ogni ruota le " & nFrzPerRt
s = s & " formazioni composte da " & nClasse & " numeri" & vbCrLf
s = s & "dal ritardo piu alto che non si sono ancora sfaldate,"
s = s & " esaminando e fornendo i dati statistici per " & vbCrLf
s = s & "i numeri che le compongono." & vbCrLf
s = s & "Le formazioni vengono mostrate in ordine decrescente di ritardo." & vbCrLf
s = s & "All'interno della tabella statistica i numeri sono disposti ordinati per frequenza decrescente." & vbCrLf
Call Scrivi(String(150,"*"),True)
Call Scrivi(s,True)
Call Scrivi(String(150,"*"),True)
Call Scrivi
s = "Data di rilevamento Tabellone Analitico : " & GetInfoEstrazione(Fine)
Call Scrivi(s,True)
s = "Estrazioni esaminate per calcolo freqenza : " & nEstrPerCalcFrq
Call Scrivi(s,True)
s = "Ricerca formazioni di classe : " & nClasse
Call Scrivi(s,True)
Call Scrivi(String(150,"*"),True)
Call Scrivi
End Sub
Sub CreaTabellone(aTabAnalitico,fine)
Dim k,i,r
ReDim aV(57)
ReDim aColSpan(57)
ReDim aColori(57)
Dim idPrimaRiga,idEstr
Dim nColor
Call Messaggio("Output TabAnalitico in corso ...")
i = 2
aColori(1) = RGB(255,255,192)
aColori(2) = vbYellow
For r = 1 To 11
For k = 1 To 5
i = i + 1
If r Mod 2 = 0 Then
nColor = RGB(255,255,192)
Else
nColor = vbWhite
End If
aColori(i) = nColor
Next
Next
aColSpan(1) = 57
aV(1) = "TABELLONE ANALITICO"
Call InitTabella(aV,vbCyan,,6,,"Courier New",aColSpan)
aV(1) = ""
aV(2) = ""
i = 0
For k = 3 To 56 Step 5
i = i + 1
aV(k) = NomeRuota(Iif(i = 11,12,i))
aColSpan(k) = 5
Next
aColSpan(1) = 2
Call AddRigaTabella(aV,aColori,,,,"Courier New",aColSpan)
aV(1) = " Data "
aV(2) = " Rit "
i = 2
For r = 1 To 11
For k = 1 To 5
i = i + 1
aV(i) = Format2(k) & "°"
Next
Next
Call AddRigaTabella(aV,aColori,,,,"Courier New")
idPrimaRiga = GetIdPrimaRigaTabAna(aTabAnalitico)
For k = idPrimaRiga To UBound(aTabAnalitico)
idEstr = fine -((UBound(aTabAnalitico) + 1) - k - 1)
aV(1) = " " & DataEstrazione(idEstr) & " "
aV(2) = UBound(aTabAnalitico) - k
For i = 1 To 55
If aTabAnalitico(k,i) <> 0 Then
aV(i + 2) = Format2(aTabAnalitico(k,i))
Else
aV(i + 2) = " "
End If
Next
Call AddRigaTabella(aV,aColori,,,,"Courier New")
Next
Call CreaTabella
End Sub
Function GetIdPrimaRigaTabAna(aTabAnalitico)
Dim k,e
For k = 1 To UBound(aTabAnalitico)
For e = 1 To 55
If aTabAnalitico(k,e) <> 0 Then
GetIdPrimaRigaTabAna = k
Exit Function
End If
Next
Next
End Function
Function ScegliDaMenu(sTitolo,idSelDef)
Dim k
ReDim aV(5)
For k = 1 To 5
aV(k) = k
Next
k = ScegliOpzioneMenu(aV,idSelDef,sTitolo)
If k > 0 Then
ScegliDaMenu = aV(k)
End If
End Function
Sub EseguiStatistica(CollCinquine,nEstrPerCalcFrq,Fine)
Dim clsE
Call OrdinaItemCollection(CollCinquine,"Ritardo")
For Each clsE In CollCinquine
Call clsE.CreaStatEstratti((Fine + 1) - nEstrPerCalcFrq,Fine)
Next
End Sub
Sub AlimentaCollCinquine(CollCinquine,aTabAnalitico,QCinquinePerRuota,nClasse)
Dim r,k,nPosIn,nPosFi
Dim b,e,i
Dim nTrovate
Dim clsE
Dim nPresenti
Set CollCinquine = GetNewCollection
For r = 1 To 11
Call Messaggio("Ricerca cinquine su " & NomeRuota(Iif(r = 11,12,r)))
nPosIn =((r - 1)*5) + 1
nPosFi =(nPosIn - 1) + 5
nTrovate = 0
For k = 1 To UBound(aTabAnalitico)
nPresenti = 0
For e = nPosIn To nPosFi
If aTabAnalitico(k,e) <> 0 Then
nPresenti = nPresenti + 1
End If
Next
If nPresenti = nClasse Then
i = 0
Set clsE = New clsEstrazione
clsE.ruota = Iif(r = 11,12,r)
clsE.ritardo = UBound(aTabAnalitico) - k
For e = nPosIn To nPosFi
i = i + 1
Call clsE.SetNum(i,aTabAnalitico(k,e))
Next
CollCinquine.Add clsE
nTrovate = nTrovate + 1
If nTrovate = QCinquinePerRuota Then Exit For
End If
Next
Call AvanzamentoElab(1,11,r)
Next
End Sub
Function AlimentaGrigliaEstr(aTabAnalitico,Fine)
Dim idEstr
Dim Inizio
Dim nTot
Dim iPos,iEst,r,e
Call Messaggio("Lettura estrazioni in corso")
Inizio = Fine - 220
If Inizio < 0 Then Inizio = 0
nTot =(Fine + 1) - Inizio
ReDim aTabAnalitico(nTot,55)
For idEstr = Inizio To Fine
iPos = 0
iEst = iEst + 1
For r = 1 To 12
If r <> 11 Then
For e = 1 To 5
iPos = iPos + 1
aTabAnalitico(iEst,iPos) = Estratto(idEstr,r,e)
Next
End If
Next
Call AvanzamentoElab(Inizio,Fine,idEstr)
Next
End Function
Sub CreaTabAnalitico(aTabAnalitico)
Dim k,j,e,ee,r
Dim iPos,nPosIn,nPosFi
For r = 1 To 11
Call Messaggio("Creo analitico per " & NomeRuota(Iif(r = 11,12,r)))
nPosIn =((r - 1)*5) + 1
nPosFi =(nPosIn - 1) + 5
For k = 2 To UBound(aTabAnalitico)
For j = k - 1 To 1 Step - 1
For e = nPosIn To nPosFi
For ee = nPosIn To nPosFi
If aTabAnalitico(j,ee) = aTabAnalitico(k,e) Then
aTabAnalitico(j,ee) = 0
Exit For
End If
Next
Next
Next
Next
Call AvanzamentoElab(1,11,r)
Next
End Sub