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

Débutez Discussion :

Fonctionnement macro variable


Sujet :

Débutez

  1. #1
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut Fonctionnement macro variable
    Bonjour,
    je poste la question dans la section "Débutez" car elle concerne le fonctionnement de base des macro-variables.

    J'exécute le code suivant une première fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    option mlogic mprint symbolgen;
    dm log 'clear';
    data _null_;
    	set MyTable;
    	%global toto;
    	call symputx('toto',v_);
    	%put &toto;
    run;
    J'obtiens dans la log :
    49 option mlogic mprint symbolgen;
    50 dm log 'clear';
    51 data _null_;
    52 set MyTable;
    53 %global toto;
    54 call symputx('toto',v_);
    55 %put &toto;
    SYMBOLGEN : Macro variable TOTO traitée dans

    56 run;
    J'éxécute à nouveau le même code sans aucune modification et j'obtiens alors dans la log :

    58 option mlogic mprint symbolgen;
    59 dm log 'clear';
    60 data _null_;
    61 set MyTable;
    62 %global toto;
    63 call symputx('toto',v_);
    64 %put &toto;
    SYMBOLGEN : Macro variable TOTO traitée dans 4
    4
    65 run;
    Quelqu'un pourrait-il m'aider à comprendre pourquoi le même code exécuter deux fois produit des résultats différents ?

    Je suis vraiment perplexe car j'ai développé une macro qui produit des résultats différents dans la log à plusieurs exécutions du même code sans modification des données. J'hésite à arrêter les macros et à repasser au sas base.

    Quand j'initialise la macro-variable toto à zéro alors la call symputx ne lit plus la valeur 4 en table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data _null_;
    	set MyTable;
    	%global toto;
    	%let toto=0;
    	call symputx('toto',v_);
    	%put &toto;
    run;
    67 data _null_;
    68 set MyTable;
    69 %global toto;
    70 %let toto=0;
    71 call symputx('toto',v_);
    72 %put &toto;
    SYMBOLGEN : Macro variable TOTO traitée dans 0
    0
    73 run;
    Alors que v_ prend la valeur 4 pour tous les enregistrements de la table.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  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
    ta macro variable toto est actualisée par la méthode call symput à l'issue de l'étape data.

    Avec ce code tu devrait comprendre:

    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
    OPTION mlogic mprint symbolgen;
    dm log 'clear';
     
    data Mytable;
    v_=4;
    run;
    %let toto=;
    %put &toto.;
    DATA _null_;
    	SET MyTable;
    	%global toto;
    	call symputx('toto',v_);
    run;
     
    %put &toto;
     
    data _null_;
    set MyTable;
    %global toto;
    %let toto=0;
    call symputx('toto',v_);
    %put &toto;
    run; 
     
    %put &toto;

  3. #3
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci Manoutz,
    j'ai compris.

    La macro-variable est mise à jour en sortie d'étape data.
    Ca n'est pas évident pour débeuguer.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  4. #4
    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
    Petite feinte, si besoin, pour que ta macro variable créée avec le call symput soit utilisable avant la fin de l'étape data : la fonction RESOLVE

    Voici l'extrait du doc où j'ai trouvé cette astuce :
    La fonction resolve
    La fonction resolve permet d’utiliser les macro-variables dans l’étape data qui les a créées.
    Syntaxe :
    Resolve(‘&nom_de_macro_variable’)
    Exemple 36
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data temp ;
    set table ;
    call symput (‘mac’||left(put(_N_,2.)),var1) ;
    premval=resolve(&mac1);
    run;

    La variable premval contient la valeur de la macro-variable mac1, c’est à dire AQU (pour toutes les observations).


    C'est extrait d'une documentation plutôt bien faite sur les macros : rechercher un pdf qui s'appelle "les macros SAS", de l'agrocampus-ouest

  5. #5
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci Rémi.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/04/2008, 11h58
  2. Suppression de macro-variables globales
    Par raf64flo dans le forum Macro
    Réponses: 2
    Dernier message: 09/04/2008, 15h25
  3. Réponses: 3
    Dernier message: 14/03/2008, 11h03
  4. Utiliser les macro variables avec sql
    Par Euseibus dans le forum Macro
    Réponses: 5
    Dernier message: 25/10/2007, 18h40
  5. [VBA-E] Macro Variable Caption
    Par ArchiveAgain dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2007, 05h20

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