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

Macro Discussion :

call symput dans une macro


Sujet :

Macro

  1. #1
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut call symput dans une macro
    Bonjour à tous,

    J'aurai besoin de vos lumières, je bloque sur un call symput dans un macro programme... Chose étrange, ca fonctionne bien qd je sors du macro prg..???

    voila mon code:


    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
    %macro transp(trspvar=,subtrspvar=,	indata=);
    proc sql noprint;
    	create table NBGRP as
    	select distinct count (distinct &trspvar.) as TOTNBGRP, &trspvar.
    	from &indata.
    ; 		
    quit;
     
    data _null_;
    	set NBGRP;
    	call symput("GRPNB"||compress(put(_N_,1.)),put(VISITNUM,3.));
    run;
     
    /*
    proc sql;
    	%do i=1 to &nbsubgrp.
    	select  count (distinct &subtrspvar.) into :nbsubgrp&i.
    	from &indata.(where=())
    ;  */
    %mend transp;
     
    %transp(trspvar=VISITNUM,subtrspvar=CATEG,indata=TAB9);
     
     
    %put _user_;
     
     
    data _null_;
    	set NBGRP;
    	call symput("GRPNB"||compress(put(_N_,1.)),put(VISITNUM,3.));
    run;
    %put _user_;
    le put(_n_,1.) ne pose pas de soucis, j'ai deux lignes dans ma table.

    Merci d'avance,

    manoutz

  2. #2
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Pour être un peu plus précis (dsl!), le code se compile et s'éxécute sans soucis dans les deux cas. par contre dans le macro prg les deux macros variables ne sont pas créées..

  3. #3
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Il faut déclarer tes macros variables comme "globale", pour que leur valeurs soient conservées à l'extérieur de ta macro.
    A noter que ce n'est pas lié au mode de déclaration de ta macro variable (call symput).
    Pour t'en convaincre, teste cela
    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
    %MACRO TEST1 ;
        %local  macro_var_locale  ;
        %global macro_var_globale ;
        data _null_;
            call symput ("macro_var_locale" ,"macro var valable en local uniquement");
            call symput ("macro_var_globale","macro var valable en global"          );
        run ;
        %put valeur des macros var dans la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_globale : &macro_var_globale. ;
    %MEND ;
    %TEST1 ; 
        %put valeur des macros var à l extérieur de la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_globale : &macro_var_globale. ;

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    J'ajouterai pour faire suite à la réponse de Rémi qu'en v9, tu peux aussi faire un CALL SYMPUTX, avec en 3e argument "L" si tu crées une macro-variable locale, et "G" si elle est globale. Ca évite les %LOCAL et %GLOBAL.

  5. #5
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Merci à tous les deux, c'était effectivement ca!

    par contre, en puisant dans mes lointains souvenirs, une macro variable globale est utilisable à tous niveaux du programme en cours. Or lorsque j'utilise la version d'Olivier (pratique dans le sens où je vais définir autant de macro var que de lignes dans mon fichier entrée), il semble que les macros variables aient été supprimées une fois sorti du macro programme. Par curiosité, est-ce lié au x call symputx (j'ai du mal à y croire, j'avoue...) ?

  6. #6
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    As-tu bien exécuté le code ci-dessous?
    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
    %MACRO TEST1 ;
        %LOCAL  macro_var_locale  ;
        %global macro_var_globale ;
        DATA _null_;
            call symput ("macro_var_locale" ,"macro var valable en local uniquement");
            call symput ("macro_var_globale","macro var valable en global"          );
    	call symputX ("macro_var_globale2","macro auto var valable en global","G");
    	call symputX ("macro_var_locale2","macro auto var valable local uniquement","L");
        run ;
        %put valeur des macros var dans la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_locale2  : &macro_var_locale2. ;
        %put * macro_var_globale : &macro_var_globale. ;
        %put * macro_var_globale2 : &macro_var_globale2. ;
    %MEND ;
    %TEST1 ; 
        %put valeur des macros var à l extérieur de la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_locale2  : &macro_var_locale2. ;
        %put * macro_var_globale : &macro_var_globale. ;
        %put * macro_var_globale2 : &macro_var_globale2. ;

  7. #7
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    J'ai (à présent) essayé les deux versions. Celle de fafabzh6 fonctionne (copié collé de son code).

    Par contre

    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
    %macro transp(trspvar=,	subtrspvar=,indata=);
     
    proc sql noprint;
    	create table NBGRP as
    	select distinct count (distinct &trspvar.) as TOTNBGRP, &trspvar.
    	from &indata.
    ; 		
     
    	select distinct count (distinct &trspvar.) into: NBGRP
    	from &indata.
    ; 		
    quit;
     
    data _null_;
    	set NBGRP;
    	call symputx("GRPNB"||compress(put(_N_,1.)),put(VISITNUM,1.),G);
    run;
     
     
    %put _user_;
    %mend transp;
     
    %transp(trspvar=VISITNUM, subtrspvar=CATEG,indata=TAB9);
     
    %put _user_;
    produit toujours le même problème qu'avant ...?

  8. #8
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    As-tu bien mis les quotes entourant G car dans le cas contraire ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symputx("GRPNB"||compress(put(_N_,1.)),put(VISITNUM,1.),"G");
    Pour t'en assurer re-exécute le programme :
    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
    %symdel macro_var_globale2;
    %symdel macro_var_globale;
    %symdel macro_var_locale2;
    %symdel macro_var_locale;
     
    %MACRO TEST1 ;
        %LOCAL  macro_var_locale  ;
        %global macro_var_globale ;
        DATA _null_;
            call symput ("macro_var_locale" ,"macro var valable en local uniquement");
            call symput ("macro_var_globale","macro var valable en global"          );
    	call symputX ("macro_var_globale2","macro auto var valable en global","G");
    	call symputX ("macro_var_locale2","macro auto var valable local uniquement","L");
        run ;
        %put valeur des macros var dans la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_locale2  : &macro_var_locale2. ;
        %put * macro_var_globale : &macro_var_globale. ;
        %put * macro_var_globale2 : &macro_var_globale2. ;
    %MEND ;
    %TEST1 ; 
        %put valeur des macros var à l extérieur de la macro ;
        %put * macro_var_locale  : &macro_var_locale. ;
        %put * macro_var_locale2  : &macro_var_locale2. ;
        %put * macro_var_globale : &macro_var_globale. ;
        %put * macro_var_globale2 : &macro_var_globale2. ;
    en supprimant les quotes encadrant G dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symputX ("macro_var_globale2","macro auto var valable en global","G");

  9. #9
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Bonjour,

    C'était bien les quotes.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. Call symput dans une étape DATA
    Par alexd dans le forum Macro
    Réponses: 5
    Dernier message: 15/10/2013, 11h07
  2. CALL SYMPUT dans une macro
    Par kykyn dans le forum Macro
    Réponses: 15
    Dernier message: 25/07/2012, 18h32
  3. Réponses: 2
    Dernier message: 21/01/2010, 17h02
  4. Comment insérer une macro excel dans une macro word?
    Par max2245 dans le forum VBA Word
    Réponses: 15
    Dernier message: 07/01/2006, 17h44
  5. pb dans une macro excel VB
    Par syl221 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/10/2005, 17h29

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