Bonjour à toutes et à tous,
Précisons que je suis encore un nouveau sous SAS...
Je dois travailler sur une base contenant des événements. Il va sans dire que pour certains enregistrements, je n'aurai pas d'événement alors que pour d'autres je peux en avoir (jusqu'à 20 ; c'est le maximum prévu). J'aurais besoin de connaitre le nombre d'événements pour chaque enregistrement. Quand événement il y a, la date de l'événement est saisi dans la base. Cette date est stockée dans la variable truc0101 pour le 1er événement, truc0201 pour le 2ième événement, truc0301 pour le 3ième etc..., jusqu'à truc2001.
Je me suis dit que j'allais compter le nombre de variable trucXX01 non manquante avec un truc du genre Nbevt = Nbevt + NOT(MISSING(trucXX01)). J'ai mis cette instruction dans une boucle sur XX. Et quand j'ai mon nombre NbEvt, je m'en sers pour initialiser une variable dans ma table.
Je pensais que ça pouvait marcher. Et en fait non... Ah bon ? Vous n'êtes pas surpris ??? Tiens... :-)
Donc en gros ma question est : comment je fais pour connaitre mon nombre d'événement pour chaque enregistrement ?
Merci d'avance pour votre aide !
Mon code ?
puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 /* Génération de variables */ DATA Db.Base; SET Db.Base; ATTRIB NbEIT LABEL = "Nombre d'EIT"; NbEIT = 0; RUN;
J'ai aussi essayé la version suivante (mais avec le même succès) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 %MACRO NombreEIT(); /* Pour tous les événements */ %DO cpt = 1 %TO 20; /* Détermination du préfixe de la variable eit0/eit selon la valeur du compteur */ %IF &cpt. < 10 %THEN %DO; %LET PreVar = eit0; %END; %ELSE %DO; %LET PreVar = eit; %END; /* Jusqu'à ce que la variable eitXX01 soit vide */ %DO %WHILE (MISSING(&PreVar.&cpt.01)); DATA Db.Base; Set Db.Base; /* Incémentation de la variable NbEIT de la base */ NbEIT = NbEIT + 1; RUN; %END; %END; %MEND NombreEIT; %NombreEIT();
Parfois, je me demande si j'ai bien compris la finalité des macros. J'ai l'impression que je leur demande un fonctionnement pour lequel elles ne sont pas pensées...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 %MACRO NombreEIT(); %LET CptEIT=0; /* Pour tous les événements */ %DO cpt = 1 %TO 20; /* Détermination du préfixe de la variable eit0/eit selon la valeur du compteur */ %IF &cpt. < 10 %THEN %DO; %LET PreVar = eit0; %END; %ELSE %DO; %LET PreVar = eit; %END; &CptEIT. = &CptEIT. + NOT(MISSING(&PreVar.&cpt.01)); %END; DATA Db.Base; SET Db.Base; NbEIT = &CptEIT.; RUN; %MEND NombreEIT; %NombreEIT();
Bref, encore merci d'avance !
Au plaisir,
Laurent
Partager