[Gelöst]Felder per Report umnummerieren

19. März 2013 14:07

Hallo zusammen

Wir sind dabei eine Branchenlösung als Add-On zu implementieren und müssen dazu in zahlreichen Standard-Tabellen die Felder vom 50000er Bereich in den lizenzierten Bereich (3059000) verschieben. Ich möchte dafür einen Report erstellen mit dem dies automatisch ausgeführt werden kann. Der Ansatz ist simple: Einfach über das DataSource "Field" auf "No." zuzugreifen und diese OnAfterGetRecord neu setzen (siehe Beispiel --> Tabelle 50999 mit einem Feld):

Field - OnPreDataItem()
SETRANGE(TableNo,50999);

Field - OnAfterGetRecord()
"No." := 3059000;
Modify;

Es erscheint jedoch die Fehlermeldung:
Field existiert nicht. Identifizierende Felder und Werte: TableNo='50999',No.='3059000' TableNo: 50999

Hat das was damit zu tun, dass es sich um ein Key Feld handelt?
Mit Rename (50999,3059000) funktioniert es auch nicht....


Für samtliche Infos, Tips und Anregungen bin ich sehr dankbar.
Vielen Dank und liebe Grüsse, Martin
Zuletzt geändert von martin77 am 23. April 2013 13:35, insgesamt 1-mal geändert.

Re: Felder per Report umnummerieren

20. März 2013 14:04

Das geht leider so einfach nicht. Field ist eine sog. Virtuelle Tabelle.
NAV Online Help hat geschrieben:A virtual table contains information provided by the system. In C/SIDE, you have access to a number of virtual tables. They work in much the same way as normal database tables, but you cannot change the information in them. That is, you can only read the information. Another difference is that virtual tables are not stored in the database (as normal tables are) but are computed by Microsoft Dynamics NAV at run time.


Die Daten in den Feldern müßten ja auch "verschoben" werden. Daher müßte die richtige Vorgehensweise grob umrissen etwa so aussehen:
  1. Gesamtsicherung des System machen
  2. Daten temporär wegsichern
  3. Felder leeren
  4. Objekte ändern, falls möglich als Textexport, dann in den Textdateien die Feldnr. suchen und ersetzen, anschließend wieder importieren und kompilieren
  5. Daten in die "neuen" Felder zurücksichern

Natürlich kann 4. schon entsprechend vorbereitet werden. Außerdem gibt es diverse Tools, die einen bei den einzelnen Punkten unterstützen, wenn man nicht alles neu machen möchte.

Re: Felder per Report umnummerieren

21. März 2013 11:17

Ich glaube der OMA nimmt diese Arbeit ab. Es gibt extra ein Renumber Field Worksheet feature.

Re: Felder per Report umnummerieren

21. März 2013 11:57

Das müsste (zumindest in 2009, außer bei Schlüsselfeldern) schon mit der Tabelle Field gehen, aber mit Feld kopieren -> Kopie an neuer "No." einfügen -> altes Feld löschen.

Re: Felder per Report umnummerieren

21. März 2013 18:06

McClane hat geschrieben:Das müsste (zumindest in 2009, außer bei Schlüsselfeldern) schon mit der Tabelle Field gehen, aber mit Feld kopieren -> Kopie an neuer "No." einfügen -> altes Feld löschen.

Kannst du das mal bitte genauer erklären. Kenne diese Möglichkeit bisher nicht, wäre aber hochinteressant.

Re: Felder per Report umnummerieren

21. März 2013 18:44

So in etwa:
Code:
Field.get(TableNo, FieldNo);
Field2 := Field;
Field2."No." := NeueFieldNo;
Field.delete;
Field2.insert;

Das klappt aber wie gesagt nur, wenn das Feld in keinem Schlüssel vorkommt. Dafür müsste man noch die Tabelle Key bearbeiten können, aber da bekomme ich den Fehler, dass ich nichts löschen darf.

Re: Felder per Report umnummerieren

21. März 2013 18:56

Kann sein, daß ich jetzt gerade völlig auf dem Schlauch stehe, aber das geht doch nur, wenn das Feld leer ist.

Re: Felder per Report umnummerieren

21. März 2013 19:55

HattrickHorst hat geschrieben:Kann sein, daß ich jetzt gerade völlig auf dem Schlauch stehe, aber das geht doch nur, wenn das Feld leer ist.

Natürlich :)

Re: Felder per Report umnummerieren

22. März 2013 09:52

Achso, dann war das als Alternative zum Textexport gedacht.

Re: Felder per Report umnummerieren

22. März 2013 12:48

Im Report musst Du quasi folgende Logik programmieren:
Datensatz von Field von dem 50000er Feld nehmen, Kopie auf die neue Feldnummern anlegen. Achtung, anderer Name ist nötig.
Dann die Daten von Quellfeld in das neue Feld verschieben, dann das Quellfeld löschen.
Dazu benötigst Du die Tabelle Field und den einen oder anderen RecRef/FieldRef.

Re: Felder per Report umnummerieren

26. März 2013 11:25

JanGD hat geschrieben:Im Report musst Du quasi folgende Logik programmieren:
Datensatz von Field von dem 50000er Feld nehmen, Kopie auf die neue Feldnummern anlegen. Achtung, anderer Name ist nötig.
Dann die Daten von Quellfeld in das neue Feld verschieben, dann das Quellfeld löschen.
Dazu benötigst Du die Tabelle Field und den einen oder anderen RecRef/FieldRef.


Hallo. Vielen Dank für Eure Inputs! Es gibt noch eine weiter Falle: Beim Kopieren des Feldes geht leider der Code im Trigger dazu verloren, da dieser nicht mitkopiert wird...
Ich gehe davon aus, dass das daran liegt, dass es sich bei der Fields-Tabelle um eine virtuelle Tabellen handelt. Kennt jemand dieses Problem, bzw. gibts hierfür eine Lösung?

Re: Felder per Report umnummerieren

26. März 2013 12:22

Man kann auch Umnummerieren, wenn das Feld in allen Mandanten leer ist, dann sollte der Trigger erhalten bleiben. D.h. folgendermaßen:
  1. Daten vom individuellen Feld in ein temporäres Feld kopieren
  2. Individuelles Feld leeren
  3. Individuelles Feld umnummerieren
  4. Daten vom temporären Feld in individuelles Feld mit neuer Nummer verschieben
  5. Temporäres Feld wieder löschen

Re: Felder per Report umnummerieren

2. April 2013 14:31

HattrickHorst hat geschrieben:Man kann auch Umnummerieren, wenn das Feld in allen Mandanten leer ist, dann sollte der Trigger erhalten bleiben. D.h. folgendermaßen:
  1. Daten vom individuellen Feld in ein temporäres Feld kopieren
  2. Individuelles Feld leeren
  3. Individuelles Feld umnummerieren
  4. Daten vom temporären Feld in individuelles Feld mit neuer Nummer verschieben
  5. Temporäres Feld wieder löschen


Vor dem gleichen Problem stehe ich auch.
Wenn man versucht das ohne OMA-Tools zu automatisieren und man das wie oben Beschrieben in der Field-Tabelle macht, dann wird der komplette Trigger-Inhalt einfach weggelassen.
Wir haben das bis jetzt (wenn auch ein wenig umständlich) so gelöst:

- Tabelle mit allen Feldern des Add-on´s und den Key-Feldern der Tabelle. Zusätzlich eine Laufende Nummer um wirklich eine 1:1 Verknüpfung zu generieren.
- CodeUnit die aus den Tabellen die Informationen ausliest und anschließend löscht (nach Prüfung und Filterung auf Felder mit Inhalt und auf alle Mandanten!)
- Dann per Hand die Felder und Key´s renumbern (ca. 35 Standard-Tabellen sind bei uns betroffen, ich brauche dafür ca. 25 Minuten)
- Dann mittels der oben erwähnten Codeunit alle Informationen aus der Tabelle in die Standardtabelle einlesen und gegenprüfen.

Ich habe das ca. 8x bei einer Datenbank mit 7 Mandanten und einem Volumen von 160GB geprüft und es funktioniert bis jetzt einwandfrei.
In den ca. 35 Tabellen die uns betreffen sind in der Datenbank ca. 9.000.000 Datensätze, wovon 160.000 Datensätze betroffen sind.

Falls Du Hilfe brauchst, ich bin gerade voll in dem Thema :-)

Gruß
Sascha