Soon will be the release of NAV 2017. And I assume you are going to want to upgrade to it. :-). Let me save you from one upgrade-caveat ..
A while ago, I blogged about merging VersionLists with PowerShell. It shows a solution on how to handle (merge) version lists with PowerShell.
Judging from the amount of reads, it has been “used” quite a lot. I use it not daily, but at least every month .. to apply the Cumulative Update. You have been able to find the scripts on my github.
Some time ago, a great developer from the Netherlands called “Jan Hoek” created an issue on my github, telling me the function contains a bug. One I wasn’t aware of .. but he was very right. Thanks for this! :-). By the way, Jan has got a blog which you should check out! Here it is: http://www.uncommonsense.nl/zen/
The function is going to compare strings, like NAVW19.00 is greater than NAVW17.10 . This has worked, but only …
… until NAV 2017
Because NAV 2017 is version 10. Which means in the version list it’s NAVW110.00. If you do a text comparison with this, you will see that NAVW19.00 is greater than NAVW110.00. This is an issue, because merging version lists to NAV 2017 was all of a sudden not possible anymore.
Solution
There is a solution, and it’s already on my github. I changed one function, and added another one. Basically, I needed to be able to compare integers instead of strings. These are the two functions I’m talking about:
I changed “Merge-NAVVersionList” to loop the versionlists, compare them with the next one, and “bubble up” the one that I want.. .
function Merge-NAVVersionList
{
param (
[String]$OriginalVersionList,
[String]$ModifiedVersionList,
[String]$TargetVersionList,
[String[]]$Versionprefix
)
Write-Verbose "Merging $OriginalVersionList, $ModifiedVersionList, $TargetVersionList"
$allVersions = @() + $OriginalVersionList.Split(',')
$allversions += $ModifiedVersionList.Split(',')
$allversions += $TargetVersionList.Split(',')
$mergedversions = @()
foreach ($prefix in $Versionprefix)
{
#add the "highest" version that starts with the prefix
$PrefixVersionLists = $allVersions | where { $_.StartsWith($prefix) }
$CurrentHighestPrefixVersionList = ''
foreach ($PrefixVersionList in $PrefixVersionLists){
$CurrentHighestPrefixVersionList = Get-NAVHighestVersionList -VersionList1 $CurrentHighestPrefixVersionList -VersionList2 $PrefixVersionList -Prefix $prefix
}
$mergedversions += $CurrentHighestPrefixVersionList
# remove all prefixed versions
$allversions = $allVersions.Where({ !$_.StartsWith($prefix) })
}
# return a ,-delimited string consiting of the "hightest" prefixed versions and any other non-prefixed versions
$mergedversions += $allVersions
$mergedversions = $mergedversions | ? {$_} #Remove empty
$Result = $mergedVersions -join ','
write-verbose "Result $Result"
$Result
}
And I added “Get-NAVHighestVersionList” to figure out which one is the highest versionlist of two, based on a prefix you provide:
function Get-NAVHighestVersionList
{
param (
[String]$VersionList1,
[String]$VersionList2,
[String]$Prefix
)
if ([string]::IsNullOrEmpty($Versionlist1)){return $VersionList2}
if ([string]::IsNullOrEmpty($Versionlist2)){return $VersionList1}
if ($VersionList1 -eq $VersionList2) {
return $VersionList1
}
try{
if ([String]::IsNullOrEmpty($Prefix)) {
[int[]] $SplitVersionlist1 = $VersionList1.split('.')
[int[]] $SplitVersionlist2 = $VersionList2.split('.')
} else {
[int[]] $SplitVersionlist1 = $VersionList1.Replace($Prefix,'').split('.')
[int[]] $SplitVersionlist2 = $VersionList2.Replace($Prefix,'').split('.')
}
} catch {
$ReturnVersionList = $VersionList2
try{
[int[]] $SplitVersionlist2 = $VersionList2.Replace($Prefix,'').split('.')
} Catch {
$ReturnVersionList = $VersionList1
}
$WarningMessage = "`r`nVersionlists are probaly too unstructured to compare."
$WarningMessage += "`r`n VersionList1 : $VersionList1"
$WarningMessage += "`r`n VersionList2 : $VersionList2"
$WarningMessage += "`r`n Prefix : $Prefix"
$WarningMessage += "`r`n Returned value: $ReturnVersionList"
$WarningMessage += "`r`nNo further action required is this is OK."
Write-Warning -Message $WarningMessage
return $ReturnVersionList
}
$Count = $SplitVersionlist1.Count
if ($SplitVersionlist2.count -gt $count){
$Count = $SplitVersionlist2.Count
}
$HighestVersionList = ''
for ($i=0;$i -lt $Count;$i++){
if ($SplitVersionlist1[$i] -gt $SplitVersionlist2[$i]){
$HighestVersionList = $VersionList1
}
if ($SplitVersionlist2[$i] -gt $SplitVersionlist1[$i]){
$HighestVersionList = $VersionList2
}
if ($HighestVersionList -ne ''){
$i = $Count
}
}
return $HighestVersionList
}
(Thanks to kfuglsang for contributing to this, and already providing a bugfix – I love the community 🙂 )
Probably, there are better ways to do this. I’m always open for suggestions. But for now, I hope this works for you :-).
You can test both functions with code like this.
$OrigVersionlist = 'NAVW17.10.00.37563,NAVBE7.10.00.37563' $ModVersionList = 'NAVW17.10.00.37563,NAVBE7.10.00.37563,I7.4,M22344,M65877,I8.0' $TgtVersionList = 'NAVW110.00,NAVBE10.00' $MyVersionprefix = 'NAVW1', 'NAVBE', 'I' Merge-NAVVersionList ` -OriginalVersionList $OrigVersionlist ` -ModifiedVersionList $ModVersionList ` -TargetVersionList $TgtVersionList ` -Versionprefix $MyVersionprefix
And the other one like:
Get-NAVHighestVersionList ` -VersionList1 'NAVW110.00' ` -VersionList2 'NAVW17.10.00.37563' ` -Prefix 'NAVW1'
Your upgrade code can still stay the same – the signature of the main function “Merge-NAVVersionList” hasn’t changed, so you should not have to change any scripts – only these functions.
Enjoy!
7 comments
2 pings
Skip to comment form
Oh no, not my Again 🙂
Hi Waldo, I think i found a small bug in the loop here:
I’m Merging W1 with CH NAV. [Better don’t ask why]. The problem i’m facing right now is the follow:
COD1:
W1 : NAVW110.0.00.14199 vs. CH: NAVW110.00.00.14199 [2 x 00]
this leads to an empty HighestVersionList in return. Why? Well: you compare the string in the top which is not equal:
if ($VersionList1 -eq $VersionList2)
due to that you run into the Integercasting this will flatten the 00s to 0. like this the code within the loop for ($i=0;$i -lt $Count;$i++){…} will never detect a difference and the return value will be empty.
It doesn’t run properly. It has got a syntax error. After correct it, the result was:
NAVW110.00,NAVBE7.10.00.37563,NAVBE7.10.00.37563,I7.4,M22344,M65877,I8.0,NAVBE10.00
It creates all version lists concatenated!
Sorry, if a prefix doesn’t set in MyVersionPrefix returns all version list, It’s Ok. Thank you. It runs properly
Author
Cool :-). thanks for getting back 😉
Hi Waldo,
first thanks for this useful functions. I had the same problem as Kristof, in my case it was from W1 to DE or DACH.
W1: NAVW110.0 vs. DE: NAVW110.00
To solve it, I added at the end of the function Get-NAVHighestVersionList this IF statement to get back the previous Highest Version List, if the new one is empty:
if (($HighestVersionList -eq ”) -and ($VersionList1 -ne ”)){
return $VersionList1
}
It may not be the smartest solution, but I’m not an expert with powershell and it works for me.
Kind regards
Stefan
Hello , how to use this with Merge-NAVApplicationObject please?
Author
The “MergeNavapplicationObject” simply uses this.
Please check out this script, and follow it down: https://github.com/waldo1001/Cloud.Ready.Software.PowerShell/blob/master/PSScripts/NAV%20Upgrades/UpgradeDatabase.ps1
it has a “Merge-NAVUpgradeObjects”, which gets the prefixes for the versionlists… .
[…] Continued on Source: Merging NAV Versionlists to NAV 2017 – Updated PowerShell functions! » waldo's blog […]
[…] Bron : Waldo’s Blog Lees meer… […]