Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/09/2011, 15h08   #1
Invité de passage
 
Homme
autre
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : autre
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
Par défaut macro fonction personnalisée

Bonjour
je souhaite créer une 'macro fonction', j'ai presque trouvé le code que je voulais sur internet mais quand je l'adapte à mon problème ça ne marche pas. Voici ce que j'ai écrit:

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
 
%macro cherche(valeur,tab) ;
*Récupérer le(s) nom(s) du(es) champs de la TABLE 'tab'
	%let trouve=0;
    proc contents DATA = &tab noprint 
        out = CONTENTS ;
    run ;
    proc sql ;    
        SELECT DISTINCT(NAME)
        INTO   :LIST_VARIABLES
        separated BY ' '
        FROM CONTENTS
        ;
    quit ;                                           
*------------------------
		%let tabid=%sysfunc(open(&tab,i));
		%syscall SET(tabid);
		%let rec_tab=%sysfunc(fetch(&tabid));
 
*parcourir les enregistrements de la TABLE 'tab' et trouver 'valeur'
		%do %until (&rec_tab=-1);
			%IF &&&list_variables = &valeur %then %do;
				%let trouve=1;
			%end;
			%let rec_tab=%sysfunc(fetch(&tabid));
		%end;
	%let rec_tab=%sysfunc(close(&tabid));
*renvoyer 'trouve'
	%eval(&trouve);
%mend ;
Voici l'appel de la macro (dans une autre macro):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
DATA annee;
	INFILE datalines;
	input an;
datalines;
2008
2009
2010
;
run;
 
%macro test;
 %let var=%cherche(2000,annee);
 %put &var;
%mend;
%test;
et voici les messages d'erreurs...

Code :
1
2
3
4
 
WARNING: Référence symbolique apparente LIST_VARIABLES non traitée.
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 : &&&list_variables = &valeur
ERROR: L'exécution de la macro CHERCHE va s'arrêter.
HELP!
merci
db84360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 15h40   #2
Invité de passage
 
Homme
autre
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : autre
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
j'ai trouvé une solution alternative en passant en paramètre le champ dont j'ai besoin:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
%macro cherche(valeur,tab,champ) ;
	%let trouve=0;
	%let tabid=%sysfunc(open(&tab,i));
	%syscall SET(tabid);
	%let rec_tab=%sysfunc(fetch(&tabid));
	%do %until (&rec_tab=-1);
		%IF &&&champ = &valeur %then %do;
			%let trouve=1;
		%end;
		%let rec_tab=%sysfunc(fetch(&tabid));
	%end;
	%let rec_tab=%sysfunc(close(&tabid));
	%eval(&trouve);
%mend ;
 
%macro test;
	%let var=%cherche(2008,anneeiqrn,aniqrn);
	%put &var;
%mend;
 
%test;
mais je ne comprends pas pourquoi le code précédent ne fonctionne pas...
Si quelqu'un peut m'expliquer...
merci
db84360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h17   #3
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
parce qu'il manque un ";" en ligne 3
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h25   #4
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
ton algo a pour but de trouver "2000" dans n'importe quelle variable?

si c'est cela il y a quand même plus simple
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h13   #5
Invité de passage
 
Homme
autre
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : autre
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
merci... ça marche...
et c'est pour trouver n'importe quelle valeur dans n'importe quelle table
la macro 'test' est un test.
s'il y a plus simple je suis preneur...
db84360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h49   #6
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
Citation:
Envoyé par db84360 Voir le message
c'est pour trouver n'importe quelle valeur dans n'importe quelle table.
n'importe quelle valeur de n'importe quel type dans n'importe quelle colonne de n'importe quelle table?

C'est cela? et après tu veux savoir où tu as trouvé la valeur : dans quelle ligne/colonne?

Xav
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 09h03   #7
Invité de passage
 
Homme
autre
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : autre
Secteur : Service public

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 1
Points : 1
en fait je me suis pas servi de ce bout de programme, mais à la base c'était pour trouver la valeur dans une colonne spécifiée (ma solution alternative, que je n'ai pas utilisée non plus, était mieux... si, si!!!)
et copier l'enregistrement dans une autre table, nommée avec cette valeur.

je sais pas si je suis clair...

si tu veux je peux t'envoyer mon code complet à simplifier (je débute, c'est surement très mal écrit)
db84360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h41.


 
 
 
 
Partenaires

Hébergement Web