Use Case: Een dialoogvenster voor meervoudige selectie dat een Automation Script activeert


Dit is een scenario dat vaak voorkomt bij Maximo-implementaties: een planner opent een werkorder voor een voertuig en moet daar een zestal reparatietaken aan toevoegen. Die taken worden niet ter plekke bedacht. Ze bestaan al als records, gekoppeld aan een reparatielocatie, en steeds weer wordt dezelfde handvol taken gebruikt.
De eerste ingeving is meestal een taakplan. Dat werkt als telkens hetzelfde pakket aan taken van toepassing is, maar het schiet tekort zodra de planner een willekeurige subset nodig heeft. Tien taakplannen worden er veertig, dan honderd, elk een kleine variatie op de vorige. Het alternatief, de taken handmatig invoeren, is trager en levert telkens een andere omschrijving op als iemand een woord anders spelt.
In dit blog bespreken we een derde optie: een aangepast dialoogvenster dat de reeds geregistreerde taken weergeeft, waarmee de planner de gewenste taken kan aanvinken en deze met één klik naar de werkorder kan kopiëren. Eén signature option, één dialoogvenster en een kort automatiseringsscript. Geen nieuwe objecten, geen Java.
De context is een scherm voor het volgen van werkorders met een tabel voor taken. Drie onderdelen zijn al aanwezig:
Het kernidee: het dialoogvenster slaat zelf niets op. Het is een kiezer. Het enige wat het doet, is een set records vasthouden en onthouden welke de gebruiker heeft aangevinkt. Een signature option die wordt geactiveerd via de OK-knop draagt de controle over aan een automatiseringsscript, en het script voert het eigenlijke werk uit.
De signature option vormt de brug tussen een knop op het scherm en een script op de server. Zonder deze optie is er geen manier voor een drukknop om een actie-startpunt te bereiken.

De optienaam, ADDREPTASK, is de exacte tekenreeks die de dialoogknop zal activeren; deze is hoofdlettergevoelig.
Vergeet niet om ADDREPTASK toe te wijzen aan de beveiligingsgroepen die dit nodig hebben. Als de optie wel bestaat maar niet is toegewezen, wordt de knop wel weergegeven en opent het dialoogvenster, maar gebeurt er niets wanneer u op OK drukt, zonder dat er een foutmelding verschijnt.
In Application Designer wordt een drukknop toegevoegd aan de werkbalk van de tabel Taken.

De truc hier is: het instellen van de gebeurtenis op een dialoog-id is voldoende om dat dialoogvenster te openen. Er komt geen script aan te pas bij dit deel van de oplossing en er is geen doel-id of waarde nodig. Maximo ziet een gebeurtenisnaam die overeenkomt met een dialoogvenster in de presentatie en opent dit voor het huidige record.
Het dialoogvenster wordt toegevoegd aan de XML van de applicatie. Het is kort en elk attribuut heeft een specifieke functie.
<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>
Van boven naar beneden gelezen:
De twee knoppen onderaan vormen de kern van het ontwerp. Annuleren gebruikt het standaard dialogcancel-event. De knop Geselecteerde taken toevoegen gebruikt mxevent="ADDREPTASK", de signature-optie uit stap 1.
Een veelgemaakte fout: het kopiëren van een standaard dialoogvenster voor meervoudige selectie en de OK-knop laten staan als mxevent="dialogok" met een value-attribuut. Die waarde verwijst naar een Java-methode in de application bean, waardoor deze vrolijk een methode aanroept die voor een compleet andere tabel is geschreven. Een automatiseringsscript kan daar nooit worden benoemd. Activeer in plaats daarvan de signature-optie.
Het script is een actie-launchpoint op WORKORDER, gekoppeld aan de signature-optie ADDREPTASK.
# 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()
Wat de moeite waard is om te bestuderen: de drie regels die de selectie ophalen. Het script vraagt de webclient-sessie om de data bean achter het dialoogvenster, op basis van het dialoog-ID, vraagt die bean vervolgens om zijn MboSet en roept getSelection() aan. Dat geeft alleen de rijen terug die de gebruiker heeft aangevinkt. Doorloop de data bean en de selectie is direct beschikbaar.
De rest is standaard Maximo.
De werkorder begint met een lege takenlijst en één knop.

Door hierop te klikken, wordt het dialoogvenster geopend met de taken die beschikbaar zijn voor die werkorder.

De planner vinkt aan wat nodig is. Met het selectievakje in de koptekst worden alle drie de taken tegelijk geselecteerd.

Eén klik op Geselecteerde taken toevoegen en het dialoogvenster sluit, waarna de takenlijst is gevuld.

De gehele interactie kost vier klikken.
Niets in deze oplossing is specifiek voor reparatietaken. Om dit toe te passen op een andere bron of doel, hoeven slechts vier zaken te worden aangepast:
De handtekeningoptie, de knopconfiguratie en de getSelection-logica veranderen nooit.
Laten we direct met de belangrijkste voorwaarde beginnen: definieer de bronrelatie op de juiste manier. Een keuzelijst die elke rij uit een catalogus ophaalt, is onbruikbaar bij echte data. Filter deze op gerelateerde kenmerken in de 'where'-clausule van de relatie, niet in het script, zodat het dialoogvenster alleen ophaalt wat daadwerkelijk getoond moet worden.
Aangepaste dialoogvensters staan erom bekend lastig te zijn, en dat komt bijna altijd door hetzelfde probleem: zorgen dat een knop op het scherm de code op de server bereikt die normaal gesproken door Java-code wordt afgehandeld. Zodra je weet dat een drukknopgebeurtenis een dialoogvenster kan openen en een signatuuroptie een script kan uitvoeren, is de rest slechts een kort Automation Script.
Discover everything you need to know to modernize your asset management strategy.
Inside, you’ll learn:

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.