Änderung eines Primärschlüsselfeldes

27. November 2014 11:17

GELÖST
Hallo zusammen,

bin neu hier und auch noch recht neu im NAV.

Folgendes Problem stellt sich mir:

Tabelle mit einem zweiteiligen Primärschlüssel (Felder Code und Startdatum) (Über 20.000 Datensätze).
Ich habe nun die Aufgabe das Startdatum (z.B. von 01.01.2014 auf 01.01.2013) zu ändern.

Wie löse ich das Problem, da ich weder mit Dataport noch mit Report (Stapellauf) weitergekommen bin. Ich wäre um ein Musterbeispiel in C/AL dankbar.

Vielen Dank

Michael
Zuletzt geändert von Rossi am 14. Juli 2017 16:00, insgesamt 1-mal geändert.

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 11:32

Herzlich Willkommen bei uns!

Wann immer Feldwerte des Primärschlüssels geändert werden sollen, ist dies eine Umbenennung (Rename). Es ist dann das Gleiche, als würdest du z.B. eine Artikelnummer ändern.
Umbenennungen sind nicht nur recht inperformant, sondern bergen auch ein gewisses Risiko für andere Tabellen, die mit der aktuellen verknüpft sind.

Daher sollte immer zuerst sicher gestellt sein, dass diese Umbenennung nicht zusätzliche Probleme auslösen würde. Da ich weder eure Tabelle noch eure Umgebung kenne, müsst ihr euch die Frage selber beantworten.

Ab dann sind zwei verschiedene Wege denkbar, das kannst du mit einem Report oder einer Codeunit realisieren:
  1. Anstatt die Umbennenung vorzunehmen, fügst du pro Code einen weiteren Datensatz mit Startdatum 01.01.2013 sein. Dann habt ihr aber doppelt so viele Datensatze wie vorher.
  2. Wenn faktsich wirklich eine Umbenennung vorgenommen werden muss, würde ich das nicht über die RENAME-Funktion machen, sondern wie in Schritt 1 über eine Neuanlage von Datensätzen - und die Datensätze mit dem falschen Datum werden im Anschluss gelöscht.

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 12:19

Vielen Dank für den Hinweis auf den ersten großen Fehler, den ich gemacht habe.
RENAME. Ich habe hier mit MODIFY gearbeitet.

Es ist richtig, dass es auf die Performance geht aber wenn ich nicht über RENAME das mache, könnte ich den Bezug zu bestehenden Datensätzen, die mit dieser Tabelle verbunden sind, verlieren.
Es funktioniert aber trotzdem nicht.

Hier mein Code in der Codeunit:

OnRun()
CLEARALL;
Kommune.RESET; //(Kommune ist eine globale Record-Variable auf die Tabelle Commune)

Startalt := '01.01.2014'; //Startalt und -neu sind globale Textvariablen
Startneu := '02.01.2014';
EVALUATE(Datealt,Startalt); //Datealt und -neu sind globale Date-Variablen
EVALUATE(Dateneu,Startneu);

Kommune.SETRANGE("Starting Date",Datealt); //Abfilterung der kompletten Tabelle auf alle Datensätze mit Startdatum = 01.01.2014
Kommune.FINDSET;

REPEAT;
Kommune."Starting Date" := Dateneu; //Ändern
Kommune.RENAME(TRUE); //Änderung durchführen

UNTIL Kommune.NEXT = 0; //Bis kein Datensatz in diesem FINDSET mehr vorhanden ist.
EXIT;

Folgender Fehler erscheint:

Eine Typkonvertierung des Ausdrucks Boolean in einen Code-Wert ist nicht möglich!

?!?!?
Sorry für meine umständliche Herangehensweise!

VG
Michael

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 12:30

Dem Rename - Befehl werden die zu ändernden Primärschlüsselfelder direkt übergeben.
Code:
[Ok :=] Record.RENAME(Value1, [Value2],...)

Also wäre es so richtig
Code:
...
REPEAT;
  Kommune.RENAME(Code, Dateneu); //Änderung durchführen
UNTIL Kommune.NEXT = 0;
...

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 12:38

Vielen Dank! Funktioniert!

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 13:28

Hallo,

alternativ zum RENAME kann auch mit einer zweiten Record-Variable und INSERT/DELETE gearbeitet werden.

z.B.
Code:
if Record1.findset then
  repeat
    Record2 := Record1;
    Record2."Starting Date" := Startneu;
    IF Record2.insert(true) then
      Record1.delete(true);
  until Record1.next = 0;

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 13:48

JRenz hat geschrieben:alternativ zum RENAME kann auch mit einer zweiten Record-Variable und INSERT/DELETE gearbeitet werden.

Das geht zwar wesentlich schneller, aber es werden dabei im Gegensatz zum RENAME keine Werte in anderen Tabellen mitgeändert, die ggf. eine Beziehung zu den/m Felder(n) des Primärschlüssels haben. Das muss dabei also immer vorab geprüft werden, sonst drohen Inkonsistenzen in der Datenbank.

Re: Änderung eines Primärschlüsselfeldes

27. November 2014 13:52

Wahrscheinlich macht es auch beim Lösungsansatz von m_schneider Sinn, für den eigentlichen RENAME eine weitere Recordvariable zu verwenden, damit man beim FIND-NEXT in der richtigen Sortierreihenfolge bleibt.

Re: Änderung eines Primärschlüsselfeldes

25. September 2019 08:09

Hallo Leute

Klappt irgendwie alles nicht... Nach wie vor ist meine Tabelle Verkaufspreis nicht gefüllt.

Herzliche Grüße

BotoxWade

Re: Änderung eines Primärschlüsselfeldes

25. September 2019 08:19

Guten Morgen,

kannst du uns denn deinen Quellcode teilen, damit man erkennen kann, was wie wo nicht läuft?
Ins Blaue raten hilft hier recht wenig :)

Re: Änderung eines Primärschlüsselfeldes

25. September 2019 09:00

sweikelt hat geschrieben:kannst du uns denn deinen Quellcode teilen,

Der aktuelle Fall dazu ist hier.