%LOWER
Passer en minuscules
Renvoie le texte converti en minuscules, sans modifier la zone d'origine.
Syntaxe
%LOWER(chaîne)
chaîne- Le texte à convertir : zone caractère, graphique ou UCS-2, littéral ou expression.
- Résultat
- Une valeur du même type et de la même longueur que la chaîne, avec les lettres en minuscules. La zone d'origine n'est pas modifiée.
À quoi ça sert
Deux usages courants : normaliser une valeur avant de la stocker ou de la comparer (une adresse mail, un identifiant) et mettre en forme un nom propre. Pour ce dernier, on associe %LOWER à %UPPER afin de garder la première lettre en majuscule.
Exemple 1 : Normaliser une adresse mail
**free
// %LOWER : passer un texte en minuscules, par exemple pour normaliser une adresse mail.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s saisie varchar(40) inz('Jean.Dupont@Armonie.GROUP');
dcl-s mail varchar(40);
dcl-s modele varchar(40) inz('jean.dupont@armonie.group');
snd-msg 'Saisie : [' + saisie + ']';
mail = %lower(saisie);
snd-msg 'Normalisee : [' + mail + ']';
if saisie = modele;
snd-msg 'Direct : identique';
else;
snd-msg 'Direct : different';
endif;
if %lower(saisie) = modele;
snd-msg 'Avec %LOWER : identique';
endif;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Saisie : [Jean.Dupont@Armonie.GROUP]
Normalisee : [jean.dupont@armonie.group]
Direct : different
Avec %LOWER : identique
Une adresse saisie Jean.Dupont@Armonie.GROUP n'est pas égale à jean.dupont@armonie.group : RPG distingue les majuscules des minuscules. Après %LOWER, les deux valeurs sont identiques. La zone saisie garde sa forme d'origine, le résultat est rangé dans une autre zone.
Exemple 2 : Première lettre en majuscule
**free
// %LOWER avec %UPPER : mettre la premiere lettre en majuscule (nom propre).
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s nom varchar(30) inz('DUPONT');
dcl-s societe varchar(30) inz('MARTIN ET FILS');
dcl-s sigle varchar(30) inz('LEROY SARL');
dcl-s prenom varchar(30) inz('JEAN-PIERRE');
dcl-s forme char(30) inz('BERNARD');
snd-msg 'Nom : [' + %upper(%left(nom : 1)) + %lower(%subst(nom : 2)) + ']';
snd-msg 'Societe : [' + %upper(%left(societe : 1)) + %lower(%subst(societe : 2)) + ']';
snd-msg 'Sigle : [' + %upper(%left(sigle : 1)) + %lower(%subst(sigle : 2)) + ']';
snd-msg 'Prenom : [' + %upper(%left(prenom : 1)) + %lower(%subst(prenom : 2)) + ']';
// Sur une zone fixe, %SUBST(x : 2) ramene aussi les blancs de fin.
snd-msg 'Zone fixe: [' + %upper(%left(forme : 1)) + %lower(%subst(forme : 2)) + ']';
snd-msg 'Avec trim: [' + %upper(%left(forme : 1)) + %lower(%subst(%trimr(forme) : 2)) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Nom : [Dupont]
Societe : [Martin et fils]
Sigle : [Leroy sarl]
Prenom : [Jean-pierre]
Zone fixe: [Bernard ]
Avec trim: [Bernard]
On prend la première lettre en majuscule avec %UPPER(%LEFT(nom : 1)) et le reste en minuscules avec %LOWER(%SUBST(nom : 2)). DUPONT devient Dupont.
Sur la zone fixe de 30, le reste de la chaîne ramène aussi les blancs de fin (la sortie montre Bernard suivi de 23 blancs) ; %TRIMR les retire.
Le piège
Le procédé « première lettre » ne connaît pas la grammaire. JEAN-PIERRE devient Jean-pierre : seule la première lettre du texte passe en majuscule, pas celle qui suit le tiret. MARTIN ET FILS devient Martin et fils, ce qui convient, mais LEROY SARL devient Leroy sarl : le sigle perd ses majuscules. Pour des règles plus fines, il faut découper le texte avec %SPLIT et traiter chaque mot.
Comme %UPPER, la fonction ne modifie pas la zone qu'on lui passe : il faut affecter le résultat. Sur une zone fixe, la longueur du résultat est celle de la zone.