{"id":904,"date":"2016-06-01T20:23:45","date_gmt":"2016-06-01T18:23:45","guid":{"rendered":"http:\/\/blog.systemconnect.dk\/?p=904"},"modified":"2016-03-27T11:48:39","modified_gmt":"2016-03-27T09:48:39","slug":"hoenen-og-aegget","status":"publish","type":"post","link":"https:\/\/scblog.lynge.org\/?p=904","title":{"rendered":"H\u00f8nen og \u00e6gget"},"content":{"rendered":"<p>Eller historien om at slette Dynamics NAV objekter udenfor din licens.<\/p>\n<p>Har du opgraderet \u00e6ldre NAV&#8217;er ved du at det kan v\u00e6re noget dj\u00e6velsk drilagtigt skidt, hvis man kommer ud for at der er et &#8211; eller flere &#8211; objekter man bare SKAL af med.<\/p>\n<p>Fors\u00f8g ALTID at slette objekterne b\u00e5de med kundens- og din udvikler-licens.<br \/>\nPr\u00f8v endda med en anden kundens licens (alts\u00e5 naturligvis en kunde der ogs\u00e5 har ISV-modulet i sin licens).<\/p>\n<p>&nbsp;<\/p>\n<p>Fejler alt andet, s\u00e5 hermed en brute force metode:<\/p>\n<p>Brug af f\u00f8lgende kode og metode er HELT p\u00e5 din egen regning og risiko. Vi garanterer kun at du er helt p\u00e5 egen h\u00e5nd hvis det g\u00e5r galt.<\/p>\n<p>K\u00f8rslen afvikles i NAV, men laver en TXT-fil med SQL-kommandoer. Disse skal s\u00e5 have tilf\u00f8jet et &#8220;USE &lt;databasenavn&gt;&#8221; og et &#8220;GO&#8221; som de f\u00f8rste to linjer, men kan derefter afvikles p\u00e5 SQL-serveren.<br \/>\n&#8230;og ta&#8217; lige og stop dine NAV instanser mens du g\u00f8r det s\u00e5 de ikke bliver forvirrede:<\/p>\n<pre>OBJECT Codeunit 90000 SC ISV Object Killer\r\n{\r\n\u00a0 OBJECT-PROPERTIES\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 Date=29-01-16;\r\n\u00a0\u00a0\u00a0 Time=22:12:43;\r\n\u00a0\u00a0\u00a0 Modified=Yes;\r\n\u00a0\u00a0\u00a0 Version List=SC1.00;\r\n\u00a0 }\r\n\u00a0 PROPERTIES\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 OnRun=VAR\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Company@1000000009 : Record 2000000006;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Object@1000000000 : Record 2000000001;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 FileManagement@1000000008 : Codeunit 419;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile@1000000001 : File;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ConvertFrom@1000000002 : TextConst 'ENU=.\"\\\/''%][';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ConvertTo@1000000003 : TextConst 'ENU=________';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SqlTableName@1000000004 : Text;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFilename@1000000006 : Text;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SaveToFilename@1000000007 : Text;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TableNo@1000000005 : Integer;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Object.SETFILTER(Type,'&lt;&gt;%1&amp;&lt;&gt;%2',Object.Type::FieldNumber,Object.Type::TableData);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Object.SETRANGE(ID,1000000,98999999);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IF Object.FINDSET THEN BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFilename := FileManagement.ServerTempFileName('txt');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.TEXTMODE(TRUE);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.CREATE(OutFilename,TEXTENCODING::Windows);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 REPEAT\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IF Object.Type = Object.Type::Table THEN BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLEAR(Company);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IF Company.FINDSET THEN BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 REPEAT\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SqlTableName := '[dbo].['+CONVERTSTR(Company.Name,ConvertFrom,ConvertTo)+'$'+CONVERTSTR(Object.Name,ConvertFrom,ConvertTo)+']';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.WRITE('DELETE FROM '+SqlTableName);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UNTIL Company.NEXT = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 TableNo := Object.ID;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.WRITE('DELETE FROM [dbo].[Object] where (Type BETWEEN 0 AND 1) AND ID = '+FORMAT(TableNo));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.WRITE('DELETE FROM [dbo].[Object Metadata Snapshot] where Type = 1 AND ID = '+FORMAT(TableNo));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IF Object.Type = Object.Type::Table THEN BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLEAR(Company);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IF Company.FINDSET THEN BEGIN\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 REPEAT\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SqlTableName := '[dbo].['+CONVERTSTR(Company.Name,ConvertFrom,ConvertTo)+'$'+CONVERTSTR(Object.Name,ConvertFrom,ConvertTo)+']';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.WRITE('DROP TABLE '+SqlTableName);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UNTIL Company.NEXT = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.WRITE('');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UNTIL Object.NEXT = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 OutFile.CLOSE;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SaveToFilename := 'RunMeOnSQLServer.txt';\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DOWNLOAD(OutFilename,'Run this file on the SQL server','','Text file(*.txt)|*.txt',SaveToFilename);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END;\r\n\u00a0 }\r\n\u00a0 CODE\r\n\u00a0 {\r\n    BEGIN\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/SC1.00 ISV Object Killer\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 END.\r\n\u00a0 }\r\n}<\/pre>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Eller historien om at slette Dynamics NAV objekter udenfor din licens. Har du opgraderet \u00e6ldre NAV&#8217;er ved du at det kan v\u00e6re noget dj\u00e6velsk drilagtigt skidt, hvis man kommer ud for at der er et &#8211; eller flere &#8211; objekter &hellip; <a href=\"https:\/\/scblog.lynge.org\/?p=904\">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":[41,38,32,36],"tags":[11,52,26,23,14,42,44,31,28,20],"class_list":["post-904","post","type-post","status-publish","format-standard","hentry","category-c5-teknik","category-dynamics-c5","category-dynamics-nav","category-nav-teknik","tag-dynamics","tag-dynamics-nav","tag-gratis","tag-hint","tag-microsoft","tag-nav","tag-navigator","tag-navision","tag-sql","tag-udokumenteret"],"_links":{"self":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/904","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=904"}],"version-history":[{"count":1,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/904\/revisions"}],"predecessor-version":[{"id":905,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=\/wp\/v2\/posts\/904\/revisions\/905"}],"wp:attachment":[{"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scblog.lynge.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}