Anwendungsfall: Ein Dialog zur Mehrfachauswahl, der ein Automatisierungsskript auslöst


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.
Der Kontext ist ein Bildschirm zur Arbeitsauftragsverfolgung mit einer Aufgabentabelle. Drei Elemente sind bereits vorhanden:
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.
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.

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.
Im Application Designer wird der Symbolleiste der Aufgabentabelle eine Drucktaste hinzugefügt.

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.
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 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.
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.
Der Arbeitsauftrag beginnt mit einer leeren Aufgabenliste und einer einzelnen Schaltfläche.

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

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

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

Der gesamte Vorgang erfordert nur vier Klicks.
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:
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.
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.
Erfahren Sie alles, was Sie wissen müssen, um Ihre Vermögensverwaltungsstrategie zu modernisieren.
Darin erfährst du:

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.