Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Administration
Administration Forum d'entraide sur les fonctionnalités d'administration de SAS : installation, portal, serveurs
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 17/06/2011, 17h43   #1
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Par défaut Créer une macro-variable dans un rsubmit

Bonjour, j'essai de faire tourner le code suivant:

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
 
%MACRO test();
 
OPTION autosignon=yes ;
options nonotes spool nomprint nomlogic nosymbolgen;
OPTIONS SASCMD="/opt/SAS_1.4/SASFoundation/9.2/sasexe/sas -CONFIG /opt/SAS_1.4/SASFoundation/9.2/sasv9.cfg";
libname para '/home/public';
 
%DO loop_on_server = 1 %TO 3;
 
		%IF (&loop_on_server. = 1) %THEN %DO;
			%LET dep = 1;
			%LET fin = 5000;
		%END;
 
		%IF (&loop_on_server. = 2) %THEN %DO;
			%LET dep = 5001;
			%LET fin =  10000;
		%END;
 
 
		%IF (&loop_on_server. = 3) %THEN %DO;
			%LET dep =  10001;
			%LET fin = 15000;
		%END;
 
		%SYSLPUT iteration_server = &loop_on_server. / remote = task&loop_on_server.;
		%SYSLPUT dep = &dep. / remote = task&loop_on_server.;
		%SYSLPUT fin = &fin. / remote = task&loop_on_server.;
		RSUBMIT PROCESS = task&loop_on_server. wait=no;
		LIBNAME para '/home/public';
 
		%DO loop_combis_server = &dep. %TO &fin.;
 
			/*FUTUR AJOUT*/
 
			%PUT &loop_combis_server;
 
		%END;
 
		ENDRSUBMIT; 
 
%END;
 
waitfor _all_ task1 task2 task3;
signoff task1; 
signoff task2;
signoff task3;
 
%MEND test;
 
%test();
Jusque là tout va bien, ça ça marche, le PUT me renvoit la bonne valeur à chaque itération et pour chaque process.
Maintenant je prends une table à une colonne intitulée ID qui contient les valeurs allant de 1 à 15000, je rajoute là où il y a écrit /*FUTUR AJOUT*/ :

Code :
1
2
3
4
 
DATA para.TEST&iteration_server.;
OBS = &loop_combis_server.;
RUN;
Et là ça ne va plus, j'ai le message d'erreur suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
1350   DATA para.TEST&iteration_server.;
1351   OBS = &loop_combis_server.;
             -
             386
             200
WARNING: Apparent symbolic reference LOOP_COMBIS_SERVER NOT resolved.
ERROR 386-185: Expecting an arithmetic expression.
 
ERROR 200-322: The symbol IS NOT recognized AND will be ignored.
 
1352   RUN;
Je n'arrive pas à comprendre le souci... Y-aurait-il un souci avec la façon dont j'ai créé la macro-variable &loop_combis_server de la boucle %DO dans mon rsubmit?

Merci d'avance pour votre intérêt à mon problème et le temps que vous y passez.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 11h36   #2
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Un petit up de mon topic juste pour informer que j'ai mis à jour le code pour que si une personne s'interesse à mon problème elle ait juste à copier coller le code, par contre n'ayant plus accés à la touche EDIT il reste des petites coquilles quand à mes rectifications dans le texte.

Merci à l'âme charitable qui m'aidera à régler mon problème
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 13h05   #3
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
Hello,
Sans avoir lu ton code,
Connais-tu les tables de paramétrages?
Je voie que tu t'embrouilles avec les %syslput. et %sysrput.

Mis en oeuvre :

1-tu renseignes dans un fichier texte, Excel, ou dans une table SAS tous tes paramètres.
2- t'envoies ta table de paramétrages à chaque fois que tu te connectes à une session sas via une proc upload.
3- dans les sessions serveurs tu récupères tes paramètres dans des macro variables de la table avec des call symput.

et au finale si tu veux changer tes paramètres tu les changes dans la table(fichier de paramétrage). pour les paramètres ,j'opte pour un fichier Excel, c'est plus sexy et simple à modifier.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 13h28   #4
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Eh bien il faudra que j'y pense en effet, ça à l'air de simplifier amplement la mise en oeuvre.

Par contre, concernant mon problème, il s'agit plus d'une macro-variable qui marche tout le temps et d'un coup dans l'étape DATA disparaît... c'est plus là que se situe mon interrogation.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 13h46   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
Pour débuguer, le mieux c'est de rajouter des options

comme :
Code :
options  nomprintnest mprint symbolgen mlogic; *et autres;
et que t'orientes la log de chaque session serveur dans un fichier txt avec la proc printto log="~/&sysuserid/log&session.txt.";run; que t'importes sous ta session locale avec une proc download.
pour voir ce qui se passe réellement dans tes sessions serveur.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 15h43   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
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 : 956
Points : 1 366
Points : 1 366
Je sais pas ce que tu cherches à faire mais la syntaxe n'est pas bonne. Il fallait écrire ceci
Code :
1
2
3
DATA para.TEST&iteration_server.;
OBS = "&loop_combis_server.";
RUN;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 16h15   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
si la macro variable loop_combis_server contient que des chiffres la syntaxe est bonne.

Code :
1
2
3
4
5
6
 
%let m_var=10;
 
DATA test;
a= &m_var;
run;
ici SAS indique qu'il ne reconnait pas la macro variable ( qu'elle n'existe pas dans la session serveur en cours)
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/06/2011, 17h37   #8
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
C'est exactement mon problème... mais si je met un %PUT &m_var par exemple, juste avant l'étape DATA, là il a pas de problème, et c'est ça que j'arrive pas à comprendre...

Mais je vais regarder avec les options dont tu me parles si j'arrive à avoir un début d'explication même si j'en doute vue que j'ai déjà fait tourner avec les options: mprint, symbolgen, mlogic sans pouvoir pointer du doigt la provenance du problème...
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 10h27   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
Citation:
Envoyé par joyeux_lapin13 Voir le message
C'est exactement mon problème... mais si je met un %PUT &m_var par exemple, juste avant l'étape DATA, là il a pas de problème, ...
tu peux expliquer STP?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 10h35   #10
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
En fait, si tu fais tourner la première version de la macro que j'ai mise, sans l'étape DATA et avec un %SCAN &loop_combis_server. à la place, il m'affiche pour chaque itération sur chaque process les différentes valeurs prises par &loop_combis_server. .

Par contre si je m'amuse à rajouter l'étape DATA, soit celle qui fait qu'à chaque itération sur chaque process je créé une matrice contenant une colonne et une ligne valant la valeur de &loop_combis_server. traitée, alors là il me dit qu'il reconnaît pas la macro-variable &loop_combis_server. .

C'est ce que je n'arrive pas à comprendre, apparement ma macro-variable est correctement créée sur chaque process et ne pose pas de problème sauf quand je veux m'en servir dans une étape DATA...
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 10h43   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
Code :
1
2
3
4
5
6
7
8
 
		%DO loop_combis_server = &dep. %TO &fin.;
 
			/*FUTUR AJOUT*/
 
			%PUT &loop_combis_server;
 
		%END;
faux; c'est un code ouvert et les instructions %do, %to,... ne marche pas dans le code ouvert, il faut faire comme ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
%macro test;
		%DO loop_combis_server = &dep. %TO &fin.;
 
			/*FUTUR AJOUT*/
 
			%PUT &loop_combis_server;
 
		%END;
%mend;
%test;

alors, quand tu démarres une session serveur le programme macro de la session client ne sera pas reconnu. Donc après le rsubmit; c'est une autre session SAS qui démarre , les seuls paramétres que tu peux passer de la session client vers la session serveur c'est les macro variables et non pas les macro programmes %macro;.... %mend;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 10h51   #12
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Ok, bon je crois avoir compris le problème donc, par contre si je veux pouvoir faire marcher mon exemple? je dois créer la macro à part et faire un appel à l'interieur de mon rsubmit?

Si c'est bien celà il me faudra charger ma macro sur le nouveau process via une proc UPLOAD?

Je me tate à reformuler mon programme avec tes notes, mais avant j'aimerais être sur d'avoir bien compris...

Au passage, merci Sam pour ton aide précieuse!
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 11h25   #13
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Plus que jamais avec les macros il faut procéder par étapes.

afin de bien comprendre je te propose de tester ce code et de l'adapter à ton besoin:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
rsubmit;
   %macro onServer(macroServer=);
      %put macroServer = <&macroServer>;
   %mend onServer;
endrsubmit;
 
%macro onLocal;
   %do paramLocal = 1 %TO 10;
      %syslput paramServer = &paramLocal;
      rsubmit;
         %onServer(macroServer=&paramServer);
      endRsubmit;
   %end;
%mend onLocal;
xav
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 11h29   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 703
Points : 1 703
Pourquoi une proc upload si tu n’utilises pas les tables de paramétrages?

Bon, pour éviter de reformuler / bidouiller ton code , la solution c’est de rester sur ce que t’as fait. Déclarer les paramètres dans la session mère (client) avec un %SYSLPUT tu passes tes paramètres aux sessions serveurs.
ce que tu dois comprendre c'est quand tu fais rsubmit, c'est une autre session SAS qui s'ouvre dans une autre GALAXY donc il faut coder comme si t'ouvre une autre session SAS. sur ton poste.

Si un jour les tables de paramétrages te tente, bah tu n’as plus besoin de %syslput , il suffit juste d’envoyer ta table de paramétrage dans chacune des session filles(serveurs) et de récupérer tes macro variables avec un call symput.
(l'avantage des tables de paramétrages c'est qu'on n'a pas besoin d'ouvrir le code et modifier à chaque fois les paramètres , il suffit de remplir un ficheir excel avec les paramètres souhaiter et le programme sas sera piloter via Excel)
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2011, 13h06   #15
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Merci pour toutes ces infos Brice, Xav et Sam! je n'avais absolument pas compris que sous SAS pour paralléliser il fallait penser comme ça... en fait je pensais que c'était exactement la même manière de procédés que sous R!

J'ai bricolé ce code du coup qui semble marcher, alors cet exemple on se rend pas compte de si ça passe ou pas mais sur le vrai programme sur lequel je travaille on voit que ça marche.

Encore merci à tous les 3!

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
 
MACRO test();
 
OPTION autosignon=yes ;
options nonotes spool nomprint nomlogic nosymbolgen;
OPTIONS SASCMD="/opt/SAS_1.4/SASFoundation/9.2/sasexe/sas -CONFIG /opt/SAS_1.4/SASFoundation/9.2/sasv9.cfg";
libname para '/home/public';
 
%DO loop_on_server = 1 %TO 3;
 
		%IF (&loop_on_server. = 1) %THEN %DO;
			%LET dep = 1;
			%LET fin = 5000;
		%END;
 
		%IF (&loop_on_server. = 2) %THEN %DO;
			%LET dep = 5001;
			%LET fin =  10000;
		%END;
 
 
		%IF (&loop_on_server. = 3) %THEN %DO;
			%LET dep =  10001;
			%LET fin = 15000;
		%END;
 
		%SYSLPUT iteration_server = &loop_on_server. / remote = task&loop_on_server.;
		%SYSLPUT dep = &dep. / remote = task&loop_on_server.;
		%SYSLPUT fin = &fin. / remote = task&loop_on_server.;
		RSUBMIT PROCESS = task&loop_on_server. wait=no;
		LIBNAME para '/home/public';
 
		%MACRO testrsubmit();
		%DO loop_combis_server = &dep. %TO &fin.;
 
                                DATA para.TEST&iteration_server.;
                                OBS = &loop_combis_server.;
                                RUN; 
 
		%END;
		%MEND testrsubmit;
		%testrsubmit(); 
		ENDRSUBMIT; 
 
%END;
 
waitfor _all_ task1 task2 task3;
signoff task1; 
signoff task2;
signoff task3;
 
%MEND test;
 
%test();
joyeux_lapin13 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 01h14.


 
 
 
 
Partenaires

Hébergement Web