[gelöst] Design Pattern: Singleton

15. Juli 2009 11:35

Definition (Wikipedia):
Das Singleton (auch Einzelstück genannt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Kategorie der Erzeugungsmuster (engl. Creational Patterns). Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann. Dieses Einzelstück ist darüber hinaus üblicherweise global verfügbar. Das Muster ist eines der von der so genannten Viererbande (GoF) publizierten Muster.

Gibt es eine Möglichkeit, das zu realisieren?

Ich will, das eine Codepassage immer nur von genau einem Benutzer ausgeführt werden darf. Wenn ein zweiter die gleiche Passage ausführen will bekommt er ein Fehler (noch besser wäre hier ein Warte-Fenster: Wenn Person A den Code fertig ausgeführt hat, fängt Person B automatisch an den Code auszuführen).

Schon mal Danke für Ideen
Zuletzt geändert von mhent am 15. Juli 2009 14:06, insgesamt 1-mal geändert.

Re: Design Pattern: Singleton

15. Juli 2009 12:02

Hallo mhent,

wozu benötigst du denn diese "Semaphore", die benötigt man in NAV eigentlich sehr selten (eigentlich gar nicht).
Außerdem geht das in NAV nicht so einfach, denn der Code den du blocken willst, wird normalerweise auf zwei unterschiedlichen Rechnern ausgeführt :wink: , eine Semaphore dient im allgemeinen dazu Prozesse oder Threads für den Zugriff auf gemeinsame Resourcen auf einem Rechner zu synchronisieren.

Gruß, Fiddi

Re: Design Pattern: Singleton

15. Juli 2009 12:53

Semaphor, Singleton... - Problem bleibt das gleiche.

Es muss zu 100% sichergestellt werden, dass ein bestimmtes Stück Code exklusiv nur genau einem Benutzer zu Verfügung steht.

Hat da Navision Boardmittel oder gibt es bereits erprobten Code der dazu verwendet werden kann?

Re: Design Pattern: Singleton

15. Juli 2009 13:05

erstelle eine Tabelle mit einem Feld
USERID

Wenn ein GET fehlschlaegt schreibst du einen Datensatz mit der enstsprechenden USERID rein, machst nen commit und gehst deinen Code durch. Am ende löscht du den Code und machst wieder ein commit.


ca. Beispiel Code:
Code:
IF NOT inUse.GET() THEN BEGIN
  CLEAR(iNUser);
  inUse.INIT;
  InUse.USERID := USERID;
  inUser.INSERT;
  COMMIT;

  // blasblbalbalb..

  inUse.DELETE;
  COMMIT;
END ELSE BEGIN
  ERROR('Wird schon verwendet von %1', inUse.USERID);
END;

Re: Design Pattern: Singleton

15. Juli 2009 13:30

Hallo mhent,

ich habe das aus dem Grunde gefragt, weil NAV von sich aus durch Recordlocking/ Transaktionen verhindert, das zeitgleich Daten manipuliert werden können. Es gibt zusätzlich noch den Befehl LOCKTABLE, der für exklusiven Zugriff auf eine Tabelle gewährleistet.
Der NAS sorgt z.B. von sich aus dafür, das es keine konkurierenden Zugriffe auf Programmcode gibt.

Diese Methoden haben den Vorteil auch beim Absturz eines Clients oder des Servers ohne Eingriff wieder zu funktionieren, im Gegensatz zu Hilfstabellen mit USERID o.ä.

@ MatthiasKönig,

deine Lösung funktioniert wegen des COMMITS nur solange, bis der Code , der zwischen Setzen und Löschen der Semaphore einen ERROR ausführt, dann bleibt der durch die Sempahore geschützte Bereich blockiert, bis jemand von Hand die Tabelle löscht.
Außerdem funktioniert das ganze aus dem gleichen Grunde nur dann, wenn der Code am Anfang bzw. am Ende einer kompletten Transaktion durchgeführt wird, sonst würde es z.B. in der CU80 Probleme geben, wenn du nur das Buchen der Posten mit der Semaphore schützen wolltest und dabei ein Fehler auftritt. Die Rechnungen währen dann zwar erstellt, aber die dazugehörigen Posten nicht.

Gruß, Fiddi

Re: Design Pattern: Singleton

15. Juli 2009 14:05

Vielen Dank