📖 Module VII bis - Bonnes pratiques de programmation
- Adopter les réflexes qui rendent un programme SAS lisible, robuste et rapide à corriger
- Reconnaître les messages d'erreur les plus fréquents dans la LOG et savoir les corriger
1. Les bonnes pratiques de programmation
Cette page rassemble des réflexes de programmation à prendre le plus tôt possible : ils ne sont pas propres à un module en particulier, mais utiles depuis le module III et jusqu'au dernier programme que vous écrirez ce semestre.
Le cartouche d'en-tête. Un bloc de commentaires au début du programme permet aux autres utilisateurs de reprendre rapidement le travail et identifie l'objectif et les paramètres. Y figurent le nom du programme, l'auteur, la date de création, les dates et sujets des modifications, la description, et les macros ou programmes appelés.
La taille des variables. Ajuster leur longueur économise l'espace disque et améliore les performances. Pour une variable caractère, chaque lettre occupe un octet, et la longueur doit toujours au moins correspondre à la valeur la plus longue attendue. LENGTH et ATTRIB sont à positionner avant la lecture de la table.
data WORK.EXEMPLE ;
attrib NOM length = $24 label = "Nom des societaires" ;
length AGE 3 ;
set DONNEES.PERSONNE ;
run ;
Modifier les caractéristiques d'une variable. Pour changer la longueur ou le libellé d'une variable sur une table de deux millions d'observations, une étape DATA relit tout le contenu. La PROC DATASETS modifie la structure sans parcourir les données.
La gestion des variables. Ne garder que les variables nécessaires, et le faire à la lecture :
/* A eviter */
data DONNEES.Personne2 ;
set DONNEES.Personne ;
keep NOM PRENOM TELEPHONE ;
run ;
/* A faire */
data DONNEES.Personne2 (keep = NOM PRENOM TELEPHONE) ;
set DONNEES.Personne (drop = CODEPOSTAL VILLE) ;
run ;
La gestion des tests conditionnels. Enchaîner des IF indépendants oblige SAS à tous les évaluer ; ELSE IF s'arrête au premier vrai.
/* A eviter */ if NOM = "Dupond" then ... ; if NOM = "Dupont" then ... ; /* A faire */ if NOM = "Dupond" then ... ; else if NOM = "Dupont" then ... ;
La gestion des étapes DATA. Toutes les étapes DATA ne nécessitent pas la création d'une table. Lorsque le seul but est de produire un effet de bord — créer une macro-variable, écrire dans la LOG — l'instruction _NULL_ évite des écritures inutiles.
data _null_ ;
set DONNEES.PERSONNE ;
if NOM = "Dupond" then call symput("Prenom", PRENOM) ;
run ;
Le suivi des ressources. L'option FULLSTIMER affiche le temps réel, le temps CPU utilisateur et système, et la mémoire utilisée en kilo-octets.
2. Les erreurs les plus fréquentes dans la LOG
La LOG est votre premier outil de diagnostic. Le tableau suivant recense les messages les plus fréquemment rencontrés, dans SAS Base comme en macro-langage.
| Message | Signification |
|---|---|
| Expecting a ; | Il manque un point-virgule à cet endroit |
| Syntax error, expecting one of the following... | Il manque un point-virgule ou une parenthèse, ou les options ne sont pas utilisées à bon escient |
| No matching DO/SELECT statement | Un END; a été placé sans DO; ou SELECT; correspondant |
| There was 1 unclosed DO block | Le END; a été oublié |
| The variable m in the DROP, KEEP, or RENAME list has never been referenced | Faute de frappe, variable inexistante, ou renommée plus haut dans l'étape DATA |
| Libname malib is not assigned | La librairie n'existe pas |
| Variable o is uninitialized / Missing values were generated... | Une variable sans valeur affectée est utilisée — souvent la lettre o au lieu du chiffre 0 |
| You cannot open WORK.X for output access... in use by you | La table est ouverte dans une fenêtre ViewTable ; fermez-la |
| Statement is not valid or it is used out of proper order | Instruction inexistante, mal orthographiée, inappropriée au contexte, ou point-virgule manquant avant |
| Data set was not specified on the DATA statement | Le mot suivant OUTPUT ne correspond à aucune table créée dans l'étape DATA |
| Undeclared array referenced: x | La notation x(i) a été utilisée hors du cas d'un tableau ARRAY |
| User does not have appropriate authorization level for file... | Droits d'accès insuffisants sur le répertoire de la librairie |
Background Colour
Font Face
Font Kerning
Image Visibility
Line Height
Link Highlight
Text Alignment
Font Size
Letter Spacing
Text Colour
Paragraph Width