3.4Fonctions texte/date & logique conditionnelle (If/Select)
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.
🔎 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
- Testez des fonctions TEXTE : UpperCase, Left (extraire), Trim (nettoyer), et composez un libellé avec ToText.
- Testez des fonctions DATE : Year({Date}) pour extraire l'année, DateDiff pour un délai en jours.
- Écrivez une formule If…Then…Else (catégoriser un montant) ; enchaînez pour plusieurs cas ou utilisez Select…Case pour des codes.
- Gérez les nuls avec IsNull avant d'utiliser un champ ; vérifiez la syntaxe et testez en aperçu.
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.
- 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.
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.
Pour traduire UN code statut en libellés (A → Actif, S → Suspendu…), le plus lisible est…