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': '/'); .../...