PowerShell: Objektpaket aus Datenbank exportieren

11. November 2014 01:17

Mit dieser PowerShell-Funktion kann man die für einen Mergevorgang benötigten Objekte aus einer Datenbank extrahieren.
Seit NAV 2013 ist das bislang gut nutzbare Verfahren
  1. Objekt-IDs aus dem Fob-Header auslesen
  2. Objekte in der Versionsliste mit Präfix automatisch markieren
  3. Markierte Objekte exportieren
leider nicht mehr gut zu gebrauchen, weil immer erst zeitraubend eine Instanz für die Datenbank aufgebaut werden muss, um das aufrufen zu können.

Mit der Funktion kann man ohne Instanz die benötigten Objekte exportieren. In einen Order INDEX werden die zu mergenden Objekte des Add-ons einzeln im txt-Format abgelegt (d.h. möglichst nur die, die den NAV-Standardbereich berühren, Add-on-Objekte außerhalb des Standards schaden zwar nicht, kosten aber unnötig Laufzeit). Der Inhalt der Indexdateien ist hierbei irrelevant, nur der Dateiname wird ausgewertet, Format hierbei wie beim Split-Cmdlet TAB…, PAG…,REP… usw.). Alternativ kann man natürlich auch den MODÌFIED oder TARGET-Ordner dafür nutzen, falls die Add-on-Objekte dort liegen. Für jedes Objekt wird der Export aus der angegebenen Datenbank versucht, falls vorhanden, wird es dann im WorkingFolder (hier C:\Upgrade\Export) abgelegt.

Für einen 3-Weg-Merge ist dann die Basis vorhanden, bei einem manuellen 2-Weg-Merge kann man dann per Join-Cmdlet die Einzeldateien zusammenführen bzw. diese Sortierfunktion nutzen. Falls das andere Objektpaket aus einem Clientexport stammt und verschiedene Objekttypen enthält, ist das unbedingt erforderlich, da sonst die Objektgruppierung u.U. nicht übereinstimmt.

Hier im Beispiel anhand einer NAV 2013 Datenbank. Die Funktion Export-NAV70ApplicationObjectFileFlexiServer muss natürlich mit Pfad zur NAV 2013 Installation vorhanden sein (d.h. in der Profildatei anlegen oder vorher eingeben).
Für NAV 2013 R2 bis NAV 2018 usw. die Exportfunktionen beim Namen und im Programmpfad (C:\Program Files (x86)\Microsoft Dynamics NAV\70\RoleTailored Client) entsprechend anpassen. (71,80,90,100,110)
Code:
function ExpObjPack70
{
Get-ChildItem -Path .\INDEX\*.txt |
foreach `
   (
   {
        Write-host "Trying to export object:" $_.Name
   $IDbasename = [System.IO.Path]::GetFileNameWithoutExtension($_.Name)   
   $IDobject = $IDbasename.Substring(3)
   $ShortObjectType = $IDbasename.Substring(0,3)
   $IDobject = "ID=" + $IDobject
   
   Switch ($ShortObjectType)
     {
     "TAB" {$ObjectFilter = "Type=Table;" + $IDobject + '"'}
     "PAG" {$ObjectFilter = "Type=Page;" + $IDobject + '"'}
     "REP" {$ObjectFilter = "Type=Report;" + $IDobject + '"'}
     "XML" {$ObjectFilter = "Type=XMLport;" + $IDobject + '"'}
     "COD" {$ObjectFilter = "Type=Codeunit;" + $IDobject + '"'}
     "MEN" {$ObjectFilter = "Type=MenuSuite;" + $IDobject + '"'}
     "QUE" {$ObjectFilter = "Type=Query;" + $IDobject + '"'}
     }
   
   $ExportFileName = $_.Name
   
   
   Export-NAV70ApplicationObjectFileFlexiServer `
    -WorkingFolder 'C:\Upgrade\Export' `
    -ExportFile $ExportFileName `
    -Server 'KK-NB\NAVDEMO' `
    -Database 'NAV700DE' `
   -Filter $ObjectFilter
}
)
}

FunktionObjektpaket.png


Ausgabe zur Laufzeit:
ExportNAVObjekte.png

"Erfolgreich ausgeführt" kommt da bei allen Objekten als Rückmeldung von der finsql.exe-ExportObjects-Anweisung, für die es versucht wurde, auch dann, wenn diese in der Datenbank nicht vorhanden sind. Das fehlende ü nervt leider auch hier mal wieder(Link).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.