Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > AS/400

AS/400 Le Forum d'entraide sur IBM AS/400 - iSeries. RPG.

Réponse
 
Outils de la discussion
Vieux 14/11/2008, 12h48   #1 (permalink)
Invité de passage
 
Date d'inscription: novembre 2008
Localisation: Croix
Âge: 53
Messages: 7
Par défaut e-Series et XML : mode d'emploi

Bonjour, je cherche depuis une étérnité à utiiser sur mon e-series le produit 5733XT1 ou quelque chose qui pourrait transformer un fichier e-ereies en document XML et vice versa.
Merci pour vos réponses.
jmn59170 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 14h22   #2 (permalink)
Membre chevronné
 
Avatar de Mercure
 
Date d'inscription: novembre 2004
Localisation: Région parisienne
Messages: 615
Par défaut

Il devrait exister de nombreux produits commerciaux pour faire ce genre de conversion, sinon par programme RPG ou Cobol via "Expat", c'est aisément faisable.
__________________
Philippe
Mercure est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h04   #3 (permalink)
Invité de passage
 
Date d'inscription: novembre 2008
Localisation: Croix
Âge: 53
Messages: 7
Par défaut

Citation:
Envoyé par Mercure Voir le message
Il devrait exister de nombreux produits commerciaux pour faire ce genre de conversion, sinon par programme RPG ou Cobol via "Expat", c'est aisément faisable.
Au risque de paraitre deutant, ce qui est vari dans le monde XML, c'est vrai qu'il existe de multiples produits. Hélas, ma boite VEUT utiliser celui là.

Quant à "EXPAT", je ne sais pas ce que c'est ...

Merci pour toute aide.
jmn59170 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h29   #4 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 13
Par défaut

Citation:
je cherche depuis une étérnité à utiiser sur mon e-series le produit 5733XT1
je l'ai utilisé pour voir il y a qlq années, c'est compliqué, voire lourdingue, parce-que c'est un wrapper sur une bibliothèque C++. Si vous avez une question plus précise je peux peut-être vous aider.

Expat est un parser xml simple et rapide.

Sinon à partir de la V5R4 le rpg a des nouveaux codes opérations et bifs : xml-into, xml-sax, %xml, %handler

Il y a aussi les DB2 XML extensions, que j'ai jamais réussi à faire marcher, et dont je ne sais pas si elles sont toujours d'actualité
vazymimil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 16h59   #5 (permalink)
Invité de passage
 
Date d'inscription: novembre 2008
Localisation: Croix
Âge: 53
Messages: 7
Par défaut

Citation:
Envoyé par vazymimil Voir le message
je l'ai utilisé pour voir il y a qlq années, c'est compliqué, voire lourdingue, parce-que c'est un wrapper sur une bibliothèque C++. Si vous avez une question plus précise je peux peut-être vous aider.

Expat est un parser xml simple et rapide.

Sinon à partir de la V5R4 le rpg a des nouveaux codes opérations et bifs : xml-into, xml-sax, %xml, %handler

Il y a aussi les DB2 XML extensions, que j'ai jamais réussi à faire marcher, et dont je ne sais pas si elles sont toujours d'actualité

Comment utilise-t-on un "PARSER" dans un pgm ?? Ou puis-je trouver de la documentation sur le "comment faire fonctionner" ce bastringue
jmn59170 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 17h51   #6 (permalink)
Invité régulier
 
Date d'inscription: octobre 2008
Messages: 13
Par défaut

hou là ! j'imaginais plus précis que çà !

bon pour commencer, voilà un lien sur pause-café (dont je ne fais pas partie), qui explique rapidement le xml et comment utiliser les nouveautés du RPG

pour le bousin:
la doc du 5733XT1

bon, il y a en fait deux "parser" (analyseurs syntaxiques, lecteurs) de xml dans le produit. L'un est basé sur DOM (Document Object Model), très puissant, qui charge le document dans un arbre en mémoire, permet de faire des recherches, et de mettre à jour l'arbre, etc... Il permet par exemple au Javascript de modifié à la volée des pages HTML dans les navigateurs (changements de couleurs, déplacements, etc...)
Complexe et lent, orienté objet, pas adapté du tout à ce que vous voulez faire à priori... sauf que c'est le seul moyen proposé par 5733XT1 pour écrire des documents xml.
Les exemples proposés dans la doc ont l'avantage de fonctionner mais sont loin du compte pour ce qui est de tout le travail à faire pour utiliser la chose.
Le machin ne sait pas "vraiment" écrire du xml, il lit l'arbre et vous demande "comment je fais pour écrire ceci ?" ou un truc du genre je me souviens plus bien.
Et, en v5r2 en tout cas, 5733XT1 est fais pour être utilisé en CCSID 37 (Etats-unis) plutot qu'en CCSID du job ou du système, du coup votre code est rempli de conversion de caractères dont les Etats-uniens sont "privés"


l'autre parser est évenementiel , c'est SAX (Simple API for XML, le même que dans les nouveautés V5R4), déjà beaucoup plus léger il permet seulement de lire les document avec des procédures comme dans le RPG (%handler, etc)

franchement je crois que le meilleur service que je peux vous rendre c'est de vous dire d'utiliser soit les nouveautés V5R4 (mais vous êtes en V5R2 ou V5R3 n'est-ce pas ?), soit d'utiliser expat (V5R1), ce que personnellement je n'ai jamais fait (les deux).

et pour écrire des fichier xml les apis IFS open(), write() et close() suffise largement pour peu qu'on fasse attention au caractères spéciaux.

Dernière modification par vazymimil ; 14/11/2008 à 18h52
vazymimil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/11/2008, 19h51   #7 (permalink)
Membre habitué
 
Date d'inscription: mai 2008
Messages: 149
Par défaut

Salut,

Il est facile d'écire du XML, car c'est des balises devant les zones de tes enregistrements que tu peux mettre dans un fichier plat et remonter sur un pc. Pour faciliter celà, Tu peux aussi utiliser CGIDEV2 pour écrire un fichier XML, CGIDEV2 que tu peux le télécharger à cette adresse : http://www.easy400.net/easy400p/downloads.html.
Après avoir installé CGIDEV2, voici un exemple d'utilisation avec du XML.
D'abord on créé un fichier dans l'IFS (ex: '/XML/template2.xml') avec l'éditeur que tu veux :

Code :
/$Fichier_Debut                             
<?xml version="1.0" encoding="iso-8859-15"?>
<RH>                                        
/$Service_Debut                             
   <Service Numero="/%SrvNum%/">            
      <Libelle>/%SrvLib%/</Libelle>         
      <Effectifs>/%SrvNbr%/</Effectifs>     
/$Employes                                  
      <Employes Matricule="/%EmpMat%/">     
         <Nom>/%EmpNom%/</Nom>              
         <Poste>/%EmpPoste%/</Poste>        
         <Salaire>/%EmpSalaire%/</Salaire>  
         <Age>/%EmpAge%/</Age>              
      </Employes>                           
/$Service_Fin
   </Service>
/$Fichier_Fin
</RH>
puis tu créés un RPG équivalent :

Code :
H DFTACTGRP(*NO)                                           
 /copy hspecsbnd                                           
 /copy prototypeb                                          
 /copy usec                                                
                                                           
DDS_Employes    E DS                  extname(EMPLOYES)    
D                                     Qualified            
DDS_Services    E DS                  extname(SERVICES)    
D                                     Qualified            
                                                           
D Sav_Service     S                   like(Service)        
D                                     inz(*Hival)          
D Effectifs       S              5  0                      
                                                           
DResultat         DS                                       
D Mat                                 like(DS_Employes.Mat)
D Nom                                 like(DS_Employes.Nom)   
D Poste                               like(DS_Employes.Poste) 
D Salaire                             like(DS_Employes.Salair)
D Age                            3  0 inz(0)                  
D Service                             like(DS_Employes.Srv)   
D Libelle                             like(DS_Services.NomSrv)
                                                              
                                                              
 /free                                                        
                                                              
     SetNoDebug(*OFF);                                        
     getHtmlIfsMult( '/XML/template2.xml' );                  
                                                              
     // On écrit l'entête de fichier                          
     wrtsection('Fichier_Debut');                             
                                                               
    // On fait un curseur pour lire les employes               
    Exec Sql   Declare c1 cursor for                           
               Select e.mat, e.nom, e.poste, e.salair,         
                      Year(Curdate()-e.DatNai), e.srv, s.nomsrv
               From EMPLOYES e, SERVICES s                     
               Where e.Srv=s.Srv                               
               Order by Srv, Mat;                              
                                                               
    Exec Sql   Open c1;                                        
                                                               
    Dow SQLSTT = '00000';                                      
       Exec Sql fetch next from c1 into :Resultat;             
       If SQLSTT = '00000';                                    
                                                               
       // On écrit la fin de Service si changement de Service  
       // Puis on écrit l'entête de Service                    
           If Not (Service = Sav_Service);                  
              // Récupération des Effectifs pour le Service 
              Exec SQL Select count(*)                      
                  into :Effectifs from EMPLOYES             
                  Where Srv=:Service;                       
              If Not (Sav_Service = *Hival);                
                 wrtsection('Service_Fin');                 
              EndIf;                                        
              updHtmlVar('SrvNum'    : Service          );  
              updHtmlVar('SrvLib'    : Libelle          );  
              updHtmlVar('SrvNbr'    : %char(Effectifs) );  
              wrtsection('Service_Debut');                  
              Sav_Service = Service;                        
           EndIf;                                           
           updHtmlVar('EmpNom'    : Nom           );      
           updHtmlVar('EmpPoste'  : Poste         );      
           updHtmlVar('EmpSalaire': %editc(Salaire: 'K'));
           updHtmlVar('EmpAge'    : %Char(Age)    );      
           wrtsection('Employes');                        
                                                          
        EndIf;                                            
     EndDo;                                               
     wrtsection('Service_Fin');                           
     wrtsection('Fichier_Fin');                           
                                                          
     Exec Sql   Close c1;                                 
     WrtHtmlToStmf('/XML/resultat2.xml': 819);            
     *inlr = *on;                                         
                                                          
  /end-free
Après éxectution celà te donneras un fichier /XML/resultat2.xml qui contiendra :


Code :
<?xml version="1.0" encoding="iso-8859-15"?> 
<RH>                                         
   <Service Numero="A00">                    
      <Libelle>Direction générale</Libelle>  
      <Effectifs>1</Effectifs>               
      <Employes Matricule="120">             
         <Nom>JEAN-PAUL</Nom>                
         <Poste>COMPTABLE</Poste>            
         <Salaire>57,191.40</Salaire>        
         <Age>56</Age>                       
      </Employes>                            
   </Service>                                
   <Service Numero="B01">                    
      <Libelle>PLANNING</Libelle>            
....
      </Employes>             
   </Service>                 
</RH>
En ce qui concerne la lecture, c'est ce qu'il y a de plus compliqué et pour t'éviter de faire des SCAN, des SUBSTR etc... pour lire et interpreter un fichier XML, tu as un besoin d'un PARSER.
Deux types de PARSERs différents existent comme expliqué précédemment: DOM et SAX.
La V5R4 permet d'avoir ces parsers en RPG, et pour les versions antérieures, en RPG il faut utiliser EXPAT. Sinon, un parser DOM existe en COBOL bien avant la V5R4.
Tu peux aussi utiliser un PARSER JAVA, appelable à travers un RPG faisant appel à des classes, tu trouveras des exemples sur le net.

Dernière modification par K2R400 ; 15/11/2008 à 17h11
K2R400 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/11/2008, 08h47   #8 (permalink)
Invité régulier
 
Date d'inscription: septembre 2005
Messages: 19
Par défaut

Si votre boite change d'avis, XML/400 (l'éditeur est Patrick Townsend) est un excellent produit qui permet de créer des mapping automatiques entre XML & DB2 dans les 2 sens.
db24ever est déconnecté   Envoyer un message privé Réponse avec citation
NEWS AUTRESAdaAlgoAssembleurBasicCobolFortranLaTeXMATLABPascalPerlPrologPurebasicRéseauRubySystèmesXMLRAD

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > AS/400



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide