[GELÖST]Abbruch Rename

21. Januar 2009 17:02

Hallo Leute,

ich versuche beim ändern eines Schlüsselfeldes, also im -Rename Trigger - der Tabelle folgenden Code auszuführen, hierbei wird ein weiterer Rename in einer anderen Tabelle ausgeführt und nur der 3 Wert (Rec.Code) soll geändert werden.
Jedoch bringt Navision beim letzten Datensatz folgende Meldung:

"Ihre Aktivität wurde durch die Änderung der Tabelle Related Items durch einen anderen Anwender blockiert.
Bitte beginnen sie die Aktivität noch einmal."

Komisch ist jedoch, dass ich alleine auf der DB arbeite und auch die Tabelle nicht geändert habe UND dass bis auf den letzten Datensatz alle RelatedItems geändert wurden, dass liegt aber meiner Meinung nach an einem Commit, dass beim Rename eines records gemacht wird.

Code:
IF Rec.Code <> xRec.Code THEN
  RelatedItems.SETRANGE("Table ID",50001);
  RelatedItems.SETRANGE("No.",xRec.Code);
  IF RelatedItems.FIND('-') THEN
    REPEAT
        RelatedItems.RENAME(50001,RelatedItems.Type,Rec.Code,RelatedItems."Line No.");   
    UNTIL RelatedItems.NEXT = 0;


Bitte um Hilfe....

Gruß
Zuletzt geändert von Malhody am 21. Januar 2009 17:15, insgesamt 1-mal geändert.

Re: Abbruch Rename

21. Januar 2009 17:05

Ersetze RENAMEs wo es nur geht durch DELETE + INSERT.

Falls jetzt Related Items wiederum unter OnRename einen Inhalt halt, sollte der in deinem o.g. Quelltext durch Nachprogrammierung ebenfalls ausgeführt werden.

Re: Abbruch Rename

21. Januar 2009 17:10

i'll try

edit:

meinst du allgemein sollte rename durch delete + insert ersetzt werden??

Re: Abbruch Rename

21. Januar 2009 17:36

Malhody hat geschrieben:meinst du allgemein sollte rename durch delete + insert ersetzt werden??

Wie gesagt, überall wo es nur geht. Und ob es geht, muss im Einzelfall geprüft werden.

Re: [GELÖST]Abbruch Rename

21. Januar 2009 17:44

Ach übrigens, das hier ist ganz "böse":

Code:
  IF RelatedItems.FIND('-') THEN
    REPEAT
       RelatedItems.RENAME(50001,RelatedItems.Type,Rec.Code,RelatedItems."Line No.");   
    UNTIL RelatedItems.NEXT = 0;


Störe niemals den Schleifendurchlauf; arbeite mit einer zusätzlichen Recordvariable:

Code:
  IF RelatedItems.FIND('-') THEN
    REPEAT
       RelatedItems2 := RelatedItems;
       RelatedItems2.RENAME(50001,RelatedItems2.Type,Rec.Code,RelatedItems2."Line No.");   
    UNTIL RelatedItems.NEXT = 0;


Vielleicht löst das schon dein Problem.

Re: [GELÖST]Abbruch Rename

21. Januar 2009 20:01

Dein Beispiel ist tödlich, selbst Natalies Beispiel halte ich für gewagt :twisted:
Wie siehts mit sowas aus? Alternativ auch per DELETE/INSERT.

Code:
IF Rec.Code <> xRec.Code THEN BEGIN
 
  RelatedItems.SETRANGE("Table ID",50001);
  RelatedItems.SETRANGE("No.",xRec.Code);

  IF NOT RelatedItems.ISEMPTY THEN BEGIN
    RelatedItems.FINDSET;

    REPEAT
      TempRelatedItems := RelatedItems;
      TempRelatedItems.INSERT;
    UNTIL RelatedItems.NEXT = 0;

    TempRelatedItems.FINDSET;

    REPEAT
      RelatedItems.GET(50001, TempRelatedItems.Type,xRec.Code,TempRelatedItems."Line No.");
      RelatedItems.RENAME(50001,TempRelatedItems.Type,Rec.Code,TempRelatedItems."Line No.");   
    UNTIL TempRelatedItems.NEXT = 0;

  END;

END;

Re: [GELÖST]Abbruch Rename

21. Januar 2009 20:08

Dann halte ich das aber für überflüssig, weil eine Datenbankabfrage zuviel ;-)
Code:
IF NOT RelatedItems.ISEMPTY THEN BEGIN
    RelatedItems.FINDSET;

Re: [GELÖST]Abbruch Rename

21. Januar 2009 21:12

Hmm, grundsätzlich richtig. Ist aber bei einer potentiell öfter mal leeren Auswahl schneller :)

Im Fall des OnDelete() Triggers und dem Löschen von abhängigen Tabellen ist es sogar fast ein Muss vor dem DELETEALL() ein NOT ISEMPTY zu setzen, da sonst ggf. auch bei leeren Tabellen bzw. leerer Auswahl ein Lock vom SQL Server gesetzt wird. Ich meine mich erinnern zu können den Jörg Stryk bei einem Kunden mal fluchen gehört zu haben in einem ähnlichen Fall. :D

Kommt halt auch etwas auf die persönliche Vorliebe an. In diesem Fall ist es sogar insgesamt "unnötig" mit so vielen Zeilen, da die usrpüngliche Filterung die neuen Datensätze nicht mit einschließt und es keine Nebeneffekte geben kann. Geht also auch mit deiner zweiten Instanz problemlos.

Re: [GELÖST]Abbruch Rename

27. Februar 2009 16:33

Ersetze RENAMEs wo es nur geht durch DELETE + INSERT.


An Natalie: Wieso sollte RENAME durch DELETE + INSERT ersetzt werden? Dauert etwa RENAME länger?

Dein Beispiel ist tödlich, selbst Natalies Beispiel halte ich für gewagt
Wie siehts mit sowas aus? Alternativ auch per DELETE/INSERT.


An Carsten: Hab noch sehr wenig Erfahrung mit Navision. Was würde beim schlimmsten Fall passieren, wenn ich keine Temp-Tabelle nehme?

Gruss
Michelle