PowerShell: C/AL-Objektsplitter (auch fĂĽr Forms/Dataports)

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: C/AL-Objektsplitter (auch fĂĽr Forms/Dataports)

Beitragvon Kowa » 17. Januar 2018 16:12

Mit diesem Dateisplitter mit Dialogfenster kann man die Objektpakete aller NAVision-Versionen splitten, im Gegensatz zum Split-Cmdlet von MS also auch fĂĽr Forms und Dataports des Classic Clients verwendbar.

Nachtrag: Mein Splitter für AL-Pakete ist hier zu finden. Falls nur bestimmte Objekte aus dem Paket benötigt werden, kann man den C/AL-Paketkonfigurator auf das Ausgangspaket anwenden.

Zerlegt wird automatisch in den Unterordner SPLITNAVOBJ in dem Verzeichnis, wo die Ausgangsdatei liegt, dieser wird also jeweils vor dem Start gelöscht.
Am Ende des Laufs wird eine Objektstatistik angezeigt und ein Ordnerfenster mit den gesplitteten Objektdateien automatisch geöffnet. Wenn man letzteres nicht braucht, die letzte Zeile mit INVOKE-ITEM löschen. Den aktuellen Ordner als Fensteransicht aus der PowerShell heraus bekommt man übrigens am schnellsten über den Alias dieses Cmdlets mitsamt einem Punkt gestartet.
Code: Alles auswählen
ii .


Durchaus performant, ein Testlauf mit 6569 Objekten in einer 147 MB groĂźen Datei dauert auf meinem Notebook nicht einmal eine Minute (siehe Bild).

Das Objektpaket auswählen…
NAVObjectSplitter2.png

…und kurze Zeit später schon erledigt :wink: .
NAVObjectSplitter.png


Code: Alles auswählen
function Split-NAVObjectFile
{
    $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 Object Files (*.txt)|*.txt"
        $OpenFileDialog.ShowDialog() | Out-Null
        $OpenFileDialog.filename
    }
       
    $inputfile = Get-FileName "C:\temp" # This is the default path in OpenFile window.
    if ($inputfile -eq "") {throw 'Please select a file'}
     
    [decimal]$filesize = ((Get-Item $inputfile).length/1MB)
    $filesize =[math]::round($filesize,2)
    $inputfile = resolve-path $inputfile
    $WorkingFolder = Split-Path -Parent $inputfile
   

   
    if (Test-path "$WorkingFolder\SPLITNAVOBJ\")
    {Remove-Item -path "$WorkingFolder\SPLITNAVOBJ\" -Recurse -Force}

    Write-Host "Splitting NAV objects from $inputfile (Size: $filesize MB) to $WorkingFolder\SPLITNAVOBJ\, this may take a while..." -ForegroundColor Yellow
    $starttime = date
   
    $Sr = new-object System.IO.StreamReader($inputfile,[system.text.encoding]::GetEncoding(850))
    [int]$ObjCnt = 0
    [int]$TabCnt = 0
    [int]$PagCnt = 0
    [int]$RepCnt = 0
    [int]$CodCnt = 0
    [int]$XmlCnt = 0
    [int]$ForCnt = 0
    [int]$DatCnt = 0
    [int]$QueCnt = 0
    [int]$MenCnt = 0
   

    while (-not $Sr.EndOfStream)
    {
        $Currline = $sr.ReadLine()
        if ($Currline.StartsWith('OBJECT'))
        {
            [String]$ObjectChar = $Currline.Substring(7,1)
            $ObjectLine = $currline.Split(' ')
            $ObjCnt++
            Switch ($ObjectChar)
            {
                'T' {$TabCnt++}
                'P' {$PagCnt++}
                'R' {$RepCnt++}
                'C' {$CodCnt++}
                'X' {$XmlCnt++}
                'F' {$ForCnt++}
                'D' {$DatCnt++}
                'Q' {$QueCnt++}
                'M' {$MenCnt++}
       
            }
            $ObjectFileName = $ObjectLine[1].Substring(0,3).ToUpper() + $ObjectLine[2] + ".TXT"
            $Objectfile = New-Item -path "$WorkingFolder\SPLITNAVOBJ\$ObjectFileName" -type file -force
            IF (Test-Path $ObjectFile) {Remove-Item $ObjectFile}
           
            $sw = new-object System.IO.Streamwriter($Objectfile,$false,[system.text.encoding]::GetEncoding(850))
       
        }
        if (-not $Currline.StartsWith('}'))
        {$sw.writeline($Currline)}
        else
        {
            $sw.writeline($Currline)
            $sw.writeline()
            $sw.Flush()

        }

       
    }
   
    $endtime = date
    $time = $endtime - $starttime
    Write-Host "$ObjCnt NAV objects splitted to $WorkingFolder\SPLITNAVOBJ\ in $($time.Minutes)m:$($time.Seconds)s:$($time.Milliseconds)ms" -ForegroundColor Yellow
    Write-Host "Tables: $TabCnt" -ForegroundColor Yellow
    Write-Host "Pages: $PagCnt" -ForegroundColor Yellow
    Write-Host "Reports: $RepCnt" -ForegroundColor Yellow
    Write-Host "Codeunits: $CodCnt" -ForegroundColor Yellow
    Write-Host "XMLPorts: $XMLCnt" -ForegroundColor Yellow
    Write-Host "Queries: $QueCnt" -ForegroundColor Yellow
    Write-Host "MenuSuites: $MenCnt" -ForegroundColor Yellow
    if ($ForCnt -gt 0)
    {Write-Host "Forms: $ForCnt" -ForegroundColor Yellow}
    if ($DatCnt -gt 0)
    {Write-Host "Dataports: $DatCnt" -ForegroundColor Yellow}   
    $sr.Close()
    $sr.Dispose()
    $sw.close()
    $sw.Dispose()
    Invoke-item "$WorkingFolder\SPLITNAVOBJ\"
}
Split-NAVObjectFile
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: 7851
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: C/AL-Objektsplitter (auch fĂĽr Forms/Dataport

Beitragvon fiddi » 17. Januar 2018 18:10

Hallo,

um die Daten besser erfassbar zu machen, würde ich die Objekt-IDs mit einer gleichen Feldlänge versehen. Aber das ist Geschmackssache.

GruĂź Fiddi
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
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, IM oder Telefon! DafĂĽr ist dieses Forum da.
fiddi
Moderator
Moderator
 
Beiträge: 7095
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell

Re: PowerShell: C/AL-Objektsplitter (auch fĂĽr Forms/Dataport

Beitragvon Kowa » 17. Januar 2018 19:35

Das geht natĂĽrlich auch, dann wĂĽrden die aber mit anderen Bezeichnungen erzeugt werden, als das Cmdlet Split-NAVApplicationObjectFile von MS diese generiert. Das soll sich ja nahtlos vermischen, falls beide Skripte im Einsatz sind. Das Cmdlet von MS bricht allerdings immer dann ab, wenn es mit den Inhalten der Datei nicht einverstanden ist, z.B. wenn es nicht zur Version passt. Mein Skript dagegen teilt immer auf, ohne Diskussion :mrgreen: . Eventuelle Konfliktstellen kann man dann hinterher abarbeiten.
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: 7851
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