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.

La configuration

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 :

  • TASKREPLOC - un objet personnalisé contenant le catalogue des tâches de réparation, chacune avec un emplacement, un identifiant de tâche et une description. Ignorez ceci si vous souhaitez importer toutes les tâches de travail selon un critère spécifique.
  • Une relation du même nom entre WORKORDER et cet objet, définie de manière à ce que le planificateur ne voie que les tâches pertinentes pour l'ordre de travail en cours.
  • SHOWTASKS - la relation native entre un ordre de travail et ses tâches. C'est là que les lignes copiées sont insérées.

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.

Étape 1 : Créer l'option de signature

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.

Ajouter/Modifier les options de signature. ADDREPTASK est créé pour l'application, avec les options de signature avancées configurées afin que l'action puisse être invoquée depuis l'interface utilisateur.

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.

Étape 2 : Ajouter le bouton qui ouvre la boîte de dialogue

Dans le concepteur d'applications (Application Designer), un bouton-poussoir est ajouté à la barre d'outils du tableau des tâches.

Propriétés du bouton-poussoir. L'événement est défini sur selectrepairtasks, qui correspond à l'identifiant de la boîte de dialogue que nous allons définir.


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.

Étape 3 : Définir la boîte de dialogue

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 :

  • le beanclass MultiselectDataBean permet la sélection multiple et, surtout, mémorise les choix de l'utilisateur lorsqu'il navigue entre les pages de la liste.
  • le parentdatasrc MAINRECORD lie la boîte de dialogue à l'ordre de travail actuellement ouvert, permettant ainsi de résoudre la relation à partir de celui-ci.
  • La relation TASKREPLOC fournit les lignes. Il s'agit également de la source de données que le script lira en retour.
  • selectmode multiple et la première tablecol, avec mxevent toggleselectrow, génèrent la colonne de cases à cocher.
  • inputmode readonly empêche toute modification du catalogue source depuis le sélecteur.
  • savemode onunload valide la source de données de l'ordre de travail à la fermeture de la boîte de dialogue, ce qui permet de conserver les lignes de tâches ajoutées par le script.

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.

Étape 4 : Le script d'automatisation

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.  

Voir le résultat en action

L'ordre de travail commence avec une liste de tâches vide et un seul bouton.

Ordre de travail sans tâche, avec le bouton Sélectionner les tâches de réparation dans la barre d'outils.


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

La boîte de dialogue liste trois tâches de réparation pour l'emplacement WKSHP3, chacune avec son identifiant et sa description.

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

Les trois tâches sont sélectionnées, prêtes à être ajoutées.

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.

Trois tâches créées.


L'ensemble de l'interaction ne nécessite que quatre clics.

Étendre le modèle

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 :

  1. La relation dans la boîte de dialogue, qui détermine les choix proposés à l'utilisateur.
  1. Les colonnes du tableau de la boîte de dialogue.
  1. La relation vers laquelle le script effectue l'ajout.
  1. Le bloc setValue qui assure la correspondance entre les deux.

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.

Conclusion

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.

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