Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #36

Janvier 2005


BoTTom

DB2

 


 Nouveau point d'exit (WRKREGINF)
  QIBM_QDB_OPEN 
  le pgm d'exit associé (option 8 sous WRKREGINF) est lancé à chaque    utilisation d'un fichier PF ou LF.
  il doit recevoir deux paramètres :
     - un structure décrivant les fichiers manipulés au format DBOP0100           (voir ci dessous)
     - une zone binaire sur 4 octets (10 chiffres) à renseigner avec :
           0 si vous refuser la manipulation de ce fichier            1 si vous l'acceptez
    le pmg d'exit n'est pas lancé pour un fichier de QTEMP.
    En cas de plantage du programme ou de problème (non autorisé au pgm...)      le système place un message dans l'historique et CONTINUE !



  + format DBOP0100 
       -  BIN(4)   taille de cette entete        -  CHAR(8)  format (DBOP0100)        -  BIN(4)   Offset pour accèder à la liste des fichiers  (a)        -  BIN(4)   nombre de fichiers dans la liste             (b)        -  BIN(4)   taille de la liste        -  CHAR(10) Job        -  CHAR(10) Profil        -  CHAR(10) N° de Job        -  CHAR(10) Profil en cours        -  CHAR(*)   réservè (utiliser l'offset vue plus haut)

          +  Structure concernant un fichier (repétée X fois)
            il faut accèder à cette structure en utilisant l'info en (a)              de l'entete et boucler autant de fois qu'indiqué en (b).
               voir le détail ci-dessous :



             -  CHAR(10)  nom du fichier              -  CHAR(10)  bibliothèque              -  CHAR(10)  membre              -  CHAR(2)   réservé
             -  BIN(4)    type de fichier  0 = PF  / 1 = LF
             -  BIN(4)    fichier sous jacent
                          0 = non, le nom de fichier est celui manipulé                           1 = non, le nom de fichier est sous jacent                                     du fichier manipulé (logique, vue etc..)
             -  CHAR(1)   ouverture pour INPUT,  0=non / 1=oui              -  CHAR(1)   ouverture pour OUTPUT, 0=non / 1=oui              -  CHAR(1)   ouverture pour UPDATE, 0=non / 1=oui              -  CHAR(1)   ouverture pour DELETE, 0=non / 1=oui
             -  CHAR(*)   réservè




 quelques remarques :
   La doc précise que l'ajout du pgm d'exit n'a pas d'incidence sur les jobs     déja actifs, pourtant sur nos tests, l'effet fut immédiat sous SQL.

   l'accès à un fichier DDM ne lance pas le programme       (mais il le lance sur la machine cible, si elle en possède un)

   il s'agit donc des accès locaux :
      SQL, interactif , dans les programmes, ODBC/JDBC
      les Entrées/Sorties natives
      meme DSPPFM lance le programme (mais pas CLRPFM)
   Quand vous tentez une opération interdite, vous recevez SQL0952     avec le code raison 11 (l'aide ne possède que 10 codes !)

Exemple


associé à pgm d'exit QIBM_QDB_OPEN


     Dreponse          S             10I 0
     Dds_parm          DS
     D taille_entete                 10I 0
     D format                         8
     D offset_liste                  10I 0
     D nbr_fichiers                  10I 0
     D taille_liste                  10I 0
     D job                           10
     D profil                        10
     D jobnbr                         6
     D cur_profil                    10
     D reste                       1024


     Dliste            DS                  qualified      D  fichier                      10      D  biblio                       10      D  membre                       10      D   filler                       2      D  typefichier                  10I 0      D  sous_jacent                  10I 0      D  read                           n

     D  write                          n
     D  update                         n
     D  delete                         n

     D i               S             10I 0

     C     *entry        plist      C                   parm                    ds_parm      C                   parm                    reponse
      /free         offset_liste += 1;
        FOR i = 1 to nbr_fichiers;
        liste = %subst(ds_parm : offset_liste :                           taille_liste);
          IF    liste.fichier = 'HTTPLOG'            and  liste.biblio = 'AF4W'            and  liste.delete = *on;
             reponse = 0;
             return;           ELSE;              offset_liste += taille_liste;           ENDIF;
        ENDFOR;
        *inlr = *on;       /end-free

 

 

Disponibilité de la base de données



 La disponibilité de la base données a été revue en V5R30.
 1/ la sauvegarde de fichiers en cours d'activité (paramètre SAVACT)       peut se faire meme en cas de transaction.
 2/ la réorganisaiton des fichiers :
      a/ peut etre interrompue
      b/ peut éventuellement se faire sans verrouillage fort
 Rappel sur le paramètre SAVACT.
   cela permet de faire une sauvegarde d'une base en activité.
     il reste cependant le problème des objets base de données en cours       de transaction (sous commitment control)
     on peut sauvegarder des fichiers en cours de mise à jour simple, mais       pas sous COMMIT/ROLLBACK


  Exemple :

  Soit un fichier avec un enregistrement verrouillé par un pgm sans COMMIT.    DB2 va poser un verrouillage *SHRUPD sur le membre (les données)
   SAVLIB ==> la sauvegarde prévient d'un objet NON sauvegardé
   SAVLIB SAVACT(*LIB) ==> la sauvegarde est effectué normalement (complète)    [ SAVLIB SAVACT(*SYNCLIB) si vous avez plusieurs bibliothèques ]
   ......................................................................    : L'intégrité de la base en cas de restauration est à votre charge,  :    :   vous venez peut-etre de sauvegarder une piece comptable          :    :   incomplète (non équilibrée), par exemple.                        :    :                                                                    :    : La fonction journal peut vous y aider (APYJRNCHG / RMVJRNCHG).     :    :....................................................................:
   le paramètre SAVACTWAIT(120) permet d'indiquer le temps d'attente pour     la disponibilité des objets et la fin d'une transaction.




  Mais, imaginons un fichier en cours d'utilisation sous commitment control    (DB2 pose alors un verrou *SHRRD sur l'objet)
   SAVLIB ==> la sauvegarde prévient d'un objet NON sauvegardé
   SAVLIB SAVACT(*LIB) ==> Erreur CPF377F, la sauvegarde n'a pas lieu
   ....................................................................    :   La disponibilité des objets est testée AVANT la sauvegarde !   :    :..................................................................:
   SAVLIB SAVACT(*LIB) SAVACTWAIT(120 *NOCMTBDY ) nouveau paramètre en 5.30    ........................................................................    : le paramètre SAVACTWAIT accèpte trois valeurs :                      :    :  1/ attente pour la disponibilité des objets                         :    :  2/ attente pour la disponibilité des enregistrements en transaction :    :  3/ attente pour les autres transactions (création de table, ...)    :    :......................................................................:
    la sauvegarde a lieu, complète, avec un message d'information CPI3731       par fichier en transaction, dans la JOBLOG du travail.



Détail du message CPI3731
                     Complément d'informations sur message 
 ID message . . . . . . :   CPI3731  Date d'envoi . . . . . :   29/11/04      Heure d'envoi  . . . . :   17:34:2
 Message . . . . :   Objet FICH1P1 (type *FILE) enregistré avec une transaction    partielle.
 Cause . . . . . : L'objet FICH1P1 de type *FILE de la bibliothèque AF4SRCT    été sauvegardé avec une ou plusieurs transactions partielles. Si cet objet    est un fichier base de données, le nom du membre est FICH1P1.  Que faire . . . :      -- S'il s'agit d'une opération de restauration, vous ne pouvez utiliser    cet objet avant d'appliquer ou de supprimer les modifications journalisées    (commande APYJRNCHG ou RMVJRNCHG) pour atteindre les limites de validation    Pour appliquer ou supprimer les modifications, vous aurez besoin du journal    QSQJRN de la bibliothèque AF4SRCT et de la chaîne des destinataires du    journal commençant par JRNRCV0001 dans la bibliothèque AF4SRCT de l'unité    ASP *SYSBAS.



 ATTENTION, le message indique bien que le fichier a été sauvegardé   lors d'une transaction incomplète , il n'est donc pas intègre.
 SI VOUS LE RESTAUREZ :
  vous aurez un message CPI3731 (toujours de type *INFO) dans la JOBLOG.
 et le fichier sera considéré comme inutilisable. 
  DSPFD montre cela, un OPEN sur le fichier engendre CPF428D
  et vous devez :
   i/   avoir ou restaurer le récepteur avec la transaction terminée, puis          passer l'une des commandes suivantes : APYJRNCHG ou RMVJRNCHG
   ii/  restaurer une version avec transaction complète du fichier
   iii/ passer la commande CHGJRNOBJA ATR(*PTLTNS) PTLTNS(*ALLUSE)          pour autoriser l'utilisation de cette version non intègre.          (reprise "à la main" de l'intégrité du fichier)



 Autre nouveauté concernant la disponibilté de la base de données, la   réorganisation de fichier, plus souple qu'avant.
 Elle peut maintenant etre interrompue (Appel/sys 2 ou ENDJOB)   (Iseries navigator vous propose un dialogue spécifique et très pratique)
  RGZPFM ... ALWCANCEL(*YES)
  Avant, (ou sans ce paramètre)  quand vous lancez RGZPFM, le système :
   1/ invalide tous les index.
   2/ fabrique une copie du fichier qui deviendra l'original à la fin.
   3/ reconstruit ensuite les index (sauf celui utilisé en référence)
 Si on interrompt la réorganisation, on retouve le fichier physique dans   son état d'origine, et le système se met à reconstruire tous les index !
 Ce qui rend l'interruption très délicate, les applications étant en    attente de la disponibilité des index associés.


 si vous précisez ALWCANCEL(*YES)

   - le système ne travaille pas sur une copie du fichier        ==> le fichier doit etre journalisé !
   - la réorganisation est un peu plus longue.
   - vous pouvez indiquer KEYFILE(*RPLDLTRCD) qui place les enregistrements       de fin du fichier, à la place des enregistrements supprimés.
   - vous pouvez demander une maintenance des index en temps réel, afin       d'assurer une disponibilité immédiate de la base, en cas d'arret.
        RBDACCPTH(*YES) les chemins d'accès sont maintenu de manière                          synchrone en fin d'opération (comme avant)
        RBDACCPTH(*OPTIMIZE) le système choisi, soit une maintenance pendant                              la réoganisaiton, soit une maintenance                               asynchrone, en fin de traitement.
        RBDACCPTH(*NO)  les chemins d'accès sont maintenus PENDANT la                          réoganisation [ALWCANCEL(*YES) obligatoire]



   Dans ce dernier cas, RBDACCPTH(*NO), vous pouvez autoriser l'accès     au fichier pendant la réogranisation, avec le paramètre LOCK.

     LOCK(*EXCL)     le système pose un verrou exclusif rendant l'accès                       au fichier impossible.
     LOCK(*EXCLRD)   le système pose un verrou exclusif avec lecture,                       rendant la consultation possible, mais la mise à jour                       impossible.
     LOCK(*SHRUPD)   le système pose un verrou en mode partagé, la mise à                       jour du fichier par d'autres traitements est permise.
                     ATTENTION, la réorganisaiton du fichier suivant un                       critère de clef précis [paramètre KEYFILE], n'est                       plus garantie, des enregistrements pouvant etre                       insérés (par exemple) pendant le traitement.
    Ce dernier paramètre, rend, lui aussi la réorganisaiton plus longue.

 Détails :

  Le système créé un fichier de travail dans QRECOVERY portant le nom SQL     QDBRGZ_BIBLIOTHEQUE_FICHIER, et le détruit en fin de traitement.
  L'annulation d'une demande s'affiche comme cela dans l'historique
  .......................................................................   : Dernière demande au niveau 2 interrompue.                           :   : Traitement de l'instruction SQL arrêté. Code raison : 3. (SQL0952)  :   :.....................................................................:
  Si le fichier de QRECOVERY existe déja, le système tente une reprise,    si les paamètres de la commande sont les meme.
  Voici ce que peut afficher la LOG
   QDBRGZ_AF4W_HTTPLOG_HTTPLOG de type *FILE existe déjà dans QRECOVERY.    Non continuation de l'opération de réorganisation annulée sur le fichier      HTTPLOG_I2 de la bibliothèque HTTPLOG_I2, membre AF4W.




 Si vous demandez de l'Aide, il ya trois codes possibles :
  1 -- Les paramètres indiqués lors de la réorganisation en cours (RGZPFM  FILE(AF4W/HTTPLOG) MBR(HTTPLOG) KEYFILE(AF4W/HTTPLOG_I2 HTTPLOG_I2)  RCDFMT(*ONLY) RBDACCPTH(*YES) ALWCANCEL(*YES) LOCK(*EXCL)) ne correspondent  pas exactement aux paramètres de la réorganisation annulée (RGZPFM  FILE(AF4W/HTTPLOG) MBR(HTTPLOG) KEYFILE(AF4W/HTTPLOG_I2 HTTPLOG_I2)  RCDFMT(*ONLY) RBDACCPTH(*YES) ALWCANCEL(*YES) LOCK(*SHRUPD)).
 le code raison 2 indique que le fichier contient trop de différences
         - restauration du fichier, depuis.          - changement de nom (fichier ou membre)          - déplacement (bibliothèque)          - effacement du membre (CLRPFM)          - ALTER TABLE
 le code 3 que le fichier dans QRECOERY n'existe pas ou est endommagé.

 

  • Iseries Navigator

  • Affichage des contraintes, comme WRKPFCST (non disponible en V5r20)


    Avec activation/ désactivation possible (CHGPFCST...)


    et liste des contraintes en erreur (au niveau du système)

  • Gestion des réorganisation de fichiers (RGZPFM) tenant compte des nouveautés V5R30


  • Si votre fichier n'est pas journalisé (les options nouvelles sont grisées)

  • Si votre fichier est journalisé

    Vous reconnaitrez les nouvelles possibilités de la commande RGZPFM
    • ALWCANCEL( )
    • LOCK( )
    • RBDACCPTH( )
  • Affichage de la commande, montre la commande CL

  • Pendant la réorganisation


  • Suspension

  • Reprise (il suffit de lancer une réorganisation)

  • Affichage des index liés à une table (click droit sur la table)

    Cette dernière option vous affiche des informations nouvelles en V5R30 concernant l'utilisation des index

    En effet, la date de dernière utilisation de l'objet fichier logique, n'est pas significative dans le cas d'une requête SQL,
    où c'est l'optimiseur qui décide de l'utilisation ou non de l'index (utilisation non explicite).

    Les PTF suivantes : SI12938, SI15255, SI13432, SI13245 ET SI16620 (en France) apportent 4 nouvelles colonnes

    • Last query use
      Date de dernière utilisation de cet index pour accèder à la table
    • Last query statistic use
      Date de dernière utilisation de cet index pour collecter des statistiques
    • Query use count
      Nombre d'utilisations de cet index pour accéder à la table
    • Query statistic use
      Nombre d'utilisations de cet index pour collecter des statistiques

      les compteurs sont mis à jour aussi bien par SQE (nouvel optimiseur V5R20) , que par CQE (l'ancien) ,
      mais ne sont à jour que depuis l'installation des PTF vues plus haut.

      L'API QUSRMBRD a été modifiée pour founir ces informations.


Avec les évolutions du CL en V5R30, c'est devenu beaucoup plus simple :


Utiliser des API en CLP


|

      A P I  Présentation.  (Application Program Interface)
             Routines de l'OS/400 permettant à des pgms utilisateurs               d'exécuter par appel de pgm, certaines fonctions système               (ou logiciel, cf API d'office/400)
      API déja connues :   cdes + QCMDEXC                                 + QCMDCHK
                        Chaînes + QCLSCAN                         de car. + QDCXLATE
                         Dtaq   + QSNDDTAQ                                 + QRCVDTAQ                                 + QCLRDTAQ                                 + QMHQRDQD (retrouver déf. d'une dtaq)
                         plus   API pour office/400                                 API diverses (terminal virtuel,...)


|

 Nous parlerons ici, des API retournant des informations système.
      Nous les classerons dans deux catégories :
      1/ capables de retourner de l'information sur un élément connu
         - on fournit les coordonnées de l'élément (un nom d'unité par ex.)
         - le système retourne toutes les infos concernant cette unité.

      2/ API de liste
         - le système fournit dans un objet de type *USRSPC, une liste             d'éléments (liste des spools d'un utilisateur, par exmple)
         - la manipulation du USER SPACE (suite d'octets simple)             se fait elle meme par API (création, lecture, etc...)



|

   LES FORMATS API.
       Chaque API d'extraction de données ou de remplissage de *USRSPC         a besoin d'une notion de format.
       Le format permet d'indiquer à l'API comment formater les         données renvoyées ou stockées dans le *USRSPC.
       Certaines API ne reconnaissent qu'un format.        D'autre plusieurs.
       Les formats sont reconnus par leur nom xxxxzzzz            xxxx = identification de l'API XXXX
           zzzz = N° d'ordre du format 0100,0200,0300 etc...
       Le format 0200 est toujours plus complet que le format 0100,         mais le traitement plus long.
  Tous les formats sont donnés dans QSYSINC (option 13 de l'OS/400).

|

                  Structure d'un USER SPACE.               De                          à                   ..........................           --       1       01: Espace utilisateur     :            ! Octets à blanc pour                 : (64 octets à blanc)    :            ! la communication                 ..........................64         -- entre programmes       2       65: ENTETE GENERALE        :            !                 :   DU USER SPACE        :             > Découpage image                 :                        :            !   suivante                 ..........................140        --       3      141: Rappel des paramètres  :  INPUT     !                 :  reçus par l'API       :            !                 ..........................            !       4         : En-tête API            :  HEADER    !  voir structures                 :  (valeurs rencontrées) :             > dans QSYSINC                 ..........................            !  (5769ss1 opt 13.)       5         : Liste générée par      :  LIST      !                 :  l'API.                :            !                 :                        :           --                 :                        :                 :........................:???

|
............................................................................
: X  :  De   :   à   :Fmt: Signification                                   :
:..........................................................................:
: 40 :  65   :  68   : B : Taille de l'en-tête générale (2)                :
: 44 :  69   :  72   : C : Version, "0100" pour V2R1.0                     :
: 48 :  73   :  80   : C : Nom du format utilisé par l'API (ex:OBJD0100)   :
: 50 :  81   :  90   : C : Nom de l'API ayant généré la liste              :
: 5A :  91   : 103   : C : Siècle-date-heure(SDDDDDDHHHHHH) de remplissage :
: 67 : 104   : 104   : C : Etat (C=Complet,I=Incomplet,P=Partiel)          :
: 68 : 105   : 108   : B : Nb d'octets utilisés dans le user space         :
:    :       :       :                                                     :
: 6C : 109   : 112   : B : Déplacement pour atteindre la zone INPUT        :
: 70 : 113   : 116   : B : Taille de la zone INPUT                         :
:    :       :       :                                                     :
: 74 : 117   : 120   : B : Déplacement pour atteindre la zone HEADER       :
: 78 : 121   : 124   : B : Taille de la zone HEADER                        :
:    :       :       :                                                     :
: 7C : 125   : 128   : B : Déplacement pour atteindre la liste (LIST)      :
: 80 : 129   : 132   : B : Taille de la liste                              :
: 84 : 133   : 136   : B : Nb d'entrées dans la liste                      :
: 88 : 137   : 140   : B : Taille de chaque entrée.                        :
:....:.......:.......:...:.................................................:

|

   Les adresses hexa (colonne X) sont données à titre indicatif pour     pouvoir lire un DUMP.
   Tous les DEPLACEMENTS sont relatifs (c'est le nombre d'octets dont il     faut se déplacer à partir du début du user space pour atteindre l'info     désirée).    ==> il faut ajouter 1 pour avoir la position du 1er octet.        (cet ajout a été fait sur le tableau ci-dessus)
   La zone INPUT contient un rappel des paramètres envoyés à l'API
   La zone HEADER contient des infos sur le(s) objet(s) rencontré(s).
     Cette zone n'est pas toujours présente (suivant les API)
     Par exemple pour la liste des membres elle contient le nom de la       bibliothèque du fichier à la place de *LIBL, et le nombre de membres       dans le fichier.
   La zone LIST (dans QSYSINC) donne le découpage d'UN poste, à vous     de boucler autant de fois que nécessaire (suivant nombre de postes)

|

       Les API permettant de manipuler un user space.

         Création                            + QUSCRTUS
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->                            - CHAR(10) attribut (ce que vous voulez)                            - BIN(4,0) Taille initiale                            - CHAR(1)  Valeur initiale de chaque octet                              [mettre x'00' augmente les performances]                            - CHAR(10) Autorisation pour *PUBLIC                            - CHAR(50) texte descriptif                       ------------------Paramètres optionnels---------------                            - CHAR(10) remplacement (*yes/*no)                            - CHAR(?)  code retour                       ------------------Paramètre optionnel (2)-------------                            - CHAR(10) domaine



|

       Les API permettant de manipuler un user space.

         Extraction                            + QUSRTVUS
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->                            - BIN(4,0) Position de début dans le user space                            - BIN(4,0) Lg des données à extraire                            - CHAR(?)  Variable de retour

          La position de début est donnée par le format de l'en-tête            (voir structure d'un user space) ou par un déplacement "lu"            dans l'en-tête par un appel précédent (voir l'exemple)

          La manipulation d'USER SPACE en RPG-IV peut se faire par pointeur            (plus rapide) grace à l'API QUSPRTUS.


|

       Les API permettant de manipuler un user space.

         Suppression:                            + QUSDLTUS   (ou cde CL DLTUSRSPC)
                           - CHAR(20) <-*usrspc(10c)-><-biblio(10c)->                            - CHAR(?)  Code retour
         La structure du code retour (commun à toutes les API) est :
        ....................................................................         :  DE  :  A   :Fmt: Signification                                  :         :..................................................................:  envoyé :  1   :  4   : B : Lg du code retour(=0 -> envoi msg *ESCAPE)    :  ------ :      :      :   :                  (>8 -> erreur "monitorée")    :  reçus  :  5   :  8   : B : Lg nécessaire pour recevoir l'erreur           :    !    :  9   : 15   : C : MSGID                                          :    !    : 16   : 16   :   : Réservé                                        :    v    : 17   :  x   : C : MSGDTA (x étant donné par positions 1 à 4)     :         :.............:...:................................................:

|
             PGM     /* ATTENTION, V5R30 minimum */ 
 /*                                                                      */
 /* BUT : obtenir la liste des spools d'un utilisateur (API QUSLSPL)     */
 /*  afin de détruite tous les spools de plus q'un jour à l'état RDY/HLD */
 /* ==================================================================== */
             DCL        VAR(&COMPTEUR) TYPE(*INT)
             DCL        VAR(&TAILLE)   TYPE(*INT)  VALUE(32767)
             DCL        VAR(&DEBUT)    TYPE(*INT)
             DCL        VAR(&DEBUTS)   TYPE(*INT)
             DCL        VAR(&TAILLEP)  TYPE(*INT)
             DCL        VAR(&NOMBRE)   TYPE(*INT)
             DCL        VAR(&RETOUR)   TYPE(*CHAR) LEN(136)
             DCL        VAR(&CURDATE)  TYPE(*CHAR) LEN(6)
             DCL        VAR(&CURDAT7)  TYPE(*CHAR) LEN(7)
             /* DONNÉES DE SPLF0300 */
             DCL        &SPLJOB *CHAR 10
             DCL        &SPLUSR *CHAR 10
             DCL        &JOBNBR *CHAR  6
             DCL        &SPLNAM *CHAR 10
             DCL        &SPLNBR *INT
             DCL        &SPLDAT *CHAR  7
             DCL        &STATUS *INT

|

             RTVJOBA    DATE(&CURDATE)              CVTDAT     DATE(&CURDATE) TOVAR(&CURDAT7) FROMFMT(*JOB) +                           TOFMT(*CYMD) TOSEP(*NONE)              DLTUSRSPC QTEMP/DLTALLSPLF               MONMSG CPF0000
 /* CRÉATION DU USER SPACE */              CALL QUSCRTUS PARM('DLTALLSPLFQTEMP'  /* USRSPC   */       +                                 '          '       /* ATTRIBUT */       +                                 &TAILLE            /* TAILLE   */       +                                 X'00'              /* VAL INITIALE */   +                                 '*USE'             /* DROITS */         +                                 'POUR DLTALLSPLF'  /* texte associé */  )  /* REMPLISSAGE, LISTE DES SPOOLS */              CALL QUSLSPL  PARM('DLTALLSPLFQTEMP'  /* USRSPC   */       +                                 'SPLF0300'         /* FORMAT   */       +                                 '*CURRENT  '       /* USER     */       +                                 '*ALL'             /* OUTQ     */       +                                 '*ALL'             /* FORMTYPE */       +                                 '*ALL'             /* USRDTA   */       )

|
             CHGVAR     VAR(&DEBUT) VALUE(125) /* Début de liste */
             CHGVAR     VAR(&TAILLE) VALUE(4)
             CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +
                          &TAILLE &DEBUTS)

             CHGVAR     VAR(&DEBUT) VALUE(133) /* Nombre de postes */              CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +                           &TAILLE &NOMBRE)              CHGVAR     VAR(&DEBUT) VALUE(137) /* Taille d'1 poste */              CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +                           &TAILLE &TAILLEP)
             CHGVAR     VAR(&DEBUT) VALUE(&DEBUTS + 1) /* DEBUT de liste */              CHGVAR     VAR(&TAILLE) VALUE(136)        /* lg de &RETOUR  */
             DOFOR      VAR(&COMPTEUR) FROM(1) TO(&NOMBRE) BY(1)               CALL       PGM(QUSRTVUS) PARM('DLTALLSPLFQTEMP' &DEBUT +                            &TAILLE &RETOUR) /* lecture */
              /* position pour prochaine "lecture" */               CHGVAR &DEBUT (&DEBUT + &TAILLEP)

|
              CHGVAR   &SPLDAT %SST(&RETOUR 45 7)

              IF (&SPLDAT < &CURDAT7) THEN(DO)
               CHGVAR   &STATUS  %BIN(&RETOUR 41 4)
               IF ((&STATUS = 1) *OR (&STATUS = 6)) /* RDY OU HLD */  +                   THEN(DO)                 CHGVAR   &SPLJOB  %SST(&RETOUR 1 10)                 CHGVAR   &SPLUSR  %SST(&RETOUR 11 10)                 CHGVAR   &JOBNBR  %SST(&RETOUR 21 6)                 CHGVAR   &SPLNAM  %SST(&RETOUR 27 10)                 CHGVAR   &SPLNBR  %BIN(&RETOUR 37 4)
                DLTSPLF    FILE(&SPLNAM) JOB(&JOBNBR/&SPLUSR/&SPLJOB) +                            SPLNBR(&SPLNBR)                ENDDO               ENDDO
             ENDDO
             ENDPGM




 

Copyright © 1995,2005 VOLUBIS