{"id":9832,"date":"2026-10-14T18:02:34","date_gmt":"2026-10-14T18:02:34","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-utiliser-if-then-do-sas-exemples\/"},"modified":"2026-10-14T18:02:34","modified_gmt":"2026-10-14T18:02:34","slug":"comment-utiliser-if-then-do-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-utiliser-if-then-do-sas-exemples","title":{"rendered":"Comment utiliser IF-THEN-DO dans SAS (avec exemples)"},"content":{"rendered":"<p>Dans l&rsquo;\u00e9cosyst\u00e8me du traitement analytique et de l&rsquo;ing\u00e9nierie des donn\u00e9es volumineuses, le logiciel <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS (Statistical Analysis System)<\/a> demeure une r\u00e9f\u00e9rence institutionnelle majeure au sein des banques, des compagnies d&rsquo;assurance, de la recherche clinique et des organismes statistiques gouvernementaux. Au c\u0153ur de cette infrastructure r\u00e9side l&rsquo;\u00e9tape DATA, un environnement d&rsquo;ex\u00e9cution proc\u00e9dural optimis\u00e9 pour la manipulation ligne par ligne de structures tabulaires complexes. La ma\u00eetrise des m\u00e9canismes de d\u00e9cision s\u00e9quentielle au sein de cette \u00e9tape conditionne directement la fiabilit\u00e9 m\u00e9trique, la robustesse algorithmique et la performance computationnelle de l&rsquo;ensemble des pipelines d&rsquo;analyse statistique.<\/p>\n<p>La prise de d\u00e9cision algorithmique sous SAS s&rsquo;articule autour d&rsquo;\u00e9valuations bool\u00e9ennes r\u00e9gissant le flux d&rsquo;ex\u00e9cution. Si l&rsquo;instruction conditionnelle \u00e9l\u00e9mentaire permet d&rsquo;assigner une valeur isol\u00e9e selon la v\u00e9racit\u00e9 d&rsquo;un pr\u00e9dicat, les architectures de donn\u00e9es contemporaines exigent des transformations bien plus complexes, impliquant des mises \u00e0 jour concomitantes de variables scalaires, l&rsquo;application de fonctions de transformation vectorielle, et la redirection dynamique des flux d&rsquo;enregistrements. D\u00e8s lors que plusieurs op\u00e9rations interd\u00e9pendantes doivent \u00eatre d\u00e9clench\u00e9es par une seule et m\u00eame conjoncture logique, l&rsquo;utilisation de structures en blocs devient indispensable.<\/p>\n<p>Le bloc conditionnel d\u00e9limit\u00e9 par les mots-cl\u00e9s <strong>IF-THEN-DO<\/strong> constitue la pierre angulaire de cette programmation modulaire dans le langage SAS de base. En encapsulant une s\u00e9quence arbitraire d&rsquo;instructions ex\u00e9cutables entre les bornes lexicales form\u00e9es par le groupe <strong>DO<\/strong> et l&rsquo;instruction de cl\u00f4ture <strong>END<\/strong>, le programmeur s&rsquo;affranchit des limitations de la syntaxe unitaire. Ce guide exhaustif explore l&rsquo;ensemble des dimensions th\u00e9oriques, syntaxiques, architecturales et mat\u00e9rielles de cette construction fondamentale, illustrant chaque concept par des cas d&rsquo;usage industriels approfondis.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/lagsas3-1.jpg\" alt=\"\" \/><\/figure>\n<h2>1. Introduction aux structures conditionnelles dans SAS<\/h2>\n<h3>1.1 Fondements de l&rsquo;\u00e9valuation logique dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;\u00e9tape DATA de SAS fonctionne selon un paradigme it\u00e9ratif implicite fondamentalement diff\u00e9rent de la plupart des langages proc\u00e9duraux traditionnels comme le langage C ou Python. Lors de l&rsquo;ex\u00e9cution, SAS instancie une zone de m\u00e9moire interm\u00e9diaire d\u00e9sign\u00e9e sous le terme de vecteur de donn\u00e9es du programme, ou <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/basess\/58133\/HTML\/default\/viewer.htm#a001290590.htm\">Program Data Vector (PDV)<\/a>. Ce vecteur alloue statiquement des emplacements contigus de m\u00e9moire pour stocker l&rsquo;ensemble des variables d\u00e9clar\u00e9es ou lues \u00e0 partir des tables d&rsquo;entr\u00e9e via des instructions telles que <strong>SET<\/strong>, <strong>MERGE<\/strong> ou <strong>INPUT<\/strong>. L&rsquo;\u00e9tape DATA parcourt le jeu d&rsquo;enregistrements sous-jacent en appliquant s\u00e9quentiellement l&rsquo;int\u00e9gralit\u00e9 du script compil\u00e9 \u00e0 chaque ligne individuelle, avant de restituer le r\u00e9sultat vers une table de sortie et de r\u00e9initialiser le PDV pour l&rsquo;observation suivante.<\/p>\n<p>Dans ce cycle de traitement continuel, l&rsquo;\u00e9valuation des pr\u00e9dicats logiques repose sur une s\u00e9mantique bool\u00e9enne stricte o\u00f9 le processeur d&rsquo;\u00e9valuation SAS interpr\u00e8te tout r\u00e9sultat d&rsquo;expression num\u00e9rique comme une valeur de v\u00e9rit\u00e9 binaire. Contrairement \u00e0 des environnements disposant d&rsquo;un type bool\u00e9en primitif d\u00e9di\u00e9, SAS associe la valeur num\u00e9rique un (1) \u00e0 la v\u00e9rit\u00e9 logique, et la valeur num\u00e9rique z\u00e9ro (0) \u00e0 la fausset\u00e9. Cependant, une particularit\u00e9 critique r\u00e9side dans la gestion des valeurs manquantes : toute donn\u00e9e absente num\u00e9rique, repr\u00e9sent\u00e9e en m\u00e9moire par un point ou un caract\u00e8re sp\u00e9cial d&rsquo;absence, est \u00e9valu\u00e9e comme logiquement fausse lorsqu&rsquo;elle est soumise \u00e0 un test direct d&rsquo;affirmation, mais se comporte comme la plus petite valeur possible lors des op\u00e9rations de comparaison d&rsquo;ordre de grandeur.<\/p>\n<p>Le contr\u00f4le de flux offert par les instructions conditionnelles permet d&rsquo;intercepter cette ex\u00e9cution lin\u00e9aire ligne par ligne. Sans structures d\u00e9cisionnelles, l&rsquo;\u00e9tape DATA appliquerait uniform\u00e9ment les m\u00eames formules alg\u00e9briques et les m\u00eames r\u00e9assignations de variables \u00e0 l&rsquo;ensemble du fichier plat. L&rsquo;int\u00e9gration des pr\u00e9dicats conditionnels introduit des embranchements d\u00e9terministes, garantissant que certaines portions de code ne soient activ\u00e9es que si et seulement si l&rsquo;\u00e9tat des variables de l&rsquo;observation courante satisfait des crit\u00e8res alg\u00e9briques, typologiques ou temporels pr\u00e9d\u00e9termin\u00e9s par l&rsquo;ing\u00e9nieur de donn\u00e9es.<\/p>\n<h3>1.2 N\u00e9cessit\u00e9 des blocs d&rsquo;instructions group\u00e9es<\/h3>\n<p>L&rsquo;instruction conditionnelle \u00e9l\u00e9mentaire de SAS, formul\u00e9e sous le paradigme simple d&rsquo;une condition suivie imm\u00e9diatement d&rsquo;une unique action, pr\u00e9sente une restriction op\u00e9rationnelle majeure : elle ne peut l\u00e9galement lier qu&rsquo;une seule et unique instruction ex\u00e9cutable \u00e0 l&rsquo;\u00e9valuation positive de son pr\u00e9dicat logique. Dans les environnements r\u00e9els d&rsquo;ing\u00e9nierie statistique, les exigences de transformation de donn\u00e9es d\u00e9passent tr\u00e8s largement le cadre de la r\u00e9assignation unitaire. L&rsquo;identification d&rsquo;une sous-population clinique atypique, par exemple, n\u00e9cessite simultan\u00e9ment l&rsquo;incr\u00e9mentation de compteurs de contr\u00f4le, le recodage d&rsquo;indicateurs de risque, la conversion d&rsquo;unit\u00e9s de mesure physiologiques et la g\u00e9n\u00e9ration de messages d&rsquo;audit dans le journal d&rsquo;ex\u00e9cution.<\/p>\n<p>Si le programmeur devait s&rsquo;en tenir aux constructions unitaires, il serait contraint de r\u00e9p\u00e9ter la m\u00eame expression conditionnelle pour chaque variable devant subir une modification. Cette duplication textuelle induit une dette technique consid\u00e9rable. Non seulement elle d\u00e9grade la lisibilit\u00e9 globale de l&rsquo;algorithme, mais elle engendre \u00e9galement une inefficacit\u00e9 computationnelle manifeste, puisque le moteur d&rsquo;\u00e9valuation interne de SAS est forc\u00e9 de r\u00e9\u00e9valuer le m\u00eame test logique autant de fois qu&rsquo;il y a d&rsquo;instructions d&rsquo;assignation d\u00e9pendantes, consommant inutilement des cycles processeur sur des volumes massifs de t\u00e9raoctets.<\/p>\n<p>Le concept de bloc d&rsquo;instructions conditionnelles r\u00e9sout cette impasse architecturale en autorisant le regroupement herm\u00e9tique d&rsquo;une s\u00e9quence quelconque d&rsquo;ordres SAS au sein d&rsquo;une unit\u00e9 logique atomique. Une fois que la condition principale est valid\u00e9e au sommet de la structure, le fil d&rsquo;ex\u00e9cution p\u00e9n\u00e8tre dans le bloc et ex\u00e9cute s\u00e9quentiellement l&rsquo;int\u00e9gralit\u00e9 des instructions internes sans jamais r\u00e9\u00e9valuer le pr\u00e9dicat initial. Cette encapsulation garantit l&rsquo;int\u00e9grit\u00e9 transactionnelle des transformations : soit l&rsquo;ensemble des variables interd\u00e9pendantes est recalcul\u00e9 de concert, soit aucune d&rsquo;entre elles ne l&rsquo;est, pr\u00e9venant ainsi toute incoh\u00e9rence d&rsquo;\u00e9tat au sein du vecteur de donn\u00e9es.<\/p>\n<h3>1.3 Applications types en analyse de donn\u00e9es<\/h3>\n<p>L&rsquo;utilisation des blocs d&rsquo;instructions group\u00e9es s&rsquo;impose dans de multiples contextes m\u00e9thodologiques li\u00e9s \u00e0 la pr\u00e9paration et au nettoyage rigoureux des bases de donn\u00e9es de recherche. En premier lieu figure le recodage multidimensionnel de donn\u00e9es cliniques ou d\u00e9mographiques. Lorsqu&rsquo;un sujet d&rsquo;\u00e9tude change de cohorte en raison du franchissement d&rsquo;un seuil biologique, il est imp\u00e9ratif de modifier concomitamment son libell\u00e9 de statut, la variable quantitative repr\u00e9sentant son dosage recommand\u00e9, ainsi que la date d&rsquo;entr\u00e9e en vigueur de ce nouveau protocole.<\/p>\n<p>En second lieu, l&rsquo;imputation conditionnelle de donn\u00e9es d&rsquo;enqu\u00eates ou psychom\u00e9triques requiert fr\u00e9quemment l&rsquo;ex\u00e9cution conjointe de calculs math\u00e9matiques et d&rsquo;indicateurs d&rsquo;\u00e9tat. Par exemple, si une valeur est d\u00e9tect\u00e9e comme manquante au sein d&rsquo;une \u00e9chelle de Likert, un algorithme d&rsquo;imputation d\u00e9terministe peut calculer la moyenne des items r\u00e9siduels du sous-domaine pour cette observation, assigner cette valeur estim\u00e9e \u00e0 la case vide, et imm\u00e9diatement positionner un drapeau binaire (flag d&rsquo;imputation) \u00e0 un pour avertir les mod\u00e9lisateurs \u00e9conom\u00e9triques en aval que cette donn\u00e9e r\u00e9sulte d&rsquo;un traitement synth\u00e9tique.<\/p>\n<p>Enfin, le filtrage s\u00e9lectif et la standardisation de donn\u00e9es transactionnelles issues de syst\u00e8mes h\u00e9t\u00e9rog\u00e8nes mobilisent syst\u00e9matiquement des blocs conditionnels \u00e9tendus. Dans le traitement des flux bancaires transfrontaliers, la d\u00e9tection d&rsquo;une devise \u00e9trang\u00e8re sp\u00e9cifique commande l&rsquo;application d&rsquo;un taux de change dynamique, le calcul de frais de compensation proportionnels, la conversion des montants dans la monnaie de r\u00e9f\u00e9rence comptable, et la transcription d&rsquo;un code pays normalis\u00e9 selon la norme ISO 3166-1. L&rsquo;atomicit\u00e9 procur\u00e9e par le bloc conditionnel garantit que ces quatre op\u00e9rations s&rsquo;ex\u00e9cutent de fa\u00e7on synchrone et infaillible.<\/p>\n<h2>2. Distinction syntaxique et logique entre IF-THEN et IF-THEN-DO<\/h2>\n<h3>2.1 L&rsquo;instruction unitaire IF-THEN : M\u00e9canismes et restrictions<\/h3>\n<p>L&rsquo;instruction unitaire conditionnelle fondamentale ob\u00e9it \u00e0 la grammaire rigoureuse suivante : le mot-cl\u00e9 <strong>IF<\/strong> est suivi d&rsquo;une expression dont la r\u00e9solution produit une valeur scalaire num\u00e9rique, imm\u00e9diatement suivie du mot-cl\u00e9 <strong>THEN<\/strong>, lequel introduit la commande d&rsquo;action unique. Cette commande peut consister en une affectation arithm\u00e9tique \u00e9l\u00e9mentaire, un appel de fonction syst\u00e8me ou une instruction de contr\u00f4le telle que <strong>DELETE<\/strong>. Le compilateur SAS interpr\u00e8te cette structure en associant le saut conditionnel directement \u00e0 l&rsquo;adresse m\u00e9moire de l&rsquo;instruction qui suit la premi\u00e8re ponctuation de terminaison rencontr\u00e9e, \u00e0 savoir le point-virgule.<\/p>\n<p>Cette conception syntaxique impose une restriction stricte : il est rigoureusement impossible d&rsquo;ins\u00e9rer deux instructions s\u00e9par\u00e9es par des points-virgules sous la tutelle d&rsquo;un seul mot-cl\u00e9 <strong>THEN<\/strong> sans faire appel \u00e0 un conteneur lexical. Si un d\u00e9veloppeur d\u00e9butant tente d&rsquo;\u00e9crire une suite d&rsquo;affectations s\u00e9par\u00e9es par des points-virgules apr\u00e8s <strong>THEN<\/strong>, seule la toute premi\u00e8re affectation sera soumise \u00e0 la condition logique. L&rsquo;instruction suivante, bien qu&rsquo;indent\u00e9e visuellement sous la condition, sera interpr\u00e9t\u00e9e par le compilateur comme une instruction inconditionnelle ind\u00e9pendante, ex\u00e9cut\u00e9e syst\u00e9matiquement pour chaque observation traversant l&rsquo;\u00e9tape DATA, provoquant une corruption imm\u00e9diate et silencieuse des donn\u00e9es.<\/p>\n<p>Pour contourner cette limitation sans utiliser de blocs group\u00e9s, le programmeur se trouverait contraint de r\u00e9p\u00e9ter laborieusement la structure :<\/p>\n<ul>\n<li>\u00c9valuation de la condition pour la premi\u00e8re variable cible et affectation du r\u00e9sultat ;<\/li>\n<li>R\u00e9\u00e9valuation stricte de la m\u00eame condition logique pour la deuxi\u00e8me variable cible et affectation du second r\u00e9sultat ;<\/li>\n<li>Multiplication proportionnelle des blocs de contr\u00f4le pour chaque attribut subsidiaire devant \u00eatre synchronis\u00e9.<\/li>\n<\/ul>\n<p>Ce sch\u00e9ma r\u00e9p\u00e9titif encombre inutilement le fichier source et augmente dramatiquement le risque d&rsquo;introduire des discordances si l&rsquo;un des pr\u00e9dicats vient \u00e0 \u00eatre modifi\u00e9 ult\u00e9rieurement sans que les copies conformes r\u00e9parties sur les lignes subs\u00e9quentes ne soient rigoureusement actualis\u00e9es.<\/p>\n<h3>2.2 Le groupe d&rsquo;instructions conditionnel : L&rsquo;apport de la clause DO<\/h3>\n<p>L&rsquo;introduction du mot-cl\u00e9 <strong>DO<\/strong> en aval direct de la particule <strong>THEN<\/strong> transforme radicalement la port\u00e9e syntaxique de la structure conditionnelle. Sur le plan lexical, le terme <strong>DO<\/strong> n&rsquo;ex\u00e9cute pas une op\u00e9ration arithm\u00e9tique en soi ; il agit comme un op\u00e9rateur d&rsquo;ouverture de bloc d&rsquo;instructions, signalant au compilateur SAS qu&rsquo;une s\u00e9quence d&rsquo;instructions h\u00e9t\u00e9rog\u00e8nes va suivre et qu&rsquo;elle doit \u00eatre consid\u00e9r\u00e9e conceptuellement comme une instruction compos\u00e9e unique. La cl\u00f4ture de cette s\u00e9quence est formellement act\u00e9e par l&rsquo;instruction terminale <strong>END<\/strong>, qui r\u00e9tablit le flux s\u00e9quentiel ordinaire de l&rsquo;\u00e9tape DATA.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/ifthendo1.jpg\" alt=\"IF-THEN-DO statement in SAS\" \/><figcaption>IF-THEN-DO statement in SAS<\/figcaption><\/figure>\n<p>Gr\u00e2ce \u00e0 ce m\u00e9canisme d&rsquo;encapsulation, l&rsquo;ensemble des instructions comprises entre le mot <strong>DO;<\/strong> et le mot <strong>END;<\/strong> partage un sort d&rsquo;ex\u00e9cution rigoureusement identique. Si l&rsquo;expression logique formul\u00e9e apr\u00e8s le <strong>IF<\/strong> s&rsquo;\u00e9value comme vraie (diff\u00e9rente de z\u00e9ro et non manquante), le pointeur d&rsquo;instruction p\u00e9n\u00e8tre dans le bloc et d\u00e9roule s\u00e9quentiellement chaque ligne interne : calculs math\u00e9matiques, manipulation de cha\u00eenes de caract\u00e8res, appels de routines syst\u00e8me via l&rsquo;instruction <strong>CALL<\/strong>, et m\u00eame instructions d&rsquo;\u00e9criture physique ou d&rsquo;abandon d&rsquo;observation. \u00c0 l&rsquo;inverse, si la condition s&rsquo;\u00e9value comme fausse, le moteur d&rsquo;ex\u00e9cution op\u00e8re un branchement direct vers l&rsquo;instruction situ\u00e9e imm\u00e9diatement apr\u00e8s le mot-cl\u00e9 <strong>END;<\/strong>, sautant d&rsquo;un seul bloc toutes les op\u00e9rations interm\u00e9diaires.<\/p>\n<p>Ce mode op\u00e9ratoire rationalise consid\u00e9rablement l&rsquo;arbre d\u00e9cisionnel du programme. Les d\u00e9pendances fonctionnelles entre variables sont explicit\u00e9es de mani\u00e8re claire et non \u00e9quivoque. Le compilateur n&rsquo;a plus \u00e0 r\u00e9analyser la validit\u00e9 d&rsquo;une condition pour chaque membre d&rsquo;un groupe d&rsquo;actions solidaires, ce qui r\u00e9duit consid\u00e9rablement le nombre total de comparaisons binaires ex\u00e9cut\u00e9es \u00e0 l&rsquo;\u00e9chelle d&rsquo;une table contenant des dizaines de millions de lignes.<\/p>\n<h3>2.3 Comparaison structurelle des approches<\/h3>\n<p>Pour mesurer pr\u00e9cis\u00e9ment le gouffre qualitatif qui s\u00e9pare l&#8217;emploi de conditions unitaires multiples de l&rsquo;utilisation d&rsquo;un bloc conditionnel consolid\u00e9, il convient d&rsquo;analyser leurs comportements respectifs sous l&rsquo;angle de la performance mat\u00e9rielle et de la maintenance logicielle. Sur le plan du co\u00fbt de traitement computationnel, la multiplication de clauses conditionnelles unitaires oblige l&rsquo;unit\u00e9 centrale \u00e0 charger les registres de m\u00e9moire, \u00e0 v\u00e9rifier les comparateurs d&rsquo;\u00e9galit\u00e9 ou d&rsquo;in\u00e9galit\u00e9, et \u00e0 g\u00e9rer les pr\u00e9dictions de branchement pour chaque ligne de code isol\u00e9e. Lorsque ces m\u00eames instructions sont rassembl\u00e9es dans un bloc <strong>DO-END<\/strong>, la logique d\u00e9cisionnelle est \u00e9valu\u00e9e une seule et unique fois par enregistrement, optimisant le pipeline d&rsquo;ex\u00e9cution des microprocesseurs modernes et r\u00e9duisant l&#8217;empreinte thermique globale des calculs lourds.<\/p>\n<p>Sur le plan du g\u00e9nie logiciel et de la lisibilit\u00e9 algorithmique, le regroupement au sein d&rsquo;un bloc structur\u00e9 facilite grandement l&rsquo;audit de code, en particulier dans les secteurs hautement r\u00e9glement\u00e9s soumis aux directives de la <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.fda.gov\">Food and Drug Administration (FDA)<\/a> ou des accords prudentiels bancaires de B\u00e2le III. La maintenance d&rsquo;un script SAS comportant des centaines d&rsquo;instructions conditionnelles \u00e9parses devient rapidement ing\u00e9rable en cas de rotation des \u00e9quipes statistiques. Un bloc bien d\u00e9limit\u00e9 permet d&rsquo;isoler visuellement la port\u00e9e exacte d&rsquo;une r\u00e8gle m\u00e9tier, rendant imm\u00e9diatement \u00e9videntes les corr\u00e9lations fonctionnelles entre les diff\u00e9rentes variables cr\u00e9\u00e9es.<\/p>\n<p>En somme, la directive <strong>IF-THEN<\/strong> unitaire doit \u00eatre r\u00e9serv\u00e9e exclusivement aux modifications scalaires isol\u00e9es et strictement ind\u00e9pendantes de tout autre param\u00e8tre d&rsquo;\u00e9tat du syst\u00e8me. D\u00e8s lors qu&rsquo;une d\u00e9cision logique implique la modification conjointe de deux attributs ou plus, ou requiert l&rsquo;ex\u00e9cution s\u00e9quentielle d&rsquo;un traitement complexe, le recours au paradigme <strong>IF-THEN-DO<\/strong> s&rsquo;impose comme un imp\u00e9ratif d&rsquo;ing\u00e9nierie non n\u00e9gociable.<\/p>\n<h2>3. Syntaxe formelle et anatomie du bloc IF-THEN-DO<\/h2>\n<h3>3.1 D\u00e9composition de la r\u00e8gle syntaxique standard<\/h3>\n<p>La grammaire officielle du langage SAS sp\u00e9cifie une architecture rigoureuse pour l&rsquo;impl\u00e9mentation d&rsquo;un bloc conditionnel group\u00e9 standard. L&rsquo;ossature fondamentale repose sur un encha\u00eenement d\u00e9terministe de jetons lexicaux, d\u00e9butant par le mot-cl\u00e9 d&rsquo;amorce conditionnelle, int\u00e9grant le corps fonctionnel des instructions ex\u00e9cutables, et se concluant par la balise d&rsquo;extinction de port\u00e9e. Cette syntaxe canonique se structure formellement de la mani\u00e8re suivante :<\/p>\n<p><strong>IF<\/strong> expression-logique <strong>THEN DO;<\/strong><br \/>\ninstruction-ex\u00e9cutable-1;<br \/>\ninstruction-ex\u00e9cutable-2;<br \/>\n&#8230;<br \/>\ninstruction-ex\u00e9cutable-n;<br \/>\n<strong>END;<\/strong><\/p>\n<p>L&rsquo;expression logique situ\u00e9e entre <strong>IF<\/strong> et <strong>THEN<\/strong> peut adopter un niveau de complexit\u00e9 arbitraire, combinant des identifiants de colonnes, des constantes litt\u00e9rales, des fonctions math\u00e9matiques scalaires et des op\u00e9rateurs de conjonction bool\u00e9enne. L&rsquo;\u00e9l\u00e9ment d\u00e9terminant r\u00e9side dans la liaison indissociable entre le mot-cl\u00e9 <strong>THEN<\/strong> et l&rsquo;instruction <strong>DO;<\/strong>. Contrairement \u00e0 des structures it\u00e9ratives o\u00f9 le mot <strong>DO<\/strong> est compl\u00e9t\u00e9 par une variable d&rsquo;indexation num\u00e9rique et des bornes de boucle, il s&rsquo;agit ici d&rsquo;un <strong>DO<\/strong> dit simple ou d\u00e9claratif de bloc, dont l&rsquo;unique raison d&rsquo;\u00eatre consiste \u00e0 suspendre la cl\u00f4ture de la port\u00e9e conditionnelle jusqu&rsquo;\u00e0 ce que son homologue lexical <strong>END;<\/strong> soit formellement intercept\u00e9 par l&rsquo;analyseur syntaxique.<\/p>\n<h3>3.2 Types d&rsquo;instructions admises au sein du bloc DO<\/h3>\n<p>L&rsquo;espace syntaxique circonscrit entre les bornes <strong>DO;<\/strong> et <strong>END;<\/strong> ne subit pratiquement aucune restriction quant \u00e0 la nature fonctionnelle des instructions SAS ex\u00e9cutables pouvant y \u00eatre int\u00e9gr\u00e9es. Cette permissivit\u00e9 structurelle autorise des op\u00e9rations hautement diversifi\u00e9es r\u00e9pondant aux besoins les plus pointus du traitement de donn\u00e9es :<\/p>\n<ul>\n<li>Les assignations arithm\u00e9tiques classiques et les \u00e9valuations trigonom\u00e9triques, logarithmiques ou exponentielles calcul\u00e9es \u00e0 partir des valeurs instantan\u00e9es du PDV ;<\/li>\n<li>L&rsquo;invocation de fonctions int\u00e9gr\u00e9es sp\u00e9cialis\u00e9es dans le nettoyage ou l&rsquo;alt\u00e9ration de cha\u00eenes de caract\u00e8res, telles que <strong>SUBSTR<\/strong>, <strong>SCAN<\/strong>, <strong>COMPBL<\/strong> ou les fonctions d&rsquo;expression r\u00e9guli\u00e8re de la famille <strong>PRXPARSE<\/strong> ;<\/li>\n<li>L&rsquo;appel de routines syst\u00e8mes pr\u00e9compil\u00e9es via le mot-cl\u00e9 <strong>CALL<\/strong>, incluant par exemple des g\u00e9n\u00e9rateurs de nombres pseudo-al\u00e9atoires ou des proc\u00e9dures de tri vectoriel sur tableaux m\u00e9moire ;<\/li>\n<li>Le d\u00e9ploiement d&rsquo;instructions imp\u00e9ratives de contr\u00f4le de flux, \u00e0 l&rsquo;instar de l&rsquo;instruction <strong>OUTPUT<\/strong> pour forcer l&rsquo;\u00e9criture physique imm\u00e9diate d&rsquo;une ligne, de l&rsquo;instruction <strong>DELETE<\/strong> pour \u00e9liminer sans d\u00e9lai l&rsquo;observation du traitement courant, ou encore de l&rsquo;ordre <strong>STOP<\/strong> pour interrompre d\u00e9finitivement l&rsquo;\u00e9tape DATA ;<\/li>\n<li>La manipulation de structures de donn\u00e9es vectorielles \u00e0 travers l&rsquo;indexation de tableaux dynamiques d\u00e9clar\u00e9s via l&rsquo;instruction <strong>ARRAY<\/strong>.<\/li>\n<\/ul>\n<p>Il est en revanche crucial de souligner que les instructions purement d\u00e9claratives et non ex\u00e9cutables, telles que les d\u00e9finitions de structure <strong>LABEL<\/strong>, <strong>FORMAT<\/strong>, <strong>INFORMAT<\/strong> ou <strong>LENGTH<\/strong>, bien qu&rsquo;elles puissent techniquement \u00eatre plac\u00e9es physiquement \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc sans provoquer d&rsquo;erreur bloquante de compilation, ne sont aucunement soumises \u00e0 la logique conditionnelle du <strong>IF<\/strong>. Le compilateur les \u00e9value lors de sa passe pr\u00e9paratoire pr\u00e9liminaire et leur assignation de m\u00e9tadonn\u00e9es s&rsquo;applique de fa\u00e7on immuable \u00e0 l&rsquo;int\u00e9gralit\u00e9 de la table, ind\u00e9pendamment du statut d&rsquo;ex\u00e9cution du bloc.<\/p>\n<h3>3.3 Gestion de la ponctuation et du point-virgule<\/h3>\n<p>En programmation SAS, le point-virgule constitue le d\u00e9limiteur d&rsquo;instruction universel et irrempla\u00e7able. L&rsquo;un des \u00e9cueils syntaxiques les plus r\u00e9currents et les plus destructeurs rencontr\u00e9s par les praticiens de donn\u00e9es r\u00e9side dans l&rsquo;insertion pr\u00e9matur\u00e9e ou erron\u00e9e d&rsquo;un point-virgule au sein de la ligne de d\u00e9claration conditionnelle. Si l&rsquo;on \u00e9crit par inadvertance l&rsquo;expression conditionnelle en pla\u00e7ant un point-virgule imm\u00e9diatement apr\u00e8s le mot-cl\u00e9 <strong>THEN<\/strong>, le compilateur interpr\u00e8te ce signe comme une instruction nulle, c&rsquo;est-\u00e0-dire une action valide qui consiste \u00e0 ne rien faire du tout. Cons\u00e9quemment, l&rsquo;instruction <strong>DO;<\/strong> situ\u00e9e imm\u00e9diatement apr\u00e8s est comprise comme une ouverture inconditionnelle de bloc, rompant tout lien avec le test initial et provoquant l&rsquo;ex\u00e9cution syst\u00e9matique de toutes les op\u00e9rations du bloc pour chaque observation.<\/p>\n<p>De m\u00eame, la s\u00e9quence d&rsquo;ouverture impose que le point-virgule soit positionn\u00e9 imm\u00e9diatement apr\u00e8s le mot <strong>DO<\/strong> (formul\u00e9 ainsi : <strong>THEN DO;<\/strong>). L&rsquo;absence de ce point-virgule provoque l&rsquo;agr\u00e9gation erron\u00e9e du mot <strong>DO<\/strong> avec la premi\u00e8re instruction de la ligne suivante, g\u00e9n\u00e9rant une erreur d&rsquo;arr\u00eat de compilation de type \u00ab statement is not valid \u00bb dans le journal SAS. Chaque instruction contenue \u00e0 l&rsquo;int\u00e9rieur du bloc doit rigoureusement se terminer par son propre point-virgule terminal, respectant les r\u00e8gles syntaxiques ordinaires du langage.<\/p>\n<p>Enfin, l&rsquo;instruction de terminaison <strong>END<\/strong> requiert son propre point-virgule de cl\u00f4ture (formul\u00e9 ainsi : <strong>END;<\/strong>). Toute omission de ce symbole final maintient le bloc conditionnel artificiellement ouvert dans la table des symboles du compilateur, provoquant une cascade d&rsquo;erreurs d&rsquo;interpr\u00e9tation sur l&rsquo;ensemble des lignes de code sous-jacentes, et aboutissant \u00e0 un \u00e9chec global de l&rsquo;\u00e9tape DATA lors de la tentative de soumission du script.<\/p>\n<h2>4. Exemple pratique pas \u00e0 pas : Cr\u00e9ation et assignation de variables<\/h2>\n<h3>4.1 D\u00e9finition du jeu de donn\u00e9es source<\/h3>\n<p>Pour illustrer de fa\u00e7on empirique et reproductible le d\u00e9ploiement op\u00e9rationnel d&rsquo;un bloc conditionnel <strong>IF-THEN-DO<\/strong>, consid\u00e9rons une base de donn\u00e9es de gestion commerciale mod\u00e9lisant les performances de vente de diff\u00e9rents \u00e9tablissements de distribution. Le fichier d&rsquo;origine contient des enregistrements caract\u00e9ris\u00e9s par un identifiant d&rsquo;\u00e9tablissement sous forme de cha\u00eene de caract\u00e8res, un volume quantitatif brut de transactions exprim\u00e9 en euros, ainsi qu&rsquo;un volume de retours de marchandises enregistr\u00e9s au cours de la p\u00e9riode d&rsquo;exercice comptable.<\/p>\n<p>Nous instancions ce jeu de donn\u00e9es exp\u00e9rimental au moyen de l&rsquo;instruction <strong>DATALINES<\/strong> int\u00e9gr\u00e9e au sein d&rsquo;une premi\u00e8re \u00e9tape DATA d\u00e9nomm\u00e9e <em>donnees_magasins<\/em>. Cette d\u00e9marche permet de simuler un environnement de production contr\u00f4l\u00e9 tout en rendant le code enti\u00e8rement autonome et ex\u00e9cutable sur toute instance SAS active. Les variables quantitatives pr\u00e9sentent des distributions h\u00e9t\u00e9rog\u00e8nes r\u00e9parties entre diff\u00e9rents points de vente r\u00e9gionaux, certains enregistrant un chiffre d&rsquo;affaires particuli\u00e8rement dynamique tandis que d&rsquo;autres affichent des volumes modestes coupl\u00e9s \u00e0 des taux de retour anormalement \u00e9lev\u00e9s.<\/p>\n<p>Avant d&rsquo;engager toute transformation conditionnelle approfondie, la validation de la structure de base est syst\u00e9matiquement effectu\u00e9e via l&rsquo;invocation de la proc\u00e9dure <strong>PROC PRINT<\/strong>, permettant \u00e0 l&rsquo;analyste de s&rsquo;assurer de la conformit\u00e9 du chargement brut des enregistrements, de l&rsquo;absence de d\u00e9calage dans la lecture des colonnes au niveau du tampon d&rsquo;entr\u00e9e, et de l&rsquo;int\u00e9grit\u00e9 globale du jeu de donn\u00e9es de r\u00e9f\u00e9rence.<\/p>\n<h3>4.2 Impl\u00e9mentation du bloc IF-THEN-DO<\/h3>\n<p>L&rsquo;objectif fonctionnel assign\u00e9 \u00e0 notre \u00e9tape de transformation consiste \u00e0 identifier de mani\u00e8re cibl\u00e9e les \u00e9tablissements situ\u00e9s dans la m\u00e9tropole bordelaise afin de leur appliquer un ensemble concert\u00e9 de r\u00e8gles de gestion fiscale et de labellisation g\u00e9ographique. Pour chaque point de vente satisfaisant la condition d&rsquo;\u00e9galit\u00e9 sur la variable <em>Magasin<\/em>, le script doit simultan\u00e9ment cr\u00e9er une variable cat\u00e9gorielle <em>Region<\/em> contenant la mention \u00ab Nouvelle-Aquitaine \u00bb, une variable <em>Pays<\/em> fix\u00e9e \u00e0 \u00ab France \u00bb, calculer un montant de taxe r\u00e9gionale sp\u00e9cifique index\u00e9 \u00e0 8,5 % du volume net des ventes (ventes brutes diminu\u00e9es des retours), et attribuer un score de priorit\u00e9 op\u00e9rationnelle sous forme d&rsquo;une constante textuelle qualifi\u00e9e de \u00ab Haute \u00bb.<\/p>\n<p>L&rsquo;architecture algorithmique mise en \u0153uvre repose sur une \u00e9tape DATA d\u00e9nomm\u00e9e <em>donnees_transformees<\/em> lisant la table initiale par l&rsquo;ordre <strong>SET donnees_magasins;<\/strong>. Imm\u00e9diatement apr\u00e8s cette lecture s\u00e9quentielle, l&rsquo;\u00e9valuation conditionnelle s&rsquo;\u00e9nonce ainsi : le mot <strong>IF<\/strong> compare la variable <em>Magasin<\/em> \u00e0 la cha\u00eene litt\u00e9rale &lsquo;Bordeaux&rsquo;. D\u00e8s lors que cette \u00e9galit\u00e9 stricte est valid\u00e9e par l&rsquo;\u00e9valuateur logique interne, la directive <strong>THEN DO;<\/strong> engage l&rsquo;ex\u00e9cution de la s\u00e9quence d&rsquo;instructions. Les affectations s&rsquo;encha\u00eenent alors rigoureusement : calcul de la variable de taxe arithm\u00e9tique nette, assignation des constantes g\u00e9ographiques et marquage de l&rsquo;indicateur de priorit\u00e9. La s\u00e9quence se cl\u00f4t de fa\u00e7on herm\u00e9tique gr\u00e2ce \u00e0 la directive imp\u00e9rative <strong>END;<\/strong>.<\/p>\n<p>Cette construction m\u00e9thodique garantit qu&rsquo;aucune des variables descriptives associ\u00e9es \u00e0 la juridiction bordelaise n&rsquo;est instanci\u00e9e de mani\u00e8re d\u00e9sordonn\u00e9e ou partielle. L&rsquo;int\u00e9grit\u00e9 transactionnelle au niveau de chaque ligne analys\u00e9e dans le vecteur de m\u00e9moire est parfaitement respect\u00e9e.<\/p>\n<h3>4.3 Validation des r\u00e9sultats et inspection des sorties<\/h3>\n<p>La validation empirique du programme s&rsquo;op\u00e8re par la soumission conjointe d&rsquo;un affichage tabulaire via <strong>PROC PRINT<\/strong> et d&rsquo;un examen approfondi du journal d&rsquo;ex\u00e9cution (le SAS Log). L&rsquo;inspection du journal constitue une \u00e9tape m\u00e9thodologique cruciale : elle permet d&rsquo;attester que le volume de lignes lues depuis la table source concorde rigoureusement avec le volume de lignes ins\u00e9r\u00e9es dans la table de destination, tout en v\u00e9rifiant l&rsquo;absence absolue de messages d&rsquo;avertissement de type \u00ab uninitialized variable \u00bb ou d&rsquo;erreurs de troncature de cha\u00eene.<\/p>\n<p>L&rsquo;analyse visuelle et analytique du tableau de sortie met en exergue une dichotomie parfaite entre les enregistrements. Les lignes correspondant aux magasins bordelais affichent avec exactitude les valeurs assign\u00e9es au sein du bloc : la r\u00e9gion est renseign\u00e9e, le pays est correctement identifi\u00e9, la taxe nette correspond parfaitement au r\u00e9sultat du mod\u00e8le alg\u00e9brique, et le statut prioritaire est arbor\u00e9. Pour les \u00e9tablissements situ\u00e9s dans d&rsquo;autres agglom\u00e9rations (comme Lyon, Lille ou Marseille), le comportement par d\u00e9faut de l&rsquo;\u00e9tape DATA se manifeste pleinement : n&rsquo;ayant pas satisfait la condition logique, ces lignes ont contourn\u00e9 le bloc <strong>DO-END<\/strong> dans son int\u00e9gralit\u00e9.<\/p>\n<p>Par cons\u00e9quent, pour ces observations dissidentes, les variables calcul\u00e9es et textuelles cr\u00e9\u00e9es exclusivement \u00e0 l&rsquo;int\u00e9rieur du bloc re\u00e7oivent automatiquement la valeur manquante par d\u00e9faut du syst\u00e8me SAS, \u00e0 savoir un espace vide pour les variables alphanum\u00e9riques et un point d\u00e9cimal pour les variables num\u00e9riques. Ce constat illustre avec une clart\u00e9 totale la dynamique du vecteur de donn\u00e9es et souligne la n\u00e9cessit\u00e9, dans les architectures industrielles, d&rsquo;anticiper le traitement de ces valeurs r\u00e9siduelles au moyen d&rsquo;alternatives conditionnelles compl\u00e8tes.<\/p>\n<h2>5. Gestion rigoureuse des attributs et dimensionnement avec LENGTH<\/h2>\n<h3>5.1 Le m\u00e9canisme de troncature automatique dans SAS<\/h3>\n<p>L&rsquo;un des pi\u00e8ges les plus insidieux et les plus destructeurs de l&rsquo;\u00e9tape DATA r\u00e9side dans le m\u00e9canisme par lequel le compilateur SAS d\u00e9termine la longueur d&rsquo;allocation m\u00e9moire des nouvelles variables de type caract\u00e8re. Contrairement aux environnements modernes \u00e0 typage dynamique qui redimensionnent continuellement les zones tampons en m\u00e9moire selon la longueur du texte assign\u00e9, SAS applique un mod\u00e8le statique fond\u00e9 sur le principe de la premi\u00e8re occurrence textuelle rencontr\u00e9e lors de la phase de compilation initiale du script.<\/p>\n<p>Lorsque le compilateur analyse s\u00e9quentiellement le code source de haut en bas, la toute premi\u00e8re fois qu&rsquo;il intercepte l&rsquo;assignation d&rsquo;une variable qui n&rsquo;a pas \u00e9t\u00e9 formellement d\u00e9clar\u00e9e au pr\u00e9alable dans le dictionnaire du PDV, il examine la longueur physique exacte de la constante litt\u00e9rale pr\u00e9sente \u00e0 la droite de l&rsquo;op\u00e9rateur d&rsquo;\u00e9galit\u00e9. Si cette premi\u00e8re instanciation survient dans une branche conditionnelle attribuant une cha\u00eene tr\u00e8s courte, par exemple le mot \u00ab Nord \u00bb comportant quatre caract\u00e8res, le compilateur fige irr\u00e9vocablement la longueur de cette variable \u00e0 quatre octets pour l&rsquo;ensemble du cycle de vie de l&rsquo;\u00e9tape DATA.<\/p>\n<p>Si, plus loin dans le flux d&rsquo;ex\u00e9cution ou au sein d&rsquo;une seconde branche conditionnelle alternative, une observation satisfait un crit\u00e8re imposant l&rsquo;attribution d&rsquo;une cha\u00eene plus longue, par exemple l&rsquo;appellation \u00ab Ile-de-France \u00bb totalisant treize caract\u00e8res, SAS ne proc\u00e8dera \u00e0 aucun r\u00e9ajustement d&rsquo;allocation. La valeur sera silencieusement tronqu\u00e9e pour tenir dans le gabarit initial de quatre octets, produisant l&rsquo;aberration lexicale \u00ab Ile- \u00bb. Cette perte d&rsquo;information se produit sans n\u00e9cessairement g\u00e9n\u00e9rer d&rsquo;erreur fatale dans le journal, faussant irr\u00e9m\u00e9diablement les agr\u00e9gations cat\u00e9gorielles ult\u00e9rieures et les analyses statistiques de cohorte.<\/p>\n<h3>5.2 Utilisation explicite de l&rsquo;instruction LENGTH<\/h3>\n<p>Pour \u00e9liminer tout risque de troncature silencieuse et garantir une reproductibilit\u00e9 absolue des transformations de donn\u00e9es, la bonne pratique m\u00e9thodologique universelle consiste \u00e0 d\u00e9clarer explicitement la taille de chaque variable alphanum\u00e9rique en amont imm\u00e9diat de toute structure conditionnelle. Cette d\u00e9claration anticip\u00e9e s&rsquo;effectue au moyen de l&rsquo;instruction d\u00e9clarative non ex\u00e9cutable <strong>LENGTH<\/strong>.<\/p>\n<p>L&rsquo;instruction <strong>LENGTH<\/strong> ob\u00e9it \u00e0 une syntaxe concise o\u00f9 le nom de la variable cible est imm\u00e9diatement suivi du symbole dollar ($) d\u00e9signant la typologie caract\u00e8re, lui-m\u00eame suivi d&rsquo;un entier num\u00e9rique sp\u00e9cifiant le nombre pr\u00e9cis d&rsquo;octets que le vecteur de donn\u00e9es (PDV) doit r\u00e9server de mani\u00e8re permanente pour cette colonne. En pla\u00e7ant par exemple l&rsquo;\u00e9nonc\u00e9 d\u00e9clarant que la variable <em>Region<\/em> dispose d&rsquo;une longueur allou\u00e9e de vingt octets et la variable <em>Statut<\/em> d&rsquo;une longueur de quinze octets tout au d\u00e9but de l&rsquo;\u00e9tape DATA, l&rsquo;ing\u00e9nieur de donn\u00e9es neutralise l&rsquo;heuristique de d\u00e9duction automatique du compilateur.<\/p>\n<p>D\u00e8s lors que le compilateur rencontre cette directive d&rsquo;amont, il dimensionne imm\u00e9diatement les emplacements de m\u00e9moire correspondants dans la table de structure interne. Lorsque le fil d&rsquo;ex\u00e9cution p\u00e9n\u00e8tre ult\u00e9rieurement dans les diff\u00e9rents blocs <strong>IF-THEN-DO<\/strong>, chaque valeur textuelle assign\u00e9e, qu&rsquo;elle comporte deux caract\u00e8res ou dix-huit caract\u00e8res, s&rsquo;ins\u00e8re harmonieusement dans l&rsquo;espace allou\u00e9, les positions exc\u00e9dentaires \u00e9tant naturellement compl\u00e9t\u00e9es par des espaces de remplissage standard. Cette rigueur d\u00e9clarative constitue le fondement d&rsquo;une architecture de donn\u00e9es robuste et p\u00e9renne.<\/p>\n<h3>5.3 Attribution de formats et libell\u00e9s au sein de la structure<\/h3>\n<p>Au-del\u00e0 de la stricte allocation d&rsquo;espace physique garantie par l&rsquo;instruction <strong>LENGTH<\/strong>, la gestion exhaustive du cycle de vie des variables d\u00e9riv\u00e9es g\u00e9n\u00e9r\u00e9es au sein de blocs conditionnels exige une contextualisation descriptive au moyen des instructions <strong>LABEL<\/strong> et <strong>FORMAT<\/strong>. Dans l&rsquo;\u00e9cosyst\u00e8me SAS, la s\u00e9paration fonctionnelle entre la repr\u00e9sentation interne des donn\u00e9es en m\u00e9moire machine et leur repr\u00e9sentation visuelle externe constitue un principe d&rsquo;architecture fondamental.<\/p>\n<p>L&rsquo;instruction <strong>LABEL<\/strong> permet d&rsquo;associer \u00e0 une variable nouvellement calcul\u00e9e une cha\u00eene descriptive textuelle enrichie pouvant atteindre deux cent cinquante-six caract\u00e8res. Cette \u00e9tiquette s\u00e9mantique est stock\u00e9e de mani\u00e8re ind\u00e9l\u00e9bile dans les m\u00e9tadonn\u00e9es de la table SAS. Elle sera automatiquement mobilis\u00e9e par les proc\u00e9dures analytiques avanc\u00e9es, telles que <strong>PROC MEANS<\/strong>, <strong>PROC TABULATE<\/strong> ou <strong>PROC REPORT<\/strong>, garantissant que les sorties graphiques ou tabulaires soient imm\u00e9diatement compr\u00e9hensibles pour les d\u00e9cideurs m\u00e9tiers sans exiger de post-traitement typographique.<\/p>\n<p>Parall\u00e8lement, l&rsquo;instruction <strong>FORMAT<\/strong> gouverne le masque d&rsquo;affichage des valeurs scalaires, qu&rsquo;elles soient temporelles, mon\u00e9taires ou cat\u00e9gorielles. Si un bloc <strong>IF-THEN-DO<\/strong> calcule un montant d&rsquo;indemnit\u00e9 d&rsquo;assurance ou une p\u00e9nalit\u00e9 financi\u00e8re, l&rsquo;assignation anticip\u00e9e d&rsquo;un format mon\u00e9taire ad\u00e9quat (tel que <em>EURO12.2<\/em> ou <em>DOLLAR14.2<\/em>) garantit que les nombres flottants en double pr\u00e9cision stock\u00e9s dans le PDV soient restitu\u00e9s sous une pr\u00e9sentation standardis\u00e9e incluant s\u00e9parateurs de milliers, d\u00e9cimales calibr\u00e9es et symbole mon\u00e9taire ad\u00e9quat. Tout comme l&rsquo;instruction <strong>LENGTH<\/strong>, ces directives doivent imp\u00e9rativement \u00eatre positionn\u00e9es au sommet d\u00e9claratif de l&rsquo;\u00e9tape DATA afin de clarifier la distinction entre la mod\u00e9lisation des sch\u00e9mas de donn\u00e9es et la logique conditionnelle proc\u00e9durale.<\/p>\n<h2>6. Formulation de conditions complexes avec op\u00e9rateurs logiques<\/h2>\n<h3>6.1 Op\u00e9rateurs relationnels et conjonctions bool\u00e9ennes<\/h3>\n<p>L&rsquo;\u00e9valuation des pr\u00e9dicats gouvernant l&rsquo;entr\u00e9e dans un bloc <strong>IF-THEN-DO<\/strong> ne se limite que tr\u00e8s rarement \u00e0 des comparaisons scalaires simples. Dans les environnements statistiques avanc\u00e9s, la d\u00e9cision d&rsquo;ex\u00e9cuter un traitement group\u00e9 d\u00e9pend couramment de la combinaison alg\u00e9brique d&rsquo;une multitude de crit\u00e8res simultan\u00e9s. SAS fournit un catalogue complet d&rsquo;op\u00e9rateurs de comparaison relationnels, disponibles sous forme de mn\u00e9moniques textuels alphab\u00e9tiques ou de symboles math\u00e9matiques standards :<\/p>\n<ul>\n<li>\u00c9galit\u00e9 stricte : <strong>EQ<\/strong> ou symbole d&rsquo;\u00e9galit\u00e9 (=) ;<\/li>\n<li>Non-\u00e9galit\u00e9 ou exclusion : <strong>NE<\/strong> ou symbole de n\u00e9gation de l&rsquo;\u00e9galit\u00e9 (^= ou ~=) ;<\/li>\n<li>Sup\u00e9riorit\u00e9 stricte et sup\u00e9riorit\u00e9 large : <strong>GT<\/strong> (&gt;) et <strong>GE<\/strong> (&gt;=) ;<\/li>\n<li>Inf\u00e9riorit\u00e9 stricte et inf\u00e9riorit\u00e9 large : <strong>LT<\/strong> (&lt;) et <strong>LE<\/strong> (&lt;=) ;<\/li>\n<li>Appartenance \u00e0 une liste discr\u00e8te d&rsquo;\u00e9l\u00e9ments : l&rsquo;op\u00e9rateur ensembliste <strong>IN<\/strong>.<\/li>\n<\/ul>\n<p>Ces comparaisons atomiques sont agr\u00e9g\u00e9es sous forme d&rsquo;arborescences logiques complexes au moyen des conjonctions bool\u00e9ennes <strong>AND<\/strong> (intersection stricte) et <strong>OR<\/strong> (union inclusive), appuy\u00e9es au besoin par l&rsquo;op\u00e9rateur d&rsquo;inversion <strong>NOT<\/strong>. La rigueur de formulation impose une ma\u00eetrise absolue des r\u00e8gles de pr\u00e9s\u00e9ance op\u00e9ratoire \u00e9tablies par le compilateur SAS : les comparaisons arithm\u00e9tiques sont r\u00e9solues en premier lieu, suivies des op\u00e9rateurs relationnels, puis de la conjonction <strong>AND<\/strong>, et enfin de la conjonction <strong>OR<\/strong>.<\/p>\n<p>Afin de pr\u00e9venir tout biais d&rsquo;\u00e9valuation d\u00e9coulant de cette hi\u00e9rarchie implicite, il est imp\u00e9ratif d&rsquo;utiliser des parenth\u00e8ses de groupement pour expliciter sans ambigu\u00eft\u00e9 les priorit\u00e9s d&rsquo;\u00e9valuation. Une expression conditionnelle non parenth\u00e9s\u00e9e combinant des <strong>AND<\/strong> et des <strong>OR<\/strong> successifs constitue l&rsquo;une des sources majeures d&rsquo;erreurs logiques non d\u00e9tect\u00e9es en programmation statistique, conduisant \u00e0 l&rsquo;activation accidentelle de blocs conditionnels pour des sous-populations qui auraient d\u00fb \u00eatre formellement exclues du traitement.<\/p>\n<h3>6.2 Gestion des valeurs manquantes dans les tests logiques<\/h3>\n<p>La gestion des valeurs manquantes (missing values) au sein des pr\u00e9dicats conditionnels constitue sans conteste la sp\u00e9cificit\u00e9 la plus critique et la plus dangereuse du langage SAS. Sur le plan de l&rsquo;architecture binaire interne, SAS traite les valeurs manquantes num\u00e9riques ordinaires (repr\u00e9sent\u00e9es par un point) ainsi que les vingt-sept valeurs manquantes sp\u00e9ciales (repr\u00e9sent\u00e9es par un point suivi d&rsquo;une lettre de A \u00e0 Z ou d&rsquo;un caract\u00e8re de soulignement) comme des nombres r\u00e9els dont la grandeur est arbitrairement fix\u00e9e comme \u00e9tant inf\u00e9rieure \u00e0 n&rsquo;importe quel nombre r\u00e9el n\u00e9gatif imaginable. En substance, pour le compilateur SAS, une valeur num\u00e9rique manquante repr\u00e9sente l&rsquo;\u00e9quivalent math\u00e9matique de l&rsquo;infini n\u00e9gatif.<\/p>\n<p>Par cons\u00e9quent, si un analyste r\u00e9dige une instruction conditionnelle formul\u00e9e sous la forme :<br \/>\n<strong>IF<\/strong> Montant_Ventes &lt; 50000 <strong>THEN DO;<\/strong><br \/>\ncette condition sera \u00e9valu\u00e9e comme strictement <strong>VRAIE<\/strong> pour chaque enregistrement dont la variable <em>Montant_Ventes<\/em> est manquante ou non renseign\u00e9e dans le fichier source. Le bloc conditionnel s&rsquo;ex\u00e9cutera donc pour ces observations, appliquant ind\u00fbment des formules de remise, de reclassement ou de calcul de p\u00e9nalit\u00e9 \u00e0 des entit\u00e9s pour lesquelles l&rsquo;information est fondamentalement inconnue, introduisant ainsi une distorsion m\u00e9thodologique majeure dans les mod\u00e8les \u00e9conom\u00e9triques finaux.<\/p>\n<p>Pour immuniser le code contre cet effet pervers, il est indispensable de faire appel \u00e0 la fonction syst\u00e8me pr\u00e9compil\u00e9e <strong>MISSING()<\/strong>, ou d&rsquo;encadrer explicitement la comparaison par des bornes inf\u00e9rieures valides. La formulation d&rsquo;un test robuste doit obligatoirement s&rsquo;\u00e9crire :<br \/>\n<strong>IF<\/strong> NOT MISSING(Montant_Ventes) AND Montant_Ventes &lt; 50000 <strong>THEN DO;<\/strong><br \/>\nAlternativement, l&rsquo;expression peut recourir \u00e0 la comparaison d&rsquo;exclusion :<br \/>\n<strong>IF<\/strong> . &lt; Montant_Ventes &lt; 50000 <strong>THEN DO;<\/strong><br \/>\nCette seconde notation exploite la capacit\u00e9 unique de SAS \u00e0 cha\u00eener les comparaisons d&rsquo;in\u00e9galit\u00e9 continue, garantissant de fa\u00e7on irr\u00e9futable que seules les observations pr\u00e9sentant une valeur num\u00e9rique strictement sup\u00e9rieure au point d&rsquo;absence et inf\u00e9rieure au seuil limite ne p\u00e9n\u00e8trent \u00e0 l&rsquo;int\u00e9rieur du bloc <strong>DO-END<\/strong>.<\/p>\n<h3>6.3 Conditions textuelles et sensibilit\u00e9 \u00e0 la casse<\/h3>\n<p>L&rsquo;\u00e9valuation des pr\u00e9dicats portant sur des cha\u00eenes de caract\u00e8res impose des pr\u00e9cautions m\u00e9thodologiques sym\u00e9triques \u00e0 celles requises pour les grandeurs num\u00e9riques, principalement en raison de la stricte sensibilit\u00e9 \u00e0 la casse (case sensitivity) r\u00e9gissant les comparaisons de cha\u00eenes en environnement SAS standard. Par d\u00e9faut, la cha\u00eene litt\u00e9rale &lsquo;Paris&rsquo; n&rsquo;est aucunement \u00e9quivalente \u00e0 la cha\u00eene &lsquo;PARIS&rsquo;, ni \u00e0 la variante &lsquo;paris&rsquo;. Une condition <strong>IF<\/strong> formul\u00e9e na\u00efvement sur une cha\u00eene brute \u00e9chouera \u00e0 identifier les enregistrements valides d\u00e8s lors que la saisie pr\u00e9sente la moindre variation de casse orthographique.<\/p>\n<p>La neutralisation de cette instabilit\u00e9 s&rsquo;op\u00e8re par l&rsquo;adjonction syst\u00e9matique de fonctions de normalisation textuelle au niveau de l&rsquo;expression conditionnelle elle-m\u00eame. Les fonctions int\u00e9gr\u00e9es <strong>UPCASE()<\/strong> et <strong>LOWCASE()<\/strong> convertissent dynamiquement la variable en m\u00e9moire vers un registre typographique uniforme lors de la phase d&rsquo;\u00e9valuation, sans pour autant alt\u00e9rer la valeur originelle conserv\u00e9e dans la variable source si celle-ci ne fait pas l&rsquo;objet d&rsquo;une r\u00e9assignation. Ainsi, le pr\u00e9dicat :<br \/>\n<strong>IF<\/strong> UPCASE(Nom_Ville) = &lsquo;PARIS&rsquo; <strong>THEN DO;<\/strong><br \/>\nvalidera avec une exactitude absolue n&rsquo;importe quelle d\u00e9clinaison morphologique de la graphie du mot.<\/p>\n<p>De surcro\u00eet, les variables textuelles issues de fichiers plats ou de transferts relationnels d&rsquo;anciennes architectures contiennent fr\u00e9quemment des espaces r\u00e9siduels invisibles, qu&rsquo;ils soient positionn\u00e9s en t\u00eate ou en queue de cha\u00eene. Ces caract\u00e8res d&rsquo;espacement modifient la valeur binaire de la cha\u00eene et bloquent les tests d&rsquo;\u00e9galit\u00e9. L&rsquo;application des fonctions <strong>STRIP()<\/strong> (qui \u00e9limine simultan\u00e9ment les espaces initiaux et terminaux) ou <strong>COMPBL()<\/strong> (qui r\u00e9duit les espaces cons\u00e9cutifs internes \u00e0 un unique intervalle blanc) combin\u00e9e \u00e0 l&rsquo;op\u00e9rateur ensembliste <strong>IN<\/strong> permet de construire des pr\u00e9dicats \u00e0 l&rsquo;\u00e9preuve des corruptions de saisie, garantissant l&rsquo;activation l\u00e9gitime des blocs <strong>DO-END<\/strong> associ\u00e9s.<\/p>\n<h2>7. L&rsquo;alternative structurelle : Int\u00e9gration de ELSE DO et DO-END<\/h2>\n<h3>7.1 Architecture d&rsquo;une structure conditionnelle exhaustive<\/h3>\n<p>Dans la th\u00e9orie g\u00e9n\u00e9rale des syst\u00e8mes et de l&rsquo;ing\u00e9nierie algorithmique, un syst\u00e8me d&rsquo;aiguillage n&rsquo;atteint la robustesse d\u00e9terministe que s&rsquo;il couvre de fa\u00e7on exhaustive l&rsquo;int\u00e9gralit\u00e9 de l&rsquo;espace d&rsquo;\u00e9tats d&rsquo;un ph\u00e9nom\u00e8ne donn\u00e9. Se contenter d&rsquo;une instruction isol\u00e9e <strong>IF-THEN-DO<\/strong> laisse les observations ne satisfaisant pas la condition dans un \u00e9tat de traitement non explicit\u00e9 par le code source, ce qui engendre des valeurs manquantes impr\u00e9vues ou la persistance involontaire d&rsquo;\u00e9tats ant\u00e9rieurs. Pour rem\u00e9dier \u00e0 cette faille structurelle, le langage SAS met \u00e0 disposition la clause alternative <strong>ELSE DO<\/strong>.<\/p>\n<p>L&rsquo;architecture conditionnelle exhaustive s&rsquo;articule autour d&rsquo;une sym\u00e9trie rigoureuse : \u00e0 chaque bloc d&rsquo;affirmation <strong>IF-THEN-DO<\/strong> r\u00e9pond un bloc de n\u00e9gation ou de d\u00e9rivation compl\u00e9mentaire ouvert par les mots <strong>ELSE DO;<\/strong> et clos par son propre d\u00e9limiteur <strong>END;<\/strong>. Cette syntaxe se mat\u00e9rialise de la sorte :<\/p>\n<p><strong>IF<\/strong> condition-principale <strong>THEN DO;<\/strong><br \/>\nactions-du-cas-positif;<br \/>\n<strong>END;<\/strong><br \/>\n<strong>ELSE DO;<\/strong><br \/>\nactions-du-cas-alternatif;<br \/>\n<strong>END;<\/strong><\/p>\n<p>Dans cette configuration canonique, l&rsquo;\u00e9tanch\u00e9it\u00e9 logique est absolue. Chaque observation traversant l&rsquo;\u00e9tape DATA est obligatoirement dirig\u00e9e vers l&rsquo;un des deux compartiments d&rsquo;ex\u00e9cution. Il n&rsquo;existe aucun \u00e9tat interm\u00e9diaire non contr\u00f4l\u00e9 : si le pr\u00e9dicat s&rsquo;\u00e9value comme vrai, les actions du bloc positif sont ex\u00e9cut\u00e9es et le bloc <strong>ELSE DO<\/strong> est totalement ignor\u00e9 ; dans le cas rigoureusement inverse, le processeur enjambe le premier bloc pour consacrer l&rsquo;int\u00e9gralit\u00e9 des ressources au bloc alternatif.<\/p>\n<h3>7.2 Cha\u00eenes de d\u00e9cisions multiniveaux avec ELSE IF-THEN-DO<\/h3>\n<p>D\u00e8s lors que la segmentation logique d&rsquo;un portefeuille de donn\u00e9es requiert une partition en plus de deux \u00e9tats mutuellement exclusifs, l&rsquo;assemblage lin\u00e9aire de blocs distincts s&rsquo;op\u00e8re par l&rsquo;entremise de cascades d\u00e9cisionnelles formul\u00e9es avec la clause <strong>ELSE IF-THEN-DO<\/strong>. Cette cha\u00eene d&rsquo;\u00e9valuation s\u00e9quentielle hi\u00e9rarchis\u00e9e constitue l&rsquo;\u00e9quivalent proc\u00e9dural le plus efficient pour formaliser des r\u00e8gles m\u00e9tier \u00e0 seuils d&rsquo;activation \u00e9chelonn\u00e9s.<\/p>\n<p>L&rsquo;avantage computationnel fondamental de la structure <strong>ELSE IF<\/strong> par rapport \u00e0 une succession na\u00efve de plusieurs blocs <strong>IF<\/strong> simples r\u00e9side dans l&rsquo;interruption pr\u00e9coce du cycle d&rsquo;\u00e9valuation. Lorsqu&rsquo;une observation valide le premier test conditionnel, SAS ex\u00e9cute le premier bloc <strong>DO-END<\/strong>, puis contourne purement et simplement l&rsquo;ensemble des clauses <strong>ELSE IF<\/strong> et <strong>ELSE<\/strong> subs\u00e9quentes jusqu&rsquo;\u00e0 la fin de la cha\u00eene hi\u00e9rarchique. L&rsquo;unit\u00e9 centrale n&rsquo;ex\u00e9cute donc jamais de tests logiques superflus sur des conditions que l&rsquo;on sait par d\u00e9finition mutuellement exclusives avec les \u00e9tapes ant\u00e9rieures.<\/p>\n<p>Une bonne pratique de programmation industrielle consiste \u00e0 clore syst\u00e9matiquement ces cha\u00eenes de d\u00e9cision multiniveaux par une clause <strong>ELSE DO; &#8230; END;<\/strong> terminale d\u00e9pourvue de condition explicite. Cette branche r\u00e9siduelle finale agit comme une trappe de s\u00e9curit\u00e9 (catch-all), recueillant tous les enregistrements aux profils atypiques, aberrants ou non anticip\u00e9s par les mod\u00e9lisateurs. On peut y consigner des assignations d&rsquo;alerte, incr\u00e9menter des variables de rejet ou ins\u00e9rer des messages d&rsquo;erreur trac\u00e9s au moyen de l&rsquo;instruction <strong>PUTLOG<\/strong>, pr\u00e9venant ainsi toute contamination de la base finale par des observations non trait\u00e9es.<\/p>\n<h3>7.3 Comparaison avec la clause SELECT-WHEN<\/h3>\n<p>Le langage SAS propose une structure conditionnelle concurrente pour la prise en charge des ramifications d\u00e9cisionnelles \u00e9tendues : le bloc <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/n02z7p38g2s9lyn1a0xegvd3m14z.htm\">SELECT-WHEN<\/a>. Il appara\u00eet d\u00e8s lors indispensable d&rsquo;\u00e9tablir les crit\u00e8res m\u00e9thodologiques guidant l&rsquo;arbitrage entre une architecture fond\u00e9e sur des blocs <strong>ELSE IF-THEN-DO<\/strong> et une architecture articul\u00e9e autour de directives <strong>SELECT-WHEN<\/strong>.<\/p>\n<p>L&rsquo;instruction <strong>SELECT<\/strong> excelle tout particuli\u00e8rement dans les contextes o\u00f9 l&rsquo;arbre de d\u00e9cision d\u00e9pend de l&rsquo;\u00e9valuation discr\u00e8te d&rsquo;une unique variable pivot, notamment lorsqu&rsquo;il s&rsquo;agit de transposer des codes de typologie d&rsquo;enregistrements en cat\u00e9gories explicites. Dans ce sc\u00e9nario pr\u00e9cis, la syntaxe <strong>SELECT(variable_pivot); WHEN(valeur_1) DO; &#8230; END; OTHERWISE DO; &#8230; END; END;<\/strong> offre une clart\u00e9 typographique incomparable et r\u00e9duit la redondance lexicale en \u00e9vitant d&rsquo;avoir \u00e0 r\u00e9\u00e9crire continuellement le nom de la variable test\u00e9e.<\/p>\n<p>En revanche, d\u00e8s que la logique d\u00e9cisionnelle mobilise des pr\u00e9dicats h\u00e9t\u00e9rog\u00e8nes faisant intervenir simultan\u00e9ment de multiples colonnes distinctes, des op\u00e9rations arithm\u00e9tiques compar\u00e9es \u00e0 des seuils glissants, ou des conjonctions bool\u00e9ennes asym\u00e9triques m\u00ealant variables de texte et grandeurs temporelles, la construction <strong>ELSE IF-THEN-DO<\/strong> retrouve une sup\u00e9riorit\u00e9 op\u00e9rationnelle \u00e9clatante. Elle offre une flexibilit\u00e9 totale dans la mod\u00e9lisation des conditions, sans obliger le processeur \u00e0 forcer la comparaison contre un s\u00e9lecteur centralis\u00e9, conf\u00e9rant au d\u00e9veloppeur une libert\u00e9 algorithmique int\u00e9grale dans la formulation des r\u00e8gles m\u00e9tier hautement complexes.<\/p>\n<h2>8. Imbrication avanc\u00e9e des blocs conditionnels<\/h2>\n<h3>8.1 Conception d&rsquo;arbres d\u00e9cisionnels hi\u00e9rarchis\u00e9s<\/h3>\n<p>La mod\u00e9lisation de processus industriels ou cliniques complexes impose fr\u00e9quemment d&rsquo;\u00e9valuer des conditions subordonn\u00e9es qui n&rsquo;ont de sens algorithmique que si et seulement si une condition ma\u00eetresse pr\u00e9liminaire a \u00e9t\u00e9 pr\u00e9alablement valid\u00e9e. L&rsquo;imbrication hi\u00e9rarchique de blocs conditionnels consiste \u00e0 int\u00e9grer un ou plusieurs blocs <strong>IF-THEN-DO &#8230; END<\/strong> complets \u00e0 l&rsquo;int\u00e9rieur du corps syntaxique d&rsquo;un bloc parent pr\u00e9existant.<\/p>\n<p>Dans cette architecture en poup\u00e9es russes, le flux logique proc\u00e8de par raffinements successifs. L&rsquo;analyseur du moteur SAS valide d&rsquo;abord le macro-crit\u00e8re d\u00e9limitant la cohorte d&rsquo;int\u00e9r\u00eat globale. Une fois le pointeur de traitement engag\u00e9 \u00e0 l&rsquo;int\u00e9rieur du bloc <strong>DO<\/strong> de premier rang, il rencontre un sous-pr\u00e9dicat r\u00e9gissant un sous-bloc interne. Ce second niveau affine la segmentation, par exemple en distinguant les sous-groupes posologiques au sein de la seule population des patients ayant valid\u00e9 le protocole initial. Si la condition parente \u00e9choue, l&rsquo;ensemble de la sous-arborescence interne est int\u00e9gralement enjamb\u00e9, \u00e9conomisant un temps de calcul substantiel.<\/p>\n<p>La r\u00e8gle d&rsquo;or r\u00e9gissant l&rsquo;int\u00e9grit\u00e9 de ces \u00e9difices algorithmiques r\u00e9side dans le respect absolu de la parit\u00e9 stricte entre les instructions d&rsquo;ouverture <strong>DO<\/strong> et les instructions de cl\u00f4ture <strong>END<\/strong>. Pour chaque mot-cl\u00e9 <strong>DO<\/strong> introduit au niveau sup\u00e9rieur ou dans les sous-branches, un mot-cl\u00e9 <strong>END<\/strong> rigoureusement homologue doit \u00eatre implant\u00e9 pour refermer le sous-ensemble avant que la branche parente ne puisse elle-m\u00eame \u00eatre scell\u00e9e. Toute asym\u00e9trie dans ce d\u00e9compte provoque une rupture fatale de structure d\u00e8s l&rsquo;\u00e9tape de compilation.<\/p>\n<h3>8.2 Contr\u00f4le d&rsquo;ex\u00e9cution fine avec DO s\u00e9quentiel et conditionnel<\/h3>\n<p>L&rsquo;utilisation de blocs <strong>DO<\/strong> sous la tutelle d&rsquo;une instruction <strong>IF<\/strong> ne se cantonne pas aux simples blocs d&rsquo;encapsulation non it\u00e9ratifs. Un pan extr\u00eamement puissant de la programmation SAS r\u00e9side dans la capacit\u00e9 \u00e0 fusionner des boucles it\u00e9ratives r\u00e9elles avec des conditions pr\u00e9alables, d\u00e9clenchant des it\u00e9rations complexes uniquement lorsque certaines caract\u00e9ristiques de donn\u00e9es sont r\u00e9unies \u00e0 l&rsquo;\u00e9chelle de l&rsquo;observation courante.<\/p>\n<p>Il est parfaitement valide d&rsquo;implanter des boucles indic\u00e9es index\u00e9es par des bornes num\u00e9riques enti\u00e8res sous une clause conditionnelle, sous la forme g\u00e9n\u00e9rale :<br \/>\n<strong>IF<\/strong> Critere_Activation = 1 <strong>THEN DO<\/strong> i = 1 <strong>TO<\/strong> dim(Tableau_Mesures);<br \/>\ncalculs-sur-tableau-i;<br \/>\n<strong>END;<\/strong><br \/>\nDans cette configuration, l&rsquo;initialisation de l&rsquo;indice de boucle et le parcours it\u00e9ratif des dimensions du vecteur ne se mat\u00e9rialisent que si la variable d&rsquo;activation a pr\u00e9alablement certifi\u00e9 la pertinence de l&rsquo;op\u00e9ration, \u00e9pargnant ainsi des millions d&rsquo;it\u00e9rations st\u00e9riles sur les lignes de donn\u00e9es non concern\u00e9es.<\/p>\n<p>De surcro\u00eet, le d\u00e9veloppeur peut introduire des boucles \u00e0 terminaison conditionnelle dynamique pilot\u00e9es par les clauses <strong>DO WHILE<\/strong> (\u00e9valuation du pr\u00e9dicat d&rsquo;it\u00e9ration en t\u00eate de boucle) ou <strong>DO UNTIL<\/strong> (\u00e9valuation du pr\u00e9dicat de sortie en queue de boucle) au sein d&rsquo;un bloc conditionnel primaire. Pour orchestrer les sorties d&rsquo;urgence lorsque des convergences asymptotiques ou des seuils de rupture analytique sont pr\u00e9matur\u00e9ment atteints \u00e0 l&rsquo;int\u00e9rieur de ces sous-boucles imbriqu\u00e9es, l&rsquo;instruction imp\u00e9rative <strong>LEAVE<\/strong> force le saut imm\u00e9diat hors de la boucle it\u00e9rative la plus interne, tandis que l&rsquo;instruction <strong>CONTINUE<\/strong> commande le passage instantan\u00e9 \u00e0 l&rsquo;it\u00e9ration indic\u00e9e suivante sans ex\u00e9cuter le reste du bloc.<\/p>\n<h3>8.3 Limites et risques de la sur-imbrication<\/h3>\n<p>Bien que le compilateur SAS autorise th\u00e9oriquement des niveaux d&rsquo;imbrication d&rsquo;une profondeur consid\u00e9rable, la prolif\u00e9ration incontr\u00f4l\u00e9e de blocs conditionnels superpos\u00e9s engendre des risques majeurs pour la gouvernance des syst\u00e8mes d&rsquo;information statistique. Le ph\u00e9nom\u00e8ne dit de sur-imbrication (ou code spaghetti) d\u00e9grade dramatiquement l&rsquo;indice de maintenabilit\u00e9 logicielle et accro\u00eet exponentiellement la probabilit\u00e9 d&rsquo;introduire des r\u00e9gressions lors des phases d&rsquo;\u00e9volution des r\u00e8gles m\u00e9tier.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/ifthendo2.jpg\" alt=\"\" \/><\/figure>\n<p>Lorsqu&rsquo;un arbre d\u00e9cisionnel franchit le seuil critique de quatre \u00e0 cinq niveaux d&rsquo;imbrications successives, la charge cognitive requise pour appr\u00e9hender l&rsquo;ensemble des ramifications devient prohibitive pour les \u00e9quipes d&rsquo;audit et de contr\u00f4le qualit\u00e9. Les strat\u00e9gies modernes d&rsquo;ing\u00e9nierie des donn\u00e9es recommandent alors formellement d&rsquo;adopter des mod\u00e8les architecturaux alternatifs :<\/p>\n<ul>\n<li>La d\u00e9composition du probl\u00e8me par modularisation, consistant \u00e0 segmenter un script monolithique en une succession de plusieurs \u00e9tapes DATA distinctes reli\u00e9es par des tables interm\u00e9diaires l\u00e9g\u00e8res (staging datasets) ;<\/li>\n<li>Le recours aux tables de transcodage de param\u00e8tres g\u00e9r\u00e9es via des \u00e9tapes d&rsquo;appariement relationnel optimis\u00e9 sous <strong>PROC SQL<\/strong> ou par des jointures en m\u00e9moire par hachage (hash objects) ;<\/li>\n<li>La factorisation de segments r\u00e9currents d&rsquo;instructions conditionnelles au sein de macro-fonctions SAS param\u00e9trables compil\u00e9es dans le catalogue central de l&rsquo;environnement de production.<\/li>\n<\/ul>\n<h2>9. Traitement dynamique des flux de donn\u00e9es : OUTPUT conditionnel<\/h2>\n<h3>9.1 R\u00e8gles d&rsquo;\u00e9criture implicite vs explicite dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>Par d\u00e9faut, l&rsquo;\u00e9tape DATA ob\u00e9it \u00e0 un m\u00e9canisme d&rsquo;\u00e9criture enti\u00e8rement automatique et implicite. \u00c0 chaque cycle d&rsquo;it\u00e9ration, lorsque le pointeur d&rsquo;ex\u00e9cution atteint la derni\u00e8re instruction textuelle formalisant le p\u00e9rim\u00e8tre de l&rsquo;\u00e9tape DATA (symbolis\u00e9e par la ligne <strong>RUN;<\/strong>), le moteur SAS transf\u00e8re spontan\u00e9ment l&rsquo;int\u00e9gralit\u00e9 du contenu instantan\u00e9 des variables du Program Data Vector vers le fichier de donn\u00e9es de sortie physique sur disque, avant de purger les m\u00e9moires volatiles et d&rsquo;engager la lecture de l&rsquo;observation suivante.<\/p>\n<p>Cependant, l&rsquo;introduction d&rsquo;une seule instruction explicite <strong>OUTPUT<\/strong> \u00e0 n&rsquo;importe quel endroit du code source modifie radicalement et irr\u00e9versiblement ce comportement par d\u00e9faut. D\u00e8s lors que le compilateur identifie la pr\u00e9sence d&rsquo;une commande <strong>OUTPUT<\/strong>, il d\u00e9sactive de mani\u00e8re permanente le m\u00e9canisme de vidage automatique en queue de boucle. D\u00e8s lors, plus aucune observation n&rsquo;est inscrite dans la table finale \u00e0 moins que le fil d&rsquo;ex\u00e9cution ne franchisse physiquement une instruction <strong>OUTPUT<\/strong> formul\u00e9e de mani\u00e8re explicite.<\/p>\n<p>Cette mutation paradigmatique trouve son expression la plus puissante lorsqu&rsquo;elle est encapsul\u00e9e \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc conditionnel <strong>IF-THEN-DO<\/strong>. L&rsquo;analyste s&rsquo;arroge ainsi un contr\u00f4le chirurgical sur la g\u00e9n\u00e9ration des enregistrements physiques. Il devient possible de d\u00e9cider non seulement si une ligne donn\u00e9e doit \u00eatre mat\u00e9rialis\u00e9e dans la table finale, mais \u00e9galement de dupliquer dynamiquement une observation d&rsquo;entr\u00e9e en plusieurs observations de sortie diff\u00e9renci\u00e9es en multipliant l&rsquo;appel \u00e0 des ordres <strong>OUTPUT<\/strong> au gr\u00e9 de transformations de variables cadenc\u00e9es au sein du m\u00eame bloc d\u00e9cisionnel.<\/p>\n<h3>9.2 Ventilation conditionnelle vers plusieurs tables cibles<\/h3>\n<p>L&rsquo;une des architectures les plus efficaces permises par le couplage de <strong>IF-THEN-DO<\/strong> et d&rsquo;instructions d&rsquo;\u00e9criture explicite r\u00e9side dans le routage dynamique et simultan\u00e9 d&rsquo;un flux de donn\u00e9es brut unique vers une multiplicit\u00e9 de tables analytiques sp\u00e9cialis\u00e9es. Cette op\u00e9ration de ventilation multidirectionnelle s&rsquo;op\u00e8re en d\u00e9clarant l&rsquo;ensemble des tables de sortie cibles au sein de l&rsquo;instruction d&rsquo;en-t\u00eate de l&rsquo;\u00e9tape DATA, s\u00e9par\u00e9es par de simples espaces :<br \/>\n<strong>DATA<\/strong> table_actifs table_dormants table_contentieux table_rejets;<\/p>\n<p>Au c\u0153ur du script proc\u00e9dural, une cascade de blocs conditionnels <strong>IF-THEN-DO<\/strong> segmentant la patient\u00e8le ou la client\u00e8le oriente chaque observation vers sa destination idoine. L&rsquo;instruction <strong>OUTPUT<\/strong> s&rsquo;enrichit alors d&rsquo;un argument sp\u00e9cifiant express\u00e9ment le nom de la table cible sur laquelle l&rsquo;\u00e9criture doit imm\u00e9diatement \u00eatre d\u00e9vers\u00e9e :<\/p>\n<p><strong>IF<\/strong> Solde &gt; 0 AND Statut = &lsquo;ACT&rsquo; <strong>THEN DO;<\/strong><br \/>\nDate_Derniere_Activite = today();<br \/>\n<strong>OUTPUT<\/strong> table_actifs;<br \/>\n<strong>END;<\/strong><br \/>\n<strong>ELSE IF<\/strong> Solde = 0 <strong>THEN DO;<\/strong><br \/>\nDuree_Inactivite = today() &#8211; Date_Cloture;<br \/>\n<strong>OUTPUT<\/strong> table_dormants;<br \/>\n<strong>END;<\/strong><br \/>\n<strong>ELSE IF<\/strong> Solde &lt; 0 <strong>THEN DO;<\/strong><br \/>\nNiveau_Risque = &lsquo;Critique&rsquo;;<br \/>\n<strong>OUTPUT<\/strong> table_contentieux;<br \/>\n<strong>END;<\/strong><\/p>\n<p>Ce patron d&rsquo;architecture offre un gain de performance mat\u00e9riel monumental par rapport aux m\u00e9thodologies na\u00efves consistant \u00e0 ex\u00e9cuter plusieurs \u00e9tapes DATA cons\u00e9cutives appliquant des filtres <strong>WHERE<\/strong> successifs sur la m\u00eame table de base volumineuse. L&rsquo;int\u00e9gralit\u00e9 du processus d&rsquo;aiguillage s&rsquo;effectue ici en une seule passe de lecture des disques de stockage, divisant drastiquement les op\u00e9rations d&rsquo;entr\u00e9es\/sorties physiques (I\/O throughput).<\/p>\n<h3>9.3 Filtrage et suppression d&rsquo;enregistrements avec DELETE<\/h3>\n<p>\u00c0 l&rsquo;exact oppos\u00e9 de l&rsquo;action constructive mat\u00e9rialis\u00e9e par l&rsquo;instruction <strong>OUTPUT<\/strong>, la directive <strong>DELETE<\/strong> permet de purger instantan\u00e9ment les observations non conformes ou polluantes au sein d&rsquo;un pipeline de pr\u00e9traitement. L&rsquo;int\u00e9gration de l&rsquo;instruction <strong>DELETE<\/strong> \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc <strong>IF-THEN-DO<\/strong> r\u00e9pond g\u00e9n\u00e9ralement \u00e0 des crit\u00e8res de rejet multicrit\u00e8res associant des v\u00e9rifications de coh\u00e9rence arithm\u00e9tique et des alertes de corruption de format.<\/p>\n<p>Lorsque le fil d&rsquo;ex\u00e9cution p\u00e9n\u00e8tre dans un bloc conditionnel comportant l&rsquo;instruction <strong>DELETE;<\/strong>, SAS interrompt sans d\u00e9lai l&rsquo;\u00e9valuation du reste de l&rsquo;\u00e9tape DATA pour l&rsquo;observation courante. Le PDV ne fait l&rsquo;objet d&rsquo;aucune \u00e9criture dans aucune table de sortie, l&rsquo;ex\u00e9cution saute imm\u00e9diatement par-dessus toutes les instructions r\u00e9siduelles situ\u00e9es en aval, et le pointeur syst\u00e8me se repositionne au sommet de l&rsquo;\u00e9tape DATA pour appeler l&rsquo;enregistrement suivant depuis le fichier source.<\/p>\n<p>Sur le plan m\u00e9thodologique, l&rsquo;usage de <strong>DELETE<\/strong> \u00e0 l&rsquo;int\u00e9rieur de blocs conditionnels doit \u00eatre mani\u00e9 avec une prudence extr\u00eame. L&rsquo;\u00e9limination pr\u00e9coce de lignes peut alt\u00e9rer silencieusement la repr\u00e9sentativit\u00e9 d&rsquo;un \u00e9chantillon d&rsquo;inf\u00e9rence statistique. Les standards d&rsquo;audit contemporains recommandent de privil\u00e9gier, dans la mesure des ressources de stockage disponibles, la redirection vers une table de quarantaine d\u00e9di\u00e9e (au moyen d&rsquo;un <strong>OUTPUT<\/strong> vers une table d&rsquo;anomalies) plut\u00f4t qu&rsquo;une suppression brute par <strong>DELETE<\/strong>, pr\u00e9servant ainsi la tra\u00e7abilit\u00e9 int\u00e9grale de l&rsquo;ensemble des donn\u00e9es \u00e9cart\u00e9es pour les revues de validation des mod\u00e8les.<\/p>\n<h2>10. Erreurs syntaxiques, diagnostics et d\u00e9bogage<\/h2>\n<h3>10.1 Omission ou d\u00e9s\u00e9quilibre de l&rsquo;instruction END<\/h3>\n<p>L&rsquo;anomalie de programmation la plus fr\u00e9quente lors de la mise en \u0153uvre de structures conditionnelles \u00e9tendues r\u00e9side dans la rupture d&rsquo;\u00e9quilibre entre l&rsquo;amorce d&rsquo;un bloc par la directive <strong>DO<\/strong> et sa fermeture par l&rsquo;instruction <strong>END<\/strong>. Cette omission survient r\u00e9guli\u00e8rement lors de sessions de refactorisation logicielle, lorsqu&rsquo;un analyste d\u00e9place des pans d&rsquo;instructions ou imbrique de nouvelles r\u00e8gles sans v\u00e9rifier scrupuleusement la balance des d\u00e9limiteurs.<\/p>\n<p>Lorsque le compilateur SAS atteint le terme formel de l&rsquo;\u00e9tape DATA (marqu\u00e9 par l&rsquo;instruction <strong>RUN;<\/strong>) alors qu&rsquo;un ou plusieurs blocs <strong>DO<\/strong> demeurent ouverts dans la pile des instructions, il stoppe net la proc\u00e9dure de compilation et consigne dans le journal SAS une erreur explicite g\u00e9n\u00e9ralement libell\u00e9e :<br \/>\n<em>ERROR: Statement is not valid or it is used out of proper order<\/em>, ou encore :<br \/>\n<em>ERROR: The DO statement was not matched by an END statement.<\/em><br \/>\nCette interruption pr\u00e9vient l&rsquo;ex\u00e9cution d&rsquo;un code corrompu, mais le diagnostic peut s&rsquo;av\u00e9rer laborieux sur des scripts \u00e9tal\u00e9s sur plusieurs milliers de lignes.<\/p>\n<p>L&rsquo;effet de cascade provoqu\u00e9 par un <strong>END<\/strong> manquant d\u00e9stabilise totalement l&rsquo;arbre syntaxique : toutes les instructions situ\u00e9es en dessous du bloc incrimin\u00e9 sont subordonn\u00e9es par erreur \u00e0 la condition initiale, alt\u00e9rant la port\u00e9e fonctionnelle de pans entiers du programme. Pour neutraliser rapidement ces dysfonctionnements, les environnements int\u00e9gr\u00e9s de d\u00e9veloppement SAS modernes (tels que SAS Enterprise Guide ou SAS Studio) int\u00e8grent des m\u00e9canismes d&rsquo;analyse lexicale statique et de mise en surbrillance automatique des blocs appari\u00e9s, permettant d&rsquo;identifier imm\u00e9diatement la ligne exacte o\u00f9 la parit\u00e9 structurelle a \u00e9t\u00e9 rompue.<\/p>\n<h3>10.2 Gestion des conflits d&rsquo;assignation et initialisations involontaires<\/h3>\n<p>Une probl\u00e9matique conceptuelle majeure fr\u00e9quemment rencontr\u00e9e lors du recours aux blocs <strong>IF-THEN-DO<\/strong> concerne la gestion du statut d&rsquo;initialisation des variables calcul\u00e9es au fil des it\u00e9rations du PDV. Dans le cycle standard de l&rsquo;\u00e9tape DATA, toute variable cr\u00e9\u00e9e par une formule d&rsquo;affectation interne (contrairement \u00e0 celles lues directement depuis une table via l&rsquo;ordre <strong>SET<\/strong>) est r\u00e9initialis\u00e9e \u00e0 sa valeur manquante (. ou espace) au tout d\u00e9but de chaque nouvelle it\u00e9ration de lecture.<\/p>\n<p>Si une variable cible n&rsquo;est aliment\u00e9e qu&rsquo;au sein d&rsquo;un bloc <strong>IF-THEN-DO<\/strong> activ\u00e9 de fa\u00e7on sporadique, elle prendra sa valeur assign\u00e9e pour les observations qui remplissent la condition, mais retournera instantan\u00e9ment \u00e0 la valeur manquante pour toutes les observations suivantes qui \u00e9chouent au test conditionnel. Si le dessein du programmeur \u00e9tait en r\u00e9alit\u00e9 de conserver la derni\u00e8re valeur calcul\u00e9e valide pour l&rsquo;appliquer par propagation descendante aux observations intercalaires, l&rsquo;\u00e9tape DATA produira un r\u00e9sultat totalement erron\u00e9 constitu\u00e9 d&rsquo;\u00eelots de valeurs entour\u00e9s de vides statistiques.<\/p>\n<p>La r\u00e9solution de cette anomalie de persistance impose l&rsquo;utilisation concert\u00e9e de l&rsquo;instruction d\u00e9clarative <strong>RETAIN<\/strong>. En d\u00e9clarant la variable concern\u00e9e au sein d&rsquo;une directive <strong>RETAIN<\/strong>, le programmeur ordonne formellement au moteur SAS de suspendre la purge automatique de la m\u00e9moire du PDV pour cette colonne sp\u00e9cifique lors du passage d&rsquo;une observation \u00e0 la suivante. D\u00e8s lors, la variable conserve sa valeur issue de la derni\u00e8re ex\u00e9cution valide du bloc <strong>IF-THEN-DO<\/strong> jusqu&rsquo;\u00e0 ce qu&rsquo;une nouvelle observation satisfasse de nouveau la condition et vienne \u00e9craser le contenu de l&#8217;emplacement m\u00e9moire avec une nouvelle estimation actualis\u00e9e.<\/p>\n<h3>10.3 Outils de diagnostic dans le journal SAS<\/h3>\n<p>Lorsque le comportement observ\u00e9 d&rsquo;un algorithme conditionnel diverge des pr\u00e9dictions th\u00e9oriques de l&rsquo;analyste, le recours aux outils d&rsquo;instrumentation interne et de tra\u00e7age temps r\u00e9el s&rsquo;impose pour diagnostiquer les anomalies de flux au sein du PDV. L&rsquo;instruction la plus fondamentale et la plus imm\u00e9diatement accessible demeure l&rsquo;ordre <strong>PUT<\/strong> combin\u00e9 ou non avec la variante contemporaine <strong>PUTLOG<\/strong>.<\/p>\n<p>L&rsquo;insertion strat\u00e9gique d&rsquo;instructions d&rsquo;impression dans le journal \u00e0 l&rsquo;int\u00e9rieur m\u00eame du corps d&rsquo;un bloc conditionnel permet de valider empiriquement si et quand la condition est franchie lors de l&rsquo;ex\u00e9cution :<\/p>\n<p><strong>IF<\/strong> Anomalie_Detectee = 1 <strong>THEN DO;<\/strong><br \/>\nPUTLOG &lsquo;ATTENTION : Condition franchie pour l observation num\u00e9ro &lsquo; _N_ &lsquo; Identifiant = &lsquo; Identifiant_Client;<br \/>\nactions-de-traitement;<br \/>\n<strong>END;<\/strong><\/p>\n<p>L&rsquo;utilisation de la variable automatique du syst\u00e8me <strong>_N_<\/strong> (qui d\u00e9nombre les it\u00e9rations successives de l&rsquo;\u00e9tape DATA) coupl\u00e9e \u00e0 la variable automatique <strong>_ERROR_<\/strong> fournit une visibilit\u00e9 absolue sur l&rsquo;\u00e9tat instantan\u00e9 du vecteur m\u00e9moire au moment pr\u00e9cis du d\u00e9clenchement du bloc. Enfin, pour les architectures critiques requ\u00e9rant un d\u00e9bogage pas \u00e0 pas interactif avec inspection dynamique de la m\u00e9moire, les praticiens chevronn\u00e9s peuvent solliciter le module <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/p1j77u4euvox6zn1f0vcm4v94jsc.htm\">DATA Step Debugger<\/a> en ajoutant l&rsquo;option <em>\/DEBUG<\/em> \u00e0 l&rsquo;\u00e9nonc\u00e9 de l&rsquo;instruction <strong>DATA<\/strong>, offrant ainsi un environnement d&rsquo;ex\u00e9cution sous contr\u00f4le total avec points d&rsquo;arr\u00eat (breakpoints) et surveillance de variables (watchers).<\/p>\n<h2>11. M\u00e9canique interne du vecteur de m\u00e9moire (PDV) et optimisation<\/h2>\n<h3>11.1 Cycle de vie des variables au sein du Program Data Vector<\/h3>\n<p>Pour appr\u00e9hender l&rsquo;efficience intime des blocs conditionnels, il est imp\u00e9ratif d&rsquo;analyser la cin\u00e9matique des micro-op\u00e9rations qui se d\u00e9roulent dans les registres physiques de la m\u00e9moire vive au gr\u00e9 de l&rsquo;\u00e9tape DATA. Le Program Data Vector (PDV) constitue l&rsquo;interface tampon fondamentale dress\u00e9e entre les sources de stockage physique persistant et la logique proc\u00e9durale compil\u00e9e. Lors de la phase de chargement initial, SAS dimensionne les blocs de m\u00e9moire du PDV pour accueillir rigoureusement toutes les variables d\u00e9clar\u00e9es ou inf\u00e9r\u00e9es du code.<\/p>\n<p>Le cycle de vie d&rsquo;une observation s&rsquo;articule selon une chor\u00e9graphie invariante :<\/p>\n<ul>\n<li>Initialisation des zones de m\u00e9moire : les variables internes calcul\u00e9es sont remises \u00e0 leur valeur manquante primitive par d\u00e9faut, tandis que les variables issues de tables persistantes via l&rsquo;instruction <strong>SET<\/strong> conservent temporairement leur \u00e9tat r\u00e9siduel jusqu&rsquo;au chargement physique du flux ;<\/li>\n<li>Lecture de l&rsquo;enregistrement externe : les donn\u00e9es brutes sont aspir\u00e9es et inscrites dans les emplacements correspondants du PDV ;<\/li>\n<li>D\u00e9roulement s\u00e9quentiel des instructions proc\u00e9durales : l&rsquo;unit\u00e9 centrale ex\u00e9cute les calculs de haut en bas selon la topologie compil\u00e9e du script ;<\/li>\n<li>Travers\u00e9e des structures conditionnelles : d\u00e8s qu&rsquo;un pr\u00e9dicat <strong>IF<\/strong> est valid\u00e9, les adresses des variables cibl\u00e9es au sein du bloc <strong>DO-END<\/strong> sont sollicit\u00e9es en \u00e9criture, \u00e9crasant les valeurs r\u00e9siduelles ant\u00e9rieures du PDV avec les nouveaux scalaires calcul\u00e9s ;<\/li>\n<li>Vidage ou \u00e9criture : les donn\u00e9es du PDV sont projet\u00e9es vers la m\u00e9moire tampon de sortie si un ordre d&rsquo;\u00e9criture (implicite ou explicite) est d\u00e9clench\u00e9.<\/li>\n<\/ul>\n<p>Cette chronologie souligne que l&rsquo;ordre physique dans lequel les blocs <strong>IF-THEN-DO<\/strong> sont positionn\u00e9s dans le fichier source conditionne directement l&rsquo;\u00e9tat transactionnel des variables \u00e0 chaque point d&rsquo;\u00e9tape. L&rsquo;utilisation d&rsquo;une variable au sein d&rsquo;un calcul intervenant dans un sous-bloc situ\u00e9 plus bas dans le script exploitera imp\u00e9rativement la valeur mut\u00e9e par le bloc conditionnel amont, illustrant la s\u00e9quentialit\u00e9 absolue du processus de mutation dans le PDV.<\/p>\n<h3>11.2 Optimisation des performances computationnelles<\/h3>\n<p>\u00c0 l&rsquo;\u00e8re du traitement massif de donn\u00e9es volumineuses (Big Data) portant sur des t\u00e9raoctets d&rsquo;archives transactionnelles ou des milliards d&rsquo;enregistrements d&rsquo;objets connect\u00e9s, l&rsquo;architecture des tests logiques conditionnels exerce un impact direct et massif sur les temps d&rsquo;occupation processeur et la consommation \u00e9nerg\u00e9tique des serveurs d&rsquo;entreprise. L&rsquo;optimisation algorithmique d&rsquo;une cha\u00eene de d\u00e9cision conditionnelle repose sur des principes fondamentaux d&rsquo;\u00e9valuation probabiliste.<\/p>\n<p>La r\u00e8gle d&rsquo;or pour la conception de cha\u00eenes conditionnelles multiniveaux structur\u00e9es en <strong>IF-THEN-DO &#8230; ELSE IF-THEN-DO<\/strong> consiste \u00e0 ordonner syst\u00e9matiquement les conditions de test par ordre de probabilit\u00e9 d\u00e9croissante d&rsquo;occurrence empirique. Si une r\u00e8gle m\u00e9tier s&rsquo;applique statistiquement \u00e0 80 % des observations d&rsquo;un \u00e9chantillon, tandis que deux autres r\u00e8gles alternatives ne concernent respectivement que 15 % et 5 % des individus, il est imp\u00e9ratif d&rsquo;implanter la condition couvrant les 80 % au tout d\u00e9but de la structure hi\u00e9rarchique.<\/p>\n<p>En proc\u00e9dant de la sorte, huit fois sur dix, le compilateur validera le tout premier pr\u00e9dicat rencontr\u00e9, ex\u00e9cutera le bloc <strong>DO<\/strong> associ\u00e9, et contournera instantan\u00e9ment l&rsquo;int\u00e9gralit\u00e9 des dizaines d&rsquo;autres tests logiques subordonn\u00e9s via le branchement direct vers la sortie de cha\u00eene. \u00c0 l&rsquo;inverse, positionner une condition rare en t\u00eate de structure contraint le processeur \u00e0 \u00e9valuer inutilement des expressions relationnelles co\u00fbteuses sur la quasi-totalit\u00e9 de la base de donn\u00e9es avant d&rsquo;atteindre le bloc l\u00e9gitime, dilapidant des milliards de cycles d&rsquo;horloge machine de mani\u00e8re purement st\u00e9rile.<\/p>\n<h3>11.3 Impact m\u00e9moire des instructions d\u00e9claratives dans le bloc<\/h3>\n<p>Une incompr\u00e9hension fr\u00e9quente chez les d\u00e9veloppeurs SAS concerne la distinction conceptuelle entre les instructions ex\u00e9cutables au moment du runtime et les instructions d\u00e9claratives interpr\u00e9t\u00e9es exclusivement lors de la phase de compilation pr\u00e9liminaire. Cette confusion conduit r\u00e9guli\u00e8rement \u00e0 des maladresses de conception, comme l&rsquo;insertion inutile d&rsquo;instructions de m\u00e9tadonn\u00e9es \u00e0 l&rsquo;int\u00e9rieur de blocs conditionnels <strong>IF-THEN-DO<\/strong>.<\/p>\n<p>Des instructions telles que <strong>KEEP<\/strong>, <strong>DROP<\/strong>, <strong>RENAME<\/strong>, <strong>LABEL<\/strong>, <strong>FORMAT<\/strong>, <strong>INFORMAT<\/strong> ou <strong>LENGTH<\/strong> ne sont jamais soumises \u00e0 la cin\u00e9matique d&rsquo;ex\u00e9cution s\u00e9quentielle r\u00e9gie par le pr\u00e9dicat <strong>IF<\/strong>. Le compilateur les extrait de fa\u00e7on prioritaire lors de sa lecture syntaxique pr\u00e9liminaire du code pour configurer d\u00e9finitivement la structure statique du PDV et la structure du dictionnaire de m\u00e9tadonn\u00e9es du fichier SAS final.<\/p>\n<p>Placer par exemple une instruction <strong>DROP Variable_X;<\/strong> \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un bloc conditionnel n&rsquo;aura jamais pour effet d&rsquo;\u00e9liminer la colonne uniquement pour les observations remplissant la condition. L&rsquo;instruction d\u00e9clarative s&rsquo;appliquera universellement et aveugl\u00e9ment \u00e0 la table tout enti\u00e8re, et la variable sera irr\u00e9m\u00e9diablement absente de l&rsquo;ensemble du jeu de donn\u00e9es final pour toutes les observations sans exception. L&rsquo;ing\u00e9nieur doit donc rigoureusement bannir toute instruction de sch\u00e9ma d\u00e9claratif de l&rsquo;int\u00e9rieur des blocs <strong>DO-END<\/strong>, et regrouper m\u00e9thodiquement l&rsquo;int\u00e9gralit\u00e9 de ces d\u00e9clarations au sommet absolu de l&rsquo;\u00e9tape DATA afin de refl\u00e9ter fid\u00e8lement la r\u00e9alit\u00e9 de la m\u00e9canique de compilation sous-jacente.<\/p>\n<h2>12. Bonnes pratiques de programmation et standards de documentation<\/h2>\n<h3>12.1 Conventions de mise en page et indentation<\/h3>\n<p>La lisibilit\u00e9 visuelle d&rsquo;un algorithme constitue le premier rempart contre les anomalies conceptuelles et la dette technique. Dans la mesure o\u00f9 le compilateur SAS ignore totalement les retours \u00e0 la ligne, les tabulations et les espaces blancs surnum\u00e9raires (consid\u00e9rant uniquement le point-virgule comme fronti\u00e8re lexicale), l&rsquo;analyste dispose d&rsquo;une libert\u00e9 totale de mise en page. Cependant, l&rsquo;absence de discipline formelle d\u00e9bouche inexorablement sur un code compact, ind\u00e9chiffrable et propice aux r\u00e9gressions lors des revues de code entre pairs.<\/p>\n<p>Les standards de programmation industrielle pr\u00e9conisent l&rsquo;adoption uniforme d&rsquo;un mod\u00e8le d&rsquo;indentation strict et standardis\u00e9 pour l&rsquo;ensemble des structures conditionnelles :<\/p>\n<ul>\n<li>Alignement vertical des mots-cl\u00e9s d&rsquo;amorce et d&rsquo;extinction : le mot-cl\u00e9 <strong>END;<\/strong> fermant un bloc conditionnel doit imp\u00e9rativement \u00eatre indent\u00e9 sur la m\u00eame colonne typographique que le mot-cl\u00e9 <strong>IF<\/strong> ou la clause <strong>ELSE DO<\/strong> qui lui a donn\u00e9 naissance ;<\/li>\n<li>Retrait syst\u00e9matique des instructions internes : l&rsquo;ensemble des instructions ex\u00e9cutables contenues entre <strong>DO;<\/strong> et <strong>END;<\/strong> doit faire l&rsquo;objet d&rsquo;un d\u00e9calage vers la droite d&rsquo;au minimum deux \u00e0 quatre espaces standardis\u00e9s (l&rsquo;usage des tabulations brutes \u00e9tant proscrit en raison de leur variabilit\u00e9 de rendu selon les \u00e9diteurs de texte) ;<\/li>\n<li>D\u00e9calage proportionnel des niveaux d&rsquo;imbrication : chaque sous-bloc conditionnel imbriqu\u00e9 dans une structure parente doit accro\u00eetre son niveau de retrait d&rsquo;un palier d&rsquo;indentation suppl\u00e9mentaire, rendant imm\u00e9diatement apparente la hi\u00e9rarchie des d\u00e9pendances logiques pour quiconque parcourt le script ;<\/li>\n<li>Consistance typographique : l&rsquo;adoption d&rsquo;une convention invariable quant \u00e0 la casse des mots-cl\u00e9s du syst\u00e8me SAS (conventionnellement en majuscules pour les commandes syntaxiques natives telles que <strong>IF<\/strong>, <strong>THEN<\/strong>, <strong>DO<\/strong>, <strong>END<\/strong>, <strong>ELSE<\/strong>) et des identifiants de variables (en notation CamelCase ou s\u00e9par\u00e9s par des traits de soulignement) conf\u00e8re au code une clart\u00e9 imm\u00e9diate.<\/li>\n<\/ul>\n<h3>12.2 Strat\u00e9gies de documentation interne du code<\/h3>\n<p>L&rsquo;int\u00e9gration de blocs conditionnels \u00e9tendus refl\u00e8te syst\u00e9matiquement la transcription informatique de r\u00e8gles de gestion ou de choix m\u00e9thodologiques statistiques cruciaux. Par cons\u00e9quent, l&rsquo;insertion rigoureuse de commentaires explicatifs au sein m\u00eame du script constitue une composante indissociable de la documentation projet, particuli\u00e8rement dans les contextes de recherche m\u00e9dicale ou de mod\u00e9lisation financi\u00e8re soumis aux audits des r\u00e9gulateurs de march\u00e9.<\/p>\n<p>Le langage SAS supporte deux syntaxes de commentaires : les commentaires de bloc d\u00e9limit\u00e9s par les s\u00e9quences de caract\u00e8res <em>\/*<\/em> et <em>*\/<\/em> (qui pr\u00e9sentent l&rsquo;avantage de pouvoir \u00eatre ins\u00e9r\u00e9s n&rsquo;importe o\u00f9, y compris au milieu d&rsquo;une ligne d&rsquo;instructions, et d&rsquo;englober plusieurs paragraphes sans n\u00e9cessiter de terminaison par point-virgule) et les commentaires d&rsquo;instruction d\u00e9butant par un ast\u00e9risque (*) et s&rsquo;achevant imp\u00e9rativement par un point-virgule (;).<\/p>\n<p>La r\u00e8gle m\u00e9thodologique fondamentale consiste \u00e0 documenter non pas l&rsquo;\u00e9vidence technique (inutile de commenter qu&rsquo;un bloc <strong>DO-END<\/strong> regroupe des assignations), mais bien la justification fonctionnelle sous-jacente. Il est imp\u00e9ratif de consigner en amont direct de chaque macro-bloc d\u00e9cisionnel : la r\u00e9f\u00e9rence exacte de la clause du cahier des charges m\u00e9tier ou du protocole clinique d&rsquo;essai valid\u00e9, l&rsquo;explication th\u00e9orique guidant le choix des seuils num\u00e9riques appliqu\u00e9s aux pr\u00e9dicats, ainsi que la date et l&rsquo;auteur de la derni\u00e8re modification structurelle apport\u00e9e \u00e0 l&rsquo;arbre conditionnel.<\/p>\n<h3>12.3 Synth\u00e8se et guide de r\u00e9f\u00e9rence rapide<\/h3>\n<p>Pour parachever l&rsquo;\u00e9laboration de scripts d&rsquo;ing\u00e9nierie statistique sans faille, il appara\u00eet hautement b\u00e9n\u00e9fique de soumettre chaque \u00e9tape DATA conditionnelle \u00e0 une liste de contr\u00f4le d&rsquo;audit pr\u00e9alable (checklist) avant toute transmission en environnement de pr\u00e9-production ou de production industrielle. Cette d\u00e9marche pr\u00e9ventive syst\u00e9matis\u00e9e permet d&rsquo;\u00e9radiquer la grande majorit\u00e9 des anomalies logiques et mat\u00e9rielles avant la phase de calcul intensif :<\/p>\n<ul>\n<li>V\u00e9rification formelle de la parit\u00e9 lexicale : le nombre d&rsquo;instructions d&rsquo;ouverture <strong>DO<\/strong> concorde-t-il rigoureusement avec le nombre d&rsquo;instructions de cl\u00f4ture <strong>END<\/strong> au sein de l&rsquo;\u00e9tape DATA ?<\/li>\n<li>Dimensionnement pr\u00e9ventif des cha\u00eenes : toutes les variables cat\u00e9goriques de type caract\u00e8re assign\u00e9es au sein des diff\u00e9rents embranchements ont-elles fait l&rsquo;objet d&rsquo;une d\u00e9claration explicite pr\u00e9alable via l&rsquo;instruction <strong>LENGTH<\/strong> pour pr\u00e9venir toute troncature silencieuse ?<\/li>\n<li>Neutralisation des valeurs manquantes : les conditions d&rsquo;in\u00e9galit\u00e9 stricte ou large v\u00e9rifient-elles l&rsquo;absence pr\u00e9alable de donn\u00e9es manquantes num\u00e9riques via la fonction <strong>MISSING()<\/strong> ou des bornes d&rsquo;exclusion explicites ?<\/li>\n<li>Normalisation de la casse textuelle : les pr\u00e9dicats portant sur des identifiants textuels mobilisent-ils des fonctions d&rsquo;harmonisation de casse telles que <strong>UPCASE()<\/strong> ou <strong>LOWCASE()<\/strong> et d&rsquo;\u00e9puration d&rsquo;espaces via <strong>STRIP()<\/strong> ?<\/li>\n<li>Couverture exhaustive de l&rsquo;espace d&rsquo;\u00e9tats : la structure conditionnelle prend-elle en charge l&rsquo;ensemble des \u00e9ventualit\u00e9s au moyen d&rsquo;une clause terminale <strong>ELSE DO<\/strong> agissant comme r\u00e9ceptacle de s\u00e9curit\u00e9 pour les valeurs inattendues ?<\/li>\n<li>Gestion explicite des flux de sortie : si l&rsquo;instruction <strong>OUTPUT<\/strong> ou l&rsquo;ordre <strong>DELETE<\/strong> est invoqu\u00e9 dans un bloc, le comportement sur le reste du flux d&rsquo;enregistrements a-t-il \u00e9t\u00e9 soigneusement anticip\u00e9 et test\u00e9 sur un \u00e9chantillon r\u00e9duit ?<\/li>\n<\/ul>\n<p>L&rsquo;ex\u00e9cution syst\u00e9matique de tests unitaires pr\u00e9liminaires sur des sous-\u00e9chantillons d&rsquo;enregistrements de contr\u00f4le, adoss\u00e9e \u00e0 une inspection rigoureuse des lignes du journal d&rsquo;ex\u00e9cution SAS, permet d&rsquo;attester de la conformit\u00e9 int\u00e9grale des structures logiques d\u00e9velopp\u00e9es, scellant ainsi l&rsquo;alliance entre rigueur math\u00e9matique et excellence en g\u00e9nie logiciel.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Cody, R. (2018). <em>Learning SAS by Example: A Programmer&rsquo;s Guide<\/em> (2nd ed.). SAS Institute.<\/p>\n<p>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute.<\/p>\n<p>Horstman, D. W. (2017). <em>Data Step vs. PROC SQL: What&rsquo;s a Programmer to Do?<\/em> SAS Global Forum Proceedings. SAS Institute. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/resources\/papers\/proceedings17\/0212-2017.pdf\">https:\/\/support.sas.com\/resources\/papers\/proceedings17\/0212-2017.pdf<\/a><\/p>\n<p>SAS Institute. (2020). <em>SAS(R) 9.4 Statements: Reference, Fifth Edition<\/em>. SAS Documentation. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/titlepage.htm<\/a><\/p>\n<p>SAS Institute. (2021). <em>Base SAS Procedures Guide: Statistical Procedures<\/em>. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/titlepage.htm<\/a><\/p>\n<p>Whitlock, I. (2007). <em>Categorizing Data in the DATA Step: Techniques and Comparison<\/em>. Lex Jansen SAS Papers Archive. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.lexjansen.com\/pharmasug\/2007\/cc\/CC08.pdf\">https:\/\/www.lexjansen.com\/pharmasug\/2007\/cc\/CC08.pdf<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet sur l&rsquo;instruction IF-THEN-DO dans SAS. Syntaxe, gestion du PDV, exemples pas \u00e0 pas et bonnes pratiques en programmation statistique.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[10195,11236,2469,3059,235],"class_list":["post-9832","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-etape-data","tag-if-then-do","tag-manipulation-de-donnees","tag-programmation-statistique","tag-sas"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9832"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9832\/revisions"}],"predecessor-version":[{"id":9836,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9832\/revisions\/9836"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}