IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration et Installation Discussion :

Créer une macro-variable dans un rsubmit


Sujet :

Administration et Installation

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut Créer une macro-variable dans un rsubmit
    Bonjour, j'essai de faire tourner le code suivant:

    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
     
    %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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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

  3. #3
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    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.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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.

  5. #5
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Pour débuguer, le mieux c'est de rajouter des options

    comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Je sais pas ce que tu cherches à faire mais la syntaxe n'est pas bonne. Il fallait écrire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DATA para.TEST&iteration_server.;
    OBS = "&loop_combis_server.";
    RUN;

  7. #7
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    si la macro variable loop_combis_server contient que des chiffres la syntaxe est bonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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...

  9. #9
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    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?
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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...

  11. #11
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  12. #12
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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!

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  14. #14
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    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)
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  15. #15
    Membre habitué
    Homme Profil pro
    Ingénieur d'études / Biostatisticien
    Inscrit en
    Décembre 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 354
    Points : 194
    Points
    194
    Par défaut
    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 : 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
     
    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();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ODS HTML] Afficher une macro variable dans le title1
    Par Lou12 dans le forum ODS et reporting
    Réponses: 2
    Dernier message: 06/07/2010, 16h07
  2. Réponses: 4
    Dernier message: 01/04/2010, 15h20
  3. Réponses: 2
    Dernier message: 22/03/2010, 15h26
  4. Réponses: 11
    Dernier message: 29/05/2008, 16h26
  5. Réponses: 0
    Dernier message: 28/05/2008, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo