Pages, prüfen ob bereits open

18. September 2014 08:07

Guten Morgen MSDynamics-Gemeinde,

Ich habe eine Funktion in einer CU, welche Dinge zum Thema Order Management erledigt und im Anschluss eine Page mit .RUNMODAL aufruft.
Problem ist, das diese Funktion ebenso in besagter Page - beim Löschen von allen Zeilen - aufgerufen wird.

Ich habe die ganze Sache gerade mal komplett durchdebuggt, und möchte nur ungern etwas am generellen Aufbau dieser Sache ändert,
ChangeLogEntry hier, ChangeLogEntry da, zurückschreiben in die Order und und und... :roll:

Jedenfalls stellt sich mir die Frage ob ich in der Funktion der CU abprüfen kann, ob die Page bereits offen ist, wenn nicht, .RUNMODAL. Geht das?

Beste Grüße,

NAV-0-Mat

EDIT: Der Grund warum mich das stört ist übrigens, dass sich die Page schließt wenn ein erneuter .RUNMODAL ausgeführt wird :!:

Re: Pages, prüfen ob bereits open

18. September 2014 08:48

NAV-0-Mat hat geschrieben:Jedenfalls stellt sich mir die Frage ob ich in der Funktion der CU abprüfen kann, ob die Page bereits offen ist

Du könntest im OnOpenPage-Trigger eine neue Funktion in einer SingleInstance-Codeunit abrufen, welche dort eine globale Boolean-Variable auf True setzt. Diese Variable kannst du ebenso abfragen.
Und beim Schließen der Page diese Variable natürlich wieder zurück setzen.

Die technische Alternative wäre ein Tabellenfeld, aber davon ist abzuraten, weil du den Wert pro User vorhalten müsstest.

Re: Pages, prüfen ob bereits open

18. September 2014 11:13

NAV-0-Mat hat geschrieben:Der Grund warum mich das stört ist übrigens, dass sich die Page schließt wenn ein erneuter .RUNMODAL ausgeführt wird :!:

Warum werden denn hier mehrere RUNMODALs hintereinander ausgeführt? Normalerweise ist ein modaler Aufruf ja dazu gedacht, um auf ein Feedback vom User zu warten.

Re: Pages, prüfen ob bereits open

18. September 2014 11:54

HattrickHorst hat geschrieben:Warum werden denn hier mehrere RUNMODALs hintereinander ausgeführt? Normalerweise ist ein modaler Aufruf ja dazu gedacht, um auf ein Feedback vom User zu warten.


Das übersteigt mein Wissen leider. Ich frage mich öfter was der externe Dienstleister da teilweise für Logiken programmiert hat... :?:
Jedenfalls ist es so, das die Funktion in der CU des Ordermanagement sowohl in einer Action verwendet wird, um die Page modal zu öffen (soweit so gut),
aber zusätzlich auch beim Löschen bestimmter Zeilen durch den Benutzer aufgerufen wird (deshalb doppelter Runmodal).

Entferne ich also den Runmodal an dieser Stelle, ist der Fehler, dass sich die Page beim Löschen der Zeilen schließt, behoben... doch öffnen funktioniert dann auch nicht mehr... :wink:

Beste Grüße,

NAV-0-Mat

Re: Pages, prüfen ob bereits open

18. September 2014 11:59

Natalie hat geschrieben:Du könntest im OnOpenPage-Trigger eine neue Funktion in einer SingleInstance-Codeunit abrufen, welche dort eine globale Boolean-Variable auf True setzt. Diese Variable kannst du ebenso abfragen.


Zum besseren Verständnis (für mich :wink: ):

Ich lege eine Mini-CU mit 2 Funktionen an, z.B. SetPageStatusOpened und SetPageStatusClosed.
In dieser CU deklariere ich eine globale boolean, die in den Funktionen jeweils true bzw. false gesetzt wird.
In der Page deklariere ich die CU global und rufe in den Open- / Close-Triggern die jeweilige Funktion auf.
In der CU Ordermanagement deklariere ich die Mini-CU ebenfalls global und prüfe den Wert der boolean ab.

Hab ich das richtig verstanden? Falls ja: Ich habe keinen Zugriff auf die globale Variable der Mini-CU, lediglich auf die Funktionen...

Beste Grüße,

NAV-0-Mat

Re: Pages, prüfen ob bereits open

18. September 2014 12:45

Nicht ganz.
In einer neuen Codeunit:
1. Ganz wichtig: setze die CU-Eigenschaft SingleInstance=Yes.
2. Deklariere die globale Variable PageIsOpen vom Typ boolean.
3. Deine neuen Funktionen heißen SetPageIsOpen(NewValue : boolean), und GetPageIsOpen : boolean.
SetPageIsOpen setzt lediglich PageIsOpen := NewValue.
GetPageIsOpen gibt lediglich den Inhalt von PageIsOpen zurück.

In deiner Page, rufst du auf:
- OnOpenPage: SetPageIsOpen(TRUE);
- OnClosePage: SetPageIsOpen(FALSE)

Nun kannst du an beliebigen Stellen die Funktion GetPageIsOpen deiner neuen Codeunit abfragen.

Re: Pages, prüfen ob bereits open

18. September 2014 13:27

Natalie hat geschrieben:Nun kannst du an beliebigen Stellen die Funktion GetPageIsOpen deiner neuen Codeunit abfragen.


Soweit so gut, habe alles verstanden.

Allerdings sagt der Debugger mir, das GetPageIsOpen im aktuellen Kontext nicht vorhanden ist.
Das Scope zeigt an, dass die boolean <Uninitialized> sei.
Ich habe überlegt die boolean an einer Stelle vorzubelegen, jedoch sollte sie doch default bereits FALSE sein oder?
Eine Codeunit initialisieren geht meines Wissens nach auch nicht...
Stehe auf dem Schlauch :/

Beste Grüße,

NAV-0-Mat

Re: Pages, prüfen ob bereits open

18. September 2014 13:46

NAV-0-Mat hat geschrieben:Eine Codeunit initialisieren geht meines Wissens nach auch nicht...

Das geht bei normalen schon mit CLEAR, aber eben nicht bei Single-Instance. Da müssen Initfunktionen für alle Variablen im Codeunit angelegt werden, die man dann aufruft.

Re: Pages, prüfen ob bereits open

19. September 2014 12:22

Hier im Bild als Beispiel die typischen Funktionsdreiergruppen (Werte setzen,löschen,lesen) eines SingleInstance-Codeunits.
SingleInstanceFunctions1.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.