PDA

Vollständige Version anzeigen : Versionen vergleichen, Zahlen als Text


stuz1
22.10.2011, 23:12
Hallo zusammen,

ich hänge mal wieder an einer Sache, und komme auf keinen grünen Zweig:

Ich möchte die Versionsnummern von FE und Backend vergleichen,

wenn FE < BE -----> Exit.... soweit klar....

Jetzt ist folgender Fall aufgetreten:

Versionsnummer FE: 1.1.9
Versionsnummer BE: 1.1.10

So, jetzt sollte kräftig gemeckert werden, da FE mindestens 1.1.10 sein muss, passiert aber nichts da für die Engine die 1.1.10 kleiner als 1.1.9 ist.

Wie kann ich das lösen? Habe schon NZ() versucht, klappt auch nicht.

Danke für die Unterstützung

Gruß

Stefan

ebs17
22.10.2011, 23:49
Wie kann ich das lösen?
Du müsstest Zahlen vergleichen, nicht Texte:
?CLng(Split("1.1.10", ".")(2)) > CLng(Split("1.1.9", ".")(2))

Marsu65
23.10.2011, 00:27
Da Eberhards Vorschlag nur die letzte Stelle berücksichtigt, gibt´s von mir noch 'ne kleine Funktion als Nachschlag ;)
Function VersChange(ByVal Vers1 As String, ByVal Vers2 As String) As Boolean
Dim var1 As Variant, var2 As Variant, i As Integer
var1 = Split(Vers1, ".")
var2 = Split(Vers2, ".")
For i = 0 To 2
If Val(var2(i)) > Val(var1(i)) Then
VersChange = True
Exit For
End If
Next i
End Function

kama
23.10.2011, 13:39
So, jetzt sollte kräftig gemeckert werden, da FE mindestens 1.1.10 sein muss......
Warum ist das bei dir so? Ein BE sollte doch nur Daten enthalten. Änderungen sind da doch eher selten. Es muss auch kein Zusammenhang mit der Version des FE bestehen. in einerm größerem Umfeld werden Stammdaten als BE bereitgestellt auch immer geändert.

stuz1
24.10.2011, 06:33
Hallo und vielen Dank für die schnellen und guten Antworten.

@Kama: Ich habe es etwas einfacher erklärt da ich ja nur aufzeigen wollte was ich erreichen möchte, und nicht mit ewig langen Vorbemerkungen Eure Zeit stehlen.

Tatsächlich ist es so dass ich eine Anwendung habe welche 1:1 in vielen produktiven Umgebungen bei meinen Kunden zum Einsatz kommen soll. Also immer das gleiche FE und das gleiche BE. Von Zeit zur Zeit merkt allerdings der Entwickler (also ich) dass für weitere Funktionen Änderungen am BE nötig werden. Neue Felder, andere Eigenschaften bestehender Felder oder auch ganze Tabellen neu. Dafür habe ich eine extra Update-Routine geschrieben welche dann (meist per DAO) die Änderungen am BE vornimmt. Nun Ist im BE eine Tabelle enthalten welche die aktuelle Version des BE enthält, und gleichzeitig die Mindestversion des FE. Logisch, ältere FE kennen die neuen Änderungen am BE ja nicht. Und mit meiner bisherigen Lösung der Versionskontrolle hat es ja auch immer bestens funktioniert, solange eben nicht Version .10 zum Einsatz kam. Im übrigen werden auch die Frontends automatisch verteilt, aber es kommt eben immer mal wieder vor dass ein Enduser das aktuelle FE aus welchem Grund auch immer nicht erhalten hat, und der wird dann freundlich darauf hingewiesen dass es eine neuere Version gibt.

Im übrigen werde ich nun ein weilchen Sinnieren ob ich für die Tatsächliche Versionskontrolle nicht doch lieber eine Echte Zahl verwende, und die Version nur als "Show" zur Anzeige beim Kunden. Ist vermutlich besser.

Auf jeden Fall nochmals herzlichen Dank!

Liebe Grüße

Stefan

Nachtrag:
@Marsu und Eberhardt:
Ich glaube ich bin noch nicht richtig Wach... :) Ihr habt es ja perfekt gelöst.... oh jeh... Ich werde Eure Lösunge nehmen, die passen ja perfekt.... Danke!

stuz1
24.10.2011, 21:45
Hallo Marsu,

hmmm... ich habe deinen Code eingesetzt, und mal ziemlich damit herumgespielt... Der String wird sauber zerlegt und ausgewertet, aber nicht immer, ich komme nicht dahinter warum?

Der verwendete Code:


Function VersChange(ByVal Vers1 As String, ByVal Vers2 As String) As Boolean
Dim var1 As Variant, var2 As Variant, i As Integer
var1 = Split(Vers1, ".")
var2 = Split(Vers2, ".")
For i = 0 To 2
If CLng(var2(i)) > CLng(var1(i)) Then
VersChange = True
Exit For
End If
Next i
End Function


Im Direktfenster ausprobiert:

?VersChange ("500.100.4", "100.100.31")
Wahr


Das sollte ja "Falsch ergeben"?

OK, ist ein sehr abstraktes Beispiel, aber was wird da nicht sauber verglichen?

ich habe es auch mit Clng und CDbl versucht, keine Änderungen. Das ist doch irgendwie seltsam? Kann es sein dass die Einzelnen Zahlenblöcke im Array nicht immer in der selben Reihenfolge abgearbeitet werden?

Hier noch ein paar Beispiele:


?VersChange ("1.10.4", "1.9.11")
Wahr

?VersChange ("1.10.4", "1.10.1")
Falsch

?VersChange ("1.10.4", "1.10.5")
Wahr


Eigentlich müsste ja von vorne gesehen einfach jeder Zahlenblock für sich verglichen werden, und das macht doch eigentlich auch diese Funktion? Aber irgendwas stimmt da nicht? Ich glaube das geht hier nach dem Motto "First in - Last out". Sollte aber nach "First in - First out" gehen. Oder sehe ich da was falsch?


Gruß

Arne Dieckmann
24.10.2011, 22:02
Verwende am besten sprechende Variablenbezeichner:

Function VersChange(ByVal IstVersion As String, ByVal VergleichsVersion As String) As Boolean

Dim vIst As Variant, vVgl As Variant, i As Integer

vIst = Split(IstVersion, ".")
vVgl = Split(VergleichsVersion, ".")

For i = 0 To 2
If CLng(vIst(i)) > CLng(vVgl(i)) Then
VersChange = True
Exit For
End If
Next i

End Function


Mit der Anpassung und dem Umdrehen bei dem > kommt bei allen "Wahr" heraus, nur bei
?VersChange ("1.10.4", "1.10.5")
erhältst du "Falsch". Das sollte dann doch passen (wenn man sich die Bezeichner anschaut).


nachtrag: es gibt tatsächlich noch einen Bug in der Funktion...
?VersChange ("0.10.4", "1.10.1")
darf z.B. nicht wahr ergeben - tut es aber (wenn man den Ablauf im Kopf durchgeht, ist das auch logisch ...).

ebs17
24.10.2011, 22:04
Die Schleife hat Marsu mit etwas zu heißer Nadel gestrickt: Nicht größer heißt nicht automatisch gleich (womit die Schleife weiterlaufen kann).
Eine Gegenprüfung sollte helfen:
For i = 0 To 2
If CLng(var2(i)) > CLng(var1(i)) Then
VersChange = True
Exit For
ElseIf CLng(var2(i)) < CLng(var1(i)) Then
VersChange = False ' Zeile verzichtbar durch Vorbelegung der Variablen mit False
Exit For
End If
Next i

stuz1
25.10.2011, 18:40
Hallo @all,

nun, das war ja jetzt doch ein bissle eine Frage zum nachdenken. Lächel.... Allen die mitgeholfen haben das Problem zu lösen ein ganz herzliches Dankeschön. Letztendlich war es dann Eberhard der die endgültige Lösung zu Tage gefördert hat. Mit dieser Schleife geht es wie gewünscht. Ich habe keine Fehler mehr feststellen können, macht ja auch Sinn das auf diese Weise zu lösen.

Liebe Grüße und bis zur nächsten Denkaufgabe.... (Ihr seid Klasse!)

Stefan

Arne Dieckmann
25.10.2011, 18:46
Da das Thema gelöst ist, doch noch einmal etwas off-topic:

Braucht man wirklich solch detaillierte Versionsangaben? Oder sieht's einfach nur schicker aus, als eine ordinäre Dezimalzahl (bei mir gibt's nur Versionen wie 2.01, 2.02 etc. - damit ist ein Versionsvergleich wirklich nichts Kompliziertes). Wie handhabt der Rest das denn so mit Versionsangaben?

ebs17
25.10.2011, 19:22
Ich nehme das umgedrehte Datum (das sieht auch wichtig aus).
Überdies dient dies nur zur Information. Frontends sind mit einem Ablauf zu einem festgelegten Termin versehen (in Abstimmung mit möglichen Strukturänderungen im Backend / Rhythmus i.d.R. jährlich). Somit ergibt sich für den Anwender einfach ein Aktualisierungszwang, ab Stichtag ist nur die aktuelle Version lauffähig. Das Problem, dass einige Anwender sofort aktualisieren und andere nach Monaten noch nicht, ist damit erledigt.
Zwischendurchaktualisierungen betreffen nur das Frontend und werden vom Anwender angefordert und dann umgehend auch verwendet.
Das Ganze betrifft lokal verteilte Anwendungen.

Maxel
25.10.2011, 20:04
Ich schließe mich Arnes Meinung an, dass man i. d. R. mit Haupt- und Nebenversionsnummer hinkommt und im normalen Softwaregeschäft auf detailliertere (http://de.wikipedia.org/wiki/Versionsnummer) verzichten kann.

stuz1
26.10.2011, 08:33
Guten morgen zusammen,
da ich ich das Thema angezettelt habe gebe ich meine Meinung auch noch zum besten: Tatsächlich bräuchte vor allem ich keine so detaillierte Versionsnummern, aber ich fand es einfach chic.... naja.... Ich erhöhe die hinterste Zahl für Kosmetische Reparturen und BUG-Fixes, die mittlere für Optische Korrekturen der Formulare und Ergänzung einfacher Funktionen und die erste Stelle für "überragende" Neuerungen... was natürlich wiederum Definitionssache ist. Die hinterste Zahl erhöhe ich relativ oft da ich versuche alle Änderungen so gut wie möglich in einer Tabelle zu dokumentieren und wähle hier relativ kleine Schritte. Naja.... Jeder tut was er kann so gut er es kann.
LG, Stefan

zra8886
26.10.2011, 09:01
Hallo Arne
.... Wie handhabt der Rest das denn so mit Versionsangaben?

auch, wenn schon dicht ist:

20111026Dateiname
oder
20111026Dateiname
20111026DateinameV2
20111026DateinameV3

Größer V9 hatte ich bisher nicht, da das dann am nächsten Tag eh wieder gepasst hat.

mfg
Roland