Cas d'utilisation : une boîte de dialogue à sélection multiple qui déclenche un script d'automatisation


Voici un scénario courant dans les implémentations Maximo: un planificateur ouvre un ordre de travail pour un véhicule et doit y ajouter une demi-douzaine de tâches de réparation. Ces tâches ne sont pas inventées sur le moment. Elles existent déjà sous forme d'enregistrements associés à un lieu de réparation, et le même groupe est utilisé à maintes reprises.
Le réflexe habituel est d'utiliser un plan de travail. Cela fonctionne lorsque le même ensemble de tâches s'applique systématiquement, mais la méthode atteint ses limites dès que le planificateur a besoin d'un sous-ensemble arbitraire. Dix plans de travail deviennent quarante, puis cent, chacun n'étant qu'une légère variante du précédent. L'alternative, saisir les tâches manuellement, est plus lente et génère des descriptions différentes à chaque fois qu'un mot est orthographié différemment.
Dans cet article, nous explorons une troisième option : une boîte de dialogue personnalisée qui liste les tâches déjà enregistrées, permet au planificateur de cocher celles souhaitées et les copie dans l'ordre de travail en un seul clic. Une option de signature, une boîte de dialogue et un court script d'automatisation. Aucun nouvel objet, aucun Java.
Le contexte est l'écran de suivi des ordres de travail avec une table de tâches. Trois éléments sont déjà en place :
L'idée centrale : la boîte de dialogue n'enregistre rien par elle-même. Il s'agit d'un sélecteur. Son seul rôle est de contenir un ensemble d'enregistrements et de mémoriser ceux que l'utilisateur a cochés. Une option de signature déclenchée par le bouton OK transfère le contrôle à un script d'automatisation, qui effectue le travail réel.
L'option de signature est le pont entre un bouton à l'écran et un script sur le serveur. Sans elle, il est impossible pour un bouton de commande d'atteindre un point de lancement d'action.

Le nom de l'option, ADDREPTASK, est la chaîne exacte que le bouton de la boîte de dialogue déclenchera ; elle est sensible à la casse.
N'oubliez pas d'accorder ADDREPTASK aux groupes de sécurité qui en ont besoin. Si l'option existe mais n'est pas accordée, le bouton s'affiche, la boîte de dialogue s'ouvre, mais cliquer sur OK ne produit aucun effet et n'affiche aucune erreur.
Dans le concepteur d'applications (Application Designer), un bouton-poussoir est ajouté à la barre d'outils du tableau des tâches.

L'astuce ici : définir l'événement sur l'identifiant d'une boîte de dialogue suffit à l'ouvrir. Aucun script n'est nécessaire pour cette partie de la solution, et aucun identifiant de cible ou valeur n'est requis. Maximo détecte un nom d'événement correspondant à une boîte de dialogue dans la présentation et l'ouvre pour l'enregistrement en cours.
La boîte de dialogue est ajoutée au XML de l'application. Elle est courte et chaque attribut a son importance.
<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>
En commençant par le haut :
Les deux boutons en bas illustrent le choix de conception. Annuler utilise l'événement dialogcancel fourni. Le bouton Ajouter les tâches sélectionnées utilise mxevent="ADDREPTASK", l'option de signature de l'étape 1.
Une erreur courante : copier une boîte de dialogue de sélection multiple fournie et laisser son bouton OK avec mxevent="dialogok" et un attribut de valeur. Cette valeur désigne une méthode Java sur le bean de l'application ; elle appellera donc volontiers une fonction écrite pour une table totalement différente. Un script d'automatisation ne peut jamais être nommé à cet endroit. Déclenchez plutôt l'option de signature.
Le script est un point de lancement d'action sur WORKORDER, lié à l'option de signature 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()
Ce qui mérite d'être étudié : les trois lignes qui récupèrent la sélection. Le script demande à la session client web le bean de données derrière la boîte de dialogue, via l'identifiant de la boîte de dialogue, puis demande à ce bean son MboSet et appelle getSelection(). Cela ne renvoie que les lignes cochées par l'utilisateur. Parcourez le bean de données et la sélection s'y trouve tout simplement.
Le reste est du Maximo classique.
L'ordre de travail commence avec une liste de tâches vide et un seul bouton.

Un clic dessus ouvre la boîte de dialogue affichant les tâches disponibles pour cet ordre de travail.

Le planificateur coche ce dont il a besoin. La case à cocher de l'en-tête permet de sélectionner les trois simultanément.

Un clic sur Ajouter les tâches sélectionnées suffit pour fermer la boîte de dialogue et remplir la liste des tâches.

L'ensemble de l'interaction ne nécessite que quatre clics.
Rien dans cette solution n'est spécifique aux tâches de réparation. Pour l'adapter à une autre source ou destination, seuls quatre éléments doivent être modifiés :
L'option de signature, la configuration du bouton et la logique getSelection restent inchangées.
Une chose à clarifier dès le départ : définissez correctement la relation source. Un sélecteur qui renvoie chaque ligne d'un catalogue est inutilisable avec des données réelles. Filtrez-le par des attributs associés dans la clause where de la relation, et non dans le script, afin que la boîte de dialogue ne récupère que ce qui est nécessaire à l'affichage.
Les boîtes de dialogue personnalisées ont la réputation d'être complexes, et la difficulté est presque toujours la même : faire en sorte qu'un bouton à l'écran accède au code sur le serveur, une tâche généralement gérée par du code Java. Une fois que vous savez qu'un événement de bouton-poussoir peut désigner une boîte de dialogue à ouvrir et qu'une option de signature peut exécuter un script, le reste n'est qu'une simple automatisation par 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.