|
Wie können Sie Versionsnummern vergleichen, die als kompletter String vorliegen, beispielsweise "1.001.2.04711" und "1.001.2.047101" und ähnlich? Ein reiner String-Vergleich, etwa mittels der Visual Basic-Funktion StrComp, kann den Vergleich nicht leisten, da ja die einzelnen Abschnitte jeweils miteinander verglichen werden müssen.
Der einfachste Weg führt über die ab Visual Basic 6 zur Verfügung stehende Split-Funktion (einen Ersatz der Split-Funktion für VB 5 und früher finden sie
unter "Teile-Haberschaft"). Damit zerlegen Sie zwei zu vergleichende Versions-Strings in zwei Arrays, deren Elemente Sie Stufe für Stufe miteinander vergleichen können. Sobald sich die beiden Elemente einer Stufe voneinander unterscheiden, ist der Vergleichsvorgang beendet - das im direkten Vergleich jeweils größere Element bestimmt, welche Version insgesamt die höhere ist. Der Vergleich erfolgt hierbei über StrComp. Die möglichen Vergleichsresultate sind identisch mit den Werten einer eigenen Enumeration VersionsCompareConstants, die lediglich zur einfacheren Handhabung der Werte im Kontext des Versionsvergleichs dient.
Ein erster Ansatz zu einer Vergleichs-Funktion könnte somit so aussehen:
Public Enum VersionsCompareConstants
vcFirstVersionLower = -1
vcFirstVersionEquals = 0
vcFirstVersionHigher = 1
End Enum
Public Function VCompare1(Version1 As Variant, Version2 As Variant) _
As VersionsCompareConstants
Dim nVer1 As Variant
Dim nVer2 As Variant
Dim i As Integer
Dim nCompare As Integer
nVer1 = Split(Version1, ".")
nVer2 = Split(Version2, ".")
For i = 0 To UBound(nVer1)
nCompare = StrComp(nVer1(i), nVer2(i))
If nCompare <> vcFirstVersionEquals Then
Exit For
End If
Next 'i
VCompare1 = nCompare
End Function
Dieser erste Ansatz hat den kleinen Nachteil, dass die beiden zu vergleichenden Versions-Strings die gleiche Anzahl an Versions-Stufen enthalten müssen. Ein Vergleich von zwei Versions-Strings wie "1.001" und "1.001.1" würde mit einem Laufzeitfehler quittiert.
In einem zweiten Ansatz vergleichen wir daher zusätzlich zunächst die Obergrenzen der aus den Zerlegungen mit Split resultierenden Arrays. Die niedrigre Obergrenze ergibt die Anzahl der zu vergleichenden Stufen. Dazu gilt die sinnvolle Annahme, dass ein Versions-String in jedem Fall der höhere ist, wenn er mehr Stufen enthält, so lange die auf beiden Seiten gleichen Stufen jeweils gleich sind. Beim Vergleich der Obergrenzen wird daher gleich in der Variablen nDifferentLevels festgehalten, welche der beiden Versionen die höhere sein soll, falls der nachfolgende Vergleich der gemeinsamen Versions-Stufen unentschieden ausgehen sollte.
Public Function VCompare2(Version1 As Variant, Version2 As Variant) _
As VersionsCompareConstants
Dim nVer1 As Variant
Dim nVer2 As Variant
Dim i As Integer
Dim nUBound As Integer
Dim nCompare As Integer
Dim nDifferentLevels As Integer
nVer1 = Split(Version1, ".")
nVer2 = Split(Version2, ".")
Select Case UBound(nVer1)
Case Is > UBound(nVer2)
nUBound = UBound(nVer2)
nDifferentLevels = vcFirstVersionHigher
Case UBound(nVer2)
nUBound = UBound(nVer2)
Case Is < UBound(nVer2)
nUBound = UBound(nVer1)
nDifferentLevels = vcFirstVersionLower
End Select
For i = 0 To nUBound
nCompare = StrComp(nVer1(i), nVer2(i))
If nCompare <> vcFirstVersionEquals Then
Exit For
End If
Next 'i
If nDifferentLevels Then
If nCompare = vcFirstVersionEquals Then
nCompare = nDifferentLevels
End If
End If
VCompare2 = nCompare
End Function
Im Sinne der Aufgabenstellung funktioniert dieser zweite Ansatz tadellos. Für den Fall jedoch, dass vielleicht eine der beiden Versions-Information (oder sogar beide) nicht in der Form eines Strings vorliegen sollte, sondern als einzelne Werte für jede Stufe oder bereits als Array, erhöhen wir den Komfort der Funktion ein wenig. In der folgenden endgültigen Version können sowohl Strings als auch Arrays übergeben werden, wobei Einzelwerte zunächst mittels der Array-Funktion zu einem Array zusammengefasst werden müssen. Voraussetzung ist allerdings, dass bereits vorhandene Arrays mit der Untergrenze 0 beginnen müssen.
Public Function VersionsCompare(Version1 As Variant, _
Version2 As Variant) As VersionsCompareConstants
Dim nVer1 As Variant
Dim nVer2 As Variant
Dim i As Integer
Dim nUBound As Integer
Dim nCompare As Integer
Dim nDifferentLevels As Integer
If IsArray(Version1) Then
nVer1 = Version1
ElseIf VarType(Version1) = vbString Then
nVer1 = Split(Version1, ".")
Else
Err.Raise 380
End If
If IsArray(Version2) Then
nVer2 = Version2
ElseIf VarType(Version2) = vbString Then
nVer2 = Split(Version2, ".")
Else
Err.Raise 380
End If
Select Case UBound(nVer1)
Case Is > UBound(nVer2)
nUBound = UBound(nVer2)
nDifferentLevels = vcFirstVersionHigher
Case UBound(nVer2)
nUBound = UBound(nVer2)
Case Is < UBound(nVer2)
nUBound = UBound(nVer1)
nDifferentLevels = vcFirstVersionLower
End Select
For i = 0 To nUBound
nCompare = StrComp(nVer1(i), nVer2(i))
If nCompare <> vcFirstVersionEquals Then
Exit For
End If
Next 'i
If nDifferentLevels Then
If nCompare = vcFirstVersionEquals Then
nCompare = nDifferentLevels
End If
End If
VersionsCompare = nCompare
End Function
|