IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

[AS400] Afficher le contenu d'une librairie


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Par défaut [AS400] Afficher le contenu d'une librairie
    Bonjour à tous,

    Je débute actuellement un projet dans lequel je vais devoir automatiser un processus de restauration de librairies AS400 à l'aide d'un programme Java.

    Dans ce processus, je dois exécuter de nombreuse commande (CRTLIB, CLRLIB, MOVOBJ, etc...) et pour cela j'utilise les bibliothèques AS400 pour java (JT400). J'ai déjà testé ces requêtes et tout fonctionne bien.

    Mon soucis c'est par contre pour consulter le contenu d'une librairie. En AS400 je dois utiliser la commande "DSPLIB LIB(MA_LIB)". Mais cette commande n'a aucun message de retour, elle affiche juste le contenu de la librairie sur l'interface AS400.
    Ma question est donc, avez vous une idée de comment faire avec du code Java pour afficher le contenu d'une librairie AS400.


    Pour information mon code actuel est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    AS400 as400 = new AS400(nomMachine,login,password);
    CommandCall command = new CommandCall(as400);
    command.run(commande);
    AS400Message[] messageList = command.getMessageList();
    for (int i=0; i<messageList.length; i++)
    {
    System.out.println(messageList[i].getText());
    }
    J'ai testé ce code avec des commandes comme "CRTLIB LIB(ANOTHERLIB)", "DLTLIB LIB(ANOTHERLIB)" ou encore "CLRLIB LIB(ANOTHERLIB)" et en sortie "Bibliothèque ANOTHERLIB créée.", "Bibliothèque ANOTHERLIB supprimée."
    Mais avec la commande DSPLIB LIB("MY_LIB"), j'ai 0 messages en sortie.

    Merci d'avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je verrais 2 possibilités :

    1) La merdique mais classique

    DSPLIB LIB(NomBibliothèque) OUTPUT(*PRINT)
    CPYSPLF FILE(QPDSPLIB) TOFILE(BiblCible/FileCible) MBROPT(*ADD)
    et l'appel d'un programme qui analyse la sortie

    2) La plus éléguante

    API QUSLOBJ pour lister les objets d'une bibliothèque dans un user space
    API QUSRTVUS pour lire le user space

    Dans les 2 cas, tu appelles un programme sur l'AS/400 pour enchainer les étapes et tu récupères directement la liste par le retour ou tu écris dans une table de base de données pour un traitement dans l'application.

    Si tu n'es pas à l'aise avec les API système de l'AS/400, la première solution sera la plus facile à mettre en oeuvre mais il faudra certainement l'adapter de release à release...

    Pour appeler un programme depuis une application java, tu peux utiliser les objets spécialisés contenus dans le jar jt400.
    Voici un exemple simple avec 2 paramètres en entrée et 1 paramètre en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    import java.beans.PropertyVetoException;
    import com.ibm.as400.access.AS400;
    import com.ibm.as400.access.AS400PackedDecimal;
    import com.ibm.as400.access.AS400Text;
    import com.ibm.as400.access.ProgramCall;
    import com.ibm.as400.access.ProgramParameter;
     
    /**
     * Interface IRIS
     * @author Olivier BUTTERLIN
     */
    public class ARB001CL
    {
        public AS400 system;
        public ProgramCall program;
        public ProgramParameter[] parameterList = new ProgramParameter[3];
        public AS400PackedDecimal division = new AS400PackedDecimal(3, 0);
        public AS400Text depot = new AS400Text(10);
        public AS400Text section = new AS400Text(8);
        private static ARB001CL instance;
     
        public static ARB001CL getInstance(String as400Name, String user, String password)
        {
            if (instance == null)
            {
                instance = new ARB001CL();
                instance.system = new AS400(as400Name, user, password);
                instance.parameterList[0] = new ProgramParameter();
                instance.parameterList[1] = new ProgramParameter();
                instance.parameterList[2] = new ProgramParameter(80);
                instance.program = new ProgramCall(instance.system, "/QSYS.LIB/ARBPLIB.LIB/$ARB001CL.PGM", instance.parameterList);
            }
            return instance;
        }
     
     
        /**
         * Appel du programme et récupération du message d'achèvement
         */
        public String run() throws Exception
        {
            Exception ex = null;
            int i = 0;
            /*
             * 2 tentatives pour palier à un IPL sur l'AS/400 sans redémarrage du serveur JBoss
             */
            while (i < 2)
            {
                try
                {
                    ++i;
                    if (program.run())
                    {
                        return (String)lerr.toObject(parameterList[2].getOutputData());
                    }
                    break;
                }
                catch (Exception e)
                {
                    ex = e;
                }
            }
            return ex == null ? null : ex.toString();
        }
     
        public void setDivision(Integer division) throws PropertyVetoException
        {
            parameterList[0].setInputData(this.division.toBytes(division.doubleValue()));
        }
        public void setDepot(String depot) throws PropertyVetoException
        {
            parameterList[1].setInputData(this.depot.toBytes(depot));
        }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Par défaut
    Merci pour cette réponse.
    Je vais regarder et tester les solutions que tu proposes.

    Dans ton exemple, à la ligne 55, tu écris "return (String)lerr.toObject(parameterList[2].getOutputData());"
    A quoi correspond l'objet "lerr", il n'est déclaré nulle part dans la classe.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est un mauvais copier/coller... j'ai pris dans 2 classes pour te montrer la récupération d'un paramètre en retour.
    En adaptant, il faudrait mettre section en lieu et place de lerr et remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instance.parameterList[2] = new ProgramParameter(80);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instance.parameterList[2] = new ProgramParameter(8);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 12
    Par défaut Solution
    Finalement j'ai opté pour une solution un peu différente.

    Dans un premier temps je lance ma commande "DSPLIB" et j'écris le résultat dans un fichier Spool en ajoutant le paramètre "OUTPUT(*PRINT)".
    Ensuite, à l'aide de la librairie JT400, je peux récupérer ce fichier Spool et le lire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SpooledFileList splfList = new SpooledFileList( as400 );
    splfList.setUserFilter("MYUSERNAME");
    splfList.openSynchronously();
    Enumeration<?> enumx = splfList.getObjects();
    SpooledFile splf = null;
    while(enumx.hasMoreElements()) {
        splf = (SpooledFile) enumx.nextElement();
    }
    En faisant cela, ma variable splf contient le dernier SpooledFile crée.
    Il ne me reste plus qu'à le lire. Ici je stock le contenu du fichier dans une variable Data qui peut ensuite être affichée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PrintParameterList printParms = new PrintParameterList();
    printParms.setParameter(PrintObject.ATTR_WORKSTATION_CUST_OBJECT,   "/QSYS.LIB/QWPDEFAULT.WSCST");
    printParms.setParameter(PrintObject.ATTR_MFGTYPE, "*WSCST");
     
    // Create a page input stream from the spooled file
    PrintObjectPageInputStream is = splf.getPageInputStream(printParms);
     
    BufferedReader d = new BufferedReader(new InputStreamReader(is));
    String data = "";
    while((data = d.readLine() )!=null)
    {
        pageSpool += data+"\n";
    }
    J'espère que ça pourra aider d'autres utilisateurs qui auraient le même problème.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Attention aux changements de version... ça peut avoir des impacts sur le fichier spool généré par la commande DSPLIB
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Bonjour.

    Tardif mais peut être utile :
    Au lieu d'utiliser DSPLIB et triturer un spool, tu peux lancer un requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from qsys2/systables  where TABLE_SCHEMA = 'mabiblio'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DLL] Afficher le contenu d'une dll dans un Tpanel
    Par Fabs dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/08/2007, 14h30
  2. afficher les contenu d'une liste dynamiquement
    Par mzt.insat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/04/2006, 18h02
  3. [10] afficher le contenu d'une collection
    Par noinneh dans le forum Oracle
    Réponses: 6
    Dernier message: 14/02/2006, 13h37
  4. Réponses: 3
    Dernier message: 27/01/2006, 18h35
  5. Afficher le contenu d'une variable
    Par mpat dans le forum ASP
    Réponses: 11
    Dernier message: 14/11/2005, 14h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo