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é # 1

Mars 1994

Fin


Nouvelle API QLICOBJD permet de modifier certaines infos d'un objet.


 paramètres :       - CHAR(10) bibliothèque en retour.


                    - CHAR(20) objet à modifier
                               <--objet(10c)-><--biblio(10c)-->
                                  un nom         un nom ou *LIBL,*CURLIB.


                    - CHAR(10) type d'objet


                    - CHAR(??) infos à modifier, découpé comme suit.


                               BIN(4) nombre d'infos à modifier.


                               puis x fois
                                    BIN(4) clé (détermine l'info à modifier)
                                    BIN(4)     lg de la nouvelle valeur
                                    CHAR(??)   nouvelle valeur.


                    - CHAR(??) code erreur.

      


Les différentes clés admises:


  !    Clé  ! lg     !   valeur
  ----------------------------------------------------------------------
  !   1     !  30    ! Fichier source <--fich(10c)-><-bib(10c)-><-mbr(10c)->
  !         !        !
  !   2     !  13    ! date de modif du source (format C YY MM DD HH MM SS)
  !         !        !
  !   3     !  13    ! compilateur <-nom-du-produit(7c)-><-version(VxRyMz)->
  !         !        !                (5738xx1)
  !   4     !   8    ! niveau de controle
  !         !        !
  !   5     !  13    ! programme sous licence (idem compilateur)
  !         !        !
  !   6     !   7    ! PTF (format XXzzzzz XX = préfixe zzzzz = n° ptf)
  !         !        !
  !   7     !   6    ! APAR (n° d'analyse des incidents sur ce pgm /Azzzzz)
  !         !        !
  !   8     !   1    ! cet objet peut-il être modifié par cette API 0=non
  !         !        !                                              1=oui
  !         !        !


Les différentes clés admises:


  !    Clé  ! lg     !   valeur
  ----------------------------------------------------------------------
  !   9     !  10    ! attribut défini par l'utilisateur.
  !         !        !
  !  10     !  50    ! texte decriptif.
  !         !        !
  !  11     !   1    ! remise à zéro du compteur nb de jours d'utilisation
  !         !        !  0=non , 1=oui.
  !         !        !
  !  12     !   4    ! ID langage associé à ce produit (29xx)
  !         !        !
  !  13     !   4    ! option d'un logiciel sous licence  0=*BASE, 01 à 99
  !         !        !
  !  14     !   4    ! ID composant (laissé à votre imagination)
  ----------------------------------------------------------------------







      

 exemple de CL renommant le source d'un objet et mettant à jour l'objet


 /* RNMOBJSRC  */
             IF (&COD *EQ 'R') DO
             RNMM       FILE(&SRCL/&SRCF) MBR(&SRCM) +
                          NEWMBR(&NEWNAM)
 /* API QUI PERMET DE MODIFIER LES INFOS DANS L'OBJET        */


             CHGVAR %BIN(&CHGINFO 1 4)  1 /* NBR DE MODIFS      E */
             CHGVAR %BIN(&CHGINFO 5 4)  1 /* CLE 1 = MODIF SOURCE */
             CHGVAR %BIN(&CHGINFO 9 4) 30 /* LG MODIF             */
             CHGVAR %SST(&CHGINFO 13 30) +
                                        (&SRCF *CAT &SRCL *CAT &NEWNAM)
             CHGVAR %BIN(&ERRCOD)       0
             CALL QLICOBJD PARM( +
                                 &RTNLIB    +
                                 &NOMOBJ    +
                                 &OBJTYP    +
                                 &CHGINFO   +
                                 &ERRCOD    )
             ENDDO

      

 CPP de la commande CHGOBJAPI


     Calcul le nombre d'infos à modifier (&NBR)


     Concatène les différentes modifs dans une seule variable
      sous la forme <-clé-><-lg-><-nouvelles valeurs->  repété x fois


             PGM        PARM(&OBJQ &OBJT &SRCELEM &SRCDATE +
                          &COMPILELEM &PRDELEM &OPTION &ATTRIB +
                          &COMPOS &ALWCHG)


             DCL        VAR(&OBJQ) TYPE(*CHAR) LEN(20)
             DCL        VAR(&OBJT) TYPE(*CHAR) LEN(10)
             DCL        VAR(&SRCELEM) TYPE(*CHAR) LEN(32)
             DCL        VAR(&SRCDATE) TYPE(*CHAR) LEN(13)
             DCL        VAR(&COMPILELEM) TYPE(*CHAR) LEN(15)
             DCL        VAR(&PRDELEM) TYPE(*CHAR) LEN(15)
             DCL        VAR(&OPTION) TYPE(*CHAR) LEN(2)
             DCL        VAR(&ATTRIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&COMPOS) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ALWCHG) TYPE(*CHAR) LEN(1)

      

             DCL        VAR(&RTNLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&CODERR) TYPE(*CHAR) LEN(4) +
                          VALUE(X'00000000')
             DCL        VAR(&NBR) TYPE(*DEC) LEN(2 0)
             DCL        VAR(&VAR2000) TYPE(*CHAR) LEN(2000)
             DCL        VAR(&X41) TYPE(*CHAR) LEN(1) VALUE(X'41')
             DCL        VAR(&DEP) TYPE(*DEC) LEN(4 0) VALUE(5)
 /* VARIABLES UTILISEES PAR LA GESTION DE MESSGAES */
             DCL        &ERRORSW *LGL                     /* SWITCH  */
             DCL        &MSGID *CHAR LEN(7)               /* ID MSG  */
             DCL        &MSGDTA *CHAR LEN(100)            /* DATA    */
             DCL        &MSGF *CHAR LEN(10)               /* FICHIER */
             DCL        &MSGFLIB *CHAR LEN(10)            /* BIBLI   */


             MONMSG     MSGID(CPF0000) EXEC(GOTO ERREUR)


 /* CORPS DU PROGRAMME */


/* SOURCE*/ IF (%BIN(&SRCELEM 1 2) > 1) DO
               IF (%SST(&SRCELEM 3 5) ^= '*SAME')  THEN(DO)
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 1  /* CLE 1 */

               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 30  /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 30) %SST(&SRCELEM 3 30)
               CHGVAR &DEP (&DEP + 30)
               ENDDO
             ENDDO


/* DATE */   IF (&SRCDATE ^= '*SAME') THEN(DO)
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 2  /* CLE 2 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 13  /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 13) &SRCDATE
               CHGVAR &DEP (&DEP + 13)
             ENDDO


/* COMPIL*/ IF (%BIN(&COMPILELEM 1 2) > 0) DO
               IF (%SST(&COMPILELEM 3 5) ^= '*SAME')  THEN(DO)
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 3   /* CLE 3 */

               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 13   /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               IF (%SST(&COMPILELEM 3 5) = '*BLANK')    +
               CHGVAR %SST(&VAR2000 &DEP 13) '             '
               ELSE +
               CHGVAR %SST(&VAR2000 &DEP 13) %SST(&COMPILELEM 3 13)
               CHGVAR &DEP (&DEP + 13)
               ENDDO
             ENDDO


/* PROD  */ IF (%BIN(&PRDELEM 1 2) > 0) DO
               IF (%SST(&PRDELEM 3 5) ^= '*SAME')  THEN(DO)
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 5   /* CLE 5 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 13   /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               IF (%SST(&PRDELEM 3 5) = '*BLANK')    +
               CHGVAR %SST(&VAR2000 &DEP 13) '             '
               ELSE +
               CHGVAR %SST(&VAR2000 &DEP 13) %SST(&PRDELEM 3 13)

               CHGVAR &DEP (&DEP + 13)
               ENDDO
             ENDDO


/* OPTION*/ IF (%SST(&OPTION 1 1) ^= &X41) DO
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 13  /* CLE 13 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 2    /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 2) &OPTION
               CHGVAR &DEP (&DEP + 2)
             ENDDO


/* ATTRIB*/ IF (%SST(&ATTRIB 1 1) ^= &X41) DO
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 9  /* CLE 9 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 10   /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 10) &ATTRIB
               CHGVAR &DEP (&DEP + 10)

             ENDDO


/* COMPOS*/ IF (%SST(&COMPOS 1 1) ^= &X41) DO
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 14  /* CLE 14 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 4   /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 4) &COMPOS
               CHGVAR &DEP (&DEP + 4)
             ENDDO


/* MODIF */ IF (&ALWCHG ^= '2') DO
               CHGVAR &NBR (&NBR + 1)
               CHGVAR %BIN(&VAR2000 &DEP 4) 8  /* CLE 8 */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %BIN(&VAR2000 &DEP 4) 1   /* LG INFOS */
               CHGVAR &DEP (&DEP + 4)
               CHGVAR %SST(&VAR2000 &DEP 1) &ALWCHG
             ENDDO



      

  Mise en place du nombre de modifs demandées


             CHGVAR     VAR(%BIN(&VAR2000 1 4)) VALUE(&NBR)
  Appel API
             CALL QLICOBJD PARM(      +
                           &RTNLIB    +
                           &OBJQ      +
                           &OBJT      +
                           &VAR2000   +
                           &CODERR)


 /* RENVOI DES MESSAGES DE TYPE *COMP SI FIN NORMALE */
 COMPMSG:    RCVMSG     MSGTYPE(*COMP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                          MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)
  !-->       IF         (&MSGID *EQ '       ') RETURN  /* FIN DU PGM */
  !          SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
  !                       MSGDTA(&MSGDTA) MSGTYPE(*COMP)
  !          GOTO       COMPMSG /* BOUCLE SUR MESSAGES *COMP      */
  !
   fin du pgm si tout va bien


   sinon, routine de gestion d'erreurs à suivre

              /*----------------------------------------*/
 ERREUR:      /*        GESTION DES ERREURS             */
              /*----------------------------------------*/
             IF         &ERRORSW SNDPGMMSG MSGID(CPF9899) +
                          MSGF(QCPFMSG) MSGTYPE(*ESCAPE) /* 2EME FOIS*/
                                                         /* ARRET PGM*/
             CHGVAR     &ERRORSW '1' /* MISE EN PLACE DU SWTICH     */


 /* RENVOI DES MESSAGES DE TYPE *DIAG SI FIN ANORMALE */
 DIAGMSG:    RCVMSG     MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                          MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)
             IF         (&MSGID *EQ '       ') GOTO EXCPMSG
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                          MSGDTA(&MSGDTA) MSGTYPE(*DIAG)
             GOTO       DIAGMSG /* BOUCLE SUR MESSAGES *DIAG      */


 /* RENVOI DU MESSAGE D'ERREUR                        */
 EXCPMSG:    RCVMSG     MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                          MSGF(&MSGF) SNDMSGFLIB(&MSGFLIB)
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                          MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
             ENDPGM

   Les nouveaux types de variables de la base de donnée OS/400


1/ valeur nulle admises  (dans l'enregistrement 1 bit par zone, 1 = ALWNULL)


   - SQL : sans préciser not null


   - SDD = ALWNULL


   - traitement SQL: mot-clé null


                RPG: CRTRPGPGM ALWNULL(*YES)


                     si une zone a la valeur indéfinie le compilateur
                      la remplace par une valeur par défaut.


                     on ne peut pas donner la valeur indéfinie en sortie


                     CRTRPGPGM ALWNULL(*NO)


                     si une zone a la valeur indéfinie ==> erreur E/S


                autres langages: non supporté !!!

   Les nouveaux types de variables de la base de donnée OS/400


2/ longueur variable  (chaque zone est précédée de 2 octets binaires
                                                   indiquant la longueur)
   - SQL : VARCHAR(X) ALLOCATE(y)


   - SDD = lg=lg maxi (ici X)  VARLEN(y)


   - traitement SQL: pas de remarque


                RPG: CRTRPGPGM CVTOPT(*VARCHAR)


                     le compilateur génère une zone alpha (lg-maxi + 2)
                      ==> prévoir une DS pour le traitement.
                      ==> renseigner la longueur en sortie.


                CBL: CRTCBLPGM CVTOPT(*VARCHAR)
                     le compilateur génère une zone de groupe
                     01 ADRESSE
                        49 ADRESSE-LENGTH PIC S9(4) comp-4.
                        49 ADRESSE-DATA   PIC X(xxx).
                     ==> mêmes remarques que RPG en sortie

   Les nouveaux types de variables de la base de donnée OS/400


3/ date et heure


   - SQL : DATE, TIME, TIMESTAMP (CURRENT DATE, CURRENT TIME, ... valides)


   - SDD = type de donnée L -> date  mots-clés DATFMT() et DATSEP()
                          T -> heure mots-clés TIMFMT() et TIMSEP()
                          Z -> horodatage (pas de mot-clé)
   - traitement
                SQL: calculs autorisés


                RPG: CRTRPGPGM CVTOPT(*DATETIME)


                      le compilateur génère une zone alpha.


                      doit contenir une valeur correcte en sortie
                      pas de traitement particuliers possibles.


                CBL: CRTCBLPGM CVTOPT(*DATETIME)


                      idem RPG.


    Tous ces nouveaux types ne sont reconnus par SDD
     que pour les fichiers physiques (par pour les DSPF, helas !)


    Il faut donc prévoir des zones alphas,lg fonction du type.


    DFU reconnait ces nouveautés.


    OPNQRYF aussi (y compris fonctions intégrées pour les dates)


    il est possible de faire des sélections sur la valeur nulle


    exemple de fichier utilisant ces nouveautés.


      * fichier PFV2R11
     A          R FORMAT                    TEXT('FORMAT PF V2R11')
     A            NULLOK        20          ALWNULL
     A            VARLEN       128          VARLEN(50)
     A            VDATE           L         DATFMT(*DMY) DATSEP('/')
     A            VTIME           T         TIMFMT(*HMS) TIMSEP(':')
     A            VHORO           Z

      

 GESTION DE DONNEES D'UN FICHIER                Mode . . . . :   SAISIE         
 Format . . . . :   FORMAT                      Fichier  . . :   PFV2R11    


  ########  ######### 
 NULLOK:                       
 VARLEN:  
                                                           
 VDATE:   01/01/40 
 VTIME:   00:00:00 
 VHORO:   0001-01-01-00.00.00.000000 


















 F3=Exit                 F5=Réafficher            F6=Sélection format           
 F9=Insertion            F10=Saisie               F11=Modification              
 Des zones acceptant les valeurs indéfinies ont été trouvées.                 # 

                           Entrée d'instructions SQL        


 Saisissez l'instruction SQL, puis appuyez sur Entrée.                          
 ===> INSERT INTO AF4TOOL/PFV2R11                                               
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                           Fin  
 F14=Supprimer ligne       F15=Scinder ligne         F16=Choisir bibliothèques 
 F17=Choisir fichiers      F18=Choisir zones         F24=Autres touches         
                                                                              # 

                      Définition d'une instruction INSERT           


 Indiquez vos choix, puis appuyez sur ENTREE. 


   INTO fichier  . . . . . . . . . .   PFV2R11           Nom, F4 pour liste 
     Bibliothèque  . . . . . . . . .     AF4TOOL         Nom, F4 pour liste 


   Choix de zones pour insertion 
     INTO  . . . . . . . . . . . . .   O                 O=Oui, N=Non 


   Méthode d'insertion . . . . . . .   1                 1=VALUES en entrée 
                                                         2=Sous-sélection 
















 F3=Exit   F4=Invite   F5=Réafficher   F12=Annuler   F21=Instruction 

      

                      Définition d'une instruction INSERT           


 Entrez les numéros de séquence (1-999) correspondant à vos choix, puis ENTREE. 


                                                        Valeurs 
 Séq  Zone          Type              Chiffres    Long  indéfinies 
  10  NULLOK        CHARACTER                       20  NULL                  
  20  VARLEN        VARCHAR                        128  NOT NULL WITH DEFAULT 
  30  VDATE         DATE                                NOT NULL WITH DEFAULT 
  40  VTIME         TIME                                NOT NULL WITH DEFAULT 
  50  VHORO         TIMESTAMP                           NOT NULL WITH DEFAULT 
















                                                                            Fin 
 F3=Exit   F5=Réafficher   F12=Annuler   F21=Afficher instruction 

      

                      Définition d'une instruction INSERT           


 Indiquez les valeurs à insérer, puis appuyez sur ENTREE. 




 Zone          Valeur 
 NULLOK        'renseignée par SQL'                                  
 VARLEN        'renseignée par SQL'                                  
 VDATE         '31/12/93'                                            
 VTIME         '11:59:59'                                            
 VHORO         current timestamp                                     
















                                                                            Fin 
 F3=Exit       F5=Réafficher   F6=Insérer ligne   F10=Copier ligne   F11=Type 
 F12=Annuler   F14=Supprimer ligne   F15=Scinder ligne   F24=Autres touches 

                           Entrée d'instructions SQL        


 Saisissez l'instruction SQL, puis appuyez sur Entrée.                          
    > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO)          
      VALUES ('renseigné par SQL', 'renseigné par SQL', '31/12/93',             
      '11:59:59', current timestamp)                                            
      1 lignes ont été insérées dans la table PFV2R11 de la base de donnée      
 ===> INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO)          
      VALUES (null, 'renseignée par SQL,variable précédente non renseignée      
      ', '31/12/93', '11:59:59', current timestamp)                             
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                           Fin  
 F14=Supprimer ligne       F15=Scinder ligne         F16=Choisir bibliothèques 
 F17=Choisir fichiers      F18=Choisir zones         F24=Autres touches         
                                                                              # 

                           Entrée d'instructions SQL        


 Saisissez l'instruction SQL, puis appuyez sur Entrée.                          
    > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO)          
      VALUES ('renseigné par SQL', 'renseigné par SQL', '31/12/93',             
      '11:59:59', current timestamp)                                            
      1 lignes ont été insérées dans la table PFV2R11 de la base de donnée      
    > INSERT INTO AF4TOOL/PFV2R11(NULLOK, VARLEN, VDATE, VTIME, VHORO)          
      VALUES (null, 'renseignée par SQL,variable précédente non renseignée      
      ', '31/12/93', '11:59:59', current timestamp)                             
      1 lignes ont été insérées dans la table PFV2R11 de la base de donnée      
 ===> select * from af4tool/pfv2r11                                             
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                           Fin  
 F14=Supprimer ligne       F15=Scinder ligne         F16=Choisir bibliothèques 
 F17=Choisir fichiers      F18=Choisir zones         F24=Autres touches         
                                                                              # 

                                                      Affichage des données


 Première ligne à afficher . .        
 ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....
 NULLOK                VARLEN
 renseignée            20 caractères saisis
 -                     la variable ALWNULL n'a pas étée renseignée,les zones DAT
 renseignée par SQL    renseignée par SQL
 -                     renseignée par SQL,variable précédente non renseignée
 ********  Fin de données  ********
 
 
 
 
 
 
 
 






 

                           Membre de fichier physique                           
 Fichier  . . . . :   PFV2R11             Bibliothèque . . :   AF4TOOL    
 Membre . . . . . :   PFV2R11             Enregistrement . :   1          
 Contrôle . . . . .                       Colonne  . . . . :   1     
 Recherche  . . . .                                            
 *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....
 renseignée          20 caractères saisis
                     Øla variable ALWNULL n'a pas étée renseignée,les zones DAT
 renseignée par SQL  renseignée par SQL
                     renseignée par SQL,variable précédente non renseignée
                         ****** FIN DES DONNEES ******




















                                                                            ....

 OPNQRYF et les variables de type DATE, HEURE, HORODATAGE


 OPNQRYF reconnait et est capable de traiter ces formats


 1/en comparaison avec une variable de même type   'DATCHG > DATCRT'
                  avec une constante (charactère)  'DATCHG > "01/01/94"


                  attention, respecter le format et les séparateurs.


 2/en calcul
   avec des fonctions intégrées de durée
        %DURYEAR( ) %DURMONTH( ) %DURDAY( )
        %DURHOUR( ) %DURMINUTE( ) %DURSEC    %DURMICSEC( )


   avec une durée numérique
        date = décimale 8,0 sous forme yyyymmdd (nombre d'années-mois-jours)
          (le résultat d'une opération date-date est sous ce format)
        heure= décimale 6,0 sous forme hhmmss   (nombre d'heures-minutes-s)
          (le résultat d'une opération heure-heure est sous ce format)
        horodatage= décimale (20,6) sous forme yyyymmddhhmmssccccc
          (le résultat d'une opération timestamp-timestamp est sous ce
                                                               format)

 3/ avec des opérations + -


    + : Ajout d'une durée (incrémentation)


        DATE + 215 (date + 2 mois et 15 jours)


        DATE + %DURMONTH(2) + %DURDAY(15) idem


        si l'on ajoute une durée en mois (%DURMONTH) le jour reste inchangé
         sauf s'il est plus grand que le dernier jour du mois auquel cas il
         est remplacé par le dernier jour du mois.


        %DATE('30/01/1994') + %DURMONTH(1) devient 28/02/94


        Modifier une partie de date affecte les éléments dépendants


         Ajouter un nombre de jours peut modifier le mois et l'année


         Ajouter un nombre de mois peut modifier l'année






    - : différence entre ....


        DATE1 - DATE2 (résultat sous forme de durée)


        %DATE('3/15/2000') - %DATE('12/31/1999') = 215 (2 mois et 15 jours)


      : retrait d'une durée (décrémentation)


        DATE - 215 (date - 2 mois et 15 jours)


         mêmes remarques que pour l'incrémentation




    Pour une variable de type horodatage


     la modification de l'heure(+ ou -)
       peut entrainer la modification de la date.
     la modification des microsecondes
       peut entrainer une modification de l'heure.






 Fonctions associées:


 %CURDATE, %CURTIME, %CURTIMESTP  sans argument, donnent date/heure en cours


   QRYLST('DATCRT = %CURDATE')


 %DATE, %TIME, %TIMESTP renvoient date/heure de l'argument


         l'argument peut être une variable horodatage pour %DATE, %TIME
                              une constante caractère (attention au format)
                              une variable caractère


   QRYSLT('%DATE(DAT8) = %CURDATE) ou %DATE(VHORO) = "12/12/94"   ....


 %DAY, %MONTH, %YEAR, %HOUR, %MIN, %SECOND, %MICSEC
                         renvoient une PARTIE de l'argument (Binaire 4)


           Même remarque pour l'argument PLUS LA NOTION DE DUREE.


    QRYSLT('%MONTH(DATE1) = 12)  ou %MONTH(DATE1 - DATE2) > 1




 Fonctions associées:


 %CHAR(date/heure format)
                        renvoit date ou heure sous format caractère


   QRYLST('%CHAR(DATE1 "EUR") = "28/02/94")


 %DAYS( )               renvoit une date sous format numérqiue (Binaire 4)




 %MIN et %MAX acceptent les variables de type DATE, HEURE, HORODATAGE


 A noter :


 la fonction %NULL est admise en comparaison avec une variable


             QRYSLT('VAR1 = %NULL')


 la fonction %USER retourne le profil en cours sous forme lg variable 18 c.


 le paramètre MAPFLD admet tous les nouveaux types de variables


LA possibiblité de définir ses propres ressources sous controle de
   validation (commit/rollback)


Il faut définir une ressource sous controle de validation en lui associant
   un paramètre de 80 c. et un pgm d'exit.


A chaque action du control de validation (commit ou rollback) le pgm d'exit
 sera appellé et recevra les 80 c. (entre autre)


Ajouter une ressource :    QTNADDCR 


                          - BIN(4,0) zone de retour (à utiliser en fin
                                                        avec QNTRMVCR)
                          - CHAR(10) nom de la ressource


                          - CHAR(20) nom qualifé du pgm d'exit


                          - CHAR(80) informations à envoyer au pgm d'exit


                          - CHAR(1)  appel du pgm à l'IPL (doit être N)
                          - CHAR(??) code erreur

      

Enlever une ressource :    QTNRMVCR 


                          - BIN(4,0) zone de retour recue de QTNADDCR


                          - CHAR(??) code erreur


Informations sur le controle de validation
                           QTNRCMTI 


                           - CHAR(??) variable en retour (format CMTI0100: )
                              1 à 4 BIN(4,0) octets renvoyés
                              5 à 8 BIN(4,0) octets valides
                              9 à 9 CHAR(1)  status I=inactif,L=actif(local)
                                                    R=actif(remote),A=actif
                             10  19 CHAR(10) verrouillage           sans
                                                                   ressource
                           - BIN(4,0) lg de la variable en retour


                           - CHAR(8)  format = CMTI0100


                          - CHAR(??) code erreur

      

 Le pgm d'exit recoit deux paramètres


 1/ les informations liées à la ressource (80 c.)


 2/ une structure composée comme suit:


    1 à  4 BIN(4)  lg des infos (toujours 32)


    5 à  5 CHAR(1) commit (C) ou rollback (R)


    6 à  6 CHAR(1) Appel lors de l'IPL (toujours N)


    7 à 10 CHAR(4) réservé


   11 à 11 CHAR(1) état du processus (job) lors de l'appel


                   '0' processus n'est PAS en phase de fin
                   '1' processus en phase de fin NORMALE
                   '2' processus en phase de fin ANORMALE


   12 à 31 CHAR(20) réservé

      


début