22 novembre 2010

Contrôle de débordement d'information

HR Access utilise des tableaux Cobols dont le nombre d'occurrence est fixé par le dictionnaire HR Access. Il peut donc arriver que ces tableau génèrent des erreurs de débordement.

Pour anticiper l'apparition de ces blocages, un collègue m'a transmis un SQL de Contrôle de débordement (ici avec les informations rattachées au processus de paie FDAZY hors 6* et 8*, l'alarme étant fixée dans le premier cas à 90% du maximum) :

  select a.nudoss, a.matcle, a.soccle, b.cdinfo, b.nboccr as NombreDico, c.cdpros,
  c.cdinfo, c.nboccr as NombreFDAZY , d.cdinfo, d.nombre as NombreTD12
  from hr.zy00 a, hr.di40 b, hr.ap30 c,  hr.zytd12 d
  where a.nudoss = d.nudoss and b.cdinfo= c.cdinfo and b.cdinfo = d.cdinfo
  and ((c.nboccr > 0 and d.nombre >= (c.nboccr*90/100))
  or   (c.nboccr = 0 and d.nombre >=  b.nboccr*90/100))
  and (b.tehist = '1' or b.tyinfo='R') and b.cdstdo = 'ZY' and c.cdstdo = 'ZY'
  and c.cdpros = 'FDAZY'
  and b.cdinfo not like '6%' and b.cdinfo not like '8%' order by b.cdinfo, d.nombre;

et

  select distinct b.cdinfo from hr.zy00 a, hr.di40 b, hr.ap30 c,  hr.zytd12 d
  where a.nudoss = d.nudoss and b.cdinfo= c.cdinfo and b.cdinfo = d.cdinfo
  and ((c.nboccr > 0 and d.nombre >= c.nboccr)
    or (c.nboccr = 0 and d.nombre >= b.nboccr))

  and (b.tehist = '1' or b.tyinfo='R')
  and b.cdstdo = 'ZY' and c.cdstdo = 'ZY' and c.cdpros = 'FDAZY'
  and b.cdinfo not like '6%' and b.cdinfo not like '8%' ;

16 novembre 2010

Résoudre un verrouillage sur DB2

1 - Bilan


  db2pd -wlocks -db $DB2DBDFT

Cette commande liste les "applications DB2" (champ AppHandl) à la source d'un verrouillage et celles en attente de la levée du verrou. Si la commande n'affiche qu'une ligne avec l'heure - il n'y a pas de verrou - l'éventuel blocage n'est pas dû à DB2.

2 novembre 2010

Personnaliser l'invite HRaSpace v7

Dans le fichier paramètre suivant de HRaSpace :
$SIGACS/../hraspace/webapps/hra-space/WEB-INF/classes/hra-space-str_f.xml (ici f pour français), deux paramètres sont intéressant à personnaliser :
  • ID109 : message de la page d'accueil (par défaut "Bienvenue sur HRa Space")
  • ID121 : message de bienvenue (affichage de l'identité de l'utilisateur connecté - variable $1 - en haut de page)

Je recommande pour ces deux champs d'ajouter (sauf en Production) le code ou le libellé de l'environnement (je vous conseille de prendre aussi en compte la version anglaise du fichier pour le cas des poste clients internationaux).

28 juin 2010

Message d'erreur "98 RS BNA 9N CG TD11 00000000000818"

Sous DB2 l'erreur SQL 818 signifie qu'il existe un déphasage entre l'exécutable et sa bibliothèque de définition des accès SQL stockée en base. Ce déphasage a plusieurs causes possibles :

Des exécutables ont été copiés à partir d'un autre environnement, mais le bind n'a pas été fait (ou inversement) :

Suite à une livraison imparfaite, exécutable et bind sont déphasés.
Vérifiez que l'horodatage des fichiers ".so" et ".bnd" sont en phase, et cohérents avec ceux de l'environnement source.
Il suffit alors de faire la mise à jour de la bibliothèque de définition des accès SQL ("bind") par prise en compte du fichier *.bnd :

bind RRRRRPPP.bnd collection $HRSCHEMA  datetime iso qualifier $HRSCHEMA

Avec RRRRRPPP radical et code du programme.

La dernière génération s'est terminée en fin anormale :

Il est possible de se trouver dans le cas de figure ou le "bind" a été fait mais la compilation est sortie en erreur. Ce déphasage se résout en corrigeant la source du problème de compilation et en relançant la génération de l'exécutable.

Les chaines de génération physique réalisent dans l'ordre :
  • L'écriture du source Cobol
  • La pré-compilation DB2 du source contenant du SQL (création du *.bnd)
  • Mise à jour de la bibliothèque de définition des accès SQL ("bind" par prise en compte du fichier *.bnd)
  • La compilation du Cobol (fichiers *.so)
  • Le stockage des générés dans $SIGACS/prod (gnt et bnd)
Lorsqu'une étape sort en erreur, le stockage des *.so et *.bnd correspondants n'est pas réalisé.

Observer la correspondance de l'horodatage des fichiers *.bnd et *.so n'est donc pas pertinent.
Mieux vaut comparer l'horodatage du bind (LAST_BIND_TIME de SYSCAT.PACKAGES) avec celui de l'exécutable (TICOMP de PG15).

Une version obsolète de l'exécutable est encore active :


Avec les versions Web de HR Access, les BHR montés en mémoire sont partagés entre les différents utilisateurs de l'application. Un BHR peut ainsi rester plusieurs heures en ligne si l'activité TP est incessante.

Si une génération a lieu entre temps, la nouvelle version des exécutables n'est alors pas prise en compte. Néanmoins, le bind de la nouvelle version des programmes ayant été fait, les BHR actifs utilisent des exécutables BNA, BNK ... déphasés.

Pour limiter cette rémanence des programmes, il convient :
  • De réduire le temps de latence des BHR au minimum (working time out dans dispatcher.ini ou dispatcher.properties),
  • On s'arrangera pour que les BHR soient spécialisés par processus HR (reuse_cobol_runtimes à false dans dispatcher.ini ou dispatcher.properties),
  • En dernier recours on éliminera les processus unix BHR obsolètes (kill).

Exemple : un processus BHR a démarré à 11h21 mais certains programmes ont été regénérés à 11h52.

hrppr@hra:/hraccess5/hrppr/txt/log> ps -ef | grep BHR
hrppr     6604 22369  1 11:21 ?        00:00:14 /hraccess5/hrppr/bin/RTSDGN TYBXBHR WZ005BNM0000000000000001 192.168.64.11 58282 logdir=/hraccess5/hrppr/openhr/logs,trace=true,debug=true,chrono=false,client=*
hrppr@hra:/hraccess5/hrppr/prod/gnt> ltt
-rwxrwxr-x  1 hrppr v5ppr  402219 jun 28 11:52 WZ005BNA.so
-rwxrwxr-x  1 hrppr v5ppr  402219 jun 28 11:53 WZ005BJA.so
-rwxrwxr-x  1 hrppr v5ppr  402219 jun 28 11:53 WZ005BNK.so
-rwxrwxr-x  1 hrppr v5ppr  402219 jun 28 11:54 WZ005BNL.so

18 juin 2010

Message d'erreur "L Z BHR 8V BN : VIRTUAL_SESSION_TIMEOUT"

Avec HRaSuite 7.1, passées 30 minutes d'inactivité, HRaSpace nettoie la session et renvoie à l'utilisateur un message VIRTUAL_SESSION_TIMEOUT qui le contraint à se reconnecter.

La durée de la session (time out) est paramétrable. Il s'agit d'insérer manuellement la ligne suivante dans la table PP15:
INSERT INTO PP15 VALUES ('code-plateforme physique','OP_TIMEOUT','mmm');

Alimenter :
  • CDPLPH avec le code de la plate forme physique réelle
  • VALPAR avec le nombre de minutes sur 3 caractères (mmm)
  • IDPARM est alimentée par le paramètre OP_TIMEOUT (time out OpenHR)
Avec HRv9 apparaît CX_TIMEOUT. C'est la durée de connexion maximale (en minutes) - même si celle ci est restée active. Par défaut elle est de 18 heures. Sa valeur maximale possible est de 9999 minutes.

28 avril 2010

Libération de l'espace disque consommé par un log fantôme

Sous Unix, il peut arriver que les volumes fournis par les commandes "du" et "df" soient discordantes. Et l'on peut voir un disque se remplir sans réussir à trouver le fichier coupable !

Une cause probable est la conservation par le système d'exploitation d'un fichier "supprimé" ... mais encore ouvert en écriture :
  • Si un processus a ouvert un écriture un fichier (ex : une exploration en boucle infinie),
  • Et que vous détruisez ledit fichier (ex : le log de cette exploration),
  • Alors l'espace n'est pas libéré tant que les processus Unix associés au batch ne sont pas tués.

Exemple :
L'espace disque est quasi plein (93% - 9Go consommés sur 9.8)
  df -g .
  Système de fichiers    Blocs GB      Libre %Util    Iutil %Iutil Monté sur
  /dev/lv_hradv2a            9,81       0,78   93%    52744    19% /appli/hradv2

Suppression d'un log volumineux
  rm ${LOG}/JD800NBW.DIGIX

L'espace n'est pas libéré
  df -g .
  Système de fichiers    Blocs GB      Libre %Util    Iutil %Iutil Monté sur
  /dev/lv_hradv2a            9,81       0,78   93%    52744    19% /appli/hradv2

L'espace consommé par les fichiers présents (3.2 Go) ne correspond pas a l'espace occupé dans le système de fichier (9 Go)
  du -ks /appli/hradv2
  3252884 /appli/hradv2

L'exploration à la source du log est en fait active.
Elle consomme énormément de puissance (C=120) et tourne depuis 4h25 (15h21 - 10h56).
Elle est probablement en boucle infinie.
  ps -fu ${LOGNAME}
     UID     PID    PPID   C    STIME    TTY  TIME CMD
  hradv2 1228816 1703940   0 15:21:18 pts/31  0:00 -ksh
  hradv2 1265740 2015454   0 10:56:23      -  0:00 sh /appli/hradv2/bin/OPER PPHRADV2JD800JD800NBX03PA45977233811DIGIX
  hradv2 1515600 1765484 120 10:56:26      - 268:31 /appli/hradv2/bin/RTSDGN /appli/hradv2/prod/gnt/LASS1AEX.so
  hradv2 1552476 1515600 0 15:34:42      -  0:00 oraclehradv2 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  hradv2 1765484 1265740 0 10:59:02      -  0:00 sh /appli/hradv2/txt/tmp/JD800NBX.3096756 N

Suppression du processus (kill du Cobol AEX)
  kill -9 1515600

L'espace est maintenant libéré (6.76 Go libres)
  df -g .
  Système de fichiers    Blocs GB      Libre %Util    Iutil %Iutil Monté sur
  /dev/lv_hradv2a            9,81       6,76   32%    48252     3% /appli/hradv2

21 avril 2010

Récupérer l'heure systeme dans un traitement Cobol

Pour récupérer et afficher l’horodatage système dans un Cobol (heures, minutes, secondes, centièmes), déclarez une variable de 8 caractères et utilisez la commande "ACCEPT ... FROM TIME" :

Working :

       01         DIGIX-TIME.                  
         05         DIGIX-TIMEH PIC 9(2).     
         05         DIGIX-TIMEM PIC 9(2).     
         05         DIGIX-TIMES PIC 9(2).      
         05         DIGIX-TIMEC PIC 9(2).

Procedure :

  ACCEPT DIGIX-TIME FROM TIME.
  DISPLAY DIGIX-TIME.

25 janvier 2010

Script de login Oracle login.sql

Quand SQL*Plus démarre, il recherche le script de login global "glogin.sql" dans le répertoire $ORACLE_HOME/sqlplus/admin et l'exécute s'il est présent. Dans un second temps, SQL*Plus va recherche le script de login "login.sql" dans le répertoire local, sinon dans le répertoire $ORACLE_PATH ou $SQLPATH que vous avez spécifié. Il l'exécute s'il est présent.

NB: à compter de Oracle 10g, SQL*Plus va exécuter le glogin.sql et login.sql après chaque 'connect' réussi. Cela est pratique quand on affiche le "user Oracle" dans l'invite.