Aller au contenu

%LEN

Longueur d'une chaîne, d'un nombre ou d'une date

Renvoie la longueur d'une expression ; sur une zone de type varchar, elle peut aussi se placer à gauche du signe égal pour changer la longueur.

Syntaxe

%LEN(expression)
%LEN(zone-varchar : *MAX)
%LEN(zone-varchar) = longueur
expression
Une zone, un littéral ou une expression : caractère, graphique, UCS-2, numérique, date, heure ou horodatage.
*MAX
Pour une zone de longueur variable seulement : renvoie la longueur maximale déclarée et non la longueur courante.
Résultat
Un entier. Pour une zone fixe, la longueur déclarée, blancs de fin compris. Pour un varchar, la longueur courante. Pour un nombre, son nombre de chiffres. Pour une date, sa longueur en format texte (10 pour une date *ISO).

À quoi ça sert

%LEN sert à borner une boucle sur les caractères d'un texte, à vérifier qu'une saisie tient dans une zone, ou à couper proprement avec %SUBST, %LEFT et %RIGHT.

Elle répond à une question simple, mais la réponse dépend du type de la zone : ce qu'on obtient sur un char n'est pas ce qu'on obtient sur un varchar. C'est là que se cachent les erreurs.

Exemple 1 : Zone fixe, varchar, nombre et date

**free
// %LEN : longueur d'une zone, d'une expression, d'un nombre.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s nomFixe char(30)    inz('Dupont SA');
dcl-s nomVar  varchar(30) inz('Dupont SA');
dcl-s ville   varchar(20) inz('Montpellier');
dcl-s montant packed(9:2) inz(1250.50);
dcl-s jour    date        inz(d'2026-09-30');

snd-msg 'Zone fixe      : ' + %char(%len(nomFixe));
snd-msg 'Zone fixe trim : ' + %char(%len(%trim(nomFixe)));
snd-msg 'Zone varchar   : ' + %char(%len(nomVar));
snd-msg 'Varchar maxi   : ' + %char(%len(nomVar : *max));
snd-msg 'Expression     : ' + %char(%len(ville + ', France'));
snd-msg 'Litteral       : ' + %char(%len('abc  '));
snd-msg 'Packed(9:2)    : ' + %char(%len(montant));
snd-msg 'Son texte      : ' + %char(%len(%char(montant)));
snd-msg 'Date           : ' + %char(%len(jour));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Zone fixe      : 30
Zone fixe trim : 9
Zone varchar   : 9
Varchar maxi   : 30
Expression     : 19
Litteral       : 5
Packed(9:2)    : 9
Son texte      : 7
Date           : 10

La zone nomFixe contient Dupont SA mais mesure 30 : c'est la longueur déclarée, les blancs de fin comptent. Pour connaître la longueur utile, on passe par %LEN(%TRIM(...)), ou on déclare la zone en varchar, qui donne directement 9.

*MAX ramène la taille maximale du varchar (30), pas sa longueur courante. Un packed(9:2) vaut 9 : c'est le nombre de chiffres de la zone, pas la largeur de son texte ; %LEN(%CHAR(montant)) donne 7 pour 1250.50.

Exemple 2 : Borne de boucle et longueur modifiée

**free
// %LEN : borne de boucle et modification de la longueur d'un varchar.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s refFixe char(20)    inz('CLI0042');
dcl-s refVar  varchar(20) inz('CLI0042');
dcl-s code    varchar(10) inz('CLI0042');
dcl-s i       int(10);
dcl-s chiffres int(10);

// Comptage des chiffres : la boucle sur la zone fixe parcourt 20 positions.
for i = 1 to %len(refFixe);
  if %subst(refFixe : i : 1) >= '0' and %subst(refFixe : i : 1) <= '9';
    chiffres += 1;
  endif;
endfor;
snd-msg 'Zone fixe : ' + %char(%len(refFixe)) + ' tours, ' + %char(chiffres) + ' chiffres';

chiffres = 0;
for i = 1 to %len(refVar);
  if %subst(refVar : i : 1) >= '0' and %subst(refVar : i : 1) <= '9';
    chiffres += 1;
  endif;
endfor;
snd-msg 'Varchar   : ' + %char(%len(refVar)) + ' tours, ' + %char(chiffres) + ' chiffres';

// %LEN a gauche de l'egal : on fixe la longueur du varchar.
%len(code) = 3;
snd-msg 'Longueur 3 : [' + code + ']';
%len(code) = 6;
snd-msg 'Longueur 6 : [' + code + ']';
%len(code) = 0;
snd-msg 'Longueur 0 : [' + code + ']';

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Zone fixe : 20 tours, 4 chiffres
Varchar   : 7 tours, 4 chiffres
Longueur 3 : [CLI]
Longueur 6 : [CLI   ]
Longueur 0 : []

On compte les chiffres de CLI0042 avec deux zones : sur la zone fixe de 20, la boucle fait 20 tours, sur le varchar elle en fait 7. Le résultat est le même, mais le varchar évite de parcourir des blancs.

À gauche du signe égal, %LEN fixe la longueur d'un varchar. Réduire à 3 garde CLI. Remonter à 6 ne rend pas les caractères perdus : les positions ajoutées sont remplies de blancs. Une longueur de 0 donne une chaîne vide.

Le piège

Sur une zone fixe, %LEN ne donne pas la longueur du texte. Un char(30) qui contient Dupont SA renvoie 30, et une boucle bornée par cette valeur parcourt les 21 blancs de fin. Il faut soit %LEN(%TRIMR(zone)), soit une zone varchar.

Autre confusion fréquente : pour un nombre, %LEN compte les chiffres déclarés (9 pour packed(9:2)), jamais les caractères du texte affiché.