Bonjour,
j'ai développé une fonction age avec PROC FCMP.
Cette fonction fonctionne bien dans une étape data.
J'aurais besoin de faire appel à cette fonction au sein d'une macro TestBornes.
J'obtiens le message :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 options cmplib=sasuser.funcs; %macro TestBornes(MyTableIn, MyTableOut, MyValueVide, MyValueOk, MyValueNok, MyFormatNok, MyValueNonTestee) / store; %global MyAge; data &MyTableOut; set &MyTableIn; %If dnaiss_ ne &MyFormatNok And dnaiss_ ne &MyValueVide %Then %Do; %let MyAge=%SYSFUNC(age(dnaiss)); %If %eval(&MyAge)>70 OR %eval(&MyAge)<16 %Then %Do; dnaiss_=&MyValueNok; %End; %Else %Do; dnaiss_=&MyValueOk; %End;%End; run; %Mend;
Citation:
ERROR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande
numérique est requis. La condition était : .
SYMBOLGEN : Macro variable MYAGE traitée dans .
ERROR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande
numérique est requis. La condition était : .
MLOGIC(TESTBORNES) : La condition %IF %eval(&MyAge)>70 OR %eval(&MyAge)<16 est TRUE
ERROR: L'exécution de la macro TESTBORNES va s'arrêter.
MLOGIC(TESTBORNES) : Fin de l'exécution.
J'utilise %SYSFUNC pour appeler la fonction.
Si quelqu'un a un exemple de syntaxe ça me dépannerait bien.
Merci ;)
Je viens de trouver une solution :Code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 proc fcmp outlib=sasuser.funcs.FonctionsDate; function Age(MyDatenaiss $); IF MyDatenaiss ne '' Then DO; stDate=Strip(MyDatenaiss); lLength=LENGTH(StDate); /* On traite un certain nombre d'informats de diférentes longueurs */ /* On ne traite pas la date si sa valeur vaut zéro */ IF (lLength eq 4 OR lLength eq 8 OR lLength eq 10) THEN DO; /* Décodage de l'informat yyyy */ IF lLength=4 THEN DO; stAnnee=SUBSTR(stDate,1,4); lAnnee=input(stAnnee,4.); Mydnaiss=mdy(6,15,lAnnee); MyAge=int((Today()-Mydnaiss)/365.25); END; /* Décodage de l'informat ddmmyyyy */ IF lLength=8 THEN DO; stAnnee=SUBSTR(stDate,5,4); stMois=SUBSTR(stDate,3,2); stJour=SUBSTR(stDate,1,2); lJour=input(stJour,2.); lMois=input(stMois,2.); lAnnee=input(stAnnee,4.); IF lJour>=1 AND lJour<=31 AND lMois>=1 AND lMois<=12 AND lAnnee>=1900 AND lAnnee<=2100 THEN DO; Mydnaiss=mdy(lMois,lJour,lAnnee); MyAge=int((Today()-Mydnaiss)/365.25); END; END; /* Décodage de l'informat dd/mm/yyyy */ IF lLength=10 THEN DO; stAnnee=SUBSTR(stDate,7,4); stMois=SUBSTR(stDate,4,2); stJour=SUBSTR(stDate,1,2); lJour=input(stJour,2.); lMois=input(stMois,2.); lAnnee=input(stAnnee,4.); If lJour>=1 AND lJour<=31 AND lMois>=1 AND lMois<=12 AND lAnnee>=1900 AND lAnnee<=2100 THEN DO; Mydnaiss=mdy(lMois,lJour,lAnnee); MyAge=int((Today()-Mydnaiss)/365.25); END; END; END; END; return(MyAge); ENDSUB;
J'utilise un Call Symputx pour récupérer la valeur de dnaiss :
Macro qui marche :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 options cmplib=sasuser.funcs; %macro TestBornes(MyTableIn, MyTableOut, MyValueVide, MyValueOk, MyValueNok, MyFormatNok, MyValueNonTestee) / store; %global MyVar; %global MyAge; data &MyTableOut; set &MyTableIn; %If dnaiss_ ne &MyFormatNok And dnaiss_ ne &MyValueVide %Then %Do; call symputx('MyVar',dnaiss); %let MyAge=%sysfunc(age(&MyVar)); %If %eval(&MyAge)>70 OR %eval(&MyAge)<16 %Then %Do; dnaiss_=&MyValueNok; %End; %Else %Do; dnaiss_=&MyValueOk; %End;%End; run; %Mend;