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

AS/400 Discussion :

Inhiber controle validité d'une commande si option en *CMDSTR


Sujet :

AS/400

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Inhiber controle validité d'une commande si option en *CMDSTR
    Bonjour,

    je souhaite pour une commande avec une option en *CMDSTR que dans certain cas, le controle de validité de la commande inscrite dans cette option ne soit pas controlé par IBM.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHKVAR COND(*IF 'TOTO' *EQ 'USER') 
    THEN(WRKSPLF SELECT(*NONE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')
    THEN et de type *CMDSTR
    ELSE et de type *CHAR

    J'ai bien l'option d'ajouter un point d'exit dans QIBM_QCA_RTV_COMMAND, mais je reçoit la commande complète dans une seule zone ce qui ne me permet pas d'avoir les options en zones séparées.
    Etant donné que l'option THEN peut admettre N commandes imbriquées, je me vois mal faire un programme pour extraire le THEN.
    IBM fourni, lors de l'appel du programme de traitement de la commande, les option prêt a l'emploi (je me retrouve donc avec une zone contenant "WRKSPLF SELECT(*NONE)".

    J'ai essayé également une commande en substitution en paramétrant l'option THEN en *CHAR, mais ça passe pas

    Merci de vos réponses et/ou idées


  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Je ne suis pas persuadé d'avoir bien compris ta demande.
    Pourquoi veux-tu que les contrôles IBM soient neutralisés ?
    Peux-tu développer et surtout nous dire ce que tu veux faire et à quoi ça va servir, car on peut alors te donner des idées.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ok, ci dessous un exemple/démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHKVAR COND(*IF '&VARIABLE' *NE '*NONE') 
    THEN(WRKSPLF SELECT(&VARIABLE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')
    Supposons que &VARIABLE = "*NONE"

    Aprés remplacement de celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHKVAR COND(*IF '*NONE' *NE '*NONE') 
    THEN(WRKSPLF SELECT(*NONE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')
    1) passage avec inhibation du contrôle IBM:
    l'option THEN (type *CMDSTR) :
    - la commande à exécuter dans cette option est finalement incorrecte.
    - L'inhibation me permettrais dans le CLP de tester l'option COND en premier lieu.
    - Cette option COND n'étant pas remplie, seul l'option ELSE sera prise en compte, l'option THEN ne servira pas, alors même si, point de vue syntaxique, elle est incorrecte, ça ne gêne pas .

    2) Pourquoi garder cette option en *CMDSTR ?
    - Pour faciliter la saisie par prompt en cascade pour l'utilisateur.

    3) Test effectuer, pistes recherchées :
    - Lorsque que je reçois cette commande dans une zone string, je scanne le terme CHKVAR. Si trouvé, j'ai tenté de faire une sorte d'OVRCMD. J'ai créé une commande XCHKVAR avec les même options mais en remplaçant le type de l'option THEN en *CHAR.
    Comme la valeur dans THEN n'est pas une chaîne, IBM retourne la commande ACHKVAR en erreur.

    - L'exit point QIBM_QCA_RTV_COMMAND : Dans ce cas, je prends bien la main avant le contrôle de validité, mais je reçois la commande dans une zone. Ce qui m'oblige à faire un programme de recherche du fameux THEN avec les notion de signes de citation (quote) et donc tous les soucis de gestion des doubles quotes..

    Tous le problème tourne autour de l'option THEN de type *CMDSTR qui contient une commande invalide mais qui ne sera pas exécutée vu la condition.

    J'espère que cette exemple vous apparaîtra plus clair

    Par avance merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Utiles plutôt CHGCMD, tu pourras mettre ton propre programme de contrôle de la commande et définir aussi son environnement d'éxécution possible.

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Le CHGCMD pour attacher un programme de validation n'est appellé qu'a compter du moment ou le niveau de controle syntaxique IBM est passé.

    Le point d'exit est, à priori le seul moyen de contrôler et de regénérer la chaîne de la commande avant ce contrôle syntaxique.
    Ce qui oblige donc à faire un programme de découpage de cette commande puisque qu'elle arrive sous la forme d'une chaîne

    On peux donc dire que l'ordre d'execution est :
    1er ) Les exit point sur commande (libre programme et optionnel)
    2ème) Le contrôle syntaxique IBM (incontournable)
    3eme) Le programme de validation attaché à la commande (optionnel)
    4ème) Le programme d'exécution

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Alors créé ta propre commande qui remplace celle d'IBM !!!!
    - Soit en la mettant dans la SYSLIBL au-dessus de celle de QSYS (qui sera interdit en V6R1), pour ce faire il suffit de modifier la valeur système QSYSLIBL
    - soit en modifiant le paramètre PGM "Programme de traitement de cde" de CHGCMD pour débrancher vers ton programme.

  7. #7
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Manifestement, je m'explique trés mal

    Ok, ci dessous un exemple/démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHKVAR COND(*IF '&VARIABLE' *NE '*NONE') 
    THEN(WRKSPLF SELECT(&VARIABLE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')
    Dans ce cas, IBM admet la commande WRKSPLF SELECT(&VARIABLE) car il y a une variable

    Supposons que &VARIABLE = "*NONE"

    Aprés remplacement de celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHKVAR COND(*IF '*NONE' *NE '*NONE') 
    THEN(WRKSPLF SELECT(*NONE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')
    Si je résouds COND(*IF '*NONE' *NE '*NONE') => ce n'est pas vrai
    La condition n'est pas remplie et doit finalement amener à exécuter le ELSE, l'option THEN n'a plus d'interêt.

    Mais maintenant que la variable &VARIABLE a été remplacée par *NONE, IBM considère la commande WRKSPLF SELECT(*NONE) comme incorrecte (ce qui est vrai qu'elle est incorrecte). mais concretement, on a que faire du THEN !

    de part ce blocage, IBM n'appel pas le programme attaché à la commande.

    En reprennant ton dernier message K2R400:
    Alors créé ta propre commande qui remplace celle d'IBM !!!!
    C'est a dire ? le CHKVAR est une commande non IBM...je comprends pas de quelle commande tu parles ?

    - Soit en la mettant dans la SYSLIBL au-dessus de celle de QSYS (qui sera interdit en V6R1), pour ce faire il suffit de modifier la valeur système QSYSLIBL
    Même si je mets la commande dans une bibliothèque en 1ere dans la SYSLIB, ça ne resoud rien du tout, IBM envera un message d'erreur car WRKSPLF SELECT(*NONE) est invalide .

    - soit en modifiant le paramètre PGM "Programme de traitement de cde" de CHGCMD pour débrancher vers ton programme.
    Ca ne change rien du tout au problème, puisqu'on accède pas au programme traitant la dite commande puisque IBM bloque par message d'erreur avant de donner la main au programme. Je peux le changer, rien n'y fera

    Merci

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Après 25 relectures successives (et oui suis pas très rapide), je crois avoir compris ton Prb, effectivement je répondais "à côté".
    Normal, si tu déclares un paramètre dans une commande en *CMDSTR, il contrôlera sa validité !
    M'enfin ton ELSE marche en *CHAR (avec des quotes), tu pourrais conserver la même logique pour ton THEN (certes tu perdras le F4) et il faudra y mettre les quotes.

    Sinon as-tu essayé pour éviter le contrôle dans le THEN d'intégrer un DO/ENDDO si la condition est vraie.
    M'enfin faudrait voir le source de CHKVAR.

  9. #9
    Candidat au Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    On a finalement développé le programme de recherche de chaine...et utiliser le Exit point (WRKREGINF => QIBM_QCA_CHG_COMMAND CHGC0100 *YES Change command exit programs )

    Donc aprés avoir extrait les conditions et analyser ces dernières, si le THEN doit être executer, on le laisse tel que, sinon on le remplace par THEN(/**/) et on redonne la chaine à IBM.

    CHKVAR COND(*IF '*NONE' *NE '*NONE')
    THEN(WRKSPLF SELECT(*NONE))
    ELSE('DSPLIBL OUTPUT(*PRINT)')

    deviendra au final

    CHKVAR COND(*IF '*NONE' *NE '*NONE')
    THEN(/**/)
    ELSE('DSPLIBL OUTPUT(*PRINT)')

    En tout cas, merci pour votre aide et bonne continuation

  10. #10
    Expert confirmé
    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
    Points : 4 155
    Points
    4 155
    Par défaut
    Citation Envoyé par ybosse Voir le message
    ...En tout cas, merci pour votre aide et bonne continuation
    Excellent feedback.

    Bonne continuation et à une autre participation.

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

Discussions similaires

  1. Utiliser des options dans une commandes
    Par Ladgalen dans le forum Débuter
    Réponses: 8
    Dernier message: 17/12/2009, 14h42
  2. [AC-2007] quel est le retour pour une fonction de controle validité
    Par polux dans le forum IHM
    Réponses: 2
    Dernier message: 17/09/2009, 14h55
  3. Réponses: 3
    Dernier message: 10/09/2009, 11h08
  4. [OpenOffice][Tableur] Macro, où trouve t on les différentes options d'une commande
    Par esperanto94 dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 15/11/2008, 11h07
  5. Controle de validité sur une liste déroulante
    Par francois134 dans le forum IHM
    Réponses: 3
    Dernier message: 04/02/2008, 06h12

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