IFSXML – Dans la pratique

La page n’est plus maintenue en Français : tips-and-good-practice

Mutualiser, réutiliser

L’utilisation d’un handle permet de dispatcher l’alimentation d’un document XML dans de multiples procédures. Les quelques recommandations ci-dessous illustrent la façon d’en tirer avantage.

Dissocier les procédures

Il est fortement préférable de toujours séparer la création d’un document de son alimentation :

      /free

       // Récupération d'un handle
       hXml = ifsxml_new();

       ifsxml_createFile(hXml: 'xmlFile.xml');

       // Définition des options de formatage
       ifsxml_setPretty(hXml: IFSXML_NONE);

       // Appel d'une procédure fillData() pour l'alimentation du document
       // y compris la définition de la racine.      
       fillData(hXml);

       // Cloture
       ifsxml_Close(hXml);

       // Libération du handle
       ifsxml_free(hXlk);
      /end-free

La prochaine évolution majeure d’IFSXML sera la possibilité de ne plus avoir à créer… de fichier de sortie et de proposer la récupérer le flux produit. Cela permet, par exemple, d’envisager la transmission des données générées via du CGI.

En séparant les traitements de créations/paramétrages des traitements d’alimentations, ces derniers pourront être réutilisés indépendamment du média de sortie (IFS, CGI, socket, etc).

Traiter les DS dans des procédures spécifiques

Il est grandement bénéfique de créer une procédure d’écriture spécifique par structure lorsque celle-ci sont utilisées régulièrement ou nécessites des formatages complexes.

Ci-dessous une structure simple :

     d m_ds_contact...
     d                 ds                  qualified based(null)
     d   
     d   nom...
     d                               64a   varying
     d   prenom...
     d                               64a   varying
     d   adresse...
     d                              256a   varying

Et la procédure permettant de l’exporter :

     
.../...

      /copy QRPGLEINC,IFSXML

.../...

      *---------------------------------------------------------------------------------------------
      * 
      * Exporte une structure basée sur m_ds_contact
      *  
      *--------------------------------------------------------------------------------------------- 
     p xmlexp_ds_contact..
     p                 b  
     d                 pi              
     d   hXml...
     d                                     value like(m_ifsxml_handle)
     d   p_ds_contact_...
     d                                 *   value
     d contact_...
     d                 ds                  likeds(m_ds_contact) based(p_ds_contact_) 
      /free

       xmlifs_openElement(hXml: 'contact');
         xmlifs_addElement(hXml: 'nom': contact_.nom);
         xmlifs_addElement(hXml: 'prenom': contact_.prenom);
         xmlifs_addElement(hXml: 'adresse': contact_.email);
       xmlifs_closeElement(hXml);

      /end-free
     

Crééer des procédures d’exportations spécifiques

Il est aussi intéressant de créer des procédures d’exportations pour sortir des informations métiers (clients, détail de facture) ou bien techniques (info sur l’application, la version etc).

L’exemple ci-dessous exporte les informations du job à l’origine du traitement, elle ne reçoit en paramètre que le handle du document.

      *---------------------------------------------------------------------------------------------  
      *  
      * Exporte les informations sur l'utilisateur à l'origine du traitement (dans un contexte de
      * session traditionnelle)
      *
      * <jobinitiator name="" user="" number=""/>
      *
      *--------------------------------------------------------------------------------------------- 
     p xmlexp_job..
     p                 b  
     d                 pi              
     d   hXml_...
     d                                     value like(m_ifsxml_handle)
     d qusrjobi...
     d                 pr                  extpgm('QUSRJOBI')
     d   inf                               likeds(jobi0300)
     d   len                         10i 0 const
     d   fmt                          8a   const
     d   jun                         26a   const
     d   jint                        16a   const
     d   b                                 like(api_error)
     d
     d jobi0300...
     d                 ds                  qualified
     d   bytesReturned...
     d                               10i 0
     d   bytesAvailable...
     d                               10i 0
     d   jobName...
     d                               10a
     d   jobUser...
     d                               10a
     d   jobNumber...
     d                                6a
     d   jobInternalID...
     d                               16a
     d   jobStatus...
     d                               10a
     d   jobType...
     d                                1a
     d   jobSubtype...
     d                                1a
     d   jobQ...
     d                               10a
     d   jobQLib...
     d                               10a
     d   jobQPriority...
     d                                2a
     d   qutQ...
     d                               10a
     d   qutQLib...
     d                               10a
     d   qutQPriority...
     d                                2a
     d   printDevice...
     d                               10a
     d   submitByJob...
     d                               10a
     d   submitByUser...
     d                               10a
     d   submitByJobNumber...
     d                                6a
     d   submitMsgQ...
     d                               10a
     d   submitMsgQLib...
     d                               10a
     d   statusOnJobQ...
     d                               10a
     d   dateEnteredJobQ...
     d                                8a
     d   jobDate...
     d                                7a
     d api_error       ds
     d   err_size...
     d                               10i 0 inz(%size(api_error))
     d   err_length...
     d                               10i 0 inz(0)
     d   err_id                       7a
     d                                1a
     d   err_data                   128a           
      /free

       qusrjobi(jobi0300: %len(jobi0300): 'JOBI0300' : '*': ' ': api_error);

       xmlifs_addElement(hXml_: 'jobinitiator');

       if jobi0300.jobType = 'I';
         // Nous somme actuellement en interactif
         xmlifs_addAttribute(hXml_: 'name': %trimr(jobi0300.jobName));
         xmlifs_addAttribute(hXml_: 'user': %trimr(jobi0300.jobUser));
         xmlifs_addAttribute(hXml_: 'number': %trimr(jobi0300.jobNumber));
       else;
         // En batch
         xmlifs_addAttribute(hXml_: 'name': %trimr(jobi0300.submitByJob));
         xmlifs_addAttribute(hXml_: 'user': %trimr(jobi0300.submitByUser));
         xmlifs_addAttribute(hXml_: 'number': %trimr(jobi0300.submitByJobNumber));
       endif;

      /end-free

 

Utiliser des Namespaces

L’exemple suivant montre comment produire un flux contenant des espaces de noms.

.../...

       // <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       ifsxml_setRootName(hXml: 'stylesheet');
       ifsxml_addAttribute(hXml: 'version': '1.0');
       ifsxml_addAttribute(hXml: 'xmlns:xsl': 'http://www.w3.org/1999/XSL/Transform');
         
.../...

       // <xsl:template match="/">
       ifsxml_openElement(hXml: 'xsl:template');
       ifsxml_addAttribute(hXml: 'match': '/');

.../...