Newsgroup: it.comp.lang.visual-basic
Titolo: Funzione di confronto versioni

Ho creato una funzione per fare il confronto tra 2 versioni in formato
Visual Basic:
Major.Minor.Revision
A me era utile e l'ho creata, spero possa essere utile anche a voi :-)
Non ditemi che esisteva già altrimenti mi sparo un colpo alla nuca ;-)
Ecco il codice sorgente, siete liberi di utilizzarlo come volete.
I (pochi) commenti sono in inglese, perchè sono abituato a programmare in
inglese, lavorando con programmatori esteri.
----------------------------------------------------
Function GetLastestVersion(Version1 As String, Version2 As String) As
Variant
  'Gives back:
  'Version1 newer than Version2  =>  1
  'Version1 older than Version2  =>  2
  'Version1 same  as   Version2  =>  0
  'Error (of any kind)           =>  Null
  Const Major As Integer = 0, Minor As Integer = 1, Revision As Integer = 2,
Full As Integer = 3
  Const Same As Integer = 0, Newer As Integer = 1, Older As Integer = 2
  Dim Version(2, 4) As String
  Dim VersionPrecision(3) As Integer, Dots(2) As Integer
  Dim verCounter As Integer, dotsCounter As Integer
  On Error Resume Next
  Version(1, Full) = Version1
  Version(2, Full) = Version2
  For verCounter = 1 To 2
    'Count the number of dots (".")
    For dotsCounter = 1 To Len(Version(verCounter, Full))
      If Mid(Version(verCounter, Full), dotsCounter, 1) = "." Then
Dots(verCounter) = Dots(verCounter) + 1
    Next dotsCounter
    Select Case Dots(verCounter)
      Case 0
        VersionPrecision(verCounter) = Major
      Case 1
        VersionPrecision(verCounter) = Minor
      Case 2
        VersionPrecision(verCounter) = Revision
      Case Else 'not a valid version
        GetLastestVersion = Null
        Exit Function
    End Select
    Select Case VersionPrecision(verCounter)
      Case Major
        Version(verCounter, Major) = Version(verCounter, Full)
      Case Minor
        Version(verCounter, Major) = CInt(Mid(Version(verCounter, Full), 1,
InStr(Version(verCounter, Full),
".")))
        Version(verCounter, Minor) = CInt(Mid(Version(verCounter, Full),
InStrRev(Version(verCounter, Full),
".") + 1))
      Case Revision
        Version(verCounter, Major) = CInt(Mid(Version(verCounter, Full), 1,
InStr(Version(verCounter, Full),
".")))
        Version(verCounter, Minor) = CInt(Mid(Version(verCounter, Full),
InStr(Version(verCounter, Full),
".") + 1, InStrRev(Version(verCounter, Full), ".") -
InStr(Version(verCounter, Full), ".")))
        Version(verCounter, Revision) = CInt(Mid(Version(verCounter, Full),
InStrRev(Version(verCounter,
Full), ".") + 1))
    End Select
  Next verCounter
  Select Case VersionPrecision(1)
    Case Is < VersionPrecision(2)
      VersionPrecision(3) = VersionPrecision(1)
    Case Is > VersionPrecision(2)
      VersionPrecision(3) = VersionPrecision(2)
    Case Is = VersionPrecision(2)
      VersionPrecision(3) = VersionPrecision(1)
  End Select
  'Compare
  Select Case VersionPrecision(3)
    Case Major
      If Version(1, Full) = Version(2, Full) Then
        GetLastestVersion = Same
      ElseIf Version(1, Full) > Version(2, Full) Then
        GetLastestVersion = Newer
      Else
        GetLastestVersion = Older
      End If
    Case Minor
      If Version(1, Major) = Version(2, Major) Then
        If Version(1, Minor) = Version(2, Minor) Then
          GetLastestVersion = Same
        ElseIf Version(1, Minor) > Version(2, Minor) Then
          GetLastestVersion = Newer
        Else
          GetLastestVersion = Older
        End If
      ElseIf Version(1, Major) > Version(2, Major) Then
        GetLastestVersion = Newer
      Else
        GetLastestVersion = Older
      End If
    Case Revision
      If Version(1, Major) = Version(2, Major) Then
        If Version(1, Minor) = Version(2, Minor) Then
          If Version(1, Revision) = Version(2, Revision) Then
            GetLastestVersion = Same
          ElseIf Version(1, Revision) > Version(2, Revision) Then
            GetLastestVersion = Newer
          Else
            GetLastestVersion = Older
          End If
        ElseIf Version(1, Minor) > Version(2, Minor) Then
          GetLastestVersion = Newer
        Else
          GetLastestVersion = Older
        End If
      ElseIf Version(1, Major) > Version(2, Major) Then
        GetLastestVersion = Newer
      Else
        GetLastestVersion = Older
      End If
  End Select
End Function

Riposto il codice sorgente perchè Outlook (quando mi deciderò a
re-installare Agent?!) ha fatto confusione con gli spazi :-(


 
Mi sembra che questo codice sia inutilmente complicato.
Io avevo già scritto una funzione del genere ed era più semplice.
Eccola:
Public Function ConfrontaVersioni(ByVal V1 As String, ByVal RelData As String, ByVal V2 As String) As Boolean
'Date due versioni, dice qual è maggiore
   Dim VV1() As String
   Dim VV2() As String
   Dim Rel As String
   VV1 = Split(V1, ".")
   VV2 = Split(V2, ".")
   If CLng(VV1(0)) > CLng(VV2(0)) Then
      Rel = ">"
   ElseIf CLng(VV1(0)) < CLng(VV2(0)) Then
      Rel = "<"
   Else
      If CLng(VV1(1)) > CLng(VV2(1)) Then
         Rel = ">"
      ElseIf CLng(VV1(1)) < CLng(VV2(1)) Then
         Rel = "<"
      Else
         If CLng(VV1(2)) > CLng(VV2(2)) Then
            Rel = ">"
         ElseIf CLng(VV1(2)) < CLng(VV2(2)) Then
            Rel = "<"
         Else
            Rel = "="
         End If
      End If
   End If
   ConfrontaVersioni = (InStr(RelData, Rel) > 0)
End Function
Esempio di utilizzo:
If ConfrontaVersioni("2.5.4", ">", "2.6.1") Then _
   Debug.Print "C'è qualcosa che non va!"
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

>    VV1 = Split(V1, ".")
Eh, grazie.
Se sapevo che esisteva una funzione del genere.... non l'avrei fatta da me
:-(
Grazie per la funzione cmq.
Ciao!