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 10/11/2011, 11h53   #1
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Par défaut Proc sql à l'intérieur de la boucle DO

Bonjour,

comment pourrais je utiliser un proc sql à l'intérieur d'une boucle
j'ai essayé le code suivant mais ca marche pas

Code :
1
2
3
4
5
6
7
do i=1 TO m+1;
formul[i]=scan("&formule1",i,';');
comp[i]=tranwrd(scan("&z1",i,';'),',','","');
proc sql;
SELECT formule INTO :formule0 FROM etape0 WHERE "etape0"!!'.'!!code_ind IN (comp[i]);
quit;
end;
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 12h02   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 145
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 145
Points : 1 763
Points : 1 763
les boucles do sont a effectuer dans une etape data - tu ne peux pas faire du sql dans une etape data.

une solution consiste a passer en macro (faire des %do au lieu des do). il va falloir eviter les array.

Que cherches tu a faire? pourquoi l'as tu code comme ca?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 12h12   #3
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
Citation:
Envoyé par aminao Voir le message
Bonjour,

comment pourrais je utiliser un proc sql à l'intérieur d'une boucle
j'ai essayé le code suivant mais ca marche pas

Code :
1
2
3
4
5
6
7
do i=1 TO m+1;
formul[i]=scan("&formule1",i,';');
comp[i]=tranwrd(scan("&z1",i,';'),',','","');
proc sql;
SELECT formule INTO :formule0 FROM etape0 WHERE "etape0"!!'.'!!code_ind IN (comp[i]);
quit;
end;
ce n'est presque pas du SAS.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 14h55   #4
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
J'ai utilisé les macros mais là il ne reconnait pas la macro variable comp&i dans ma requête sql!!

Code :
1
2
3
4
5
6
7
8
9
%macro calcul_ind1;
%do i=1 %TO 2;
%let comp&i=%scan("etape0.Ind0,etape0.Ind1",&i,',');
proc sql;
SELECT formule FROM etape0 WHERE "etape0"!!"."!!code_ind="&&comp&i";
quit;
%end;
%mend;
%calcul_ind1;
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 15h21   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
sans regarder le tout, ce n'est pas
qu'il faut mettre ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 15h21   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Code :
1
2
3
4
5
6
7
8
9
10
11
%macro calcul_ind1;
%do i=1 %TO 2;
%let comp&i=%scan(%str(etape0.Ind0,etape0.Ind1),&i,',');
%put &&comp&i.;
proc sql;
SELECT formule FROM etape0 WHERE "etape0"!!"."!!code_ind="&&comp&i";
quit;
 
%end;
%mend;
%calcul_ind1;
__________________
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 10/11/2011, 15h24   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
autre chose, il faut revoir ta boucle. car ici tu crées la même table "formule", et le filtre finale serai

Code :
WHERE "etape0"!!"."!!code_ind="comp2";
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 15h25   #8
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
merci bahraoui, ca marche.
@SAM: j'ai déjà essayé "&comp&i", ca fonctionne pas
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h08   #9
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
proc sql;
SELECT z INTO :z1 separated BY ';' FROM interm WHERE top=0;
quit; 
/*formule vacontenir par exemple "etape0.Ind0,etape0.Ind1;etape0.Ind4"*/
 
Je veux utiliser la variable z1 dans cette macro, mais il faut que j'enlève les quillements avant je pense car ca marche pas comme suit:
 
%macro calcul_ind1;
m=count("&z1",';');
%do i=1 %to 3;
%let comp&i=%scan(%str("&z1"),&i,',');
%put &&comp&i.;
proc sql;
SELECT formule FROM etape0 WHERE "etape0"!!"."!!code_ind in ("&&comp&i");
quit;
%end;
%mend;
%calcul_ind1;
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h09   #10
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Code :
1
2
3
4
proc sql;
SELECT z INTO :z1 separated BY ';' FROM interm WHERE top=0;
quit; 
/*formule vacontenir par exemple "etape0.Ind0,etape0.Ind1;etape0.Ind4
Je veux utiliser la variable z1 dans cette macro, mais ca marche pas comme suit:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro calcul_ind1;
m=count("&z1",';');
%do i=1 %TO 3;
%let comp&i=%scan(%str("&z1"),&i,',');
%put &&comp&i.;
proc sql;
SELECT formule FROM etape0 WHERE "etape0"!!"."!!code_ind IN ("&&comp&i");
quit;
%end;
%mend;
%calcul_ind1;
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h17   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
Code :
1
2
3
 
 
m=%sysfunc(countC("&z1",';');
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h19   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
La réponse était LA

NOTA: Merci de cliquer sur une fois ton problème est résolu.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h30   #13
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
merci SAM, mais c'est pas là ou se trouve le problème, dans la sol de bahraoui il a utilisé etape0.Ind0,etape0.Ind1 sans guillemets, le problème réside en comment enlever les guillemets de la variable z1 je pense
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2011, 16h38   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
%let z1=a/b/c/;
 
%macro calcul_ind1;
 
%let m=%sysfunc(countc("&z1",'/'));
%put &m.;
%do i=1 %TO &m;
%let comp&i=%scan(&z1,&i,'/');
%put &&comp&i.;
 
%end;
%mend;
%calcul_ind1;
ce code marche bien pour moi, c'est ce que tu recherches ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/11/2011, 11h14   #15
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Bjr,
je reviens vers vous pour resoudre tjrs ce problème avec %sysfunc
dans le code suivant, j'arrive à récupérer une valeur exacte de la macrovariable n, sauf pour le de nb&i, il me renvoie tjrs une valeur inexacte qui vaut 0, quand je n'utilise pas les macros ca marche mais je ss obligée de passer par les macros car j'aurais besoin d'insérer un proc sql dedans une boucle pour extraire les champs qui valident la condition.

voilà ce qui me retourne comme résultat:

Code :
1
2
3
 
comp1                                z1        comp2                            z2         
etape0.Ind0,etape0.Ind1       0        etape0.Ind2,etape0.Ind4     0
normalement cadoit être z1=1 et z2 =1 puisqu'il y'a une virgule dans comp1,comp2


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
%macro calcul_ind1;
DATA _null;
%let n=%sysfunc(countc("&formule1",';'));
%put &&n.;
%do i=1 %TO &&n.+1;
comp&i=scan("&z1",&i,';');
%let nb&i=%sysfunc(countc(comp&i,','));
%put &&nb&i.;
z&i=&&nb&i.;
/*%do j=1 %to &&nb&i.;
com&i&j=scan(comp&i,&j,',');
%end;
%put &&com&i.;
proc sql;
select formule from etape0 where "etape0"!!"."!!code_ind="&&com&i";
quit;*/
%end;
run;
%mend;
%calcul_ind1;
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 09h39   #16
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
Hello,
Commences déjà à prendre en considération les corrections (propositions) qu'on t'a donné plus haut.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 09h41   #17
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Il faut des %let pour créer les nouvelles variables!!
__________________
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 14/11/2011, 09h57   #18
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 011
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 011
Points : 1 712
Points : 1 712
à part le %let , le data _null, le &&n,... c'est juste tout sa ?
s_a_m 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 06h29.


 
 
 
 
Partenaires

Hébergement Web