In unserem vorherigen Blog-Beitrag haben wir bereits Die Grundlagen des neuen Workflow-Moduls erklĂ€rt. Der jetzige Blog-Beitrag dagegen ist eine Schritt-fĂŒr-Schritt-An­leitung um das Workflow-Modul um neue Workflow-Ereignisse und -Antworten zu erweitern und richtet sich an Dynamics NAV-Entwickler/innen.

Um beim Lesen dieser umfang­rei­chen Anleitung nicht den „roten Faden“ zu verlieren, haben wir sie mithilfe fol­gen­der Kapiteln strukturiert:

1. Eigene Workflow-Ereignisse erstellen
  1.1. Erstellen der Publisher-Funktion „SetDefaultsWorkflow“
  1.2. Erstellen der Codeunit „My Workflow Event“
  1.3. Erstellen der Funktion „MyWorkflowEventCode“
  1.4. Erstellen der „Subscriber“-Funktion „AddMyEventsToLibrary“
  1.5. Erstellen der „Subscriber“-Funktion „RunWorkflowSetCustomerDefault“
  1.6. Das erstellte Ereignis im RTC testen

2. Eigene Workflow-Antworten erstellen
  2.1. Erstellen einer neuen Codeunit
  2.2. Erstellen der „Subscriper“-Funktion „MyWorkflowResponseCode“
  2.3. Erstellen der neuen Funktion „AddMyWorkflowResponsesToLibrary“
  2.4. Erstellen der Funktion „MyWorkflowResponse“
  2.5. Erstellen der Funktion „ExecuteMyWorkflowResponses“

3. Eigene Antwortoption erstellen
  3.1. EinfĂŒgen eines Feldes in die Tabelle â€žWorkflow Step Argument“
  3.2. EinfĂŒgen eines Feldes auf die Seite/Page „Workflow Response Options“
  3.3. Eintragen der Eigenschaften des Feldes â€žMy New Response Option“
  3.4. Ändern des Codes in der Funktion â€žAddMyWorkflowResponsesToLibrary“
  3.5. Löschen des Datensatzes aus der Tabelle â€žWorkflowreaktion“
  3.6. Einstellen eines weiteren Parameters in der Funktion „MyWorkflowResponse“
  3.7. Erstellen einer neuen lokalen Variable in der Funktion â€žMyWorkflowResponse“
  3.8. Abgleichen des fertigen Codes
  3.9. Testen der Workflow-Antwort

1. Eigene Workflow-Ereignisse erstellen

Es wird zunĂ€chst eine „Herausgeber“-Funktion („Publisher“) erstellt, welche von anderen Funktionen „abon­niert“ („Subscriber“) werden kann. Als Beispiel werden wir ein Ereignis erstellen, das ausgelöst wird, sobald das Feld „Kontakt“ auf der „Debitorenkarte“ geĂ€ndert wird.

1.1. Erstellen der „Publisher“-Funktion „SetDefaultsWorkflow“

In der Tabelle „Customer“ (ID 18) erstellen wir die neue Funktion „SetDefaultWorkflow“. DafĂŒr gehen wir in das Fenster „C/AL Globals“ in die Registerkarte „Functions“ und geben den Namen unserer neuen Funktion in die neue Zeile ein.

Anschließend gehen wir in die Eigenschaften der Funktion und tragen folgende Änderungen ein:

Als vorerst letzten Schritt gehen wir in den C/AL Code-Editor und suchen die Funktion „Contact - OnValidate“, da das Workflow Event jedes Mal ausgelöst werden soll, sobald der Datensatz im Feld „Kontakt“ geĂ€ndert wird. Dort geben wir „SetDefaultWorkflow(Rec);“ ein.

Wichtig ist hierbei zu beachten, dass die von uns erstellte Funktion erst am Ende eingefĂŒgt wird, da der „OnValidate“-Trigger erst durchlaufen muss.

1.2. Erstellen der Codeunit „My Workflow Event“

Gehen wir nun ĂŒber den Object-Designer in die Übersicht der Codeunits und klicken unten links auf „New“ um eine neue leere Codeunit erstellen zu können. Diese speichern wir unter dem Namen „My Workflow Event“ (ID 50000). NatĂŒrlich lĂ€sst sich auch ein anderer Name oder eine andere ID verwenden.

1.3. Erstellen der Funktion „MyWorkflowEventCode“

Nun gehen wir in die „C/AL Globals“ und erstellen die neue Funktion „MyWorkflowEventCode“.

In den „C/AL Locals“ gehen wir in die „Return Value“-Registerkarte und geben folgendes ein:

1.4. Erstellen der „Subscriber“-Funktion „AddMyEventsToLibrary“

Nun wird es Zeit unsere „Subscriber“ zu erstellen, welche das „Publisher“-Event „SetDefaultsWorkflow“ abonnieren. DafĂŒr gehen wir wieder in die „C/AL Globals“ und erstellen die Funktion „AddMyEventsToLibrary“.

Diese Funktion wird dafĂŒr sorgen, dass das Workflow-Event spĂ€ter in der Ereignis-Übersicht des Workflows erscheint.

Öffnen wir fĂŒr diese Funktion die Eigenschaften und fĂŒllen die Felder folgendermaßen aus:

Nun erstellen wir eine neue globale Variable mit dem Namen „WorkflowEventHandling“, welche auf die Codeunit „Workflow Event Handling“ (ID 1520) zugreift.

Gehen wir jetzt wieder in den Code-Editor zurĂŒck und schreiben folgende Zeile Code in neue Funktion:

WorkflowEventHandling.AddEventToLibrary(MyWorkflowEventCode, DATABASE::Customer,'Das Feld Kontakt wurde geÀndert',0,FALSE);

Somit wĂ€re nun dafĂŒr gesorgt, dass das Event mit den Worten „Das Feld Kontakt wurde geĂ€ndert“ in der Übersicht der Workflow-Ereignisse erscheint.

1.5. Erstellen der „Subscriber“-Funktion „RunWorkflowSetCustomerDefault“

Zum Schluss erstellen wir eine weitere „EventSubscriber“-Funktion und benennen diese „RunWorkflowSetCustomerDefault“. Dabei gehen wir wie bereits in der ersten Funktion vor.

Nachdem wir die Eigenschaften entsprechen geĂ€ndert haben, mĂŒssen wir eine lokale Variable erstellen, welche auf die Tabelle Customer zugreift.

Nun erstellen wir noch eine globale Variable und benennen diese „WorkflowManagement“, welche sich auf die Codeunit „Workflow Management“ (ID 1501) bezieht.

Anschließend tragen wir noch folgenden Code ein:

WorkflowManagement.HandleEvent(MyWorkflowEventCode,Customer);

Zu guter Letzt speichern wir das Objekt.

1.6. Das erstellte Ereignis im RTC testen

Gehen wir nun in die Übersicht „Workflow“ und erstellen einen neuen Workflow. Wir tragen dort einen be­liebigen Namen in den Feldern „Code“ und „Beschreibung“ und wĂ€hlen eine entsprechende Kategorie aus. FĂŒr unser Beispiel wĂ€hlen wir den Code „HINWEIS KONTAKTFELD“ und die Beschreibung „Das Kontaktfeld auf der Debitorenkarte wurde geĂ€ndert“.

Öffnen wir nun die EreignisĂŒbersicht.

Bei der Bedingung können Sie nun eine beliebige Option setzen. FĂŒr unser Beispiel belassen wir den Stan­dard­wert „<Immer>“. FĂŒr die Antwort wĂ€hlen wir, der Einfachheit halber, „Zeigen Sie die Nachricht „<Nachricht>“ an.“ aus und tragen in das entsprechende Feld „Meldung“ „Der Kontakt wurde geĂ€ndert.“ ein.

Anschließend sollte unser Workflow folgendermaßen aussehen.

Nun mĂŒssen wir den Workflow nur noch aktivieren. Hierzu klicken wir in das Feld „Aktiviert“ und setzen somit das entsprechende HĂ€kchen.

Gehen wir nun in eine beliebige Debitorenkarte und Ă€ndern den Wert des Feldes „Kontakt“.

Sobald wir nun diesen neuen Wert eingetragen haben, erscheint folgende Meldung:

Wie wir sehen können, erscheint die gewĂŒnschte Meldung aus unserem Beispiel-Workflow „Der Kontakt wurde geĂ€ndert“.

2. Eigene Workflow-Antworten erstellen

Der Standard von Microsoft Dynamics NAV 2016 bietet im Bereich der Workflow-Antworten einen recht begrenzten Inhalt. Es besteht aber die Möglichkeit, das Workflow-Modul um eigene Workflow-Antworten zu erweitern.

Wir möchten nun das Beispiel aus dem vorherigen Kapitel aufgreifen und erweitern. Wird nĂ€mlich der Wert des Feldes „Kontakt“ geĂ€ndert, soll die entsprechende Kontaktkarte aufgerufen werden. Ist dem eingetragenen Kontakt allerdings keine Kontaktkarte hinterlegt, soll eine entsprechende Meldung ausgegeben werden.

2.1. Erstellen einer neuen Codeunit

Im Object Designer erstellen wir eine neue Codeunit mit dem Namen „My Workflow Responses“.

2.2. Erstellen der „Subscriber“-Funktion „MyWorkflowResponseCode“

In dieser neuen Codeunit erstellen wir nun eine neue „Subscriber“-Funktion mit dem Namen „MyWorkflowResponseCode“. DafĂŒr fĂŒllen wir die Eigenschaften wie bei den bisherigen „Subscriber“-Funktionen.

Öffnen wir nun die lokalen Variablen dieser Funktion und erstellen einen neuen RĂŒckgabewert.

2.3. Erstellen der neuen Funktion „AddMyWorkflowResponseToLibrary“

Erweitern wir unsere Codeunit mit einer neuen Funktion, welche unsere Antwort in der Übersicht/Bibliothek der Workflowantworten einsetzt. Wir nennen sie daher „AddMyWorkflowResponsesToLibrary“.

Öffnen wir die Eigenschaften dieser Funktion und setzen die folgende Eigenschaften:

Nach diesem Schritt gehen wir in die „C/AL Locals“ und erstellen die neue Variable „WorkflowResponseHandling“, welche auf die Codeunit „Workflow Response Handling“ (ID 1521) zugreift.

Gehen wir nun zurĂŒck in den Code-Editor und fĂŒgen folgende Zeile Code ein:

WorkflowResponseHandling.AddResponseToLibrary(WorkflowResponseCode, DATABASE::Customer, 'Öffnen Sie die Kontaktkarte, wenn vorhanden','GROUP 50000');

2.4. Erstellen der Funktion „MyWorkflowReponse“

Erstellen wir nun eine weitere Funktion, welche genutzt wird um unsere Antwort zu implementieren. In unserem Beispiel wĂ€re das die Funktion „MyWorkflowResponse“.

Gehen wir anschließend wieder in die „C/AL Locals“ und tragen folgende Werte fĂŒr die Parameter ein:

Zu guter Letzt tragen wir noch die folgende Zeile Code in unsere gerade erstellte Funktion:

Contact.SETRANGE(Name,Customer.Contact);
IF Contact.FINDFIRST THEN
  PAGE.RUN(PAGE::"Contact Card",Contact)
ELSE
  MESSAGE('Dem Kontakt ist keine Kontaktkarte zugeordnet');

In dieser Abfrage wird geprĂŒft, ob eine Kontaktkarte zum eingetragenen Kontakt vorhanden ist. Ist dies der Fall wird diese Seite aufgerufen. Wenn nicht, erscheint die Meldung â€žDem Kontakt ist keine Kontaktkarte zugeordnet“.

2.5. Erstellen der Funktion „ExecuteMyWorkflowResponses“

Nun erstellen wir noch eine Funktion, welche dafĂŒr sorgt dass unsere Workflowantwort ausgefĂŒhrt wird. Daher nennen wir sie „ExecuteMyWorkflowResponses“.

Öffnen wir die Eigenschaften und fĂŒllen die Felder wie folgt:

Schreiben wir nun noch folgenden Code in die Funktion:

IF WorkflowResponse.GET(ResponseWorkflowStepInstance."Function Name") THEN
  CASE WorkflowResponse."Function Name" OF
    MyWFResponseCode:
      BEGIN
        MyWorkflowResponse(Variant);
        ResponseExecuted := TRUE;
      END;
  END;

Nun können wir unsere Antwort in der entsprechenden Tabelle auswÀhlen.

3. Eigene Antwortoption erstellen

Ihnen sind doch bestimmt schon die fett hinterlegten Antworten fĂŒr ein bestimmtes Ereignis aufgefallen. Dabei handelt es sich um vom Standard vorgeschlagene Antworten zu dem jeweiligen Ereignis.

Wir möchten nun, dass unsere erstellte Antwortmöglichkeit vorgeschlagen wird, sobald unser erstelltes Ereignis aus dem ersten Teil ausgewÀhlt wird, wie auf diesem Bild zu erkennen ist.

3.1. EinfĂŒgen eines Feldes in die Tabelle „Workflow Step Argument“

Öffnen wir dafĂŒr die Table „Workflow Step Argument“ (ID 1523) und fĂŒgen dieser ein neues Feld hinzu. In unserem Beispiel benennen wir das Feld „My New Response Option“.

3.2. EinfĂŒgen eines Feldes auf die Seite/Page „Workflow Response Options“

Dieses Feld fĂŒgen wir auf der Seite/Page „Workflow Response Options“ (ID 1523) in einer neu erstellten Gruppe hinzu.

3.3. Eintragen der Eigenschaften des Feldes „My New Response Option“

In den Eigenschaften tragen wir nun fĂŒr „Visible“ „‘Response Option Group‘ = ‘Group 50000‘ ‘“

3.4. Ändern des Codes in der Funktion „AddMyWorkflowResponsesToLibrary“

Anschießend gehen wir zurĂŒck in die „AddMyWorkflowResponsesToLibrary “-Funktion in der â€žMy Workflow Response“-Codeunit und Ă€ndern folgende Zeile Code:

WorkflowResponseHandling.AddResponseToLibrary(MyWorkflowResponseCode, DATABASE::Customer,'Öffnen Sie die Kontaktkarte, wenn vorhanden', 'GROUP 0');

in

WorkflowResponseHandling.AddResponseToLibrary(MyWorkflowResponseCode, DATABASE::Customer,'Öffnen Sie die Kontaktkarte, wenn vorhanden', 'GROUP 50000');

3.5. Löschen des Datensatzes aus der Tabelle „Workflowreaktion“

Damit unsere Änderungen nun greifen können, mĂŒssen wir den bereits vorhanden Datensatz in der Tabelle „Workflowreaktion“ löschen.

Suchen Sie dafĂŒr die Tabelle im Objekt Designer und fĂŒhren Sie diese aus. Nun öffnet sich Ihnen der RTC und die Tabelle „Workflowreaktion“ wird aufgerufen. Suchen wir den Datensatz „Öffnen Sie die Kontaktkarte, wenn vorhanden“ und löschen diesen.

3.6. Einstellen eines weiteren Parameters in der Funktion „MyWorkflowResponse“

ZurĂŒck in der Funktion „MyWorkflowResponse“ öffnen wir die „C/AL Locals“ und geben den folgenden neuen Parameter an.

3.7. Erstellen einer neuen lokalen Variable in der Funktion „MyWorkflowResponse“

Außerdem erstellen wir eine neue lokale Variable mit dem Namen „WorkflowStepArgument“, welche auf die Tabelle „Workflow Step Argument“ (ID 1523) verweist.

3.8. Abgleichen des fertigen Codes

Ist dies soweit erledigt, sollte in Ihrem Code-Editor nun folgendes zu sehen sein:

3.9. Testen der Workflow-Antwort

Ist dies erledigt, sollten Sie nun als vorgeschlagene Antwortmöglichkeit unsere erstellte Antwort sehen.

Schlagwörter

  • Anleitung
  • Dynamics NAV
  • Tutorial
  • Workflow