Ein Szenario, das bei Maximo-Implementierungenvorkommt: Ein Planer öffnet einen Arbeitsauftrag für ein Fahrzeug und muss diesem ein halbes Dutzend Reparaturaufgaben hinzufügen. Diese Aufgaben werden nicht spontan erfunden. Sie existieren bereits als Datensätze, die einem Reparaturstandort zugeordnet sind, und dieselbe Handvoll wird immer wieder verwendet.

Der erste Instinkt ist meist ein Arbeitsplan. Das funktioniert, wenn jedes Mal dasselbe Aufgabenpaket anfällt, aber es scheitert, sobald der Planer eine beliebige Teilmenge benötigt. Aus zehn Arbeitsplänen werden vierzig, dann hundert, jeder nur eine leichte Abwandlung des vorherigen. Die Alternative, die Aufgaben manuell einzugeben, ist langsamer und führt jedes Mal zu einer anderen Beschreibung, wenn jemand ein Wort anders schreibt.

In diesem Blogbeitrag stellen wir eine dritte Option vor: einen benutzerdefinierten Dialog, der die bereits hinterlegten Aufgaben auflistet, es dem Planer ermöglicht, die gewünschten auszuwählen, und diese mit einem einzigen Klick in den Arbeitsauftrag kopiert. Eine Signaturoption, ein Dialog und ein kurzes Automatisierungsskript. Keine neuen Objekte, kein Java.

Die Einrichtung

Der Kontext ist ein Bildschirm zur Arbeitsauftragsverfolgung mit einer Aufgabentabelle. Drei Elemente sind bereits vorhanden:

  • TASKREPLOC – ein benutzerdefiniertes Objekt, das den Katalog der Reparaturaufgaben enthält, jeweils mit Standort, Aufgaben-ID und Beschreibung. Überspringen Sie dies, wenn Sie alle Arbeitsaufgaben anhand eines bestimmten Kriteriums abrufen möchten.
  • Eine gleichnamige Beziehung von WORKORDER zu diesem Objekt, die so eingegrenzt ist, dass der Planer nur die für den vorliegenden Arbeitsauftrag relevanten Aufgaben sieht.
  • SHOWTASKS – die standardmäßige Beziehung von einem Arbeitsauftrag zu seinen Aufgaben. Hier landen die kopierten Zeilen.

Die Grundidee: Der Dialog speichert selbst nichts. Er ist lediglich eine Auswahlhilfe. Er hält lediglich eine Reihe von Datensätzen bereit und merkt sich, welche der Benutzer angeklickt hat. Eine Signaturoption, die über die OK-Schaltfläche ausgelöst wird, übergibt die Steuerung an ein Automatisierungsskript, das die eigentliche Arbeit erledigt.

Schritt 1: Erstellen der Signaturoption

Die Signaturoption ist die Brücke zwischen einer Schaltfläche auf dem Bildschirm und einem Skript auf dem Server. Ohne sie gibt es keine Möglichkeit für eine Drucktaste, einen Aktions-Startpunkt zu erreichen.

Signaturoptionen hinzufügen/bearbeiten. ADDREPTASK wird für die Anwendung erstellt, wobei die erweiterten Signaturoptionen so konfiguriert sind, dass die Aktion über die Benutzeroberfläche aufgerufen werden kann.

Der Optionsname ADDREPTASK entspricht exakt der Zeichenfolge, die durch die Dialogschaltfläche ausgelöst wird; dabei ist die Groß-/Kleinschreibung zu beachten.  

Denken Sie daran, ADDREPTASK den entsprechenden Sicherheitsgruppen zuzuweisen. Wenn die Option zwar existiert, aber nicht zugewiesen wurde, wird die Schaltfläche zwar angezeigt und der Dialog geöffnet, doch das Klicken auf „OK“ bleibt ohne Funktion und ohne Fehlermeldung.

Schritt 2: Hinzufügen der Schaltfläche zum Öffnen des Dialogs

Im Application Designer wird der Symbolleiste der Aufgabentabelle eine Drucktaste hinzugefügt.

Eigenschaften der Drucktaste. Das Ereignis wird auf „selectrepairtasks“ gesetzt, was der ID des Dialogs entspricht, den wir gleich definieren werden.


Der Clou dabei: Das Ereignis einfach auf eine Dialog-ID zu setzen, reicht aus, um diesen Dialog zu öffnen. Für diesen Teil der Lösung ist kein Skript erforderlich, und es werden weder eine Ziel-ID noch ein Wert benötigt. Maximo erkennt einen Ereignisnamen, der mit einem Dialog in der Präsentation übereinstimmt, und öffnet diesen für den aktuellen Datensatz.

Schritt 3: Definieren des Dialogs

Der Dialog wird dem Anwendungs-XML hinzugefügt. Er ist kurz gehalten, und jedes Attribut erfüllt einen wichtigen Zweck.

<dialog beanclass="psdi.webclient.system.beans.MultiselectDataBean" 
        id="selectrepairtasks" label="Select Repair Tasks" 
        parentdatasrc="MAINRECORD" relationship="TASKREPLOC" 
        savemode="onunload"> 

  <table id="selectrepairtasks_select_table" inputmode="readonly" 
         label="Tasks" selectmode="multiple" width="700"> 
    <tablebody displayrowsperpage="15" filterable="true" 
               id="selectrepairtasks_select_table_tablebody"> 
      <tablecol id="selectrepairtasks_select_table_tablebody_1" 
                mxevent="toggleselectrow" type="event" 
                filterable="false" sortable="false"/> 
      <tablecol dataattribute="location"    id="..._tablebody_2"/> 
      <tablecol dataattribute="taskid"      id="..._tablebody_4"/> 
      <tablecol dataattribute="description" id="..._tablebody_3"/> 
    </tablebody> 
  </table> 

  <section id="selectrepairtasks_btn_section"> 
    <sectionrow id="selectrepairtasks_btn_row"> 
      <section datasrc="mainrecord" id="selectrepairtasks_act_section"> 
        <buttongroup id="selectrepairtasks_act_bg"> 
          <pushbutton id="selectrepairtasks_cancel" label="Cancel" 
                      mxevent="dialogcancel"/> 
          <pushbutton id="selectrepairtasks_add" label="Add Selected Tasks" 
                      mxevent="ADDREPTASK" default="true"/> 
        </buttongroup> 
      </section> 
    </sectionrow> 
  </section> 
</dialog> 

Von oben betrachtet:

  • Die beanclass MultiselectDataBean sorgt für das Auswahlverhalten und speichert – was besonders wichtig ist – die Auswahl, während der Benutzer durch die Liste blättert.
  • parentdatasrc MAINRECORD verknüpft den Dialog mit dem aktuell geöffneten Arbeitsauftrag, sodass die Beziehung ausgehend von diesem aufgelöst wird.
  • Die Beziehung TASKREPLOC liefert die Zeilen. Dies ist auch die Datenquelle, die das Skript wieder ausliest.
  • selectmode multiple und die erste tablecol mit mxevent toggleselectrow erzeugen die Spalte mit den Auswahlkästchen.
  • inputmode readonly verhindert, dass der Quellkatalog innerhalb der Auswahlmaske bearbeitet werden kann.
  • savemode onunload überträgt die Datenquelle des Arbeitsauftrags beim Schließen des Dialogs, wodurch die vom Skript hinzugefügten Aufgabenzeilen gespeichert werden.

Die beiden Schaltflächen am unteren Rand sind der entscheidende Teil des Designs. Abbrechen verwendet das standardmäßige Ereignis dialogcancel. Die Schaltfläche „Ausgewählte Aufgaben hinzufügen“ verwendet mxevent="ADDREPTASK", die Signaturoption aus Schritt 1.

Ein häufiger Fehler: Das Kopieren eines standardmäßigen Dialogs mit Mehrfachauswahl und das Beibehalten der OK-Schaltfläche mit mxevent="dialogok" und einem value-Attribut. Dieser Wert benennt eine Java-Methode in der Anwendungs-Bean, sodass sie problemlos eine Funktion aufruft, die für eine völlig andere Tabelle geschrieben wurde. Ein Automatisierungsskript kann dort niemals aufgerufen werden. Lösen Sie stattdessen die Signaturoption aus.

Schritt 4: Das Automatisierungsskript

Das Skript ist ein Aktions-Startpunkt für WORKORDER, der an die Signaturoption ADDREPTASK gebunden ist.

# Script  : ADDREPTASK 
# Trigger : Action launch point — WORKORDER, signature option ADDREPTASK 
# Purpose : Copy the repair tasks ticked in the dialog onto the work order. 

from psdi.mbo import MboConstants 

# mbo here is MAINRECORD, the work order, because the button sits in a 
# section with datasrc="mainrecord" 
target_set = mbo.getMboSet("SHOWTASKS") 

# read the ticked rows straight out of the dialog's data bean 
session   = service.webclientsession() 
databean  = session.getDataBean("selectrepairtasks")   # the dialog id 
mboSet    = databean.getMboSet() 
selection = mboSet.getSelection() 

for task in selection: 
    location    = task.getString("LOCATION") 
    description = task.getString("DESCRIPTION") 

    new_task = target_set.add() 
    new_task.setValue("repairfacility",   location,    MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION) 
    new_task.setValue("description",      description, MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION) 
    new_task.setValue("assetnum",         None,        MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION) 
    new_task.setValue("parentchgsstatus", False,       MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION) 
    new_task.setValue("woacceptscharges", False,       MboConstants.NOACCESSCHECK | MboConstants.NOVALIDATION_AND_NOACTION) 

service.closeDialog()


Der Teil, der einen Blick wert ist:
die drei Zeilen, die die Auswahl abrufen. Das Skript fragt die Web-Client-Sitzung nach der Daten-Bean hinter dem Dialog (anhand der Dialog-ID), fordert dann von dieser Bean das MboSet an und ruft getSelection() auf. Dies gibt nur die Zeilen zurück, die der Benutzer markiert hat. Gehen Sie die Daten-Bean durch, und die Auswahl ist einfach vorhanden.

Der Rest ist Standard-Maximo.  

In der Praxis

Der Arbeitsauftrag beginnt mit einer leeren Aufgabenliste und einer einzelnen Schaltfläche.

Arbeitsauftrag ohne Aufgaben und die Schaltfläche „Reparaturaufgaben auswählen“ in der Symbolleiste.


Ein Klick darauf öffnet den Dialog mit den für diesen Arbeitsauftrag verfügbaren Aufgaben.

Der Dialog listet drei Reparaturaufgaben für den Standort WKSHP3 auf, jeweils mit Aufgaben-ID und Beschreibung.

Der Planer wählt die benötigten Aufgaben aus. Über das Kontrollkästchen im Header können alle drei gleichzeitig markiert werden.

Alle drei Aufgaben sind ausgewählt und bereit zum Hinzufügen.

Ein Klick auf „Ausgewählte Aufgaben hinzufügen“ schließt den Dialog und die Aufgabenliste ist befüllt.

Drei Aufgaben wurden erstellt.


Der gesamte Vorgang erfordert nur vier Klicks.

Erweiterung des Musters

Diese Lösung ist nicht auf Reparaturaufgaben beschränkt. Um sie auf eine andere Quelle oder ein anderes Ziel anzuwenden, müssen lediglich vier Dinge angepasst werden:

  1. Die Beziehung im Dialog, die festlegt, woraus der Benutzer auswählen kann.
  1. Die Spalten in der Dialogtabelle.
  1. Die Beziehung, zu der das Skript hinzufügt.
  1. Der setValue-Block, der die Zuordnung zwischen den Elementen vornimmt.

Die Signaturoption, die Schaltflächenanbindung und die getSelection-Logik bleiben unverändert.

Eines vorab: Definieren Sie die Quellenbeziehung korrekt. Ein Auswahlfeld, das jede Zeile eines Katalogs zurückgibt, ist bei echten Daten unbrauchbar. Filtern Sie es über die zugehörigen Attribute in der WHERE-Klausel der Beziehung, nicht im Skript, damit der Dialog immer nur die Daten abruft, die er tatsächlich anzeigen muss.

Fazit

Benutzerdefinierte Dialoge gelten oft als kompliziert, und der schwierige Teil ist fast immer derselbe: eine Schaltfläche auf dem Bildschirm dazu zu bringen, auf Code auf dem Server zuzugreifen, der normalerweise durch Java-Code verarbeitet wird. Sobald Sie wissen, dass ein Pushbutton-Ereignis einen Dialog öffnen und eine Signaturoption ein Skript ausführen kann, ist der Rest nur noch ein kurzes Automatisierungsskript.

MORE Community Logo
Live from the MORE community

Your Maximo questions probably already have answers

See what Maximo users are asking, answering, and solving right now.

Entdecken Sie den ultimativen Leitfaden zur IBM Maximo Application Suite (MAS)

Erfahren Sie alles, was Sie wissen müssen, um Ihre Vermögensverwaltungsstrategie zu modernisieren.

Darin erfährst du:

  • Was ist neu in IBM Maximo Application Suite 9.0
  • Hauptunterschiede zwischen Maximo 7.6 und MAS
  • Wie AppPoints und OpenShift das Spiel verändern
  • Branchenanwendungsfälle in den Bereichen Energie, Fertigung und Transport
  • Schrittweise Anleitung für das Upgrade und die Bereitschaft zur Migration
Cover of 'The Ultimate Guide to MAS Maximo Application Suite' by Naviam featuring a man in a yellow construction helmet and safety vest holding a tablet.
×

ActiveG, BPD Zenith, EAM Swiss, InterPro Solutions, Lexco, Peacock Engineering, Projetech, Sharptree, and ZNAPZ have united under one brand: Naviam.

You’ll be redirected to the most relevant page at Naviam.io in a few seconds — or you can go now.

Read Press Release