Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
4 août 2010 3 04 /08 /août /2010 13:51

      *              Programme de Service  v1
      *              Fonctions de date
     Hnomain
     Hdatfmt(*iso)


DT99  * renvoie une   Date
      *   parm1   Num    8 0  || 991130 1091129 20080223 0         *omit     ||
      *   parm2   Alpha 10    || rien   ' '     *omit   '1101231' '17890714' ||
      *   parm3   Alpha  5  (*iso,*eur,*usa,*cymd,*ymd,*cdmy,*dmy,*cmdy,*mdy)
      *

      /copy sources,dt99k

     Pdt99             b                   export

     Ddt99             pi              d
     Dn80x                            8  0 const options(*nopass:*omit)
     Da10x                           10    const options(*nopass:*omit)
     Dfmtx                            5    const options(*nopass:*omit)

      * Message d'escape
     Ddt99c            pr                  extproc('DT99C')
     D parm1                        512    const

      * Zones de travail correspondant au paramètres
     Dretw             s                   like(dt99)
     Dn80w             s                   like(n80x)
     Da10w             s                   like(a10x)
     Dfmtw             s                   like(fmtx) inz('*cymd')

     Derrfmtw          s               n

      /free

        // Si transmis les parametres sont affectés.
         if %parms >= 1 and
            %addr(n80x) <> *null;
         n80w = n80x;
         endif;

         if %parms >= 2 and
            %addr(a10x) <> *null;
         a10w = a10x;
         endif;

         if %parms >= 3 and
            %addr(fmtx) <> *null;
         fmtw = fmtx;
         endif;


        // Numérique ou alpha, mais pas les deux !
         if n80w <> 0 and a10w <> *blanks;
         callp dt99c('Numérique ou Alpha, mais pas les deux : ' +
               %editc(n80w:'X') + ' ' + a10w + ' !'); // Erreur, escape
         endif;


        // Si blank ou des zéro :
         if n80w = 0 and
           (a10w = *blanks or
           (%check('  0':a10w) = 0));
         return  *loval;               // Retour *loval  0001-01-01
         endif;


          monitor;

         // Les éventuels séparateurs de date sont enlevé.

         // Convertion en numérique
          if a10W <> *blanks;
          n80w = %dec(%xlate('/-_.,:;':'       ':a10w):8:0);
          endif;

         // Traitement des 999999
          if (fmtw = '*cymd' or fmtw = '*cdmy' or fmtw = '*cmdy' or
               fmtw = '*ymd ' or fmtw = '*dmy ' or fmtw = 'cmdy ') and
             (n80w = 999999 or n80w = 1999999);
          return *hival;                  // Retour *hival  9999-12-31
          endif;

         // Conversion en date
          select;
          when fmtw = '*cymd';
          retw = %date(n80W:*cymd);
          when fmtw = '*ymd ';
          retw = %date(n80W:*ymd);
          when fmtw = '*cdmy';
          retw = %date(n80W:*cdmy);
          when fmtw = '*dmy ';
          retw = %date(n80W:*dmy);
          when fmtw = '*cmdy';
          retw = %date(n80W:*cmdy);
          when fmtw = '*mdy ';
          retw = %date(n80W:*mdy);
          when fmtw = '*iso ';
          retw = %date(n80W:*iso);
          when fmtw = '*eur ';
          retw = %date(n80W:*eur);
          when fmtw = '*usa ';
          retw = %date(n80W:*usa);
          other;
          errfmtw = *on;              // Le format doit être valide !
          endsl;

          on-error;
          retw = d'0001-01-02';      // Date invalide (par convention)
          endmon;


          if errfmtw;   // Erreur, escape
          callp dt99c('Format d''appel inconnu : ' +

            fmtw + ' !');            

          endif;


          return retw;                         // Retour d'une date

      /end-free
     P                 e

 


      // Pour être appelable par une fonctions Sql,

      // no more paramètres facultatifs.

 
      // Entrée numérique, format par défaut.

     Pdt99n            b                   export

     Ddt99n            pi              d
     Dn80x                            8  0 const

      /free

           return  dt99(n80x);

      /end-free
     P                 e


      // Entrée alpha, format par défaut.

     Pdt99a            b                   export

     Ddt99a            pi              d
     Da10x                           10    const varying

     Da10w             s                   like(a10x)

      /free

           a10w = a10x;
           return  dt99(*omit:a10w);

      /end-free
     P                 e


      // Entrée alpha, format par *cmdy pour les pseudo-dates système

     Pdt99as           b                   export

     Ddt99as           pi              d
     Da10x                           10    const varying

     Da10w             s                   like(a10x)

      /free

           a10w = a10x;
           return  dt99(*omit:a10w:'*cmdy');

      /end-free
     P                 e

 

      // Tous parametres

     Pdt99naf          b                   export

     Ddt99naf          pi              d
     Dn80x                            8  0 const
     Da10x                           10    const varying
     Dfmtx                            5    const varying

      /free

           return  dt99(n80x:a10x:fmtx);

      /end-free
     P                 e

Partager cet article
Repost0

commentaires