7 décembre 2004

Utiliser DAI pour les convertions Sequentiel / Indexé des fichiers de paie

Pour convertir un fichier de paie séquentiel en indexé - et inversement, vous pouvez utiliser le programme standard DAI.

Cet exemple de script prend en paramètres :
  • Le nom du fichier à traiter
  • Le type de conversion : IS ou SI
Les fichiers résultants sont suffixés par _SEQ ou _IND.
Adaptez les radicaux du programme DAI en fonction de ceux de votre site ...


if [ ! -f "$1" ]; then
 echo "fichier $1 inexistant"
 exit 1
fi
rm -f $TMP/T*.$$


echo "*-------------------------- STEP280A ---------------------------*"

echo "* Chargement de paramètres dans T280DPA *"
echo "*---------------------------------------------------------------*"

case "$2" in

IS)

echo "DA08E " >$TMP/T280DPA."$$"
SUF=SEQ
rm -f $1_$SUF

;;

SI)

echo "DA08S " >$TMP/T280DPA."$$"
SUF=IND
echo "DA08I " >$TMP/T220DPA."$$"

rm -f $1_$SUF

rm -f $1_$SUF.idx

echo "*-------------------------- STEP220N ---------------------------*"

echo "* Initialisation du fichier $1_$SUF "
echo "*---------------------------------------------------------------*"
   DPA=$TMP/T220DPA."$$"
export DPA
   DTA=$1_$SUF
export DTA
ES=$TMP/T050ES."$$"
export ES
NL=$TMP/T050NL."$$"
export NL
PO=$TMP/T050NT."$$"
export PO
$SIGACS/bin/RTSDGN $SIGACS/prod/gnt/DIFDPDAI.$SUFMOD
CODE_RETOUR=$?
unset DPA
unset DTA
unset ES
unset NL
unset PO
rm $TMP/T220DPA."$$"
;;

*) echo "Parametre 2 : IS pour Seq -> Ind"
echo " SI pour Ind -> Seq"
exit 1
;;
esac


echo "*-------------------------- STEP280N ---------------------------*"

echo "* Recopie sur séquentiel des résultats de paie définitifs *"
echo "*---------------------------------------------------------------*"
DPA=$TMP/T280DPA."$$"
export DPA
case "$2" in
IS)
   DTA=$1
export DTA
   DAT=$1_$SUF
export DAT
;;
SI)
   DAT=$1
export DAT
   DTA=$1_$SUF
export DTA
;;

esac
ES=$TMP/T050ES."$$"
export ES
NL=$TMP/T050NL."$$"
export NL
PO=$TMP/T050NT."$$"
export PO
$SIGACS/bin/RTSDGN $SIGACS/prod/gnt/DIFDPDAI.$SUFMOD
CODE_RETOUR=$?
unset DPA
unset DTA
unset DAT
unset ES
unset NL
unset PO

rm -f $TMP/T*.$$



20 septembre 2004

Signaux à destination des processus Unix

Principaux Signaux (nom numéro signification) :

SIGHUP     1  (hang up): émis aux processus associés à un terminal lorsque celui-ci se déconnecte.
SIGINT     2  (interrupt): signal d'interruption émis aux processus associés à un terminal lorsque le caractère d'interruption (<CTRL-C>) est tapé.
SIGQUIT    3  (quit): signal d'interruption émis aux processus associés à un terminal lorsque le caractère pour quitter une application (<CTRL-\>) est tapé.
SIGILL     4  (illegal) : émis en cas d'instruction illégale.
SIGTRAP    5  (trap) : émis après chaque instruction en cas de traçage de processus.
SIGIOT     6  (input/output trap) : émis en cas d'erreur matérielle.
SIGKILL    9  (kill) : tue un processus, quel que soit son état.
SIGSEGV    11 (segmentation violation) : émis en cas de violation de la segmentation mémoire.
SIGSYS     12 (system) : émis en cas d'erreur de paramètre dans un appel système.
SIGPIPE    13 (pipe) : émis en cas d'écriture sur un tube sans lecteur.
SIGALRM    14 (alarm) : signal associé à une horloge.
SIGTERM    15 (termination) : terminaison normale d'un processus.

14 septembre 2004

Dimensionner les tableaux Cobol suivant le nombre d'occurrences du dictionnaire HR

Dans un contexte de working d'un traitement, il est possible depuis HRDesign 420 (HRv3e) de saisir une ligne de commentaires ayant la forme suivante :
*<NBOCCR>sdci

Ceci aura pour effet :
  • soit de remplacer le %1 présent dans la ligne de working suivante par le nombre d'occurrences maximal de l'information (DI40.NBOCCR) tel que saisi dans le dictionnaire,
  • soit de remplacer la valeur de l'occurs déclaré sur un appel de description d'une information par le nombre d'occurrences maximal de l'information (DI40.NBOCCR) tel que saisi dans le dictionnaire.
Exemple d'utilisation dans un traitement :
*         01    UZZ.
*    *          <NBOCCR>ZYAG
*    E          ZYAGUZZ   020000IT  0 
*    *    02     **** UZZAG ****   
*         01    INDICE-MAX                  PICTURE 9(4)

*    *          <NBOCCR>ZYAG
*                                  VALUE +%1.                           

Mais attention : en cas de une modification dans le dictionnaire de la valeur du nombre d'occurrences maximum, suite à la génération logique, faire une génération physique forcée des programmes des processus impactés, car HR Access ne sait pas gérer la cascade d'impact sur les traitements...

7 septembre 2004

Erreur "ksh: 08+03: bad number" lors de l'interprétation de calculs sous Unix

Sous certains Unix, l'opérateur korn shell qui permet l'interprétation d'un calcul ne fonctionne pas si un des arguments vaut 08 ou 09 (l'interpréteur prend ces valeurs comme étant de l'octal).

> echo $((07+03))
10
> echo $((08+03))
ksh: 08+03: bad number
> echo $((09+03))
ksh: 09+03: bad number

Sauf à lui préciser qu'il s'agit d'un nombre en base 10

> echo $((10#08+03))
11

La suppression du zéro non significatif fait disparaitre le problème.

> echo $((8+03))
11

La commande "bc" - elle - fonctionne dans tous les cas.

> echo "08+03" | bc
11

Demandez au support Unix un patch système (information trouvée sur une documentation de BMC Patrol).

21 juin 2004

Mécanisme de catalogage HRv5 intégré aux livraisons

Catalogage et Restauration


Avec HRv5 apparaît un versionning des objets de conception HR Design. Ce versioning permet de gérer différentes versions d’un même objet.

Les fonctions proposées sont de :
  • sauvegarder les objets ; la sauvegarde est appelée « catalogage »,
  • lister les différentes versions de l’objet,
  • comparer les différentes versions de l’objet,
  • Restaurer ou purger la version précédente d’un objet.
Une demande de catalogage peut se faire sur un objet, ou sur une collection. Le stockage des sauvegardes est réalisé dans une table dédiée : VS20. Pour un objet simple, HR utilisera un code collection technique ** ******.

La description d'un catalogage est stockée dans les tables KL50 et KL51. Lorsque l’objet a été catalogué, la table KL50 est mise à jour (une ligne par objet). Puis une ligne de KL51 est écrite (une ligne par catalogage – hors collections techniques)




Dans le cadre d’un catalogage, le programme BU4 compare ligne à ligne le contenu en vigueur de la table de stockage VS20 (chaque ligne étant horodatée par une date de début et une date de fin) et le contenu de la table de l'objet (ex : TRxx pour un traitement).
  • En cas de différence sur une ligne de même clé, on procède par clôture de l’ancienne ligne et insertion d’une nouvelle ligne dans la table VS20. 
  • En cas d’existence d’une ligne dans la table objet absente de la table de stockage, on crée la ligne dans la table de stockage.
  • En cas d’absence d’une ligne dans la table objet présente dans la table de stockage, la ligne de la table de stockage est cloturée.
NB :
- On peut cataloguer une collection en tant qu'objet simple.
- On ne peut restaurer une collection cataloguée que totalement.
- Pour restaurer un objet unique, il faut que celui ci ait été catalogué hors d’une collection.
- En cas de restauration d’une ancienne version d’un objet, pensez à revalider les objets restaurés et ceux qu’ils impactent !

Les chaînes batch de catalogage et restauration sont :
  • NRG : Catalogage de l’objet : (BTS + BOB) + BOP + BU4, sous pgms BX4 d’expansion de la liste et BYA ... BY9, B0A ... B09 de catalogages spécialisés,
  • NRS : Restauration de l’objet : (BTS + BOB) + BOP + BU3 + BU5 + BU2.
  • RB2 (subb2) : Purge des catalogages : BU6

Ces chaines sont aussi accessibles via l'interface HR Studio.

Les utilisateurs pourront supprimer, via HRD Studio, les catalogages qui ne les intéressent plus (version intermédiaire, version ne devant plus faire l’objet d’une restauration …). La suppression d’un catalogage correspond à une suppression TP des KL50, KL51. Puis, en batch, la chaîne RB2 supprimera les lignes de VS20 n’ayant plus de correspondance dans la table KL50. La date de fin des lignes précédant celles supprimées est mise à la date de fin de la ligne supprimée si les lignes étaient directement consécutives.

Export import



Partant d’une collection, HRD Studio permet la visualisation de la liste des objets à transférer vers une plate-forme donnée et de piloter l'export et l'import des objets via l’interface :
  • Demande de la constitution de la liste des objets à exporter,
  • Mise à jour (optionnelle) de cette liste,
  • Exportation de la liste.
Les exports / imports soumis via TP entraînent le lancement de jobs batch asynchrones (un nouveau programme BTS créant une demande dans Opération et soumettant le batch via OPER).

Dans le cas d'un export batch soumis via le système (la méthode historique avec les scripts sub**), l’utilisateur doit constituer un fichier paramètre listant les objets à transférer.
  • Ces paramètres peuvent contenir des collections et/ou des objets 'libres‘,
  • Une collection peut être exportée en tant qu'objet 'libre' ou ‘complexe’.

Quatre chaînes batchs d'export / import d'objets sont disponibles :
  • RB0 (subb0) : Export d'un objet déjà catalogué : BU3 + BU5
  • RB3 (subb3) : Export et catalogage préalable : BU4 + BU3 + BU5
  • RB4 (subb4) : Import et catalogage : BU2 + BU4
  • RB7 (subb7) : prise en compre de l’export : BU7.

    L’exportation implique un catalogage préalable: on n’exporte pas les objets en ligne mais la version présente en table VS20.

    Ci dessous un schéma illustrant les mécanismes associés à ces chaînes :




    Les fichiers paramètre sont $SIGACS/param/PARAMB0 (RB0) et PARAMB3 (RB3).

    Les cartes paramètres sont :
    • PA61 : Caractéristiques de l’export (RB0, RB3)
    • PA63 : Objets exportés (RB0, RB3)
    • PA6A : Libellé du catalogage (RB3) 
    • PB6B : Forcer le projet d’accueil (RB4)

    Les fichiers en sortie sont PSBBC100, PSBBC101 (à placer en entrée de RB4), PSBBC102 (à placer en entrée de RB7).

    Points divers :
    • Les listes de transfert sont stockées dans la table de travail (PG40). 
    • Les listes des objets transférés (PP40) et leur origine (PP41) sont aussi en base.
    • En mode différentiel, le programme BU3 générant la liste des objets à exporter compare les horodatages des objets catalogués en KL50 avec les transferts déjà réalisés (en PP40, PP41) avant d'alimenter la PG40.

    14 avril 2004

    Mettre en place une file d'attente sous Unix avec "at"

    En l'absence d'ordonnanceur, pour limiter le nombre de processus batch actifs, il est possible de soumettre ces travaux dans les files d’attentes Unix. Il y a 6 files d’attente; deux sont réservées pour le système, certaines à des shells particuliers (ex : f pour le csh). Préférer les queues a (aussi utilisée par la commande at - qu'il vaut donc mieux laisser le plus libre possible), b (aussi utilisée par la commande batch), et e :
    • "c" - cron events, réservée au système Unix
    • "d" - sync events, réservée au système Unix
    • "b" - batch jobs
    Les autres sont dédiées à un langage shell :
    • "a" - sh jobs - at jobs 
    • "e" - ksh jobs 
    • "f" - csh jobs
    Par défaut c'est la file "a" qui est utilisée. Une tâche peut toutefois être envoyée sur une autre queue ("e" dans cet exemple) à une heure particulière (21:20 dans notre exemple) :

    echo "sh monshell.sh > $LOG/monlog.log" | at -qe 2120

    La commande "at -l" permet de lister les travaux placés en attente, "at -r" de les supprimer :
    at -l
    hr.1044415211.e mar  4 fév 21:20:11 CST 2003


    Le format du nom du travail est : <UserUnix>.<IdTravail>.<NomQueue>. Sur AIX ils sont stockés dans le répertoire /var/adm/cron/atjobs :
    ls /var/spool/cron/atjobs/hr.*.?
    /var/spool/cron/atjobs/hr.1044415211.e


    Et la commande soumise peut être consultée en fin du fichier :
    tail -1 /var/spool/cron/atjobs/hr.1044415211.e
    sh monshell.sh > $LOG/monlog.log


    Quand le nombre maximum de batch en cours d'exécution est atteint pour une file d'attente, les suivants restent dans le tampon du "at" (visibles par un "at -l") d'ici à ce qu'un des batch se termine et libère une place.

    L'heure de soumission n'est donc pas forcément identique à l'heure de début d'exécution. Il pourra être nécessaire d'informer les utilisateurs de cette caractéristique. 

    Mise en place

    1) Faites paramétrer les files d'attente via le fichier /var/adm/cron/queuedefs (AIX).

    Attention :
    • Ceci est de la prérogative de l'administrateur Unix de la machine,
    • Ce paramétrage est fait pour la machine, c'est a dire pour toutes les applications hébergées.

    Par exemple pour 3 files d’attente nommées « e », « b » et « a » de respectivement 4, 4 et 9 batchs pour les paies à la demande, les paies de correction et explorations, les autre batch, avec comme priorités 20, 25, 30 (20 étant plus prioritaire que 25) :

    e.04j20n60w
    b.04j25n60w
    a.09j30n60w


    Signifie :
    • queue e : 4 batch (jobs) de priorité (nice) normale (20),
    • queue b : 4 batch de priorité réduite (25),
    • queue a : 9 batch de priorité basse (30),
    • bilan (wait) toutes les 60 secondes
    2) Sous HR Access, modifiez le script ${SIGACS}/bin/job.

    Exemple ci joint :
    - les paies à la demande NJL sont lancées sur la queue e
    - les paies de correction et explorations sur la queue b
    - tous les autre batch sur la queue a

    ...
    # Lancement d'un script de $SIGACS/bin
    if [ ! "$T" ]
    then
      JSCRI=`echo "$PARAM"|cut –c14-21| tr –d ‘ ‘`
      case ${JSCRI} in
      [A-Z,0-9]*NJL)
      echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qe now 2>> $TMP/a.batch
        ;;
      [A-Z,0-9]*NJC|[A-Z,0-9]*NBX)
      echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qb now 2>> $TMP/a.batch
        ;;
      *)
      echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1 " | at -qa now 2>> $TMP/a.batch
        ;;
      esac
    else
    ...

    Mettre en place une file d'attente sous Unix avec qconfig

    Sous système AIX, le fichier /etc/qconfig décrit les queues et matériels disponibles par la commande enq, laquelle place les requêtes en attente, et par qdaemon, qui exécute les actions et nettoie la queue. En temps normal ce système est utilisé pour les impressions, mais il est possible de l'utiliser pour l'exécution de traitements.

    Exemple :
    Une queue de traitements batch se déclare de cette façon :
    bsh:
      discipline = fcfs
      device = bshdev
    bshdev:
      backend = /usr/bin/ksh


    Pour exécuter un script nommé MonShell.sh en utilisant cette queue batch, tapez :
    qprt -Pbsh MonShell.sh

    Le système exécute les traitements un par un, dans l'ordre dans lequel ils ont été soumis. Le processus qdaemon redirigera les sorties standard (input, standard output, et erreur) vers /dev/null (la poubelle).

    Pour permettre l'exécution de deux traitements en parallèle, déclarez :
    bsh:
      discipline = fcfs
      device = bsh1,bsh2
    bsh1:
      backend = /usr/bin/ksh
    bsh2:
      backend = /usr/bin/ksh


    Il est même possible de demander un traitement sur un serveur distant ! Ci dessous par exemple, on crée localement une queue nommée "remh" qui passera la commande à la queue "bsh" préalablement déclarée sur un serveur "pluto" (à référencer dans le etc/hosts ou le DNS de l'entreprise) :

    remh: 
      device = rd0 
      host = pluto 
      rq = bsh 
    rd0: 
      backend = /usr/lib/lpd/rembak

    A noter :
    • La commande "enq" convertit automatiquement le fichier qconfig en binaire (/etc/qconfig.bin).
    • Le fichier qconfig ne doit pas être édité tant que des travaux sont présents dans les queues (édition manuelle ou via commande mkque, rmque, chque, mkquedev, rmquedev, chquedev),
    • La commande "enq -G" suspend la queue une fois tous les traitements terminés,
    • La commande "startsrc -s qdaemon" redémarre le démon.

    Mise en place


    Je n'ai pas eu l'occasion de tester cet outil, mais il me semble intéressant ...
    Ci dessous ce que j'en ferais :

    1) Faites paramétrer les files d'attente via le fichier /etc/qconfig (AIX).

    Attention :
    • Ceci est de la prérogative de l'administrateur Unix de la machine, 
    • Ce paramétrage est fait pour la machine, c'est a dire pour toutes les applications hébergées.

    Par exemple pour 3 files d’attente nommées « bshnjl », « bshnbx » et « bshall » de respectivement 4, 4 et 9 batchs pour les paies à la demande, les paies de correction et explorations, les autre batch :

    bshnjl:
      discipline = fcfs
      device = bshnjl1,bshnjl2,bshnjl3,bshnjl4

    bshnjl1:
      backend = /usr/bin/ksh
    ...

    bshnjl4:
      backend = /usr/bin/ksh


    bshnbx:
      discipline = fcfs
      device = bshnbx1,bshnbx2,bshnbx3,bshnbx4

    bshnbx1:
      backend = /usr/bin/ksh
    ...

    bshnbx4:
      backend = /usr/bin/ksh


    bshall:
      discipline = fcfs
      device = bshall1,bshall2,bshall3,bshall4
    ,bshall5,bshall6,bshall7,bshall8,bshall9
    bshall1:
      backend = /usr/bin/ksh
    ...

    bshall9:
      backend = /usr/bin/ksh
     

    2) Sous HR Access, modifiez le script ${SIGACS}/bin/job.

    Exemple ci joint :
    - les paies à la demande NJL sont lancées sur la queue bshnjl
    - les paies de correction et explorations sur la queue bshnbx
    - tous les autre batch sur la queue bshall

    ...
    # Lancement d'un script de $SIGACS/bin
    if [ ! "$T" ]
    then
      JSCRI=`echo "$PARAM"|cut –c14-21| tr –d ‘ ‘`

      echo "sh $SIGACS/bin/$PHASE '$PARAM' 1>$LOG/$JOBLOG 2>&1; rm \${0}" > $TMP/OPER.$$.pendingjob
      case ${JSCRI} in
      [A-Z,0-9]*NJL)
     
    qprt -Pbshnjl "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
        ;;
      [A-Z,0-9]*NJC|[A-Z,0-9]*NBX)
     
    qprt -Pbshnbx "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
        ;;
      *)
     
    qprt -Pbshall "$TMP/OPER.$$.pendingjob" 2>> $TMP/a.batch
        ;;
      esac
    else
    ...