3.4 · Fonctions texte/date & logique conditionnelle (If/Select)

Niveau 3 · Avancé : formules & mise en forme conditionnelle

3.4Fonctions texte/date & logique conditionnelle (If/Select)

Objectif : manipuler texte et dates en formule et écrire de la logique conditionnelle (If enchaînés, Select…Case, IsNull).
Temps estimé : 11 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Texte + dates = 80 % des besoins : extraire et nettoyer avec UpperCase, Left, Trim, ToText ; extraire périodes et délais avec Year, DateDiff, DateAdd, Today.
  • If pour les seuils, Select pour les codes : If…Then…Else enchaîné pour les tranches, Select…Case pour traduire UNE valeur en libellés — plus lisible.
  • IsNull d'abord : un champ nul non testé fait échouer la formule ou renvoie vide — tester IsNull avant d'utiliser tout champ potentiellement vide.

Mini-cas filé — Farès classe ses clients et surveille les retards

Farès, contrôleur de gestion à Alger, classe ses clients à la main (VIP, Standard, À suivre) et calcule les retards de paiement à la calculatrice. Il écrit une formule à tranches — If {Clients.CA} >= 500000 Then "VIP" Else If {Clients.CA} >= 100000 Then "Standard" Else "À suivre" — et un retard en jours avec DateDiff("d", {Factures.Echeance}, CurrentDate), protégé par un test IsNull sur la date de paiement. Le rapport catégorise et signale tout seul : la segmentation se fait à chaque rafraîchissement, sans tableur.

Ce même cas revient dans le cours, le schéma, le script et le défi 48h.

1. Fonctions texte et date : le quotidien des formules

Crystal Reports offre des CENTAINES de fonctions ; au quotidien, deux familles suffisent. Fonctions TEXTE : UpperCase / LowerCase (casse), Left / Right / Mid (extraire une partie), Len (longueur), Trim (ôter les espaces), Replace (remplacer), ToText (convertir nombre/date en texte). Elles nettoient, extraient et composent : initiale d'un nom (Left({Client.Nom}, 1)), code produit, libellé formaté. Fonctions DATE : Year / Month / Day (extraire — essentiel pour regrouper par période), DateDiff (écart entre deux dates : un délai en jours), DateAdd (ajouter une durée : une échéance), Today / CurrentDate (date du jour). Retard = DateDiff("d", {Factures.Echeance}, CurrentDate).

Ces fonctions couvrent la manipulation des échéances, anciennetés et regroupements mensuels — le pain quotidien du reporting de gestion. Réflexe : convertir explicitement (ToText pour afficher, CDate pour convertir un texte en date) plutôt que de mélanger les types.

2. Logique conditionnelle : If…Then…Else, Select…Case, IsNull

Le cœur des formules intelligentes. If…Then…Else renvoie une valeur selon une condition : If {Montant} > 1000 Then "Gros" Else "Standard" — enchaînable pour plusieurs tranches (tester du plus restrictif au plus général, la première condition vraie l'emporte). Select…Case teste UNE valeur contre plusieurs cas précis, plus lisiblement : Select {Clients.Statut} Case "A" : "Actif" Case "S" : "Suspendu" Default : "Inconnu". Règle de choix : SEUILS et plages → If enchaînés ; UNE valeur comparée à des cas fixes (codes, catégories) → Select…Case. Les opérateurs And, Or, Not combinent les conditions.

Le réflexe qui évite les pannes : tester IsNull avant d'utiliser un champ potentiellement nul — une date nulle dans un DateDiff, un montant nul dans un calcul, et la formule échoue ou renvoie vide. Ces formules alimentent ensuite l'affichage, les regroupements (3-5), la mise en forme conditionnelle (3-2) et les filtres : c'est le vocabulaire qui rend les rapports sur-mesure.

Erreur d'interprétation fréquente : « Select…Case et If enchaînés, c'est pareil — et les valeurs nulles, on verra si ça plante ». Non, deux fois. Select…Case n'est lisible que pour UNE valeur testée en égalités ; pour des seuils et des combinaisons, les If restent l'outil — intervertir les deux rend les formules illisibles. Et un nul non testé ne « passe » jamais : il fait échouer en silence. IsNull d'abord, toujours.
Rendre une formule intelligente Manipuler, décider, protéger ManipulerTexte (Left, Trim) et dates (Year, DateDiff)+DéciderIf pour seuils, Select pour codes+ProtégerIsNull avant tout champ douteux Ordre des If : du plus restrictif au plus général.
Manipuler, décider, protéger
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Manipuler : Farès extrait l'année avec Year et le retard avec DateDiff au lieu de calculer à la main. 2) Décider : If enchaînés pour les tranches de CA, Select…Case pour traduire les codes statut. 3) Protéger : IsNull sur la date de paiement avant tout calcul — aucun nul ne traverse la formule. Leçon : manipuler, décider, protéger — dans cet ordre.

🔎 Exemple concret — Segmentation clients et retard de paiement

Farès écrit ses deux formules de pilotage en syntaxe Crystal.

Segment : If {Clients.CA} >= 500000 Then "VIP"
  Else If {Clients.CA} >= 100000 Then "Standard" Else "À suivre"
Retard : If IsNull({Factures.DatePaiement}) Then
  DateDiff("d", {Factures.Echeance}, CurrentDate) Else 0

Lecture : seuils → If enchaînés ; nul possible → test IsNull en premier.

Leçon : ces catégories serviront ensuite à REGROUPER (3-5).

Vocabulaire de la section

Fonctions texte (chaînes)
UpperCase/LowerCase, Left/Right/Mid (extraire), Len, Trim (nettoyer), Replace, ToText — pour nettoyer, extraire, composer du texte.

Exemple simple : L'initiale Left({Client.Nom}, 1) de Farès.

Ce que ce n'est pas : des codes ressaisis à la main dans un tableur.

Réflexe : extraire et nettoyer en formule, jamais à la main.

Fonctions date
Year/Month/Day (extraire une période), DateDiff (délai entre deux dates), DateAdd (ajouter une durée), Today/CurrentDate.

Exemple simple : Le retard DateDiff("d", échéance, CurrentDate).

Ce que ce n'est pas : des délais calculés à la calculatrice.

Réflexe : Year pour regrouper, DateDiff pour les délais.

If…Then…Else
Renvoie une valeur selon une condition ; enchaînable pour plusieurs tranches (première condition vraie = gagnante).

Exemple simple : La segmentation VIP / Standard / À suivre.

Ce que ce n'est pas : un Select…Case pour des seuils de montants.

Réflexe : seuils et plages → If enchaînés.

Select…Case
Aiguillage : teste UNE valeur contre plusieurs cas précis + un défaut ; plus lisible que des If pour des égalités.

Exemple simple : Le code statut traduit en libellé (Actif, Suspendu…).

Ce que ce n'est pas : des If enchaînés pour traduire dix codes fixes.

Réflexe : une valeur, des cas fixes → Select…Case.

Gestion des nuls (IsNull)
Tester IsNull avant d'utiliser un champ potentiellement nul : un nul non géré fait échouer la formule ou renvoie vide.

Exemple simple : Le test sur {Factures.DatePaiement} avant le DateDiff.

Ce que ce n'est pas : un DateDiff direct sur une date parfois vide.

Réflexe : IsNull en première ligne de toute formule à risque.

En pratique — Utiliser fonctions et logique conditionnelle

  1. Testez des fonctions TEXTE : UpperCase, Left (extraire), Trim (nettoyer), et composez un libellé avec ToText.
  2. Testez des fonctions DATE : Year({Date}) pour extraire l'année, DateDiff pour un délai en jours.
  3. Écrivez une formule If…Then…Else (catégoriser un montant) ; enchaînez pour plusieurs cas ou utilisez Select…Case pour des codes.
  4. Gérez les nuls avec IsNull avant d'utiliser un champ ; vérifiez la syntaxe et testez en aperçu.
Vous manipulez texte et dates et écrivez de la logique conditionnelle : vous construisez quasiment n'importe quelle valeur calculée.

Script prêt à dire — expliquer la segmentation automatique (30 s)

« La segmentation n'est plus manuelle : une formule classe chaque client — VIP, Standard ou À suivre — selon son chiffre d'affaires, et le retard se calcule tout seul à partir de l'échéance, en ignorant les factures déjà payées. À chaque rafraîchissement, le classement est à jour. »

À dire en comité de direction ; montrer les seuils de la formule.

Modèle copier-coller — If, Select, dates (syntaxe Crystal)

// Tranches (If enchaînés)
If {Clients.CA} >= 500000 Then "VIP"
Else If {Clients.CA} >= 100000 Then "Standard"
Else "À suivre"
// Codes (Select…Case)
Select {Clients.Statut}
Case "A" : "Actif"
Case "S" : "Suspendu"
Default : "Inconnu"
// Retard protégé des nuls
If IsNull({Factures.DatePaiement}) Then
    DateDiff("d", {Factures.Echeance}, CurrentDate)
Else 0

Indépendant

Deux formules (une à tranches, une de dates) et votre rapport raisonne tout seul.

PME à Alger

Farès segmente ses clients et suit les retards sans calculatrice.

Équipe projet

Documenter les seuils (VIP, alertes) à côté de chaque formule pour les retrouver.

Débutant

Cette semaine : un If à deux issues + un DateDiff protégé par IsNull.

✓ Bonnes pratiques

  • Testez les conditions du plus restrictif au plus général (la première vraie l'emporte).
  • Préférez Select…Case dès qu'une seule valeur est comparée à des cas fixes.
  • Placez le test IsNull en première ligne de toute formule touchant un champ douteux.

✗ Pièges fréquents

  • Enchaîner les If dans le mauvais ordre : une condition générale avale les cas particuliers.
  • Utiliser Select…Case pour des seuils (ou des If pour dix codes fixes) : illisible.
  • Oublier IsNull : la formule échoue en silence sur les enregistrements à champ vide.

Points clés à retenir

  • TEXTE : UpperCase/LowerCase, Left/Right/Mid, Len, Trim, Replace, ToText — extraire, nettoyer, composer.
  • DATES : Year/Month (périodes), DateDiff (délais), DateAdd (échéances), Today — délais, ancienneté, regroupements.
  • CONDITIONS : IF…THEN…ELSE (seuils, enchaînable) et SELECT…CASE (une valeur, cas fixes) + And/Or/Not.
  • Vigilance TYPES et NULS : convertir explicitement, tester ISNULL avant usage.

Défi 48h — appliquez demain

Écrivez 1 formule à tranches sur vos vraies données + 1 calcul de délai protégé par IsNull, testés en aperçu.

Checklist sortie de section
  • Je manipule texte et dates en formule sans outil externe.
  • Je choisis If ou Select selon le cas (seuils vs codes).
  • Aucun champ douteux n'entre dans mes formules sans test IsNull.
Auto-évaluation 1-5 : mes catégories sont-elles calculées ou ressaisies ?combien de mes formules protègent leurs champs des nuls ?

Questions fréquentes

If…Then…Else ou Select…Case : comment choisir pour catégoriser ?

Les deux renvoient une valeur différente selon les données, mais pas pour les mêmes cas. IF…THEN…ELSE : deux issues (« If {Montant} > 1000 Then « Gros » Else « Standard » ») ou TRANCHES enchaînées (« >= 5000 : Très gros », « >= 1000 : Gros », « >= 100 : Moyen », sinon « Petit ») — ordre décroissant, première condition vraie gagnante. Idéal pour SEUILS, plages et combinaisons. SELECT…CASE : UNE valeur contre des cas PRÉCIS (« Select {Statut} Case « A » : « Actif » Case « S » : « Suspendu » Default : « Inconnu » ») — idéal pour traduire codes et catégories fixes, plus lisible que des If. Ces catégories calculées servent ensuite à REGROUPER (3-5) : grouper par tranche, par statut traduit, par période.

Comment manipuler les dates et gérer les valeurs nulles ?

DATES : extraire avec Year/Month/Day ({Date}) — pour REGROUPER par période (état annuel, mensuel) ; délai avec DateDiff (jours entre commande et livraison, retard vs échéance, ancienneté) ; ajouter avec DateAdd (échéance = date + 30 jours) ; aujourd'hui avec Today/CurrentDate (retard « à aujourd'hui ») ; comparer directement (Date > #2026-01-01#) ; convertir avec ToText/CDate. NULS : un champ peut être NUL (vide — différent de zéro) ; une expression avec un nul peut échouer ou renvoyer vide. Réflexe : If IsNull({champ}) Then … en premier — valeur de remplacement, ou calcul alternatif. À tester systématiquement sur dates de paiement, montants optionnels et champs non obligatoires.

Vérifiez votre compréhension

Pour traduire UN code statut en libellés (A → Actif, S → Suspendu…), le plus lisible est…

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 3Questions inédites et durcies pour valider vos acquis