Ed eccomi qui esposto al pubblico ludibrio.
Ci ho lavorato fino ad ora, e (credo) di aver risolto la prima parte del problema. Ho creato una tabella con il solo campo Anno (in effetti simulo 1 solo fornitore) e questa è la follia che ho partorito
Dim Rst As DAO.Recordset
Dim AnnoMax As Integer
Dim AnnoMin As Integer
Dim TotAnni As Integer
Dim Limite As Integer
Dim Preventiva As Boolean
Dim Storica As Boolean
Dim Diretta As Boolean
Preventiva = False
Storica = False
Diretta = False
Limite = 1
TotAnni = 0
Set Rst = CurrentDb.OpenRecordset("SELECT * FROM tblAnni ORDER BY [Anno] ASC", dbOpenSnapshot)
Debug.Print "Tot. record: " & Rst.RecordCount
'SE E' IL PRIMO ANNO DI FORNITURA HO 1 SOLO RECORD E ASSEGNO IL VALORE PREVISTO
If Rst.RecordCount = 1 Then
Preventiva = True
GoTo Chiusura
End If
'SE SONO MENO DI 5 ANNI DI FORNITURE MA HO GIA USATO IL FORNITORE ASSEGNO IL VALORE PREVISTO
If (Rst.RecordCount > 1) And (Rst.RecordCount < 5) Then
Storica = True
GoTo Chiusura
End If
'IN TUTTI GLI ALTRI CASI PASSO ALLA VALUTAZIONE
With Rst
.MoveFirst
AnnoMin = !anno
.MoveLast
AnnoMax = !anno
Debug.Print AnnoMax & " - " & AnnoMin
Debug.Print "Sono solo 5 record: " & (.RecordCount = CalcolaAnni(Year(Now), AnnoMin))
Debug.Print "I 5 anni presenti sono consecutivi:" & (CalcolaAnni(AnnoMax, AnnoMin) = CalcolaAnni((Year(Now) - 1), AnnoMin)); ""
'SE IL FORNITORE LO USO DA ALMENO 5 ANNI CONSECUTIVI
If (.RecordCount = CalcolaAnni(Year(Now), AnnoMin)) And (CalcolaAnni(AnnoMax, AnnoMin) = CalcolaAnni((Year(Now) - 1), AnnoMin)) Then 'SE CI SONO SOLO 5 RECORD E GLI ANNI SONO CONSECUTIVI
Diretta = True
GoTo FineCiclo
End If
.MoveLast
AnnoMax = !anno
Do Until Limite = 5 '.EOF
Debug.Print Limite
.MovePrevious
AnnoMin = !anno
Debug.Print "Anno magg:" & AnnoMax & vbTab & vbTab & "Anno min:" & AnnoMin
If (AnnoMax - AnnoMin) > 1 Then 'SE INTERCORRE PIU DI 1 ANNO TRA I 2 ANNI
Storica = True
GoTo FineCiclo
Else
Limite = Limite + 1
End If
Debug.Print "Differenza:" & (AnnoMax - AnnoMin)
Debug.Print "Limite: " & Limite
TotAnni = TotAnni + (AnnoMax - AnnoMin)
AnnoMax = !anno
'.MoveNext
Loop
FineCiclo:
End With
'Debug.Print AnnoMin & " - " & AnnoMax
Chiusura:
Rst.Close
Set Rst = Nothing
Debug.Print "Tot Anni: " & TotAnni + 1
'UNA VOLTA FATTO IL CICLO 5 VOLTE (CIOE GLI ANNI MINIMI PER LA CLASSIFICAZIONE DI DIRETTA)
'SE IL TOTALE E 5 ALLORA GLI ANNI SONO CONSECUTIVI. SE GLI ANNI NON FOSSERO STATI
'CONSECUTIVI SAREBBE USCITO PRIMA DAL LOOP
If TotAnni + 1 = 5 Then Diretta = True
Debug.Print Preventiva & vbTab & vbTab & Storica & vbTab & vbTab & Diretta
Questa la funzione di calcolo richiamata:
Function CalcolaAnni(A As Integer, B As Integer) As Integer
CalcolaAnni = (A - B) + 1
'Debug.Print CalcolaAnni
End Function
Sembra funzionare, facendo variazione nella sequenza degli anni, ottengo i relativi valori
In pratica verifica quanto sono i record selezionati (poi andrò a discriminarli per ID fornitore, ma qui nel test non è necessario, assumo che sia solo 1):
- se è solo 1, vuol dire che è la prima volta che lo uso, quindi la sua classifica è PREVENTIVA, quindi non è necessario proseguire
- se sono meno di 5, la sua classifica è STORICA, quindi anche qui non è necessario proseguire
- se sono più di 5 passo a valutare il recordset
Nella valutazione del recordset, lo scorro in senso inverso, cioè dall'anno più recente a salire.
Ripeto il ciclo per 5 volte (in quanto arbitrariamente ho stabilito che se il fornitore lo uso da 5 anni consecutivo, la sua classifica sarà DIRETTA)
A ogni ciclo faccio la differenza tra l'anno maggiore e quello minore: se >1 vuol dire che gli anni non sono consecutivi, quindi il fornitore non è lo stesso per 5 anni consecutivi, per cui assegno il valore STORICO ed esco dalla valutazione
Se il ciclo va avanti per le 5 volte prefissate, vuol dire che la differenza anno maggiore - anno minore =1 ad ogni ciclo, quindi gli anni sono consecutivi.
ad ogni ciclo incremento la variabile TotAnni: se al termine dei cicli sarà uguale a 5, vuol dire che gli anni sono consecutivi e quindi assegno il valore DIRETTA
Anche se il recordset ha più di 5 record non mi interessa in quanto valuto gli ultimi 5 anni per ottenere la mia classifica.
E' un pò (tanto, molto) articolato, però sembra funzionare.
Mi resta la problematica di come elaborare i record nel caso in cui lo stesso fornitore sia stato usato più volte nel corso dello stesso anno.
Probabilmente potrei raggruppare per anni (e quindi ottenere un elenco record senza anni ripetuti), valutare come sopra, dopodichè creare un altro recordset solo per gli anni con molteplici record (che poi in effetti sarebbe solo l'ultimo anno) e valutare anche questo recordset (in realtà ci sarebbe poco da valutare: se c'è 1 solo record, siamo nel caso di sopra, se sono più record la sua classifica sarà unicamente STORICA, in quanto DIRETTA è legata al numero degli anni)
Opinioni, critiche (ben accette), consigli, correzioni, suggerimenti etc etc?
Andrea
PS
07/08/2024 - sihsandrea ha scritto:
Forse non hai capito niente della valutazione dei fornitori…
Molto probabile, anzi direi sicuro. E in realtà non è che mi interessa, il mio campo professionale sarebbe ben altro che questa roba, ma questo mi hanno detto di fare (con regole e disposizioni alla carlona) e soprattutto non mi interessa combattere contro i mulini a vento della mia amministrazione perchè di idioti nella mia vita ce ne sono pure troppi.
Ma, consentimi, anche tu non hai capito nulla del mio ambiente (e non lo dico con astio): rileggi la descrizione della filosofia che ho dato sopra.