[gelöst]Upgrade Codeunits

17. Oktober 2016 12:56

Hallo zusammen,

ich habe ein Problem mit einem Upgrade von 2013 auf 2016 beim Kunden. Hier treffen zwei Herausforderungen beim Sync vor dem Update aufeinander:

1. Ich darf aus bestimmten Gründen den Sync nur "with Validate" machen
2. Ich muss eine alte Anwendung beim Update "herauslösen" was Felder in ca. 60 Tabellen betrifft, wobei Force die erste Wahl ist bzw. wäre.

Dazu einmal generell die Frage, was beim Force geschieht. Werden da die Update-Routinen generell nicht angesprochen oder nur bei den Tabellen nicht, die mit dem Force geändert werden?
Als weiteres wäre interessant zu wissen, wie eine Upgrade Codeunit aussieht mit der mittels Force Felder entfernt werden müssen ohne dass dabei ein Update anderer Felder derselben Tabelle passiert.
Als einfachste Lösung stelle ich mir auch vor, dass ich nach dem Import aller neuen Objekte erst einmal die Tabellen mit Force kompiliere, bei denen Felder entfernt werden sollen, und danach die gesamte Sync "with Validate" mache. Aber geht das?

Danke für die Hilfe im Voraus!

Rainer
Zuletzt geändert von rainergaiss am 20. Oktober 2016 13:37, insgesamt 1-mal geändert.

Re: Upgrade Codeunits

17. Oktober 2016 13:18

Hallo,

Bei Update solltest du generell nur mit "with Validate" oder "Later" Objekte einspielen. damit die Upgrade Tabellen gefüllt werden.
Wenn du "Later" benutzt, kannst du den Sync später über die PowerShell oder einen Compile der Tabelle(n) mit "with Validate" hinbekommen (letzteres empfiehlt sich, wenn man eine größere DB hat, und man noch Probleme erwartet. Dann compilert man das ganze häppchenweise).

Du kannst in deinen Upgrade-CUs den Check mit Force für die Tabellen konfigurieren, bei denen nur überflüssige Felder entfernt werden sollen.
Bei den anderen Tabellen kannst du entweder die zu löschenden Felder mit in die Temp-Tabelle übernehmen, und dort "vergessen", oder (hab's nicht probiert) die überflüssigen Felder vorher mit SQL-Scripten aus dem SSMS auf NAV-NULL-Werte setzen(also String='',Date=1.1.1793,..) der Snyc "with Validate" sollte dann nicht mehr auf die Nase fallen.

Gruß Fiddi

Re: Upgrade Codeunits

17. Oktober 2016 13:45

fiddi hat geschrieben:Bei Update solltest du generell nur mit "with Validate" oder "Later" Objekte einspielen. damit die Upgrade Tabellen gefüllt werden.

Heißt das, dass beim Force gar keine Upgrade-Tabellen gefüllt werden? Dann können wir das ja getrost schon einmal vergessen.

fiddi hat geschrieben:Du kannst in deinen Upgrade-CUs den Check mit Force für die Tabellen konfigurieren, bei denen nur überflüssige Felder entfernt werden sollen.

Gibt es da irgendwo ein Beispiel? Diese Variante ist die, die ich wahrscheinlich brauchen werde.

Was ist SSMS für eine Abkürzung?

Kann ich es zumindest bei den Tabellen, in denen nur Felder gelöscht werden müssen (also ohne Temp-Tabelle) nicht so machen, dass ich vor dem gesamten Sync mit Validate (und nach dem Import mit Later) die Tabellen, aus denen ich nur die Felder raushaben möchte, mit Force kompiliere?

Gruß Rainer

Re: Upgrade Codeunits

17. Oktober 2016 13:57

rainergaiss hat geschrieben:Was ist SSMS für eine Abkürzung?

Verwenden von SQL Server Management Studio

Nur die Option "With Validate" wertet 2000000135 Table Synch. Setup aus, "Force" nicht.
https://msdn.microsoft.com/en-us/library/dn757164(v=nav.90).aspx#TblModes

rainergaiss hat geschrieben:die Tabellen, aus denen ich nur die Felder raushaben möchte, mit Force kompiliere?

Das sollte gehen:
MSDN hat geschrieben:This option is intended to be used for the tables and fields that you want to discontinue.

Re: Upgrade Codeunits

17. Oktober 2016 14:04

Hallo,

Heißt das, dass beim Force gar keine Upgrade-Tabellen gefüllt werden? Dann können wir das ja getrost schon einmal vergessen.

Zitat von hier:
MSDN hat geschrieben:(Force)Table definition changes are applied to the business data table schema without validation. For destructive changes, data in columns of the business data table that are affected by changes will be deleted. This option ignores any table synchronization instructions for the table in upgrade codeunits.

Gibt es da irgendwo ein Beispiel? Diese Variante ist die, die ich wahrscheinlich brauchen werde.

Such mal in den Upgrade-CUs nach "TableSyncSetup" Da sind zumidest beim Upgrade von 2009 Beispiele drin.

Was ist SSMS für eine Abkürzung?

SQL-Server-Management-Studio

Kann ich es zumindest bei den Tabellen, in denen nur Felder gelöscht werden müssen (also ohne Temp-Tabelle) nicht so machen, dass ich vor dem gesamten Sync mit Validate (und nach dem Import mit Later) die Tabellen, aus denen ich nur die Felder raushaben möchte, mit Force kompiliere?

Das sollte funktionieren, bringt aber beim eigentlichen Update nichts, wenn du es auch in der Upgrade CU eingetragen hast. Dann kann die das auch erledigen.

P.S.: Kai war ein wenig schneller :-?

Gruß Fiddi

Re: Upgrade Codeunits

18. Oktober 2016 08:52

Hallo,

aus meiner Sicht ist der Table Sync nicht wirklich befriedigend. Denn er bezieht sich immer nur auf die gesamte Tabelle. Deshalb bleib nichts anderes übrig als in vorhinein die Modulfelder zu leeren (z. B. über SSMS) und dann mit dem Mode::Check zu überprüfen ob noch sonstige Felder von einer Löschung betroffen sind.

Gruß

Michael

Re: Upgrade Codeunits

19. Oktober 2016 14:43

Hallo,

beinahe hätte ich es geschafft. Jetzt habe ich das Problem, dass ich bei einer Tabelle das Force nicht nutzen kann weil schon ein Copy existiert. Das Einfachste wäre nun, diesen Copy alles erledigen zu lassen. Allerdings baut der Copy intern die Upgrade-Tabelle erst einmal mit allen Feldern auf, und da liegt mein Problem. Anscheinend aus Berechtigungsgründen werden Felder einer Branchenlösung (mit Nummern 5xxxxxx) nicht übertragen, die anderer Lösungen schon. Stattdessen wird der Sync mit Fehlermeldung abgebrochen. Es wäre jetzt natürlich sehr hilfreich zu wissen, wo das gesteuert wird.

Gruß
Rainer

Re: Upgrade Codeunits

19. Oktober 2016 15:06

Das Einfachste wäre nun, diesen Copy alles erledigen zu lassen. Allerdings baut der Copy intern die Upgrade-Tabelle erst einmal mit allen Feldern auf, und da liegt mein Problem. Anscheinend aus Berechtigungsgründen werden Felder einer Branchenlösung (mit Nummern 5xxxxxx) nicht übertragen, die anderer Lösungen schon. Stattdessen wird der Sync mit Fehlermeldung abgebrochen.


Wie Michael und ich schon sagten, das SSMS ist dein bester Freund :-?

Entweder du benötigst die Felder noch, dann kannst du Sie mit einen SQL-Script in (d)eine COPY- Tabelle befördern.
Wenn du sie nicht mehr benötigst, löscht du die Felder einfach mit einem SQL-Script vor dem SYNC.

Gruß Fiddi

Re: Upgrade Codeunits

20. Oktober 2016 12:59

Hallo Reiner,

du kannst natürlich auch schon vorher die Tabellen ohne diese Felder aufbauen lassen.

Gruß

Michael

Re: Upgrade Codeunits

20. Oktober 2016 13:36

Wir haben es jetzt doch noch mit ein paar Modifikationen der Upgrade-Codeunit(s) hinbekommen. Wichtig ist, dass in den Upgrade-Tabellen, deren Originaltabellen nicht mit Force geändert werden können, die Felder enthalten sind, die entfernt werden müssen. Klingt komisch, funktioniert aber.

Euch allen vielen Dank für die Hilfen!

Rainer