Der Namespace hat sich durch den neuen Report Builder (2016, vorher 2014) geändert, außerdem muss der neue Block ab dem Tag <ReportParametersLayout> entfernt werden.
Die neuen [Internal] bzw. [External]-Zeilen mĂĽssen ebenfalls raus (das betrifft alle Objekte).
Falls vorhanden, sind in NAV 2016 auch die ApplicationAreas überall noch unbekannt, in NAV 2017 können diese wiederum optional verbleiben (auch wenn nur Dynamics 365 diese wirklich auswertet).
Mit diesem Skript kann man die Exporte aus NAV 2018 von diesen Sachen befreien bzw. die Namespace-Zeile mit dem bisherigen Inhalt versorgen.
Dadurch, dass die Datei hier ĂĽber den StreamReader gelesen und ĂĽber den StreamWriter geschrieben wird (und nicht ĂĽber den "Kriechgang" mittels Get-Content und Out-file ), geht das auch sehr schnell, eine Testkonvertierung mit einer 21 MB groĂźen Datei mit 123 Reports dauert auf meinem Notebook nur 5 Sekunden.
Je nach Bedarf kann man das Skript leicht intern fĂĽr die Eigenschaften der Altversion anpassen (Variablen $SkipLineForNAV2016 bzw. $SkipLineForNAV2017).
Zur Laufzeit kann nach Funktionsaufruf die Datei mit einem Dialogfenster manuell ausgewählt werden.
FĂĽr die Umarbeitung zur Stapelverarbeitung die Variable $inputfile durch $args austauschen und den Code fĂĽr das Fenster entfernen und die Funktion zusammen mit dem Dateipfad aufrufen.
[Edit 16.01.18] Das Skript kann auch als .exe-Datei ausgefĂĽhrt werden, Link und Beispieldatei dazu hier.
- Code: Alles auswählen
function DowngradeNAVfileDlg
{
$ErrorActionPreference = "Stop"
$PSDefaultParameterValues['*:ErrorAction']='Stop'
Function Get-FileName($initialDirectory)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "NAV 2018 Object Files (*.txt)|*.txt"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
}
$inputfile = Get-FileName "C:\temp" # This is the default path in OpenFile window. Use whatever you like :-)
if ($inputfile -eq "") {throw 'Please select a file'}
$ToggleExportOn = $true
$ToggleExportOff = $false
$OldValueToggleExportOff = $false
$inputfile = resolve-path $inputfile
$WorkingFolder = Split-Path -Parent $inputfile
$convertedFileName = [System.IO.Path]::GetFileNameWithoutExtension($inputfile) +"_DWGR" + [System.IO.Path]::GetExtension($inputfile)
$convertedfile = New-Item -path "$WorkingFolder\$convertedFileName" -type file -force
IF (Test-Path $ConvertedFile) {Remove-Item $ConvertedFile}
IF (Test-Path "$inputfile.tmp") {Remove-Item "$inputfile.tmp"}
$Sr = new-object System.IO.StreamReader($inputfile,[system.text.encoding]::GetEncoding(850))
$sw = new-object System.IO.Streamwriter("$inputfile.tmp",$false,[system.text.encoding]::GetEncoding(850))
while (-not $Sr.EndOfStream)
{
$Currline = $Sr.ReadLine()
if ($Currline.StartsWith(' RDLDATA')){
$ToggleExportOn = $true
$ToggleExportOff = $false
$OldValueToggleExportOff = $false}
$IsApplicationAreaLine = ($Currline.startswith(' ApplicationArea='))
$IsInternalLine = ($Currline.startswith(' [Internal]'))
$IsExternalLine = ($Currline.startswith(' [External]'))
# Events
$IsIntegrationLine = ($Currline.startswith(' [Integration'))
$IsBusinessLine = ($Currline.startswith(' [Business'))
$IsEventSubscriber = ($Currline.startswith(' [EventSubscriber('))
$IsObsoleteLine1 = ($Currline.startswith(' ObsoleteState=')) -or ($Currline.startswith(' ObsoleteState='))
$IsObsoleteLine2 = ($Currline.startswith(' ObsoleteReason=')) -or ($Currline.startswith(' ObsoleteReason='))
$IsOdataline = ($Currline.startswith(' ODataKeyFields='))
$SkipLineForNAV2015 = $IsInternalLine -or $IsExternalLine -or $IsApplicationAreaLine -or $IsIntegrationLine -or $IsBusinessLine -or -$IsEventSubscriber -or $IsObsoleteLine1 -or $IsObsoleteLine2 -or $IsOdataline
$SkipLineForNAV2016 = $IsInternalLine -or $IsExternalLine -or $IsApplicationAreaLine -or $IsObsoleteLine1 -or $IsObsoleteLine2 -or $IsOdataline
$SkipLineForNAV2017 = $IsInternalLine -or $IsExternalLine -or $IsObsoleteLine1 -or $IsObsoleteLine2 -or $IsOdataline
$ToggleExportOff = ($Currline -contains ' <ReportParametersLayout>')
if ($ToggleExportOff)
{$OldValueToggleExportOff = $true}
if ($OldValueToggleExportOff)
{$ToggleExportOn = ($Currline -contains ' </ReportParametersLayout>')}
if ($ToggleExporton)
{$OldValueToggleExportOff = $false}
if ($($ToggleExportOff)) {$ToggleExportOn = ($ToggleExportOn -eq ($Currline -contains ' </ReportParametersLayout>'))}
[string]$NewSchema = '<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">'
[string]$OldSchema = '<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition">'
if ($Currline -eq $NewSchema)
{$sw.writeline($OldSchema)}
elseif ((-not $OldValueToggleExportOff) -and (-not ($Currline -contains ' </ReportParametersLayout>') -and (-not $SkipLineForNAV2016)))
{$sw.writeline($Currline)}
}
$sr.Close()
$sr.Dispose()
$sw.close()
$sw.Dispose()
Rename-Item -path "$inputfile.tmp" -NewName $convertedFileName -force -verbose
}