Sofort-Kontakt

Kopfzeilen-Bild
Kopfzeilen-Filter
Kopfzeilen-Schräge

Workflow

Kopfzeilen-Anführungszeichen Voll integriert Kopfzeilen-Anführungszeichen

Workflow-Modul in Dynamics NAV 2016: Eigene Workflow- Ereignisse
und
‑Antworten erstellen

Mit dem Workflow-Modul in Dynamics NAV 2016 lassen sich bereits typische ERP-Prozesse wie Angebotsfreigaben, Kreditlimit-Erhöhungen etc. durch einen Workflow begleiten. Es gibt aber ERP-Prozesse, die noch nicht unterstützt werden. Hier lässt sich das Modul jedoch erweitern, indem eigene Workflow-Ereignisse und ‑Antworten programmiert werden. Wir zeigen, wie das geht.


Die Grundlagen des neuen Workflow-Moduls kennen Sie bereits. Nun erhalten Sie eine Schritt-für-Schritt-Anleitung, um das Workflow-Modul in Dynamics NAV um neue Workflow-Ereignisse und -Antworten zu erweitern.

1. Eigene Workflow-Ereignisse erstellen

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

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

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

Tabelle Customer - Publisher-Funktion SetDefaultWorkflow

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

SetDefaultWorkflow - Eigenschaften

Als vorerst letzten Schritt gehen Sie 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 Sie „SetDefaultWorkflow(Rec);“ ein.

Tabelle Customer - SetDefaultWorkflow in Code einbauen

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

1.2. Erstellen der Codeunit „My Workflow Event“

Gehen Sie 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 Sie 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 Sie in die „C/AL Globals“ und erstellen die neue Funktion „MyWorkflowEventCode“.

Neue Funktion MyWorkflowEventCode

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

MyWorkflowEventCode - C/AL Locals

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

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

Neue Funktion AddMyEventToLibrary

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

Öffnen Sie für diese Funktion die Eigenschaften und füllen die Felder folgendermaßen aus:

AddMyEventToLibrary - Eigenschaften

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

Codeunit WorkflowEventHandling - Neue globale Variable WorkflowEventHandling

Gehen Sie jetzt wieder in den Code-Editor zurück und schreiben folgende Zeile Code in die 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 Sie eine weitere „EventSubscriber“-Funktion und nennen diese „RunWorkflowSetCustomerDefault“. Dabei gehen Sie wie bereits in der ersten Funktion vor.

Nachdem Sie die Eigenschaften entsprechend geändert haben, müssen Sie eine lokale Variable erstellen, welche auf die Tabelle Customer zugreift.

Neue Funktion RunWorkflowSetCustomerDefault

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

Codeunit MyWorkflowEvents - Neue globale Variable WorkflowManagment

Anschließend tragen Sie noch folgenden Code ein:

WorkflowManagement.HandleEvent(
  MyWorkflowEventCode,Customer);

Zu guter Letzt speichern Sie das Objekt.

1.6. Das erstellte Ereignis im RTC testen

Gehen Sie nun in die Übersicht „Workflow“ und erstellen einen neuen Workflow. Tragen Sie dort einen beliebigen Namen in den Feldern „Code“ und „Beschreibung“ ein und wählen eine entsprechende Kategorie aus. Für das Beispiel wählen Sie den Code „HINWEIS KONTAKTFELD“ und die Beschreibung „Das Kontaktfeld auf der Debitorenkarte wurde geändert“.

Neuer Workflow “Hinweis Kontaktfeld”

Öffnen Sie die Ereignisübersicht.

Workflowereignisse

Bei der Bedingung können Sie eine beliebige Option setzen. Für das Beispiel belassen Sie es bei dem Standardwert „Immer“. Für die Antwort wählen Sie der Einfachheit halber „Zeigen Sie die Nachricht „Nachricht“ an.“ aus und tragen in das entsprechende Feld „Meldung“ „Der Kontakt wurde geändert.“ ein.

Workflowreaktionen

Anschließend sollte der Workflow folgendermaßen aussehen.

Aufbau Workflow “Hinweis Kontaktfeld”

Nun müssen Sie den Workflow nur noch aktivieren. Hierzu klicken Sie in das Feld „Aktiviert“ und setzen somit das entsprechende Häkchen.

Gehen Sie dann in eine beliebige Debitorenkarte und ändern den Wert des Feldes „Kontakt“.

Debitorenkarte - Kontaktfeld

Debitorenkarte - Kontaktfeld ändern

Sobald Sie diesen neuen Wert eingetragen haben, erscheint folgende Meldung:

Der Kontakt wurde geändert.

Wie Sie sehen können, erscheint die gewünschte Meldung aus dem 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.

Das Beispiel aus dem vorherigen Kapitel lässt sich an dieser Stelle 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 Sie eine neue Codeunit mit dem Namen „My Workflow Responses“.

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

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

Öffnen Sie die lokalen Variablen dieser Funktion und erstellen einen neuen Rückgabewert.

Codeunit MyWorkflowResponses - Neue Funktion MyWorkflowResponseCode - C/AL Locals - Return Value

2.3. Erstellen der neuen Funktion „AddMyWorkflowResponseToLibrary“

Erweitern Sie die Codeunit mit einer neuen Funktion, welche Ihre Antwort in der Übersicht/Bibliothek der Workflowantworten einsetzt. Nennen Sie sie daher „AddMyWorkflowResponsesToLibrary“.

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

Neue Funktion AddMyWorkflowResponseToLibrary - Eigenschaften

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

AddMyWorkflowResponseToLibrary - Neue Variable WorkflowResponseHandling

Gehen Sie dann 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 Sie anschließend eine weitere Funktion, welche genutzt wird, um Ihre Antwort zu implementieren. Im Beispiel wäre das die Funktion „MyWorkflowResponse“.

Gehen Sie dann wieder in die „C/AL Locals“ und tragen folgende Werte für die Parameter ein:

Funktion MyWorkflowResponse - Parameter

Zu guter Letzt tragen Sie noch die folgende Zeile Code in Ihre gerade erstellte Funktion ein:

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 Sie noch eine Funktion, welche dafür sorgt, dass die Workflowantwort ausgeführt wird. Daher nennen Sie sie „ExecuteMyWorkflowResponses“.

Codeunit MyWorkflowResponses - Neue Funktion ExecuteMyWorkflowReponses

Öffnen Sie die Eigenschaften und füllen die Felder wie folgt:

ExecuteMyWorkflowResponses - Eigenschaften

Schreiben Sie dann 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;

Sie können nun die 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.

Jetzt geht es darum, dass Ihre erstellte Antwortmöglichkeit vorgeschlagen wird, sobald Ihr erstelltes Ereignis aus dem ersten Teil ausgewählt wird, wie auf diesem Bild zu erkennen ist.

Workflowreaktionen

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

Öffnen Sie dafür die Tabelle „Workflow Step Argument“ (ID 1523) und fügen dieser ein neues Feld hinzu. Im Beispiel benennen Sie das Feld „My New Response Option“.

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

Dieses Feld fügen Sie 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 Sie nun für „Visible“ „‘Response Option Group‘ = ‘Group 50000‘ ‘“ ein.

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

Anschließend gehen Sie 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 Ihre Änderungen greifen können, müssen Sie den bereits vorhandenen 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 der RTC und die Tabelle „Workflowreaktion“ wird aufgerufen. Suchen Sie 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 Sie die „C/AL Locals“ und geben den folgenden neuen Parameter an.

Funktion MyWorkflowResponse -  Neuer Parameter WorkflowStepInstance

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

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

Tabelle WorkflowStepArgument - Neue lokale Variable WorkflowStepArgument

3.8. Abgleichen des fertigen Codes

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

Codeunit MyWorkfloResponseCode

3.9. Testen der Workflow-Antwort

Sie sollten jetzt als vorgeschlagene Antwortmöglichkeit Ihre erstellte Antwort sehen.