PowerShell: NAV 2018 Reports (u.a. Objekte) downgraden

Bild Tipps & Tricks zu den Dynamics NAV Versionen
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.
Forumsregeln
Impressum • Community-Knigge • Nutzungsbedingungen • Datenschutzrichtlinie
Hier bitte keine Fragen stellen, sondern nur bereits vorhandene Tricks veröffentlichen.

PowerShell: NAV 2018 Reports (u.a. Objekte) downgraden

Beitragvon Kowa » 28. Dezember 2017 18:08

Wenn man Reports, die aus NAV 2018 exportiert wurden, in eine ältere Version einspielen möchte, gibt es diverse Konflikte (u.a. diese).
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.
ReportDowngrade.png


Die neuen [Internal] bzw. [External]-Zeilen mĂĽssen ebenfalls raus (das betrifft alle Objekte).
InternalExternal.png

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).
ApplicationAreaReports.png

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 :wink: ), 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.
OpenFileWindowReportDowngrade.png

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
}
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01

NAV 2015

Beitragvon Kowa » 19. Januar 2018 12:05

FĂĽr NAV 2015 waren Events noch Zukunftsmusik (Integration und Business), ich habe das Skript dafĂĽr noch erweitert, um diese Zeilen bei Bedarf zu entfernen.
Dazu dann die Variable$SkipLineForNAV2015 auswerten, wenn der Import in NAV 2015 erfolgen soll. Die zugehörigen Eventfunktionen selber werden nicht entfernt.

CodeLinesEvents.png


Event Subscriber
EventSubscriber.png
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01

Re: PowerShell: NAV 2018 Reports (u.a. Objekte) downgraden

Beitragvon Kowa » 22. Januar 2018 15:21

Weitere neue Properties in NAV 2018 sind
bei Feldern bzw. Tabellen
  • ObsoleteState
  • ObsoleteReason

Bei Pages
  • ODataKeyFields

NewFieldsNAV2018ObsoleteOdata.png

NewInNAV2018_2.png


Ich habe das Skript oben erweitert, damit diese beim Downgraden ebenfalls entfernt werden.
GruĂź, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂĽr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
Beiträge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01


ZurĂĽck zu NAV Tipps & Tricks

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast