{"id":1105,"date":"2017-05-09T18:41:22","date_gmt":"2017-05-09T16:41:22","guid":{"rendered":"http:\/\/blog.systemconnect.dk\/?p=1105"},"modified":"2017-07-17T14:20:01","modified_gmt":"2017-07-17T12:20:01","slug":"mere-dynamics-nav-odata-powershell-integration","status":"publish","type":"post","link":"https:\/\/scblog.lynge.org\/?p=1105","title":{"rendered":"Mere Dynamics NAV ODATA PowerShell integration"},"content":{"rendered":"<p>Jeg har tidligere skrevet lidt om at kalde NAVs WebServices fra PowerShell <a href=\"http:\/\/blog.systemconnect.dk\/?p=917\">her<\/a>, men nu kan vi tage det et skridt videre med noget benarbejde som en af mine gode venner har lavet.<\/p>\n<p>Helt gratis &#8211; fra os til dig &#8211; nogle generiske PowerShell funktioner og et eksempel du kan bruge n\u00e5r du skal l\u00e6se eller skrive data direkte fra Dynamics NAV via ODATA WebServices med PowerShell. Der benyttes i \u00f8vrigt &#8220;kun&#8221; standard PowerShell, s\u00e5 du beh\u00f8ver ikke engang at have\u00a0Dynamic NAVs\u00a0medf\u00f8lgende PowerShell biblioteker tilg\u00e6ngeligt p\u00e5 den maskine du bruger det fra.<\/p>\n<p>Her har du de generiske funktioner efterfulgt af eksempler:<\/p>\n<pre># Dynamics NAV OData Sample\r\n# \r\n# Created: \u00a023-04-2017\r\n# Version:  17-07-2017\r\n# by: \u00a0\u00a0\u00a0  \u00a0Gert Lynge - http:\/\/blog.systemconnect.dk\/\r\n#\u00a0        \u00a0\u00a0Graves Kilsgaard \r\n#\r\n# Setup in NAV:\r\n# - Create Page 21 webservice called \"Customer\"\r\n\r\nfunction New-NAVODataRestMethodHeader\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$ETag )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $Headers = New-Object \"System.Collections.Generic.Dictionary[[String],[String]]\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $Headers.Add(\"accept\",\"application\/json\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(-not [string]::IsNullOrEmpty($ETag)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if($ETag = \"*\") {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $Headers.Add(\"If-Match\",\"*\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $Headers.Add(\"If-Match\",\"W\/`\"'\" + [uri]::EscapeDataString($ETag) + \"'`\"\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $Headers.Add(\"Content-Type\",\"application\/json; charset=utf-8\")\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $Headers\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nfunction Get-NAVODataRecord()\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVUri,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVWebService,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVSearchParm,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [PSCredential]$NAVCredentials )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if([string]::IsNullOrEmpty($NAVCredentials)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Get -UseDefaultCredentials\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Get -Credential $NAVCredentials \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $NAVResult\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Catch {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write-host ($_ |Convertfrom-json|select -ExpandProperty \"odata.error\").message.value -ForegroundColor Red\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nfunction Test-NAVODataRecord()\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVUri,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVWebService,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVSearchParm,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [PSCredential]$NAVCredentials )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if([string]::IsNullOrEmpty($NAVCredentials)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm $NAVSearchParm\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm $NAVSearchParm -NAVCredentials $NAVCredentials \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if($NAVResult -eq $false) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return($false)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return($true)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nfunction New-NAVODataRecord()\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVUri,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVWebService,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [PSCredential]$NAVCredentials,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVJSONFields )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if([string]::IsNullOrEmpty($NAVCredentials)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService()?`$format=json\" -Method Post -UseDefaultCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Body $NAVJSONFields -Headers $(New-NAVODataRestMethodHeader)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService()?`$format=json\" -Method Post -Credential $NAVCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Body $NAVJSONFields -Headers $(New-NAVODataRestMethodHeader)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $NAVResult\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Catch {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write-host ($_ |Convertfrom-json|select -ExpandProperty \"odata.error\").message.value -ForegroundColor Red\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nfunction Update-NAVODataRecord()\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVUri,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVWebService,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVSearchParm,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [PSCredential]$NAVCredentials,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVJSONFields )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $ETag = (Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm $NAVSearchParm -NAVCredentials $NAVCredentials).ETag\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(-not [string]::IsNullOrEmpty($ETag)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if([string]::IsNullOrEmpty($NAVCredentials)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Patch -UseDefaultCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Body $NAVJSONFields -Headers $(New-NAVODataRestMethodHeader -ETag $ETag)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Patch -Credential $NAVCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Body $NAVJSONFields -Headers $(New-NAVODataRestMethodHeader -ETag $ETag)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $(Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm $NAVSearchParm -NAVCredentials $NAVCredentials)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Catch {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write-host ($_ |Convertfrom-json|select -ExpandProperty \"odata.error\").message.value -ForegroundColor Red\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\nfunction Remove-NAVODataRecord()\r\n{\r\n\u00a0\u00a0\u00a0 [CmdletBinding()]\r\n\u00a0\u00a0\u00a0 param (\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVUri,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVWebService,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [String]$NAVSearchParm,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [parameter(ValueFromPipelineByPropertyName=$true)]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [PSCredential]$NAVCredentials )\r\n\u00a0\u00a0\u00a0 PROCESS\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $ETag = (Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm $NAVSearchParm -NAVCredentials $NAVCredentials).ETag\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(-not [string]::IsNullOrEmpty($ETag)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if([string]::IsNullOrEmpty($NAVCredentials)) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Delete -UseDefaultCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Headers $(New-NAVODataRestMethodHeader -ETag $ETag)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $NAVResult = Invoke-RestMethod -Uri \"$NAVUri$NavWebService($NavSearchParm)?`$format=json\" -Method Delete -Credential $NAVCredentials `\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -ContentType \"application\/json\" -Headers $(New-NAVODataRestMethodHeader -ETag $ETag)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $true\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Catch {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 write-host ($_ |Convertfrom-json|select -ExpandProperty \"odata.error\").message.value -ForegroundColor Red\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return $false\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\n##############\r\n## EXAMPLES ##\r\n##############\r\n\r\n# Required setup in NAV:\r\n# - Create Page 21 webservice called \"Customer\"\r\n\r\n\r\nCLS\r\n\r\n$NAVUserName = \"NAVDemo1\"\r\n$NAVUserPassword = \"NAVDemo1\"\r\n$NAVServerName = \"navdemo.schost.dk\"\r\n$NAVServerPort = 7052\r\n$NAVServiceInstance = \"NAV_PublicDemo\"\r\n$NAVCompany = \"CRONUS Danmark A\/S 1\"\r\n$NAVWebService = \"Customer\"\r\n\r\n$NAVCredentials = New-Object System.Management.Automation.PSCredential($NAVUserName, (ConvertTo-SecureString $NAVUserPassword -AsPlainText -Force))\r\n$NAVUri = \"https`:\/\/$NAVServerName`:$NAVServerPort\/$NAVServiceInstance\/OData\/Company('\"+[uri]::EscapeDataString($NAVCompany)+\"')\/\"\r\n\r\n#Test-NAVODataRecord\r\nwrite-host \"Test-NAVODataRecord\" -ForegroundColor Yellow\r\nTest-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm \"No='10000'\" -NAVCredentials $NAVCredentials\r\n\r\n#Get-NAVODataRecord\r\nwrite-host \"Get-NAVODataRecord\" -ForegroundColor Yellow\r\n$NAVCustomer = Get-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm \"No='10000'\" -NAVCredentials $NAVCredentials \r\n$NAVCustomer\r\n\r\n#New-NAVODataRecord\r\nwrite-host \"New-NAVODataRecord\" -ForegroundColor Yellow\r\n$NewCustomerNo = \"11111\"\r\n$NewCustomerName = \"PowerShell test\"\r\n$NewCustomer = \"{\"\"No\"\" : \"\"\" + $NewCustomerNo + \"\"\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"\"Name\"\" : \"\"\" + $NewCustomerName + \"\"\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\"\r\n\r\nNew-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVCredentials $NAVCredentials -NAVJSONFields $NewCustomer\r\n\r\n\r\n#Update-NAVODataRecord\r\nwrite-host \"Update-NAVODataRecord\" -ForegroundColor Yellow\r\n$UpdateCustomerNo = \"11111\"\r\n$UpdateCustomerName = \"Updated PowerShell test\"\r\n$UpdateCustomerAddress = \"PowerShell Street\"\r\n$UpdateCustomer = \"{\"\"Name\"\" : \"\"\" + $UpdateCustomerName + \"\"\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"\"Address\"\" : \"\"\" + $UpdateCustomerAddress + \"\"\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\" \r\nUpdate-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm \"No='11111'\" -NAVCredentials $NAVCredentials -NAVJSONFields $UpdateCustomer\r\n\r\n#Remove-NAVODataRecord\r\nwrite-host \"Remove-NAVODataRecord\" -ForegroundColor Yellow\r\nRemove-NAVODataRecord -NAVUri $NAVUri -NAVWebService $NAVWebService -NAVSearchParm \"No='11111'\" -NAVCredentials $NAVCredentials<\/pre>\n<p>Bem\u00e6rk f\u00f8lgende omkring eksemplerne:<\/p>\n<ol>\n<li>URL, brugernavn, kodeord, regnskabsnavn, port osv. er opsat til at benytte SystemConnects online Dynamics NAV 2017 demosystem. Det kr\u00e6ver ikke registrering og der er 20 regnskaber\/logins til r\u00e5dighed &#8211; s\u00e5 det kan v\u00e6re en fordel lige at skifte v\u00e6k fra nr. 1 som er opsat. Du kan l\u00e6se mere om demosystemet ved at <a href=\"http:\/\/www.systemconnect.dk\/Default.aspx?ID=858\" target=\"_blank\" rel=\"noopener noreferrer\">klikke her!<\/a><br \/>\nDemosystemet bliver formentligt \u00e6ndret til Dynamics NAV 2018 n\u00e5r den frigives, s\u00e5, det kan v\u00e6re n\u00f8dvendigt at rette oplysningerne &#8211; det kan du i givet fald l\u00e6se mere om ved at f\u00f8lge ovenst\u00e5ende link.<\/li>\n<li>De generiske funktioner burde virke mod alle NAV WebService instanser &#8211; og justerer du oplysningerne i eksemplet kan du sikkert ogs\u00e5 f\u00e5 det til at virke mod dine egen NAV server.<\/li>\n<li>Eksemplet\u00a0kr\u00e6ver at du logger ind i demosystemet og ops\u00e6tter en WebService vi kan teste\u00a0&#8211; fx via webklienten ved at <a href=\"https:\/\/navdemo.schost.dk\/NAV_PublicDemo\/\" target=\"_blank\" rel=\"noopener noreferrer\">klikke her!<\/a>\u00a0Login med NAVDemoX og kode NAVDemoX hvor X er et nummer fra 1 til 20. Husk at rette ovenst\u00e5ende eksempel til at bruge samme nummer (Login, kodeord og firmanavn skal \u00e6ndres). N\u00e5r du er logget ind skal du ops\u00e6tte en webservice kaldet &#8220;Customer&#8221; til page 21, Customer Card.<\/li>\n<li>Microsoft Excel og \u00e6ldre versioner af PowerShell kan\u00a0IKKE h\u00e5ndtere at du har skr\u00e5streg i NAV regnskabsnavne. S\u00e5 undg\u00e5 &#8220;A\/S&#8221; mv. i firmanavne i NAV. Du er velkommen til at omd\u00f8be firmanavnet p\u00e5 vores testsystemer.<\/li>\n<li>Ovenst\u00e5ende er lavet til en NAV-server der k\u00f8rer NAVUserPassword authentication. Jeg vil pr\u00f8ve at lave et senere blogindl\u00e6g om hvordan man f\u00e5r liv i ODATA med de \u00f8vrige autorisationsmetoder i NAV.<\/li>\n<\/ol>\n<p>God forn\u00f8jelse!<\/p>\n<p>Credits g\u00e5r til <a href=\"mailto:graves@kilsgaard.org\">Graves Kilsgaard<\/a> fra <a href=\"http:\/\/www.kmc.dk\" target=\"_blank\" rel=\"noopener noreferrer\">KMC<\/a> som har lavet et k\u00e6mpe benarbejde for at lave ovenst\u00e5ende funktioner. Jeg har nemlig kun hjulpet en smule :-).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jeg har tidligere skrevet lidt om at kalde NAVs WebServices fra PowerShell her, men nu kan vi tage det et skridt videre med noget benarbejde som en af mine gode venner har lavet. Helt gratis &#8211; fra os til dig &hellip; <a href=\"https:\/\/scblog.lynge.org\/?p=1105\">L\u00e6s resten <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40,41,38,32,35,36],"tags":[43,11,54,52,26,23,14,42,44,31,57,62,55],"class_list":["post-1105","post","type-post","status-publish","format-standard","hentry","category-c5-support","category-c5-teknik","category-dynamics-c5","category-dynamics-nav","category-nav-support","category-nav-teknik","tag-c5","tag-dynamics","tag-dynamics-c5","tag-dynamics-nav","tag-gratis","tag-hint","tag-microsoft","tag-nav","tag-navigator","tag-navision","tag-odata","tag-powershell","tag-webservice"],"_links":{"self":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/1105","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1105"}],"version-history":[{"count":6,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1128,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/1105\/revisions\/1128"}],"wp:attachment":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}