29 mai 2019

Select "over partition" pour ramener un libellé Francais, sinon ...


Ce qu'un collègue m'a trouvé pour ramener un libellé dans la DI31 quelles que soient les traductions disponibles ...

:-P

L'ordre suivant ne ramènera rien si le libellé n'existe qu'en anglais
select LILONG as LIBCOMP from HR.DI31 where CDSTDO||VACDST='&CODECOMP' and CDLANG='F'

L'ordre suivant ramènera deux lignes si le libellé est traduit dans les deux langues
select LILONG as LIBCOMP from HR.DI31 where CDSTDO||VACDST='&CODECOMP'  and CDLANG in ('F','U')

Avec cet exemple on prend dans l'ordre le libellé Français, sinon Anglais, Italien ...
Quelles que soient les traductions de l'objet un unique libellé sera affiché suivant l'ordre de préférence indiqué :
 
select LILONG from 
   -- on n'affiche que le libellé mais 
   -- le select dans DI31 est temporairement précédé d'un numéro de ligne
  (select
      row_number() over 
         -- ce numéro est réinitialise a rupture CDSTDO, VACDST
         (PARTITION by CDSTDO, VACDST 
         -- les lignes de la partition sont ordonnées suivant une transco numérique du code langue
         order by decode(CDLANG, 'F', 9, 'U', 8, 'I', 7, 'E', 6, 'B',5, 'D', 4, 'N', 3, 0) desc, CDLANG asc) as numero, 
      DI31.* 
  from HR.DI31)  
where
   -- on filtre ensuite sur le code souhaité et sur la premiere langue 
   CDSTDO||VACDST='&CODECOMP'  and numero = 1;
 
ex :

Enter value for codecomp: ZDUAA
LILONG
------------------------------------
Sociétés légales


Enter value for codecomp: ZDKUU
LILONG
------------------------------------
EIC Indicator

 
Enter value for codecomp: ZYPRF
LILONG
------------------------------------
Profesionales