PowerShell: C/AL-Objekte in AL umwandeln

21. Dezember 2017 13:55

Als Alternative zu diesem von Waldo hier ein Skript, welches ohne weitere Module auskommt, also nur mit den von bei der Installation mitgelieferten Cmdlets arbeitet und sich die Objekte nicht über einen Dienst, sondern direkt aus der Datenbank holt.

Mit dieser Funktion können Objektpakete aus einer NAV 2018 Datenbank mit einem Filter (im Beispiel nur auf die Versionsliste, ist beliebig anpassbar)
z.B. so
Code:
ID=..49999;"Version List=*XYZ*"

oder so
Code:
Type=Page|Codeunit|Report;ID=55555..55666;"Name=*SEPA*";"Version List=*XYZ*"

exportiert und in AL umgewandelt werden. DELTA-Dateien werden hier nicht gebildet, dieses ist also nicht zur Erzeugung von Modification-Dateien für Extensions gedacht, das Skript dazu ist hier.


Da das Skript als Funktion geschrieben ist, braucht man hier nur die letzte Zeile mit den eigenen Parametern versorgen. Das exportierte Objektpaket wird im Arbeitsordner in den Unterordner Split zerlegt und die konvertierten Dateien in AL abgelegt.
Alconv.png

ALconversion.png



Code:
[string]$MyEnviron = [Environment]::OSversion.Version.ToString(3) ; [bool]$OldEnviron = ($MyEnviron.substring(0,3) -eq '6.1')
function Export-NAV2ALfile
{
[CmdletBinding()]param (
[String]$WorkingFolder,
[String]$ExportFile,
[String]$Server,
[String]$Database,
[String]$Filter )
$LogFile = "$WorkingFolder\Log_$ExportFile"
$ExportFile = "$WorkingFolder\$ExportFile"
if (Test-path "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central" -PathType Container)
{$NAVide = Import-Module "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central\130\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1"}
else
{$NAVide = Import-Module "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1" -WarningAction SilentlyContinue | out-null}

if (Test-Path "$WorkingFolder\navcommandresult.txt") {Remove-Item "$WorkingFolder\navcommandresult.txt"}
if (test-path $ExportFile) {remove-item $ExportFile}

if (Test-path "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central" -PathType Container) {$NAVFolder = "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central\130\RoleTailored Client"}
else
  {$NAVFolder = "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client"}

$exportfinsqlcommand = """$NAVFolder\finsql.exe"" command=ExportToNewSyntax,file=$ExportFile,servername=$Server,database=$Database,Logfile=$LogFile"
if ($Filter -ne "") {$exportfinsqlcommand = "$exportfinsqlcommand,filter=$Filter"}
$Command = $exportfinsqlcommand
Write-Host -ForegroundColor Green 'Export Objects with:'
Write-host -ForegroundColor Gray "  $Command"
cmd /c $Command
$ExportFileExists = Test-Path "$ExportFile"
If (-not $ExportFileExists)
{
write-error "Error on exporting to $ExportFile.  Look at the information below."
if (Test-Path "$WorkingFolder\navcommandresult.txt"){Get-Content "$WorkingFolder\navcommandresult.txt"}
if (Test-Path $LogFile) {Get-Content $LogFile}
 break
}
else
{
$NAVObjectFile = Get-ChildItem $ExportFile
if ($NAVObjectFile.Length -eq 0) {Remove-Item $NAVObjectFile}
if (Test-Path "$WorkingFolder\navcommandresult.txt") {Get-Content "$WorkingFolder\navcommandresult.txt"}
}
$SplitDir = "$WorkingFolder\Split"
Write-Host "Splitting objects to $SplitDir"
Split-NAVApplicationObjectFile -Source $ExportFile -Destination $SplitDir -force
$Convertcommand = """$NAVFolder\txt2al.exe"" --source=""$WorkingFolder\Split"" --target=""$WorkingFolder\AL"" --rename"
$Command = $Convertcommand
Write-Host -ForegroundColor Green 'Convert objects with:'
Write-host -ForegroundColor Gray "  $Command"
cmd /c $Command
}
Export-NAV2ALfile -WorkingFolder C:\MyWorkingFolder -ExportFile MyNAVObjects.txt  -Server MyServer -Database MyDatabase  -Filter "Version List=*MyAddOn*"
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: PowerShell: C/AL-Objekte in AL umwandeln

2. Oktober 2018 10:25

Mit dem Release von D365BC On Premises haben sich die Installationspfade

  • alt: …\Microsoft Dynamics NAV\
  • neu: …\Microsoft Dynamics 365 Business Central\
generell geändert (bei Client, Server usw., auch wenn die jeweiligen PowerShell-Module weiterhin NAV im Namen tragen :-) ). Das muss beim Ermitteln der Variablen $NAVide und $NAVfolder berücksichtigt werden. Das habe ich im obigen Skript entsprechend ergänzt. Da D365BC Cloud als Version 12.0 ab dem Erstrelease am 01.04. lief, gibt es nun hier On-Prem einen Sprung von 110 auf 130.

Code:
if (Test-path "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central" -PathType Container)
{$NAVide = Import-Module "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central\130\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1"}
else
{$NAVide = Import-Module "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client\Microsoft.Dynamics.Nav.Model.Tools.psd1" -WarningAction SilentlyContinue | out-null}


bzw.

Code:
if (Test-path "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central" -PathType Container) {$NAVFolder = "C:\Program Files (x86)\Microsoft Dynamics 365 Business Central\130\RoleTailored Client"}
else
  {$NAVFolder = "C:\Program Files (x86)\Microsoft Dynamics NAV\110\RoleTailored Client"}