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 configuratie

De context is een scherm voor het volgen van werkorders met een tabel voor taken. Drie onderdelen zijn al aanwezig:

  • TASKREPLOC - een aangepast object dat de catalogus van reparatietaken bevat, elk met een locatie, een taak-ID en een omschrijving. Sla dit over als u alle taakplannen wilt ophalen op basis van een specifiek criterium.
  • Een relatie met dezelfde naam van WORKORDER naar dat object, zodanig begrensd dat de planner alleen taken ziet die relevant zijn voor de werkorder die voor hen ligt.
  • SHOWTASKS - de standaardrelatie van een werkorder naar de bijbehorende taken. Hier komen de gekopieerde rijen terecht.

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.

Stap 1: De signature option aanmaken

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.

Voeg handtekeningopties toe of wijzig deze. ADDREPTASK wordt aangemaakt voor de applicatie, waarbij de geavanceerde handtekeningopties zo zijn ingesteld dat de actie vanuit de gebruikersinterface kan worden aangeroepen.

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.

Stap 2: De knop toevoegen die het dialoogvenster opent

In Application Designer wordt een drukknop toegevoegd aan de werkbalk van de tabel Taken.

Eigenschappen van de drukknop. De gebeurtenis (Event) is ingesteld op selectrepairtasks, wat de id is van het dialoogvenster dat we gaan definiëren.


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.

Stap 3: Het dialoogvenster definiëren

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:

  • beanclass MultiselectDataBean zorgt voor het selectievinkje en, belangrijker nog, onthoudt de selectie terwijl de gebruiker door de lijst bladert.
  • parentdatasrc MAINRECORD koppelt het dialoogvenster aan de werkorder die momenteel geopend is, zodat de relatie daarop wordt gebaseerd.
  • De relatie TASKREPLOC levert de rijen. Dit is ook de gegevensbron die het script zal uitlezen.
  • selectmode multiple en de eerste tablecol, met mxevent toggleselectrow, zorgen voor de kolom met selectievakjes.
  • inputmode readonly voorkomt dat iemand de broncatalogus bewerkt vanuit de kiezer.
  • savemode onunload legt de gegevensbron van de werkorder vast wanneer het dialoogvenster wordt gesloten; dit zorgt ervoor dat de taakrijen die het script toevoegt, worden opgeslagen.

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.

Stap 4: Het automatiseringsscript

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.  

Het resultaat in actie

De werkorder begint met een lege takenlijst en één knop.

Werkorder zonder taken, met de knop Reparatietaken selecteren op de werkbalk.


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

Het dialoogvenster toont drie reparatietaken voor locatie WKSHP3, elk met een taak-ID en beschrijving.

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

Alle drie de taken zijn geselecteerd en klaar om te worden toegevoegd.

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

Drie taken aangemaakt.


De gehele interactie kost vier klikken.

Het patroon uitbreiden

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:

  1. De relatie in het dialoogvenster, die bepaalt waaruit de gebruiker kan kiezen.
  1. De kolommen in de tabel van het dialoogvenster.
  1. De relatie waaraan het script toevoegt.
  1. Het setValue-blok dat de koppeling tussen beide legt.

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.

Conclusie

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.

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.

Unlock the Ultimate Guide to IBM Maximo Application Suite (MAS)

Discover everything you need to know to modernize your asset management strategy.

Inside, you’ll learn:

  • What’s new in IBM Maximo Application Suite 9.0
  • Key differences between Maximo 7.6 and MAS
  • How AppPoints and OpenShift change the game
  • Industry use cases across energy, manufacturing, and transportation
  • Step-by-step guidance for upgrading and migration readiness
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