20 mai 2007

Upgrade Java et erreur OpenHR "while reading SSL Site Parameters"

Vu sous HR Access 3e
Si a l'ouverture de OpenHR, vous avez une erreur fatale avec le message suivant :

[main] ERROR - OPHRS4201 Error occured while reading SSL Site Parameters org.apache.xml.dtm.DTMConfigurationException: No default implementation found at org.apache.xml.dtm.DTMManager.newInstance(DTMManager.java:177)

  1. Stoppez les serveur Web, Query et OpenHR
  2. Renommez "$SIGACS/openhr/lib/boot" en boot.old
  3. Renommez "$SIGACS/query/lib/boot" en boot.old
  4. Redémarrez.

Si le test est concluant, vous pouvez détruire les répertoires suffixés en ".old"

A priori, un upgrade Java a eu lieu sur la machine et la librairie Xalan Apache utilisée jusqu'alors par OpenHR entre en concurrence avec celle de Java.

13 mai 2007

Passer par un tableau Cobol indexé permet de limiter les accès SQL.
Utilisez ensuite des SEARCH pour être plus performant.

Exemple :

01 CountryTable.
   02 Country OCCURS 243 TIMES INDEXED BY Cidx.
      03 CountryCode    PIC XX.
      03 CountryName    PIC X(26).
...
          SET Cidx TO 1
          SEARCH Country
             AT END MOVE "Code not found" TO CountryNameSF
             WHEN CountryCode(Cidx) = CountryCodeWF
                  MOVE CountryName(Cidx) TO CountryNameSF
          END-SEARCH
...

Exemple complet sur http://www.csis.ul.ie/

Remarques :
  • Initialisez le tableau ligne à ligne avec un COB INITIALYZE,
  • Le remplir d'occurrences triées.

20 février 2007

Créer un EAR pour HR Access Web v5 sous Websphere

Un fichier EAR (Enterprise Application aRchive) contient des informations supplémentaires par rapport au fichier WAR classique. Il contient notamment le nom de l'application déployée ainsi que le "context root". Le fichier EAR, tout comme le WAR, est un fichier zip.

Pour créer le fichier EAR, il faut respecter les étapes suivantes :
  1. Créer un répertoire du nom de l'application à déployer (par exemple : hraccess).
  2. Copier dans ce répertoire le fichier WAR (ex : hraccess.war).
  3. Créer un répertoire META-INF.
  4. Créer un fichier application.xml dans le répertoire META-INF, contenant les lignes indiquée plus loin,
  5. Adaptez les informations surlignées,
  6. Zipper le répertoire complet du nom de l'application (hraccess).
  7. Renommer le fichier hraccess.zip en hraccess.ear
Exemple de application.xml:
 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application
1.2//EN" "http://java.sun.com/j2ee/dtds/application_1_2.dtd">
<application id="Application_ID">
<display-name>hraccess</display-name>
<module id="WebModule_1">
<web>
<web-uri>hraccess.war</web-uri>
<context-root>hraccess</context-root>
</web>
</module>
</application>


 A noter :
  • <display-name> hraccess </display-name> précise le nom de l'application Web déployée.
  • <web-uri> hraccess.war </web-uri> précise le nom du fichier WAR contenu dans le fichier EAR.
  • <context-root> hraccess </context-root> précise le "context root" de l'application. Il s'agit du path à renseigner dans l'url (ex : http://NomServeur:NumPort/hraccess) correspondant à l'application Web.

25 avril 2006

HR Query Meter

HR Query Meter est à la base une application destinée aux tests de montée en charge du serveur HRD Query, mais elle peut aussi s’avérer utile à la visualisation et à l'analyse des travaux en cours d’exécution sur ce serveur.

Sur votre poste Windows

Installez un serveur X (par exemple Xming).
  • installer les exécutables,
  • les polices (fonts)
  • Au niveau du raccourci "Xming", par clic droit "propriétés" modifier la "cible" : ajouter l'option "-ac" (pour ne pas être ennuyé par les problématiques d' "access control"),
  • Double cliquer sur ce raccourci Xming

Sur le serveur Unix

  • Positionnez la variable DISPLAY pour pointer sur votre PC
/hradev/query/bin> who am i
digix     pts/21      23 jul 11:05     (1.2.3.4)
/hradev/query/bin> export DISPLAY=1.2.3.4:0.0

  • Démarrez HRQueryMeter une première fois
/hradev/query/bin> sh query_meter_ui.sh

l'outil va modifier queryserver.ini pour positionner LoggerClassName=com.hraccess.bench.logger.Logger puis initier le fichier querymeter.ini.

  • Arrêtez et redémarrez le serveur de Query pour prendre en compte cette modification
  • Si vous souhaitez modifier le port de communication choisi par défaut, modifiez le fichier querymeter.ini (indiquez un port libre - pas déjà utilisé - et ouvert - non bloqué par les firewalls)
[RMI]
NUMPORT=1234

  • Relancez HRQueryMeter une seconde fois
  • Dans le répertoire logs un fichier qrmtr.log est créé

Sur votre poste Windows


  • Xming affiche HRQueryMeter.
  • Cliquer sur "Visualisation de jobs"

  • Si l'on soumet un query avec l'Assistant de gestion, alors HRQueryMeter affiche l'avancement et les statistiques du traitement (onglets "Jobs" et "Détails des jobs"). Le menu "Fichiers" permet d'exporter les données sous forme de fichier.

  • Si vous appuyez sur le bouton "Visualisation de jobs et préparation de scénarios", les fichiers temporaires XMLData seront conservés pour permettre des tests de charge. Vous pouvez paramétrer un scénario et l'exécuter le pour tester le serveur en charge (paramètres d'augmentation des volumes, d'exécutions en parallèle ou en série).

8 août 2005

Obtenir l'horodatage exact d'un fichier Unix

Si sous Linux, le "ls" GNU possède l'option --full-time ...
ls --full-time $TMP/a.batch
-rw-r--r--  1 hradev hradev 932 2012-09-21 10:50:35.000000000 +0200 /hradev/txt/tmp/a.batch


... sous Unix je n'ai jamais pu trouver comment obtenir simplement la date précise de dernière modification d'un fichier ... Qui plus est avec un format d'affichage constant (et non le "mmm JJ HH:MM" qui devient un "mmm JJ YYYY" passés 6 mois) ... 

Suite à une astuce relative à la commande "tar" donnée par un collègue (merci Gabriel), j'ai rédigé cette petite fonction nommée timestamp (que vous pouvez placer dans votre fichier profile). Pour l'utiliser tapez :
timestamp dirname/filename

Exemple :

/home/moi/ ls -al .profile
-rwxr-----    1 moi staff           684 Mar 16 2011  .profile
/home/moi/ timestamp .profile
Mar 16 2011 14:42:44


Ci dessous la fonction en question :

function timestamp
{
# Displays file timestamp
# french : jj mmm yyyy hh:mm:ss / english :  mmm jj yyyy hh:mm:ss
#
#set -x # Uncomment to active trace mode

File=$1
if [ ! -e "${File}" ]
then
   echo "usage : ${0} { filename | dirname }" >&2
   return 1
else
   # Creating a dummy file whith same timestamp
   touch -r "${File}" /tmp/T.timestamp.$$
   if [ $? -ne 0 ]
   then
      echo "${0} : Could not create temporary file in /tmp" >&2
      return 1
   else
#     LANG=fr_FR # Uncomment to force french format
#     LANG=en_EN # Uncomment to force english format
      # Tar and untar this file to catch its timestamp, then print it
      tar -cf - /tmp/T.timestamp.$$ | tar -tvf - | awk '{print $5" "$6" "$8" "$7}'
      # Removing the dummy file
      rm -f /tmp/T.timestamp.$$
      return 0
   fi
fi
}

6 juin 2005

Liste des tables étalées sous HRv5

Ci dessous la liste des tables étalées HRv5 à mettre à jour par NRA-NRB :

Postes    ZAOR Table des postes 'à plat'
                               - processus AS3FS    AS3FT

Demande de personnel
    ZB3K Table consolidée Demandes de personnel
                               - processus AS4FS    AS4FT

Emploi
    ZCGE Table des emplois 'à plat'
                               - processus AS5FS    AS5FT

Unités Organisationnelles
    ZE0R Table des organisations 'à plat'
                               - processus AS6FS    AS6FT

Salarié
    ZYAF Affectation consolidée
                               - processus AS0FS    AS0FT
    ZY1W Table chgts de société 'à plat’
                               - processus AS0FS    AS0FT
    ZY2Y Suivi du réalisé en formation
                               - processus AT0FS    AT0FT
    ZY2Z Suivi du plan de formation / salarié
                               - processus AT0RS    AT0RT

Formation
    ZDFJ, ZDFK, ZDFL  Etats légaux français
                               - processus FT9LI    FT9FT
    ZDE1, ZDE2, ZDE3, ZDE4 Suivi du plan de formation
                               - processus AT9FS    AT9FT
    ZDHV Mise à jour du plan de formation
                               - processus AT9LI    AT9F2

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
    ...

    7 février 2003

    Activation / désactivation des clefs étrangères sous Oracle

    Les tables techniques et les tables fonctionnelles utilisent des clefs étrangères et de "delete en cascade". Leur présence est nécessaire au bon fonctionnement du produit. Lors de certaines opérations (export - import Oracle de données) il peut être utile de les désactiver temporairement.

    Faire le bilan des contraintes inactivées :
    select constraint_name,validated from user_constraints where constraint_type='R' and validated <> 'VALIDATED'

    Créer des ordres SQL pour désactiver les clefs étrangères :

    select 'alter table '||table_name||' modify constraint '|| constraint_name||' disable novalidate;'     
    from user_constraints where constraint_type='R';

    Créer des ordres SQL pour réactiver les clefs étrangères :
    select 'alter table '||table_name||' modify constraint '|| constraint_name||' enable validate;'     
    from user_constraints where constraint_type='R';

    Attention car certaines tables (ex: PP12) peuvent posséder une contrainte non nommée (Oracle va donc lui attribuer un nom système et la numéroter différemment sur chaque environnement).

    13 septembre 2002

    Boucle de mise a jour SQL avec COMMITs intermédiaires


    Ci joint un modèle de boucle PL/SQL pour faire des mises à jour SQL avec des COMMITs intermédiaires (ici toutes les 100 mises à jour). Ceci est utile quand les volumes sont trop importants et provoquent des erreurs sur les tablespaces temporaires ou d'undo.

    begin
    loop
        update/insert/delete ... where ... and rownum < 100;
        exit when sql%rowcount < 99;
        commit;
    end loop;
    end;
    /


    Par exemple pour supprimer les travaux Opération de ZO de plus de 90 jours avec COMMIT tous les 10 DELETE :

    begin
    loop
        delete from ZO00 where TISOUM > '0001-01-01' and TISOUM < SYSDATE - 90 and rownum < 10;
        exit when sql%rowcount < 9;
        commit;
    end loop;
    end;
    /


    PS : ce faisant, vous avez libéré de l'espace dans chacune des tables ZO**, mais pas dans les tablespaces HRZO et HRZOI (faire un DELETE ne modifie pas l'espace alloué aux tables, mais libère de l'espace "à l'intérieur" des tables). Si vous souhaitez récupérer l'espace libéré dans chacune des tables pour le rendre disponible à toutes, vous devrez utiliser la commande :
    ALTER {TABLE/INDEX} object_name DEALLOCATE UNUSED;