Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 28/11/2011, 14h41   #1
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Par défaut ma variable existe-t-elle ?

bonjour,

je souhaite tester dans une macro %do i = 1 to &nb; l'existence d'une variable.

Je m'explique :

je dois faire des calculs sur un type de variable : CHOIXn ...

j'ai plusieurs choix :
CHOIX1
CHOIX2
CHOIX3
...

CHOIX7

dans certaines tables il peut me manquer certains choix...

par exemple dans la table1 je peux avoir tous les CHOIX, dans la table2, je peux avoir seulement CHOIX1, CHOIX5 et CHOIX7... ça dépend des périodes.

sur ces variables, je dois faire des calculs... mais avant de faire des calculs sur ces variables, je dois vérifier si elle existe, et si elle n'existe pas... passer à la suivante.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
DATA _null_;
	SET TABLE ;
	call symput('var'||LEFT(trim(id_&arbo.)),nom5);
	call symput('nb',_n_);
RUN;
 
PROC SQL NOPRINT ;
CREATE TABLE croisement3 AS
SELECT  id_mkg
	%do i=1 %TO &nb. ;
	, (sum(&arbo.&i.)/id_mkg)-(count(&arbo.&i.)-1) AS &arbo._&i.
	%end ;
 
FROM croisement2 
GROUP BY id_mkg
;
QUIT;
dans la boucle
Code :
1
2
 
%do i=1 %TO &nb. ;
j'aimerais tester l'existence de la variable, si elle existe, je fais le calcul sinon je passe au i suivant.

Merci pour votre aide !
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h08   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Bonjour,

Regarde l'avant dernier poste, il traite du même problème.

Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h13   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Bonjour,

1) C'est quoi les choix ici

2) %do i=1 %to doit figurer dans une macro
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h23   #4
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par bahraoui Voir le message
Bonjour,

Regarde l'avant dernier poste, il traite du même problème.

Cordialement
Je ne crois pas... tu parles bien de ce sujet
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h26   #5
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Bonjour,

1) C'est quoi les choix ici

2) %do i=1 %to doit figurer dans une macro
1) il s'agit de &arbo.

&arbo = CHOIX
%do i=1 %to 7;
&arbo.&i. ;
%end;

==> CHOIX1
==> CHOIX2
==> CHOIX3
==> CHOIX4
==> CHOIX5
==> CHOIX6
==> CHOIX7

2) quelle est ton idée ? a priori oui, mais si tu as une solution intéressante...
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h36   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Tu as le bout de code que tu veux automatiser? Si oui, spécifie ce que tu veux mettre en macro-variables.

Je crois que Barahoui te parle de ce poste
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h40   #7
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Tu as le bout de code que tu veux automatiser? Si oui, spécifie ce que tu veux mettre en macro-variables.

Je crois que Barahoui te parle de ce poste
oui oui, le bout de code est celui que j'ai mis dans le premier topic.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
DATA _null_;
	SET TABLE ;
	call symput('var'||LEFT(trim(id_&arbo.)),nom5);
	call symput('nb',_n_);
RUN;
 
/*------ DEBUT CODE A AUTOMATISER ------*/
PROC SQL NOPRINT ;
CREATE TABLE croisement3 AS
SELECT  id_mkg
	%do i=1 %TO &nb. ;
 
/*------ PEUT-ON METTRE UN TEST POUR VERIFIER L'EXISTENCE DE LA VARIALBE ICI ? ET SI ELLE EXISTE FAIRE LE CALCUL SINON ALLER AU COMPTEUR SUIVANT------*/
	, (sum(&arbo.&i.)/id_mkg)-(count(&arbo.&i.)-1) AS &arbo._&i.
	%end ;
 
FROM croisement2 
GROUP BY id_mkg
;
QUIT;
/*------ FIN CODE A AUTOMATISER ------*/
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h47   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Tu peux l'adapter à ton cas si tu comprends ce programme, n'hésites pas à poser des questions si jamais tu comprends pas.

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
DATA toto;
input age;
cards;
45
78
55
78
39
;
run;
 
%macro AGREGER(TABLE=,variable=);
 
proc contents DATA=&TABLE out=out;
run;
 
 
proc sql noprint;
SELECT count(*) INTO :nb FROM out;
SELECT name INTO :val separated BY ' ' FROM out;
quit;
%do i=1 %TO &nb;
 
%let var&i=%scan(&val,&i,' ');
%IF &variable=&&var&i %then %do;
 
 
/* c'est ici que tu dois agréger tes données*/
proc sql;
CREATE TABLE test2 AS SELECT *
FROM &TABLE ;
quit;
 
%end;
%end;
%mend;
%AGREGER(TABLE=toto,variable=age);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h49   #9
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Je crois que Barahoui te parle de ce poste
ok, je viens de lire le sujet... mais dans mon cas, cela ne marche pas, cela voudrait dire que j'insère la création d'une table DATA dans mon test de calcul... bizarre..
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 15h57   #10
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Tu peux l'adapter à ton cas si tu comprends ce programme, n'hésites pas à poser des questions si jamais tu comprends pas.

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
DATA toto;
input age;
cards;
45
78
55
78
39
;
run;
 
%macro AGREGER(TABLE=,variable=);
 
proc contents DATA=&TABLE out=out;
run;
 
 
proc sql noprint;
SELECT count(*) INTO :nb FROM out;
SELECT name INTO :val separated BY ' ' FROM out;
quit;
%do i=1 %TO &nb;
 
%let var&i=%scan(&val,&i,' ');
%IF &variable=&&var&i %then %do;
 
 
/* c'est ici que tu dois agréger tes données*/
proc sql;
CREATE TABLE test2 AS SELECT *
FROM &TABLE ;
quit;
 
%end;
%end;
%mend;
%AGREGER(TABLE=toto,variable=age);
je n'ai pas tout compris... mais surtout je n'ai pas l'impression que cela réponde à ma demande en fait...

dans ma table source, j'ai 1 colonne ID_MKG qui est numérique et j'ai autant de colonne CHOIXn que possible. Je peux avoir CHOIX1, CHOIX2, CHOIX7; comme je pourrait avoir CHOIX1, CHOIX2, CHOIX3, CHOIX4, CHOIX5, CHOIX6, CHOIX7. Toutes sont numériques.

Je dois créer une macro qui multiplie à chaque ligne la colonne CHOIXn par ID_MKG... mais, et cette macro doit marcher que j'ai 1 colonne CHOIX ou 7 colonnes CHOIX.

suis-je clair ?
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h40   #11
Membre régulier
 
Inscription : novembre 2009
Messages : 77
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 77
Points : 75
Points : 75
Par défaut dictionary.columns

Code :
1
2
3
4
5
SELECT name INTO :mes_cols separated BY '...'
FROM dictionary.COLUMNS
WHERE libname = ...
AND memname = ...
AND name LIKE 'CHOIX%'

et tu as très facilement tes choix en macros.

Si tu préfères tu les comptes d'abord avec select count(*) into :n
puis

Code :
1
2
3
4
5
SELECT name INTO :choix1-choix%trim(&n)
FROM dictionary.COLUMNS
WHERE libname = ...
AND memname = ...
AND name LIKE 'CHOIX%'
Si tu as dans ta table choix2, choix4 et choix5, tu obtiendras:
n=3
et
&choix1=choix2
&choix2=choix4
&choix3=choix5

Voili voilou.
frfancha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h42   #12
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Maintenant oui c'est clair, je suis en train d'implémenter
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h55   #13
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par MEGAMIND2 Voir le message
Maintenant oui c'est clair, je suis en train d'implémenter
super ! merci !
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h57   #14
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par frfancha Voir le message
select name into :mes_cols separated by '...'
from dictionary.columns
where libname = ...
and memname = ...
and name like 'CHOIX%'


et tu as très facilement tes choix en macros.

Si tu préfères tu les comptes d'abord avec select count(*) into :n
puis

select name into :choix1-choix%trim(&n)
from dictionary.columns
where libname = ...
and memname = ...
and name like 'CHOIX%'

Si tu as dans ta table choix2, choix4 et choix5, tu obtiendras:
n=3
et
&choix1=choix2
&choix2=choix4
&choix3=choix5

Voili voilou.
hum... je n'ai pas tout suivi là... là, tu me fais un programme pour savoir si une variable qui contient "Choix" dans le nom existe.. c'est bien ça ? Si oui, ce n'est pas ça que je souhaite avoir. Je veux juste savoir si dans un calcul la variable existe ou pas
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 16h59   #15
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
j'aimerai participer, mais je n'ai pas bien compris le besoin. tu peux expliquer un peu plus? car il se peut que tu n'as pas besoin de tester avec des macros.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h01   #16
Membre régulier
 
Inscription : novembre 2009
Messages : 77
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 77
Points : 75
Points : 75
Citation:
Envoyé par zellinho Voir le message
Je veux juste savoir si dans un calcul la variable existe ou pas
Ma réponse est pour celui (c'est toi? Il me semble que oui dans ton post de 15h57) qui a un dataset contenant n variables parmi choix1 ... choix7.
Pour cette question en particulier c'est une des approches qui fonctionne.
Et (mais c'est personnel) je trouve que c'est la plus simple et la plus rapide à mettre en oeuvre.
frfancha est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/11/2011, 17h03   #17
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par frfancha Voir le message
Ma réponse est pour celui (c'est toi? Il me semble que oui dans ton post de 15h57) qui a un dataset contenant n variables parmi choix1 ... choix7.
Pour cette question en particulier c'est une des approches qui fonctionne.
Et (mais c'est personnel) je trouve que c'est la plus simple et la plus rapide à mettre en oeuvre.
ah bah non, ce n'est pas le bon sujet ^^
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/11/2011, 17h06   #18
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Tu peux tester la macro avec deux tables différentes pour constater que ça fonctionne bien (table1: choix1 choix2 choix3 et table2: choix1 et choix2).
Tu peux en mettre autant de choix que tu veux.

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
DATA pivot1;
input id_mkg choix1 choix2 choix3;
cards;
1 45 58 89
5 69 85 74 
6 98 55 44 
;
run;
 
 
DATA pivot2;
input id_mkg choix1 choix2;
cards;
1 45 58 
5 69 85 
6 98 55 
;
run;
 
 %MACRO M(TABLE=);
DATA test2;
SET &TABLE.;
keep choix:;
run; 
DATA test2;
SET &TABLE.;
keep choix:;
run;
 
proc contents DATA=test2 out=out;
run;
 
DATA _null_;
	SET out ;
	call symput(compress('choix'||LEFT(_n_)),name);
	call symput('nb',_n_);
RUN;
 
DATA &TABLE._sortie;
SET &TABLE.;
%DO i=1 %TO &NB;
%put &&choix&i.;
choix_&i=&&choix&i*id_mkg;
%END;
RUN;
 
%MEND;
 
%M(TABLE=pivot1);
%M(TABLE=pivot2);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h09   #19
Invité régulier
 
Homme Xavier
Chargé d'Etudes Statistiques
Inscription : février 2009
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Xavier
Localisation : France

Informations professionnelles :
Activité : Chargé d'Etudes Statistiques

Informations forums :
Inscription : février 2009
Messages : 39
Points : 7
Points : 7
Citation:
Envoyé par s_a_m Voir le message
j'aimerai participer, mais je n'ai pas bien compris le besoin. tu peux expliquer un peu plus? car il se peut que tu n'as pas besoin de tester avec des macros.
en fait, tous les mois, je récupère des données, et d'un mois à l'autre il peut y avoir des changements, des ajouts, des retraits.

J'ai une base de données qui contient au moins ça :
1 variable ID_MKG qui est numérique
1 à n variable CHOIXn qui sont numérique..

je dois, pour chaque variable CHOIXn faire un calcul en fonction de ID_MKG.

Par exemple :
je peux avoir au mois de février 3 choix : CHOIX1, CHOIX2, CHOIX5
je peux avoir au mois de juin 7 choix : CHOIX1 à CHOIX7.

dans ma macro, qui ne doit pas changer d'un mois à l'autre, je dois tester si la variable CHOIXn existe avant d'effectuer mon calcul... par exemple, pour le mois de février les choix3, choix4, choix6 et choix7 n'existent pas. Donc dans ma boucle %do i=1 to 7, je souhaiterais qu'avant de faire le calcul sur la colonne CHOIXi, la macro vérifie que la colonne existe bien, si elle existe, on fait le calcul ID_MKG*CHOIXi, si la variable CHOIXi n'existe pas, on passe directement au i+1...

est-ce plus clair ?
zellinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 17h15   #20
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 957
Points : 1 368
Points : 1 368
Avec ma méthode, tu ne boucles pas sur 7 mais tu fais qu'avec ce que tu as.
Si y en a que 5 ce mois, alors on fait avec ...
MEGAMIND2 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 08h01.


 
 
 
 
Partenaires

Hébergement Web