[Access] Vergelijken van versienummers

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Volgend probleem heb ik bij Access:

Ik heb een tabel met daarin software componenten. In deze zijn verschillende versie nummers. In een andere tabel heb ik een soort gelijke lijst met ook softwarecomponenten. Nu wou ik uit deze twee tabellen de versie nummers vergelijken. Het probleem is nu dat als er in tabel 1 v. 1.2.3 is en in tabel 2 v. 1.2. zegt hij dus dat die in tabel 2 nieuwe is dan die in tabel 1 ... hoe kan ik dit probleem oplossen??? :?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Die versienummers zijn verdeeld in [Major].[Minor].[Revision]. Je zou dus kunnen splitten op de puntjes ofzo en dan alleen kijken naar Major & Minor...

Gebruik je een query? Een VBA macro? What?

Je zou ze evt. in aparte velden kunnen opslaan voor een duidelijke query. Doe je dat niet dan wordt je query wat ingewikkelder.

Hoe ziet je DB er uit?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de reacite, maar had het al met behulp van collega opgelost met de volgende VBA script:

Function DeGrootste(inp1 As String, inp2 As String) As Integer
'als inp1 grootste dan waarde 1
'als inp2 grootste dan waarde 2
'anders waarde 0
Dim p1 As Integer
Dim p2 As Integer
DeGrootste = 0
p1 = InStr(inp1, ".")
p2 = InStr(inp2, ".")
While p1 > 0 And p2 > 0 And DeGrootste = 0
If Mid(inp1, 1, p1 - 1) > Mid(inp2, 1, p2 - 1) Then
DeGrootste = 1
Else
If Mid(inp1, 1, p1 - 1) < Mid(inp2, 1, p2 - 1) Then
DeGrootste = 2
End If
End If
inp1 = Mid(inp1, p1 + 1)
inp2 = Mid(inp2, p2 + 1)
p1 = InStr(inp1, ".")
p2 = InStr(inp2, ".")
Wend
If DeGrootste = 0 Then
If p1 = 0 Then
If p2 = 0 Then
If inp1 > inp2 Then
DeGrootste = 1
Else
If inp1 < inp2 Then
DeGrootste = 2
End If
End If
Else
If inp1 > Mid(inp2, 1, p2 - 1) Then
DeGrootste = 1
Else
If inp1 < Mid(inp2, 1, p2 - 1) Then
DeGrootste = 2
End If
End If
End If
Else
If p2 = 0 Then
If Mid(inp1, 1, p1 - 1) > inp2 Then
DeGrootste = 1
Else
If Mid(inp1, 1, p1 - 1) < inp2 Then
DeGrootste = 2
End If
End If
End If
End If
End If
If DeGrootste = 0 Then
If p1 > 0 Then DeGrootste = 1

If p2 > 0 Then DeGrootste = 2
End If

End Function

Acties:
  • 0 Henk 'm!

  • KingRichard
  • Registratie: September 2002
  • Laatst online: 21-03 22:06

KingRichard

former Duke of Gloucester

Met alle respect voor jou en je collega, maar dit is echt een beroerd stuk progsel. :+
Als het dan per sé met een zo'n functie, dan maar zo:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Function DeGrootste(strArg1 As String, strArg2 As String) As Integer

' Voor gebruik met versienummers als 3.22.533
' Retourneert het argument met het hoogste versienummer
' [TOPIC=760244///][NOHTML][rml][ Access] Vergelijken van versienummers[/rml][/NOHTML][/TOPIC]
    
    If Val(strArg1) > Val(strArg2) Then
        DeGrootste = strArg1
    Else
        DeGrootste = strArg2
    End If

End Function

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En heel dat mid/instr/while gebeuren had je kunnen oplossen met de split functie...
Bij mij werkt deze niet hoor.... 1.2.3 > 1.2.4 volgens jouw functie????

Dit werkt "beter" :P
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Function DeGrootste(sVerA As String, sVerB As String) As Integer
    Dim arrArgA() As String
    Dim arrArgB() As String
    Dim T As Integer
    
    arrArgA = Split(sVerA, ".")
    arrArgB = Split(sVerB, ".")
    
    If UBound(arrArgB) < UBound(arrArgA) Then ReDim Preserve arrArgB(UBound(arrArgA))
    If UBound(arrArgA) < UBound(arrArgB) Then ReDim Preserve arrArgA(UBound(arrArgB))
    For T = 0 To UBound(arrArgA)
        If Val(arrArgA(T)) > Val(arrArgB(T)) Then
            DeGrootste = 1
            Exit For
        ElseIf Val(arrArgA(T)) < Val(arrArgB(T)) Then
            DeGrootste = 2
            Exit For
        End If
    Next
End Function


Geeft 1 terug als het eerste argument groter is, 2 als het 2e argument groter is en 0 als ze gelijk zijn.

Voorbeeldjes:
Visual Basic:
1
2
3
4
5
    Debug.Print DeGrootste("2.2", "2.2.1") 'Geeft 2
    Debug.Print DeGrootste("2.2.1", "2.2.1") 'Geeft 0
    Debug.Print DeGrootste("2.2.3", "2.2.1") 'Geeft 1
    Debug.Print DeGrootste("2.2.9.3.1.4.6.1", "2.2.9.3") ' Geeft 1
    Debug.Print DeGrootste("2.2.9.3.1.4.6.1", "2.2.9.3.1.4.6.1") 'Geeft 0


edit:


...ik heb jullie code ook nog eens wat nader bestudeerd en netjes ingesprongen...dude, ik zou het echt schrappen hoor! Veel onoverzichtelijker als dat kan bijna niet ;)....De "netjes ingesprongen" code van wtp (=TS) vind je hier :P

[ Voor 255% gewijzigd door RobIII op 23-05-2003 17:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry voor de slechte opmaak, maar wist niet precies hoe ik hier code moest plaatsen, want het is dus wel netje ingesprongen in broncode...

En KingRichard... leuk geprobeerd, maar daar was ik ook zelf op gekomen... helaas klopt van die vergelijking niks want daar vergelijkt hij de heele string ... maar hij moet dus de versie goed met elkaar vergelijken, en die code werkt op zich prima... ik denk dat je toch nog maar eens GOED naar die code zou m oeten kijken, dan begrijp je misschien wat ik bedoel...

ohja... erbij kwam ook nog dat in de versie nummers letters voor komen... maar is ook al opgelost

[ Voor 23% gewijzigd door Verwijderd op 24-05-2003 22:51 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 24 May 2003 @ 22:47:
Sorry voor de slechte opmaak, maar wist niet precies hoe ik hier code moest plaatsen, want het is dus wel netje ingesprongen in broncode...

En KingRichard... leuk geprobeerd, maar daar was ik ook zelf op gekomen... helaas klopt van die vergelijking niks want daar vergelijkt hij de heele string ... maar hij moet dus de versie goed met elkaar vergelijken, en die code werkt op zich prima... ik denk dat je toch nog maar eens GOED naar die code zou m oeten kijken, dan begrijp je misschien wat ik bedoel...

ohja... erbij kwam ook nog dat in de versie nummers letters voor komen... maar is ook al opgelost
(Behalve de letters) werkt mijn code toch goed :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • KingRichard
  • Registratie: September 2002
  • Laatst online: 21-03 22:06

KingRichard

former Duke of Gloucester

RobIII heeft helemaal gelijk :X . Mijn code werkte niet om twee redenen. Ten eerste moeten beide strings even lang zijn, maar wat nog veel belangrijker is: de punten worden ook omgezet met Val(). Zou wel werken met "1#2#3" en "1#2#4", maar daar heb je natuurlijk nix aan!

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
KingRichard schreef op 25 May 2003 @ 18:25:
RobIII heeft helemaal gelijk :X . Mijn code werkte niet om twee redenen. Ten eerste moeten beide strings even lang zijn, maar wat nog veel belangrijker is: de punten worden ook omgezet met Val(). Zou wel werken met "1#2#3" en "1#2#4", maar daar heb je natuurlijk nix aan!
Dan kun je nog altijd een
code:
1
strVal = replace(strVal,".","#")
loslaten ;)

Maar ik blijf erbij dat mijn code (tot nu toe) het "mooist" is. Hoewel dat niet wegneemt dat het nog mooier/korter/sneller kan. Maar ik ben te gaar :O om daar nu over na te denken :+ En de code is makkelijk aan te passen zodat 'ie ook met letters werkt...Kwestie van de "Val"s eruit slopen ;)

[edit]
Bedenk me zojuist dat strComp (of wat was het ook alweer?) de if/elseif tak mooier zou moeten kunnen maken...

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Function DeGrootste(sVerA As String, sVerB As String) As Integer
    Dim arrArgA() As String
    Dim arrArgB() As String
    Dim T As Integer
    Dim L As Long
    
    arrArgA = Split(sVerA, ".")
    arrArgB = Split(sVerB, ".")
    
    If UBound(arrArgB) < UBound(arrArgA) Then ReDim Preserve arrArgB(UBound(arrArgA))
    If UBound(arrArgA) < UBound(arrArgB) Then ReDim Preserve arrArgA(UBound(arrArgB))
    T = 0
    Do
        L = StrComp(arrArgA(T), arrArgB(T))
        T = T + 1
    Loop Until (T > UBound(arrArgA)) Or L <> 0
    DeGrootste = IIf(L < 0, 2, IIf(L > 0, 1, 0))
End Function


Werkt nu dus ook met letters...

Visual Basic:
1
2
3
4
5
6
7
8
9
    Debug.Print DeGrootste("2.2", "2.2.1")                          'Geeft 2
    Debug.Print DeGrootste("2.2.1", "2.2.1")                        'Geeft 0
    Debug.Print DeGrootste("2.2.3", "2.2.1")                        'Geeft 1
    Debug.Print DeGrootste("2.2.9.3.1.4.6.1", "2.2.9.3")            'Geeft 1
    Debug.Print DeGrootste("2.2.9.3.1.4.6.1", "2.2.9.3.1.4.6.1")    'Geeft 0
    Debug.Print DeGrootste("2.2.a", "2.2.b")                        'Geeft 2
    Debug.Print DeGrootste("2.2.a", "2.2.a")                        'Geeft 0
    Debug.Print DeGrootste("2.2b", "2.2a")                          'Geeft 1
    Debug.Print DeGrootste("2.7.alpha", "2.7.beta")                 'Geeft 2


...maar let op: Dit werkt niet als je voorloopnullen tegenkomt (zoals in 2.03.1 ofzo), dan moet je toch weer met de Val (en IsNumeric) aan de slag, maar ik ga niet alles zitten voorkauwen hiero...

[ Voor 139% gewijzigd door RobIII op 25-05-2003 23:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1