Erweiterte Programmierung


Die Schnittstellen gip.core.datamodel.IACConfig und gip.core.datamodel.IACConfigStore dienen zum  Speichern und Lesen von Konfigurationswerten (siehe Kapitel Konfigurationsspeicher). Im "iPlus-MES" Datenmodell ("gip.mes.datamodel") gibt es eine Reihe an Tabellen, die diese Schnittstellen implementieren. Die meisten davon werden primär zur Speicherung von Konfigurationsparametern für Workflows verwendet. Workflowklassen die später zur Laufzeit instanziiert werden  haben ihre speziellen Aufgaben. Ihr Verhalten wird primär über die Konfiguration von virtuellen Methoden, den eigenen Konfigurationsparametern und den Routing-Regeln bestimmt. Je nach Zweck greifen Workflowklassen auf diverse Anwendungstabellen zu. Welche Daten dabei gelesen, hinzugefügt oder manipuliert werden sollen hängt zum einen von der Konfiguration dieser Workflowklassen ab aber auch vom Fortschritt des Geschäftsprozesses selbst. Das Verhalten einer Workflowklasse bzw. der späteren Instanz ist also abhängig vom Kontext der Daten, mit der sie arbeitet und dem Fortschritt. Aus diesem Grund müssen also Konfigurationsparameter kontextabhängig gespeichert werden und abhängig von Fortschritt evtl. angepasst oder verändert werden können. Wir nennen dieses Prinzip "strikte Entitätstrennung mit fortschreitender Konkretisierung" oder technisch gesprochen "Überschreiben von Parametern".

Parameterüberschreibung erfolgt dadurch, dass die Tabellen, die als Konfigurationsspeicher dienen (die IACConfig und IACConfigStore implementieren), in einer vorgegebenen Reihenfolge gelesen werden. Das nachfolgende Bild erläutert dies anhand von Produktionsaufträgen aus dem "iPlus-MES" Datenmodell:

 

 

Die roten Rechtecke sind die Konfigurationsspeichertabellen. Die Richtung der Überschreibung ist von links nach rechts dargestellt. Es ergibt sich dann folgende Reihenfolge:

  1. gip.core.datamodel.ACClassMethodConfig (IACConfig). Tabelle, die Konfigurationen für die Stammdaten-Workflows speichert. Der Datenkontext ist gip.core.datamodel.ACClassMethod (IACConfigStore).
  2. gip.mes.datamodel.MaterialWFACClassMethodConfig (IACConfig). Tabelle, die Konfigurationen für Materialworkflows speichert. Der Datenkontext ist gip.mes.datamodel.MaterialWFACClassMethod (IACConfigStore).
  3. gip.mes.datamodel.PartslistConfig (IACConfig). Tabelle, die Konfigurationen für Stücklisten speichert. Der Datenkontext ist gip.mes.datamodel.Partslist (IACConfigStore).
  4. gip.mes.datamodel.ProdOrderPartslistConfig (IACConfig). Tabelle, die Konfigurationen für Produktionsaufträge speichert. Der Datenkontext ist gip.mes.datamodel.ProdOrderPartslist (IACConfigStore).

Die Reihenfolge spiegelt somit auch die Konkretisierung-stufe wider. Einstellungen die bei (1) Stammdaten-Workflows gemacht werden gelten generell für alle nachfolgenden Stufen, die auf diesen Workflow verweisen. Einstellungen die auf der letzten Stufe gemacht werden gelten konkret nur für diesen einen Produktionsauftrag.

 


Workflowparameter werden zum einen

  1. über die Benutzer-Oberfläche verwaltet,
  2. und zum anderen im Hintergrund von den Workflowinstanzen (aktive Workflows) gelesen.

In beiden Fällen muss das Programm wissen,

  • welche Konfigurationsspeicher benötigt werden (IACConfigStore),
  • in welcher Reihenfolge sie gelesen werden,
  • und welches der aktuelle Konfigurationsspeicher ist, unter dem die Parameter gespeichert werden (aktueller Datenkontext).

Dies wird mittels folgender Schnittstellen bewerkstelligt:

 

A. Benutzeroberfläche

In den Programmen (Businessobjekte) zur Verwaltung von Material-Workflows, Stücklisten, Produktionsaufträgen, Kommissonieraufträgen, etc. gibt es eine Registerkarte in der Workflows grafisch angezeigt werden. Die Parameter, die über den Steuerungsdialog (gip.core.autocomponent.VBBSOControlPW) geändert und hinzugefügt werden, müssen im richtigen Konfigurationsspeicher abgelegt werden. Diese Information erhält der Steuerungsdialog über die Eigenschaft "IACConfigStoreSelection.CurrentConfigStoredes aktuell selektierten grafischen Workflowobjektes (Eigenschaft "VBBSOControlPW.CurrentPWInfo"). Das grafische Objekt wiederum ist eine Instanz einer Klasse, die "gip.core.datamodel.IACComponentPWNode" implementiert:

  • PWOfflineNodeMethod: Modellklasse zur Darstellung von Workflowknoten zum Definitionszeitpunkt (nicht aktiver Workflow).
  • PWBase: Basisklasse für alle Workflowknoten, die serverseitig instanziiert werden (aktiver Workflow).
  • PWNodeProxy: Proxyklasse für PWBase (clientseitige Instanzen).

Mittels der Eigenschaft "IACConfigStoreSelection.MandatoryConfigStoreswird die Überschreibungsfolge definiert. Sie ist eine sortierte Liste von Konfigurationsspeichern (IACConfigStore). Diese Liste müssen also alle IACComponentPWNode bereitstellen, damit der Steuerungsdialog die Konfigurationsspeicher anzeigen kann, bei denen ein bestimmter Parameter überschrieben worden ist.

Damit der richtige Parameter, für den selektierten Workflowknoten, aus dem Konfigurationsspeicher gelesen und geschrieben werden kann, wird die Schnittstellelle IACConfigURL benötigt. Sie dient zur eindeutigen Adressierung eines Konfigurationsparameters innerhalb eines Workflows. Mittels "IACConfigURL.ConfigACUrl" wird in der aktuellen Konfigurationstabelle ("IACConfigStoreSelection.CurrentConfigStore") nach der Eigenschaft "IACConfig.ConfigACUrlgefiltertDie ConfigACUrl wird gebildet aus "IACConfig.PreConfigACUrl" und "IACConfig.LocalConfigACUrl". 

Die PreConfigACUrl wird benötigt für "Unterprogrammaufrufe" - wenn ein Workflow einen Unterworkflow aufruft, zeigt die PreConfigACUrl auf den aufrufenden Workflow. Diese "Call-Stack-Information" liefert "IACConfigURL.PreValueACUrl". Da IACComponentPWNode von der Schnittstelle IACConfigURL erbt, weiß also die Workflowinstanz selbst von welchem "Eltern-Workflow" der "Unterworkflow" aufgerufen wurde zu dem die Workflowinstanz angehört. Den "Call-Stack" - sprich die Aufrufreihenfolge von Workflows - liefert die Eigenschaft ACConfigMethodHierarchy der Schnittstelle IACConfigMethodHierarchy. IACComponentPWNode erbt ebenfalls von dieser Schnittstelle.

Während der Deklarationsphase, wenn Workflows mittels PWOfflineNodeMethod-Instanzen präsentiert werden, finden tatsächlich keine Unterprogrammaufrufe statt. Dies ist nur während der Laufzeit möglich, wenn PWBase-Ableitungen instanziiert werden. Wenn Konfigurationsänderungen während der Laufzeit erfolgen, müssen die entsprechenden lebenden Workflowinstanzen darüber informiert werden, damit sie Just-In-Time die geänderte Konfiguration aus der Datenbank nachladen können. Da Änderungen erst mit der "Speichern"-taste in die Datenbank übernommen werden, kann es durchaus passieren, dass gleichzeitig mehrere Unterworkflows betroffen sind, in die der Anwender zuvor navigiert hat. Diese Information muss sich das entsprechende BSO merken. Aus diesem Grund müssen BSO's, die Workflows anzeigen, die Schnittstelle IACBSOConfigStoreSelection implementieren. Jedes Mal, wenn ein Konfigurationsparameter über den Steuerungsdialog geändert wird, informiert es das entsprechende BSO, in welchem Workflow (bzw. in welchem Unterprogramm) der Parameter geändert wurde, indem es die Methode "IACBSOConfigStoreSelection.AddVisitedMethods()" aufruft. Das BSO merkt sich dann alle Unterprogrammaufrufe in der Eigenschaft "List<ACClassMethod> VisitedMethods" bis der Speichervorgang auf der Datenbank ausgeführt wird. Bei erfolgreichem Speichervorgangs erfolgt die Benachrichtigung der aktiven Workflows (auf Serverseite) über die Hilfsmethode "ConfigManagerIPlus.ReloadConfigOnServerIfChanged()" - eine Klasse, die die Schnittstelle IACConfigProvider implementiert:

 

B. Hintergrund

Die unter A. beschriebene Logik ist zum einen umfangreich und zum anderen wird sie auch im Hintergrund benötigt, wenn Workflows bzw. Workflowknoten aktiv sind und Ihre Konfiguration lesen müssen. Letztendlich geht es darum, Konfigurationsparameter zu lesen bzw. zu manipulieren und die Komplexität von Parameterüberschreibungen (Reihenfolge der Konfigurationsspeicher) in Kombination mit Unterprogrammaufrufen zu verbergen.

Dies wird mittels der Schnittstelle IACConfigProvider gewährleistet. Ableitungen von PWBase und der Steuerungsdialog (VBBSOControlPW) verwenden die dort bereitgestellten Methoden. Die Klasse "gip.core.autocomponent.ConfigManagerIPlus" implementiert dieses Interface. ConfigManagerIPlus ist zustandslos und wird als lokaler Service unter der Adresse "\LocalServiceObjects\VarioConfigManager" bereitgestellt. ConfigManagerIPlus arbeitet nur mit Konfigurationsspeichern aus dem Datemodell "gip.core.datamodel". Für "iPlus-MES" dient die abgeleitete Klasse "gip.mes.processapplication.ConfigManagerIPlusMES", die mit Konfigurationsspeichern aus dem datenmodell "gip.mes.datamodel" umgehen kann.

 


Eine der wichtigsten Stellen die IACConfigProvider nutzt ist die Methode GetConfigForACMethod() aus "gip.core.autocomponent.PWBase". Sie ist die Basisklasse aller Workflowklassen. Da alle Ableitungen die entsprechenden Konfigurationsparameter für Routing-Regeln, Funktionsaufrufe oder sich selbst lesen müssen, verwenden sie GetConfigForACMethod() um die Parameter einer leeren ACMethod zu füllen (Siehe, insbesondere Programmzeilen mit dem Kommentar 1. und 2.):

 

Hier einige Programmstellen von Workflow-Klassen, die GetConfigForACMethod() verwenden, um Ihre eigenen Konfigurationsparameter zu lesen:

 

Zugriff auf die eigenen Konfigurationsparameter einer Workflow-Klasse:

 

Konfigurationsparameter für Funktionsaufrufe:

 

Zugriff auf die Routing-Rules per IACConfigProvider: