[Gelöst] OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 08:31

Guten Morgen!

Es ist wiedereinmal wie folgt:
Es existieren X Mandanten und nur einer der Mandanten darf Artikel anlegen/bearbeiten. Da allerdings die Tabelle Item mehr oder weniger (!!) Intercompany ist, muessen diese synchronisiert werden. Ich versuche dies zurzeit im OnModify Trigger der Tabelle Item zu realisieren.
Der Code, der auf der in der Item Tabelle enhalten ist, geht ueber die Tabelle Company (ausgenommen dem einen Mandanten) und fuegt den Artikel ein oder updated die Daten in jedem Mandanten. Beim Updaten von der Artikelkarte aus kommt leider folgender Fehler:

---------------------------
Microsoft Dynamics NAV Classic
---------------------------
Ein anderer Anwender hat den Datensatz für diese Artikel geändert, nachdem er angezeigt wurde.

Geben Sie Ihre Änderungen noch einmal in das aktualisierte Fenster ein oder nehmen Sie die unterbrochene Aktivität wieder auf.

Identifizierende Felder und Werte:

Nr.='XYZ'

---------------------------
OK
---------------------------


Leider hat kein GETLATESTVERSION, COMMIT oder LOCKTABLE was gebracht. Hat jemand von euch eine Idee?

Gruß,
Matthias
Zuletzt geändert von MatthiasKönig am 4. August 2010 12:49, insgesamt 3-mal geändert.

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 08:41

MatthiasKönig hat geschrieben:Ich versuche dies zurzeit im OnModify Trigger der Tabelle Item zu realisieren.

Kannst du uns den Code zeigen?
Bedenke, dass du bei CHANGECOMPANY keine Trigger und Funktionen für den Zielmandanten verwenden kannst; nur stumpf Felder ohne Validierung füllen/leeren und INSERT/MODIFY/DELETE ohne Trigger.

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:04

Code:
CompanyInformation.CHANGECOMPANY(CompanyNameText);
CompanyInformation.GET;
// nur Mandanten in dennen auch Synchronisiert wird
IF CompanyInformation."Item Synchronize" THEN BEGIN
  Item.CHANGECOMPANY(CompanyNameText);
  // Dieser Artikel in anderen Mandanten
  IF NOT Item.GET("No.") THEN BEGIN
    Item.RESET;
    Item := Rec;
    Item.INSERT(FALSE);
  END ELSE BEGIN
    Item := Rec; 
    Item.MODIFY(FALSE);
  END;
END;

Das ist eine Funktion, die von einer anderen aufgerufen wird, um durch die Mandanten zu laufen.

Mit den Triggern ist mir bewusst :(

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:07

MatthiasKönig hat geschrieben:Mit den Triggern ist mir bewusst :(

Und warum machst du dann das hier? ;-)
Code:
Item.CHANGECOMPANY(...);
Item.INSERT(FALSE);


Natalie hat geschrieben:und INSERT/MODIFY/DELETE ohne Trigger.

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:29

FALSE! :) der soll den inserten :D

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:35

MatthiasKönig hat geschrieben:FALSE! :) der soll den inserten :D

False ist zwar der Standardwert, aber ich bin mir nicht sicher, ob durch das explizite (FALSE) nicht doch wieder im aktuellen Mandant agiert wird - deine Fehlermeldung spricht dafür! Verwende zur Sicherheit nur Item.INSERT;

Außerdem gehe ich stark davon aus, dass du sicherstellst, dass CompanyNameText nicht versehentlich leer ist und so wieder im aktuellen Mandanten agierst?

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:52

Die Frage ist auch, was "Item.RESET" an dieser Stelle alles "resettet".
Eigentlich ist der RESET hier nicht erforderlich. Was passiert, wenn Du die Zeile weglässt?

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 09:56

woger hat geschrieben:Die Frage ist auch, was "Item.RESET" an dieser Stelle alles "resettet".

Dies hat keine Auswirkungen auf CHANGECOMPANY.
Onlinehilfe hat geschrieben:The CHANGECOMPANY function is not affected by the RESET Function (Record). You can deselect a company by making a new call to CHANGECOMPANY or by using the CLEAR Function.

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 10:19

ehm False sagt doch nur aus, das der Trigger nicht(!!) durchlaufen wird. Sehe da nicht den Grund den Parameter weg zu lassen.

edit: args dachte es gelöst zu haben....Fehler tritt wieder auf >.<

Re: OnModify Artikel Synchronisation-"Ein anderer Anwender h

4. August 2010 10:26

MatthiasKönig hat geschrieben:edit: args dachte es gelöst zu haben....Fehler tritt wieder auf >.<

Und wenn du es ohne explizites (FALSE) probierst (wowohl beim INSERT als auch MODIFY), nur zur Sicherheit ...?
Und was war nun mit
Natalie hat geschrieben:Außerdem gehe ich stark davon aus, dass du sicherstellst, dass CompanyNameText nicht versehentlich leer ist und so wieder im aktuellen Mandanten agierst?

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 10:38

das war ein Fehler fehler (mit Name leer :/) aber das ist es nun auch nicht mehr.
Nachdem ich die Parameter entfernt habe, passiert das selbe wie vorher.
Komisch ist, dass neu angelegte Artikel funktionieren und zuvor exisitierende nicht. Was könnte das nur sein?! :/

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 10:44

MatthiasKönig hat geschrieben:Komisch ist, dass neu angelegte Artikel funktionieren und zuvor exisitierende nicht.

Allerdings :shock:
Macht das hier vielleicht einen Unterschied?
Code:
...
END ELSE BEGIN
  Item.TRANSFERFIELDS(Rec); 
  Item.MODIFY;
END;

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 10:53

MatthiasKönig hat geschrieben:Ich versuche dies zurzeit im OnModify Trigger der Tabelle Item zu realisieren.


Nur ein Vermutung:
Ist das evtl. so das die Funktion den OnModify Trigger auslöst und sich dann wieder dadurch selber aufruft usw.?

MatthiasKönig hat geschrieben:Komisch ist, dass neu angelegte Artikel funktionieren und zuvor exisitierende nicht. Was könnte das nur sein?! :/


mfg,
winfy

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 11:44

Ausgehend davon, dass entweder CompanyInformation oder auch Company eine Ebene höher in folgender Manier durchlaufen wird:

Code:
Company.SETFILTER(Name, '<>%1', COMPANYNAME);
Company.FINDSET;
REPEAT
UNTIL Company.NEXT = 0;


Oder in jedem Mandanten die Tabelle CompanyInformation die aktuelle ausschließt oder zumindest auf "Nicht synchronisieren" steht, könnte eventuell folgendes Konstrukt noch helfen:

Code:
CompanyInformation.CHANGECOMPANY(CompanyNameText);
CompanyInformation.GET;
// nur Mandanten in dennen auch Synchronisiert wird
IF CompanyInformation."Item Synchronize" THEN BEGIN
  Item.CHANGECOMPANY(CompanyNameText);
  // Dieser Artikel in anderen Mandanten
  IF NOT Item.GET("No.") THEN BEGIN
    Item2.GET("No.");
    Item.RESET;
    Item := Item2;
    Item.INSERT(FALSE);
  END ELSE BEGIN
    Item2.GET("No.");
    Item := Item2; 
    Item.MODIFY(FALSE);
  END;
END;

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 11:56

Hi!

Also ich hab es gerade mal in einer sauberen CRONUS-Standard-DB geprüft und es funktioniert tadellos. Hier nochmal mein Code:

Code:
Company.RESET;
Company.SETFILTER(Name,'<>%1',COMPANYNAME);
IF Company.FINDSET THEN
  REPEAT
    CompanyInformation.CHANGECOMPANY(Company.Name);
    CompanyInformation.GET;
    IF CompanyInformation."Item Synchronize" THEN BEGIN
      Item.CHANGECOMPANY(Company.Name);
      IF NOT Item.GET("No.") THEN BEGIN
        Item.RESET;
        Item := Rec;
        Item.INSERT(FALSE);
      END ELSE BEGIN
        Item := Rec;
        Item.MODIFY(FALSE);
      END;
    END;
  UNTIL Company.NEXT = 0;

Demnach würde ich sagen, dass es wahrscheinlich an einer anderen Programmierung/Anpassung liegt, die in der Datenbank vorgenommen worden ist.

Gruß, Marc

Re: OnModify Artikel Synchr. -"Ein anderer Anwender"

4. August 2010 12:48

@Marc
erstma hi ;)
Das laeuft aber nur unter NAV Native oder?


@Topic
Meine Lösung, die zurzeit anscheinend funktioniert:
Code:
CompanyInformation.CHANGECOMPANY(CompanyNameText);
CompanyInformation.GET;
// nur Mandanten in dennen auch Synchronisiert wird
IF CompanyInformation."Item Synchronize" THEN BEGIN
  Item.LOCKTABLE;
  SELECTLATESTVERSION;
  Item.CHANGECOMPANY(CompanyNameText);
  // Dieser Artikel in anderen Mandanten
  IF NOT Item.GET("No.") THEN BEGIN
    Item.RESET;
    Item := Rec;
    Item.INSERT(FALSE);
  END ELSE BEGIN
    Item.TRANSFERFIELDS(Rec, FALSE);
    Item."No." := Rec."No.";
    Item.MODIFY(FALSE);
  END;
END;

Dies egeht natuerlich alle Mandanten <> COMPANYNAME durch :)

das LOCKTABLE und SELECTLATESTVERSION ist evtl. einfach nur "sicher-ist-sicher"!

Danke an alle Beteiligten :)

Re: [Gelöst] OnModify Artikel Synchr. -"Ein anderer Anwender

10. September 2018 10:29

Hallo zusammen

Hatte genau dasselbe Problem, aber unter Version 2016. Die Lösung hier hat's genau getroffen, obwohl das bereits ein paar Jahre her ist.

Schon cool, diese Wissensdatenbank hier, herzlichen Dank mal an dieser Stelle an alle die hier mithelfen und mitschreiben, macht das NAV-Leben einfacher :-D :-D :-D