14 novembre 2012

Maintenir des processus Utilitaires



Les processus utilitaires (de qualification "UT") peuvent servir à plusieurs titres :
  • Chaîne NOY d'export de données,
  • Chaîne ROL de dé-vérolage de dossiers (reconstruction des TD12 et renumérotation des NULIGS, NULIGP des informations historiques),
  • Chaîne ROM pour generation de bordereaux de purge des informations historiques
  • Chaîne ROS pour édition de la LG10
  • Chaîne RBI pour edition TXT du contenu d'un dossier en base
Il est important de pouvoir disposer de ces outils sur tous les environnements (surtout les NOY et ROL). Maintenez donc pour chaque structure de données un processus utilitaire (en standard vous trouverez des processus YIY**. Ouvrez les pour contrôle car il est parfois nécessaire d'y renseigner le code Structure de données).



Ci joint une commande script permettant de connaitre les informations manquantes à rattacher à vos processus, au vu des données présentes dans la base :

ls $SIGACS/prod/gnt/YIY??BCG.so |sed 's/^.*YIY\(..\)BCG.so/\1/' | while read SD
do
   echo "select distinct '${SD}'||CDINFO from ${SD}TD12 where NOMBRE>0 

   minus select CDSTDO||CDINFO from AP30 where TEANNU='0' and CDPROS='YIY${SD}';"
done | sqlplus -s HR/password


Dans l'autre sens pour connaitre les informations a priori inutiles et détachables de vos processus :
ls $SIGACS/prod/gnt/YIY??BCG.so |sed 's/^.*YIY\(..\)BCG.so/\1/' | while read SD
do
   echo "
select CDSTDO||CDINFO from AP30 where TEANNU='0' and CDPROS='YIY${SD}' 
   minus select distinct '${SD}'||CDINFO from ${SD}TD12 where NOMBRE>0;"
done | sqlplus -s HR/password

13 novembre 2012

FATAL - HRJS9002 An exception occurred while starting RMI : Port already in use


Comme dans le message concernant le AP0, les causes de cette contention peuvent être multiples.

Dans notre cas le problème de démarrage de HRQuery était dû au fait que le port de communication était déjà attribué par le système d'exploitation à une autre application. En effet, la plage des ports non réservés (et libres pour attributions dynamiques) est de 9000 à 65000 et les ports utilisés par l'environnement étaient dans cette plage.

Afin de ne pas reproduire ce problème, il faut relever la borne inférieure de la plage (dans notre exemple à 33500).
  • Sous LINUX
pour connaitre la plage d'attribution dynamique :
sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 9000     65500


Pour la modifier :

sysctl -w net.ipv4.ip_local_port_range="33500 65500"
net.ipv4.ip_local_port_range = 33500    65500

Merci Gabriel ...
  • Sous AIX
no -a | grep ephemeral
       tcp_ephemeral_high = 65535
        tcp_ephemeral_low =
32768
        udp_ephemeral_high = 65535
        udp_ephemeral_low = 32768

et 
no -o tcp_ephemeral_low=33500 -o tcp_ephemeral_high=65535 
(mais cette mise a jour non pérenne - inclure la commande dans le fichier /etc/rc.tcpip juste avant le démarrage des démons).

D'autres cas sont discutés sur ephemeral_ports.html ...

7 novembre 2012

Erreur lors du FTP de publication - pensez au mode "Passif"

Par défaut le protocole FTP fonctionne en mode "actif" : pour l'envoi des données c'est le serveur qui initialise la session TCP vers un port choisi dynamiquement par le poste client.

Cela pose problème en cas de translation d'adresse et/ou de firewall - ce qui impose en général d'utiliser un mode "passif" où cette fois c'est le client qui initialise et le serveur qui choisit le port.

Dans le doute - dans l'objet Site HRS - toujours choisir un fonctionnement en mode "passif" au niveau du connecteur FTP lié à la publication.





A noter : le client FTP présent sur Windows ne permet pas de passer en mode passif



(sauf avec la commande "literal pasv" ou "quote pasv" mais cette dernière impose de s'être connecté...)

A la différence du client FTP Unix


Ci joint un lien sur Wikipedia - lire le chapitre "Établissement des connexions" et sur ce blog.

6 novembre 2012

unable to load options.xml

Il arrive que ce message "unable to load options.xml" apparaisse à l'ouverture d'une page de HR Access Web (HRv5) ou au moment de l'accès à un formulaire du client riche (HRv7, HRv9). Les causes peuvent être multiples ... Toutefois, avant d'appeler la Hot Line à l'aide, pensez à :

  • Vider le cache de votre navigateur web (outils / options internet)

  • Ainsi que celui de la console java (panneau de configuration / java) 


Merci Gabriel ...

5 novembre 2012

RBF et EXECUTE DBMS_REFRESH.REFRESH(NAME=>'V3')

La chaine RBF termine ses DDL de création de tables par la commande :

EXECUTE DBMS_REFRESH.REFRESH(NAME=>'V3')

Cet ordre permet d'exécuter une procédure stockée Oracle qui rafraîchit les vues V31 et V3.
Ces vues servent à RBF pour connaître le nombre de colonnes des clefs primaires - la chaîne utilise ce critère pour déterminer si la clef primaire sur l'information "00" doit être recréée...

Dans le squelette de BGA :

587400*ALTER TABLE PRIMARY KEY                                          P006
587500*N35EH.    NOTE *LECTURE DU NOMBRE DE COLONNES      *.            P005
587600 F35EH.                                                           P005
587700*DE LA CLE PRIMAIRE                                               P006
587800*<DEBSUB>RDVUES                                                   P010
587900     EXEC SQL    SELECT           NBCOLK                          P100
588000                 INTO             :H-NBCOLK                       P150
588100                 FROM %1.V3                                       P200
588200                 WHERE  RDTABL =  :H-RDTABL AND                   P300
588300                        CDTABL =  :H-NMTABL            END-EXEC.  P310
588400*<FINSUB>                                                         P900

...
592000*N35FN.    NOTE *CAS DE L"INFORMATION FIXE          *.            P005
592100 F35FN.    IF    WP00-TEIN00 = "1"                                P005
592200           NEXT SENTENCE ELSE GO TO     F35FN-FN.                 P005
592300*PRINCIPALE :                                                     P006
592400*IL FAUT AVOIR UNE CLE PRIMAIRE                                   P007
592500*SUR NUDOSS POUR NE PAS GENERER                                   P008



Le script TUE.sql de prod/ddl contient les ordres de création "CREATE MATERIALIZED VIEW V31", "CREATE MATERIALIZED VIEW V3" et le " begin DBMS_REFRESH.MAKE".

1 novembre 2012

Mettre a jour les séquences d'attribution du NUDOSS

Depuis HRv7 les NUDOSS sont ne sont plus calculés sur la base de l'horodatage système, mais attribués par une séquence Oracle ou DB2 nommée SEQU{SD}.

Si vous devez purger ou livrer des dossiers par un outil du SGBD (imp, load), ces séquences ne seront pas mises à jour, ce qui peut être source d'erreurs de type "clef en double" lors des futures créations de dossiers :
  • sous Oracle : code erreur SQL 1
  • sous DB2 : code erreur SQL 803
Exemple d'erreur induite :
  • Avec NOZ : 
BQL-BBAD0015-ERREUR D'ACCES (TABLE RELATIONNELLE) : S1/EXECUTE/10/PK/000000000000001
BQL-BBAD0015-ERREUR D'ACCES (TABLE RELATIONNELLE) : S1/EXECUTE/10/PK/000000000000803
  • Avec NRB :  
Zone libre : BML40DD-000000001 / BML40DD-000000803
et message BME-BBAM0016-ERREUR GRAVE DURANT LA MISE A JOUR 

Pour mettre à niveau une séquence, dans un premier temps sélectionnez le plus grand NUDOSS (exemple pour ZY) :
SQL> select max(NUDOSS) from ZY00;
126

Sous DB2 mettez a jour la séquence par un ALTER :
DB2> alter sequence SEQUZY restart with 127

Sous Oracle vous devrez détruire et recréer la séquence :
SQL> drop sequence SEQUZY;
SQL> create sequence SEQUZY start with 127;


30 octobre 2012

Chargement du PRDB par HOST TABLES sous HRv9

Avec HRv9 le programme BEB utilise des HOST TABLES pour charger les tables du PRDB par paquet de 100 à 500 lignes (ce fonctionnement est rétro-portable sous HRv7 via un "kit" éditeur - c'est alors un programme BFB qui remplace le BEB HRv7).

Le principe des HOST TABLES est décrit dans la documentation ORACLE. Je vois en revanche peu de possibilité pour utiliser cette fonctionnalité avec HR Access - car la plupart des mises à jour sont réalisées via les opérateurs de mouvement.

  • Exemple de déclaration de tableau (extrait de BEB / BFB) :

 01 HTB-CLZX0F PIC S9(4)                    COMP.                
 01 HTB-CLZX0F-MAX VALUE 0100  PIC S9(4)    COMP.                
 01 HTB-ZX0F.                                                    
  02 HTB-ZX0F-NUDOSS OCCURS  0100 PIC S9(9) COMP.                
  02 HTB-ZX0F-SOCDOS OCCURS  0100 PIC X(003).                    
  02 HTB-ZX0F-PGPDOS OCCURS  0100 PIC S9(9) COMP.                
  02 HTB-ZX0F-NULIGN OCCURS  0100 PIC S9(08) PACKED-DECIMAL.     
  02 HTB-ZX0F-CODLAN OCCURS  0100 PIC X(002).                    
  02 HTB-ZX0F-TYPADD OCCURS  0100 PIC X(003).                    
  02 HTB-ZX0F-MODTAD OCCURS  0100 PIC X(003).                    
  02 HTB-ZX0F-REPTAD OCCURS  0100 PIC X(003).                    
  02 HTB-ZX0F-LIBTAD OCCURS  0100 PIC X(045).                    
  02 HTB-ZX0F-DATDEB OCCURS  0100 PIC X(10).                     
  02 HTB-ZX0F-DATFIN OCCURS  0100 PIC X(10).                     
  02 HTB-ZX0F-TEMADD OCCURS  0100 PIC X(001).                     


  • Exemple d'alimentation du tableau :

 F9YDGZX0F.  IF    A-CDSTDO = "ZX"                               
           AND   A-CDSEGI = "0F"                                 
           NEXT SENTENCE ELSE GO TO F9YDGZX0F-FN.                
    ADD   +1  TO  HTB-CLZX0F.                                    
        MOVE  H-NUDOSS TO      HTB-ZX0F-NUDOSS    (HTB-CLZX0F).  
        MOVE  H-SOCDOS TO      HTB-ZX0F-SOCDOS    (HTB-CLZX0F).  
        MOVE  H-PGPDOS TO      HTB-ZX0F-PGPDOS    (HTB-CLZX0F).  
        MOVE  H-NULIGN TO      HTB-ZX0F-NULIGN    (HTB-CLZX0F).  
        MOVE  A-ZX0F-CODLAN  TO                                  
              HTB-ZX0F-CODLAN(HTB-CLZX0F).                       
        MOVE  A-ZX0F-TYPADD  TO                                  
              HTB-ZX0F-TYPADD(HTB-CLZX0F).                        

...

  • Exemple d'insertion en base :

          IF  S-CDSTDO = "ZX" AND S-CDSEGI = "0F"                
         AND HTB-CLZX0F > ZERO                                   
 

         EXEC SQL FOR :HTB-CLZX0F                                
                   INSERT INTO          ZX0F                     
        (NUDOSS, SOCDOS, PGPDOS, NULIGN, CODLAN, TYPADD,         
          MODTAD, REPTAD, LIBTAD,                                
              DATDEB                                    ,        
              DATFIN                                    ,        
          TEMADD, MODPAY, CDPAYS, REPPAY, LIBPAY, CDPOST,        
          ZONADA, ZONADB, ZONADC, ZONADD, ZONADE, ZONADF,        
          ZONADG, ZONADH, ZONADI, ZONADJ, IDGPRG, SOCCLE,        
          MATRIC, NUDOSP, IDSITU, PERPAI, USAGEP, NUMTRT,        
          NUMBUL,                                                
              TIMEST                                    )        
          VALUES                                                 
          (                                                      
          :HTB-ZX0F-NUDOSS     ,                                 
          :HTB-ZX0F-SOCDOS     ,                                 
          :HTB-ZX0F-PGPDOS     ,                                 
          :HTB-ZX0F-NULIGN     ,                                 
          :HTB-ZX0F-CODLAN     ,                                 
...                                                                 
          :HTB-ZX0F-IDSITU     ,                                 
          :HTB-ZX0F-PERPAI     ,                                 
          :HTB-ZX0F-USAGEP     ,                                 
          :HTB-ZX0F-NUMTRT     ,                                 
          :HTB-ZX0F-NUMBUL     ,                                 
          :HTB-ZX0F-TIMEST                                       
          )                                                      
          END-EXEC                                                



Le nombre d’occurrences traité par paquet est paramétrable via le fichier $PARM/TYBPPRBZ. Ici par exemple on charge par défaut par paquet de 100 lignes - mais par 500 pour ZX5C et ZX8K :
PB17*HZX  0100
PB17*HZX5C0500
PB17*HZX8K0500


Dans RBZ et ROA on trouve la prise en compte de ce fichier :
#RADICAUX
echo "PB17RDFD01TO_DATE(" > $PB
echo "PB17RDFD02)" >> $PB
echo "PB17RDFD03TO_CHAR(" >> $PB
echo "PB17RDFD04,'YYYY-MM-DD'" >> $PB
echo "PB17RDFD05 " >> $PB
echo "PB17RDFD06 " >> $PB
echo "PB17RDFD07 " >> $PB
echo "PB17RDFD08 " >> $PB
if [ -s $PARM/TYBPPRBZ   ] ; then
cat $PARM/TYBPPRBZ >> $PB
fi


Bizarrement ce fichier TYBPPRBZ est livré avec le kit HRv7 mais pas dans la HRv9 standard ...

25 octobre 2012

cHTMeLe ... ou comment vous initier avec vos enfants au HTML5 !

Vous me pardonnerez ce "Hors sujet" : Si vous souhaitez vous mettre (vous ou vos enfants) au HTML5, il FAUT que vous jetiez un œil sur ce jeu de plateau (2 à 5 joueurs, à partir de 8 ans), téléchargeable gratuitement ... Merci Nicolas pour ce lien ! Merci aux créateurs de cHTMeLe pour leur joyeuse inventivité !




15 octobre 2012

Erreurs d'un script Linux à cause d'un format [dos]

Sous Linux, à l'exécution, un de mes scripts a un comportement bizarre.
Il commence par deux lignes blanches, et si je tente une exécution avec trace j'obtiens ceci :

ksh -x ScriptBizarre.sh
+
: not found
+
: not found

...

Si je l'édite sous "vi" ("vim" sous Linux) ... rien de spécial.
Je finis par remarquer que "vim" m'indique à l'ouverture du fichier :

ScriptBizarre.sh 29L, 547C [dos]

Effectivement, j'avais édité ce script sur mon poste puis je l'avais transféré par FTP sur le serveur. Chaque ligne se termine donc par un "^M" (caractère de fin de ligne Windows) que "vim" masque en faisant une conversion automatique à l'affichage.Si je force l'affichage des caractères spéciaux avec la commande "cat" j'obtiens en effet :

cat -A ScriptBizarre.sh
^M$
^M$

...

Pour convertir le fichier du format DOS au format UNIX :
  • l'éditer et indiquez que vous souhaitez un format Unix en tapant :set fileformat=unix puis sauvegardez,
  • ou utilisez la commande dos2unix ScriptBizarre.sh

A lire ... http://vim.wikia.com/wiki/File_format

12 octobre 2012

Supprimer l'alimentation des journaux **LG10

Sur un de mes environnements HRv7 où le domaine "Formation" est en production depuis moins de un an, l'administrateur Oracle m'alerte :

  • la structure ZE occupe 5,56 Go dont 5,50 Go pour la table ZELG10,
  • la structure ZD occupe 8,3 Go dont 7,9 Go pour la table ZDLG10,
  • la structure ZY occupe 13,5 Go dont 11 Go pour la table ZYLG10.


Ceci est dû aux témoins de journalisation positionnés (pour la plupart en standard) dans le produit. Si certaines traces sont utiles (suivi, interfaces), pensez à automatiser le nettoyage des données obsolètes (WHERE TILG10 > SYSDATE - n). Dans le cas contraire, je vous préconise de désactiver rapidement cette fonction.

Pour supprimer l'alimentation de ces journaux, vous pouvez utiliser HRD Studio et modifier les objets Processus et Informations, puis sous HRWeb décocher les logs des dossiers de demandes ZO. Pour aller plus vite, par SQL vous pouvez procéder comme suit :

  • supprimer les témoins de journalisation LG10 pour les Processus. La mise a jour est dynamique et ne nécessite pas de regénération,
update AP20 set TELG10='0' where TELG10<>'0';

  • Supprimer les témoins de journalisation des Informations. Ce dernier témoin nécessite une regénération des processus de qualification "Gestion de Dossiers". Vous pouvez faire cela au fil de l'eau, ou en masse, puis les livrer ...
update DI40 set TIMODI=SYSDATE, TIMODG=SYSDATE, TYACCR='0' where TYACCR<> '0';

  • Supprimer le témoin de journalisation des demandes ZO NRB de mise a jour batch,
update ZO25 set TELG10 = '0' where TELG10 <> '0' and NUDOSS in (select NUDOSS from ZO00 where CDPHAS='NRB' and TISOUM='0001-01-01');

10 octobre 2012

Objets de conception de l'arborescence HRaSpace v9

Dans l'objectif d'éclairer sur les liens entre objets de conception de l'arborescence, et sur le modèle de ce qui avait été fait par un collègue en v7 ... Ci joint un graphique permettant de mettre en correspondance un libellé aperçu en naviguant avec celui d'un libellé d'objet sous HR Studio.

Je suis moyennement satisfait de mon analyse, car le lien entre le code Action et le Noeud (3) n'est pas direct (je l'obtiens par références croisées) et n'est pas bijectif (ici les références croisées indiquent deux noeuds - il semble qu'il faille prendre le "premier" noeud ?) ...

En second lieu, il faut noter que le jeu d'onglets sur les Pages (4) n'apparaît que s'il y a plus d'une page à afficher - ceci en considérant les filtrages effectués par la confidentialité et par la localisation ...

A noter aussi : il est possible (par clic droit sur l'objet "Plan de Site", Fonctions avancées) d'obtenir un export XLS où le lien entre l'Action, le Noeud et la Page seront explicites :





9 octobre 2012

Premier aperçu de Intuitive Query sous HRv9

IntuitiveQuery est un outil accessible depuis HRaSpace qui permet aux responsables et aux experts RH de créer, exécuter et sauvegarder ses rapports (dénommés rapports "Ad Hoc"). L'utilisateur sélectionne ses champs à partir d'objets appelés "perspectives d'assemblage", crées au préalable dans Design Center par les développeurs.

8 octobre 2012

Un bloc note dans l'interface HRaSpace 9

Une bricole amusante : l'utilisateur peut gérer des notes personnelles dans l'interface de HRaSpace v9 :

Les notes sont stockées en table UP10, UP30 avec TYPERS='NOTES' :

SQL> select * from up30 where IDPERS in (select IDPERS from UP10 where TYPERS='NOTES' and USERID='DIGIX');

    IDPERS     NULIGN    ZONVAR
---------- ---------- ---------

-1.125E+09          1  00030017Coder-Version:1.00036Content-Type:text/xml; charset=UTF-80032Content-Transfer-Encoding:base640000005CPD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxub3Rlcz48bm90ZT5DZWNpIGVzdCB1bmUgbm90ZTwvbm90ZT48L25vdGVzPg==

Soit, après décodage :

echo "0000005CPD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxub3Rlcz48bm90ZT5DZWNpIGVzdCB1bmUgbm90ZTwvbm90ZT48L25vdGVzPg==" | perl -MMIME::Base64 -ne 'print decode_base64($_)'
ÓM4ÓNB<?xml version="1.0" ?><notes><note>Ceci est une note</note></notes>

5 octobre 2012

Liste et code des objets depuis HRv2 jusqu'à HRv9

Ci dessous une liste des codes et noms des différents type d'objets de conception HR Access.
  • Ceux apparus avec HRv3 sont en rouge
  • avec HRv3e en jaune
  • avec HRv5 en vert.
  • avec HRv7 en bleu 
  • et enfin avec HRv9 en violet.

AM : Arbre de publication
AN : Arbre fonctionnel
AP : Groupe de processus
AR : HRa Scope
AS : Plan de site
AT : Service
BP : Processus Guidé

CA : Code action fonctionnelle HRv5 / contextuelle HRv7
CC : Condition cataloguée
CO : Code confidentialité
CT : Documentation commune
CX : Action fonctionnelle HRv7
DO : Document d'exploration 
EC : Ecran C/S (obsolète)
ET : Etats
EX : Exploration
E0 : Objets générique E0
E1 : Elément graphique
E2 : Document de fusion

E3 : Ressource Web
E4 : Objets générique E4
E5 : Objets
générique E5
E6 : Objets
générique E6
E7 : Objets
générique E7
E8 : Objets
générique E8
E9 : Objets
générique E9
FM : Fichiers Micro
FO : Formulaire
FP : Famille procédure C/S (obsolète)

FS : Feuille de style C/S (obsolète)
GB : Groupe de processus guidés
GD : Groupe de perspectives
GE : Groupe d'écrans C/S (obsolète)
GF : Groupe de formulaires
GK : Groupe de collections
GM : Groupe de descriptions données métier
GR : Groupe de requête DXE/TP (obsolète)
GT : Groupe de traitements
GX : Groupe d'exploration
HB : Activités
HD : Perspective
IN : Information
IO : Information ODS
IW : Information WH (déjà présent dans les dernières v3e)
KL : Collection
LI : Lien
LY : Action fonctionnelle localisée
MI : Description de données métier
NA : Assistant de Navigation
NN : Noeud
NS : Etape de l'Assistant
OD : Outbound process
OG : Groupe d'Outbound process

PA : Profil application (obsolète)
PE : Profil navigation (obsolète)
PI : Profil de information (obsolète)
PO : Profil action (obsolète)
PP : Profil population (obsolète)
PR : Profil requête (obsolète)
PC : Procédure C/S (obsolète)
PH : Plate-forme physique
PJ : Projet
PL : Plate-forme logique
PM : Paramètre
PS : Processus
PW : Serveur Web (obsolète)
QD : Query DataModel (inutilisé)
QG : Groupe de requêtes HRQuery
QL : Mise en page spécialisée HRQuery
QP : Population HRQuery
QR : Rapport HRQuery

RO : Rôle (modèle, structure)
RQ : Requête DXE/TP (obsolète)
SD : Structure de données
SG : Script plug-in
SI : Site HRv3e / Topologie système
SO : Structure de données ODS
SP : Sous-projet
ST : Type de dossier
SW : Structure de données WH (déjà présent dans les dernières v3e)
SY : Macro systèmes
TR : Traitement
UC : Utilisateur
WF : Page Web
WG : Groupe de pages Web

WK : Code workflow
WS : Charte graphique Web
ZC : Modèle de mail

A compter des clients HRStudio 7.30.60 (et le kit Tâche pour les HRv7)
AE : Objets "Tâche"

1 octobre 2012

Calculer le nombre de jours (hors WE) dans l'année

Ci joint une fonction DB2 trouvée sur le forum de http://www.tek-tips.com. Elle vous permet de calculer le nombre de jours ouvrables (lundi, mardi ... vendredi - sans considération de jours fériés) entre deux dates.

exemple : script DDL PSBBGJ_BUSINESSDAYS.sql

CREATE FUNCTION business_days (low_date DATE, high_date DATE)
RETURNS INTEGER
BEGIN ATOMIC
   DECLARE bus_days INTEGER DEFAULT 0;
   DECLARE cur_date DATE;
   SET cur_date = low_date;
   WHILE cur_date < high_date DO
      IF DAYOFWEEK(cur_date) IN (2,3,4,5,6) THEN
         SET bus_days = bus_days + 1;
      END IF;
      SET cur_date = cur_date + 1 DAY;
   END WHILE;
   RETURN bus_days;
END!

COMMIT!

création de la fonction :
cat PSBBGJ_BUSINESSDAYS.sql | db2 -vtd\!

utilisation de la fonction :
select HR.business_days(DATE ('2012-01-01'),DATE ('2013-01-01')) from sysibm.sysdummy1
-----------
        261