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 :

Aide QUSRJOBI jobi0300


Sujet :

AS/400

  1. #1
    Candidat au Club
    Aide QUSRJOBI jobi0300
    Bonjour
    Je sollicite votre aide sur l'api QUSRJOBI format jobi0300.
    En effet j'ai fait un programme qui recense tous les jobs en message de mon AS400 et j'ai mis une colonne "JOBQ" dans mon écran pour dire tel job est dans tel JOBQ. Pour remonter l'info, j'ai tenté de faire marcher l'api QUSRJOBI en format jobi0300.

    Sauf qu’impossible de faire le call de la manière suivante:

    callp qusrjobi(dsjobdta: %size(dsjobdta): 'JOBI0300': 'NOMDUJOB': ' ')
    (le nom du job étant sous un format 063817/ARCAD/ARCAD_NET

    L'historique de travail me retourne l'erreur suivante:
    Job AD/AD_NET ARC/063817 ARC not found. (comme si tout était mélangé...)

    Pour info si dans mon programme je passe le call de la manière suivante:
    callp qusrjobi(dsjobdta: %size(dsjobdta): 'JOBI0300': '*': ' ')

    En débug je vois que je récupère bien les infos de travail de ma session interactive qui a lancé le call du programme.
    Pensant que les '/' gênais je les ai retirés via un var = %Scanrpl('/': ' ':NOMDUJOB); mais même résultat.

    Pouvez vous m'aider? Où y a-t-il un autre moyen (plus simple) de retrouver la jobq d'un job? (une table par exemple)

    Merci d'avance

  2. #2
    Membre éclairé
    Citation Envoyé par Phebo Voir le message
    Bonjour
    Je sollicite votre aide sur l'api QUSRJOBI format jobi0300.
    En effet j'ai fait un programme qui recense tous les jobs en message de mon AS400 et j'ai mis une colonne "JOBQ" dans mon écran pour dire tel job est dans tel JOBQ. Pour remonter l'info, j'ai tenté de faire marcher l'api QUSRJOBI en format jobi0300.

    Sauf qu’impossible de faire le call de la manière suivante:

    callp qusrjobi(dsjobdta: %size(dsjobdta): 'JOBI0300': 'NOMDUJOB': ' ')
    (le nom du job étant sous un format 063817/ARCAD/ARCAD_NET

    L'historique de travail me retourne l'erreur suivante:
    Job AD/AD_NET ARC/063817 ARC not found. (comme si tout était mélangé...)

    Pour info si dans mon programme je passe le call de la manière suivante:
    callp qusrjobi(dsjobdta: %size(dsjobdta): 'JOBI0300': '*': ' ')

    En débug je vois que je récupère bien les infos de travail de ma session interactive qui a lancé le call du programme.
    Pensant que les '/' gênais je les ai retirés via un var = %Scanrpl('/': ' ':NOMDUJOB); mais même résultat.

    Pouvez vous m'aider? Où y a-t-il un autre moyen (plus simple) de retrouver la jobq d'un job? (une table par exemple)

    Merci d'avance
    Bonjour,

    Le nom du Job doit être transmis sans séparation et dans l'ordre inverse (champs mis bout à bout avec les blancs !) : Job name+User name+Job number
    Dans ton cas la variable transmise aurait donc du contenir :

  3. #3
    Candidat au Club
    Citation Envoyé par m4k-Hurrican Voir le message
    Bonjour,

    Le nom du Job doit être transmis sans séparation et dans l'ordre inverse (champs mis bout à bout avec les blancs !) : Job name+User name+Job number
    Dans ton cas la variable transmise aurait donc du contenir :
    Merci m4k-Hurrican pour ce retour rapide.

    J'ai effectué les changements dans mon code la variable var est bien égal à Job name+User name+Job number (poour l'exemple TREYNAUD TREYNAUD 361039)
    Sauf que lors du callp qusrjobi toujours même soucis:
    il me ressort:
    Job 1039/REYNAUD 36/TREYNAUD T not found

    lors du callp qusrjobi (dsjobdta: %size(dsjobdta):'JOBI0300': %trim(var): ' ') ;

    Comme si mon call était pas bon (j'ai essayé callp qusrjobi (dsjobdta: %size(dsjobdta):'JOBI0300': var: ' ') ; => problème identique)

    Merci pour ton aide

  4. #4
    Membre éclairé
    Tes variables sont décalées à priori, donc au moins une longueur ne doit pas être correcte.
    Tu n'as pas une zone à longueur variable dans le lot ? Çà doit faire 10 + 10 + 6
    Utilises la balise code pour qu'on visualise bien les données. D'après moi ta variable aurait du contenir (2 blancs après TREYNAUD pour être à 10 caractères) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TREYNAUD  TREYNAUD  361039

  5. #5
    Candidat au Club
    Citation Envoyé par m4k-Hurrican Voir le message
    Bonjour,

    Le nom du Job doit être transmis sans séparation et dans l'ordre inverse (champs mis bout à bout avec les blancs !) : Job name+User name+Job number
    Dans ton cas la variable transmise aurait donc du contenir :

    Effectivement mon NUM était sur 10 et var sur 35 au lieu de 28 (10+10+6+ 2blanc) mais ça ne change pas grand chose je te colle mon programme si jamais ça peux aider: (je te préviens je ne suis pas développeur )

    dcl-f ACCMSG1D workstn SFILE(SFL1 : rang);
    // les procédures
    dqcmdexc pr extpgm('QCMDEXC')
    d 32705 const options(*varsize)
    d 15 5 const
    d cmd s 5000

    d Format s 8
    d RcvVarLen s 10i 0

    dqusrjobi pr extpgm('QUSRJOBI')
    //D JobiDta 32767A OPTIONS(*VARSIZE) Var Output
    d dsjob like(dsjobdta)
    D length 10I 0 CONST Length rec.variable
    D APIformat 8 CONST Format name
    D APIjob 26 CONST Qualified job name
    D InternJob 16 CONST Internal job id

    Ddsjobdta DS
    D RtnLen 10I 0 Nbr bytes returned
    D AvlLen 10I 0 Nbr bytes available
    D JobNm 10A Job name
    D UsrNm 10A User name
    D JobNbr 6A Job number
    D JobID 16A Inter job identifier
    D JobSts 10A Job status
    D JobType 1A Job type
    D JobSType 1A Job subtype
    D QuNm 10A Job queue name
    D QuLb 10A Job queue lib name
    D QuPty 2A Job queue priority
    D OqNm 10A Output queue name
    D OqLb 10A Output queue libname
    D OqPty 2A Output queuepriority
    D PrtDev 10A Printer device name
    D SbmJnm 10A Submitter's job name
    D SbmJUs 10A Submitter's usr name
    D SbmJJb 6A Submitter's job nbr
    D SbmJMsgqN 10A Submitter msg queue
    D SbmJMsgwL 10A Submitter's msg queu
    D SbmSts 10A Status of job
    D SbmDte 8A Date and time job
    D JobDte 7A Job date


    // Les variables

    dcl-s requete varchar(900);
    dcl-s requete2 varchar(900);
    dcl-s requete3 varchar(900);
    dcl-s quotes char(1) INZ('''');
    dcl-s rang packed(2);
    dcl-s JOBQ char(10);
    dcl-s NBRJOBS char(4);
    dcl-s MAXJOB char(2);
    DCL-S JOB char(10);
    dcl-s NUM char(6);
    dcl-s user char(10);
    dcl-s pos1 int(3);
    dcl-s pos2 int(3);
    dcl-s pos3 int(3);
    dcl-s pos4 int(3);
    dcl-s pos5 int(3);
    dcl-s var char(28);
    dcl-s pos6 int(3);

    dow not *IN03;
    CHOIX = ' ';
    rang=0 ;
    *in98 = '1' ;
    *in97 = '0' ;
    write ctl1;
    *in98 = '0' ;
    *in97 = '1' ;
    requete =
    'SELECT JOB_NAME, SUBSYSTEM, JOB_STATUS FROM +
    TABLE(QSYS2.ACTIVE_JOB_INFO()) where +
    JOB_STATUS = ' + quotes + 'MSGW' +quotes +
    ' and SUBSYSTEM <> '+quotes+ 'ARCAD' +quotes ;

    exec sql prepare r1 from :requete ;
    exec sql declare C1 cursor for r1;
    exec sql open C1;
    exec sql fetch C1 into :NOMJOB,:SOUSYSTEME,:STATUT;
    dow sqlcode = 0;

    rang += 1 ;

    pos1 = %scan('/' : NOMJOB);
    pos2 = pos1 +1;
    pos3 = %scan('/' : NOMJOB: pos2);
    pos4 = pos3 +1;
    pos5 = %scan('/' : NOMJOB: pos4);
    pos6 = pos3 - 1;

    NUM = %subst(NOMJOB : 1: (pos1 -1));
    user = %subst(NOMJOB : pos2 : (pos6 -pos1));
    JOB = %subst(NOMJOB : pos4 : (%len(NOMJOB)-pos3)) ;

    var = %trim(JOB) +' '+%trim(user) + ' ' + %trim(NUM) ;



    callp qusrjobi
    (dsjobdta: %size(dsjobdta):'JOBI0300': %trim(var): ' ') ;



    JOBQ = QuNm;

    requete2 =
    'SELECT NUMBER_OF_JOBS FROM qsys2.jobq_info +
    where JOB_QUEUE_NAME = ' +quotes+JOBQ +quotes ;
    exec sql prepare r2 from :requete ;
    exec sql declare C2 cursor for r2;
    exec sql open C2;
    exec sql fetch C2 into :NBRJOBS ;

    requete3 =
    'SELECT NUMBER_OF_JOBS FROM qsys2.jobq_info where +
    job_queue_name = ' +quotes+ JOBQ +quotes ;
    exec sql prepare r3 from :requete ;
    exec sql declare C3 cursor for r3;
    exec sql open C3;
    exec sql fetch C3 into :MAXJOB ;

    write SFL1;
    exec sql fetch C1 into :NOMJOB,:SOUSYSTEME,:STATUT;

    ENDDO;
    exec sql close C1;

    if rang <> 0;
    write RECORD1;
    *in97 = '0' ;
    exfmt ctl1;

    readc sfl1;
    if CHOIX = '5' ;
    cmd = 'WRKJOB ' +%trim(NOMJOB) ;
    qcmdexc(cmd:%len(cmd));

    endif;
    if CHOIX = '7';
    cmd = 'DSPMSG MSGQ(*SYSOPR) MSGTYPE(*INQ) SEV(0)';
    qcmdexc(cmd:%len(cmd));
    ENDIF;
    else;
    exfmt ERR2;
    leave;
    endif;

    enddo;

    *inlr = *on;

  6. #6
    Membre éclairé
    Citation Envoyé par Phebo Voir le message
    Effectivement mon NUM était sur 10 et var sur 35 au lieu de 28 (10+10+6+ 2blanc) mais ça ne change pas grand chose je te colle mon programme si jamais ça peux aider: (je te préviens je ne suis pas développeur )
    Alors :
    - La variable doit faire 26 de long et non 28
    - Comme indiqué tu dois mettre les champs bout à bout AVEC les blancs. Or toi tu fais des %trim et tu ajoutes un blanc de séparation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = %trim(JOB) +' '+%trim(user) + ' ' + %trim(NUM) ;
    Défini ta variable à 26 :
    Et fais une simple concaténation des champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = JOB + user + NUM ;

  7. #7
    Candidat au Club
    Citation Envoyé par m4k-Hurrican Voir le message
    Alors :
    - La variable doit faire 26 de long et non 28
    - Comme indiqué tu dois mettre les champs bout à bout AVEC les blancs. Or toi tu fais des %trim et tu ajoutes un blanc de séparation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = %trim(JOB) +' '+%trim(user) + ' ' + %trim(NUM) ;
    Défini ta variable à 26 :
    Et fais une simple concaténation des champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = JOB + user + NUM ;
    Un grand merci m4k-Hurrican ça marche niquel! Une semaine que je m'arrache les cheveux la dessus!!!!!!

###raw>template_hook.ano_emploi###