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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
J'obtiens le message :

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

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
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;
Je viens de trouver une solution :

J'utilise un Call Symputx pour récupérer la valeur de dnaiss :

Macro qui marche :

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
 
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;