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 étape DATA


Sujet :

Macro

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 52
    Points
    52
    Par défaut Call symput dans une étape DATA
    Bonjour,

    je ne comprend pas pourquoi mon code ne fonctionne pas, je tourne en rond et à mon avis je passe complètement à coté d'un détail!

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %let DTDB65M01 = 1 ;
    %let DTDB65M02 = 2 ;
    %let DTDB65M03 = 3 ;
     
     
    data tbout;
    	set workserv.tbin;
    	call symput("MoisRef",TRIM(PDREFEXT));
    	PUT "MoisRef= &MoisRef.";
    	PUT "DTDB65&MoisRef. = &&DTDB65&MoisRef";
    run;
    Voici la log SAS lorsque je l’exécute la première fois :
    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
     
    126  %let DTDB65M01 = 1 ;
    127  %let DTDB65M02 = 2 ;
    128  %let DTDB65M03 = 3 ;
    129
    130
    131  data tbout;
    132      set workserv.tbin;
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    AVERTISSEMENT: Référence symbolique apparente DTDB65 non traitée.
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    133      call symput("MoisRef",TRIM(PDREFEXT));
    134      PUT "MoisRef= &MoisRef.";
    135      PUT "DTDB65&MoisRef. = &&DTDB65&MoisRef";
    136  run;
     
    MoisRef= &MoisRef.
    DTDB65&MoisRef. = &DTDB65&MoisRef
    MoisRef= &MoisRef.
    DTDB65&MoisRef. = &DTDB65&MoisRef
    MoisRef= &MoisRef.
    DTDB65&MoisRef. = &DTDB65&MoisRef
    MoisRef= &MoisRef.
    DTDB65&MoisRef. = &DTDB65&MoisRef
    MoisRef= &MoisRef.
    DTDB65&MoisRef. = &DTDB65&MoisRef
    NOTE:  5 observations copiées de la table WORKSERV.TBIN.
    NOTE: La table WORK.TBOUT a 5 observations et 30 variables.
    NOTE: L'étape DATA a utilisé (Durée totale du processus) :
          temps réel                   0.45 secondes
          temps processeur   0.04 secondes
    et voici la log SAS lorsque je le ré-éxcute immédiatement après sans rien changer :
    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
     
    137
    138
    139  %let DTDB65M01 = 1 ;
    140  %let DTDB65M02 = 2 ;
    141  %let DTDB65M03 = 3 ;
    142
    143
    144  data tbout;
    145      set workserv.tbin;
    146      call symput("MoisRef",TRIM(PDREFEXT));
    147      PUT "MoisRef= &MoisRef.";
    148      PUT "DTDB65&MoisRef. = &&DTDB65&MoisRef";
    149  run;
     
    MoisRef= M02
    DTDB65M02 = 2
    MoisRef= M02
    DTDB65M02 = 2
    MoisRef= M02
    DTDB65M02 = 2
    MoisRef= M02
    DTDB65M02 = 2
    MoisRef= M02
    DTDB65M02 = 2
    NOTE:  5 observations copiées de la table WORKSERV.TBIN.
    NOTE: La table WORK.TBOUT a 5 observations et 30 variables.
    NOTE: L'étape DATA a utilisé (Durée totale du processus) :
          temps réel                   0.43 secondes
          temps processeur   0.03 secondes
    avec cette deuxième exécution je constate que ma macro-variable fonctionne après coup ...

    Pour l'explication de ce que je veux faire :
    J'ai des macro variable qui sont définit "DTDB65Mxx" portant une valeur qui dépend du mois (donc xx peut prendre 01 à 12).
    Je lis une table qui contient une colonne Mois (PDREFEXT avec des valeur M01 à M12) et en fonction du mois de cette colonne je dois exploiter la valeur correspondant à la macro variable, d'où la récupération de &&DTDB65&MoisRef.

    J'avoue que je suis totalement perdu à cause du comportement de SAS, si je fais une erreur de syntaxe, pourquoi à la deuxième exécution cela fonctionne.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    autres info :

    après la première éxcution qui est en erreur, si je vérifie la sashalp.vmacro, j'ai bien mes macro variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
               s                      f v
                  c     n                f a
         O        o     a                s l
         b        p     m                e u
         s        e     e                t e
     
     
            2 GLOBAL    MOISREF          0 M02
           11 GLOBAL    DTDB65M01        0 1
           12 GLOBAL    DTDB65M02        0 2
           13 GLOBAL    DTDB65M03        0 3

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Encore une chose, je vous ai mit ce que je voulais au finale mais si je me cantonne juste à la partie call symput, j'ai le soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data tbout;
    	set workserv.tbin;
    	call symput("MoisRef",TRIM(PDREFEXT));
    	PUT "MoisRef= &MoisRef.";
    	PUT "DTDB65&MoisRef. = &&DTDB65&MoisRef";
    run;
    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
     
    109  data tbout;
    110      set workserv.tbin;
    AVERTISSEMENT: Référence symbolique apparente MOISREF non traitée.
    111      call symput("MoisRef",TRIM(PDREFEXT));
    112      PUT "MoisRef= &MoisRef.";
    113  run;
     
    MoisRef= &MoisRef.
    MoisRef= &MoisRef.
    MoisRef= &MoisRef.
    MoisRef= &MoisRef.
    MoisRef= &MoisRef.
    NOTE:  5 observations copiées de la table WORKSERV.TBIN.
    NOTE: La table WORK.TBOUT a 5 observations et 30 variables.
    NOTE: L'étape DATA a utilisé (Durée totale du processus) :
          temps réel                   0.45 secondes
          temps processeur   0.00 secondes

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Et encore mieux idem avec une table qu'on a tous :

    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
     
    115  data tbout;
    116      set sashelp.Class;
    117      call symput("Test",TRIM(sex));
    118      PUT "Test= &Test.";
    AVERTISSEMENT: Référence symbolique apparente TEST non traitée.
    119  run;
     
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    Test= &Test.
    NOTE:  19 observations copiées de la table SASHELP.CLASS.
    NOTE: La table WORK.TBOUT a 19 observations et 5 variables.
    NOTE: L'étape DATA a utilisé (Durée totale du processus) :
          temps réel                   0.00 secondes
          temps processeur   0.00 secondes

  5. #5
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    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 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Hello,

    Je n'ai pas tout lu, mais pour pouvoir utiliser une macro variable créée dans la même étape data, il faut utiliser la fonction RESOLVE.

    Si ton programme a fonctionné à la deuxième exécution c'est parce que les macro variables ont été compilées à la première exécution.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    NICKEL !

    Merci s_a_m :

    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
     
    109
    110  %let DTDB65M01 = 1 ;
    111  %let DTDB65M02 = 2 ;
    112  %let DTDB65M03 = 3 ;
    113
    114  data tbout;
    115      set workserv.tbin;
    116      call symput("MoisRef",TRIM(PDREFEXT));
    117      toto = resolve('&MoisRef.');
    118      titi = resolve('&&DTDB65&MoisRef');
    119      PUT "MoisRef= " toto ;
    120      PUT toto " = " titi;
    121  run;
     
    MoisRef= M02
    M02  = 2
    MoisRef= M02
    M02  = 2
    MoisRef= M02
    M02  = 2
    MoisRef= M02
    M02  = 2
    MoisRef= M02
    M02  = 2
    NOTE:  5 observations copiées de la table WORKSERV.TBIN.
    NOTE: La table WORK.TBOUT a 5 observations et 32 variables.
    NOTE: L'étape DATA a utilisé (Durée totale du processus) :
          temps réel                   0.42 secondes
          temps processeur   0.00 secondes
    J'en conclu que c'est la première fois que j'exploite une macro au sein de la même étape data car je n'ai pas souvenir d'avoir déjà rencontré cela...

    En tout cas merci Beaucoup !

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

Discussions similaires

  1. Macro ne fonctionne pas dans une étape DATA
    Par cladoo dans le forum Macro
    Réponses: 2
    Dernier message: 07/11/2011, 10h36
  2. call symput dans une macro
    Par Manoutz dans le forum Macro
    Réponses: 8
    Dernier message: 29/06/2009, 09h46
  3. Boucle dans une étape data
    Par ueshiba dans le forum Macro
    Réponses: 3
    Dernier message: 26/05/2009, 12h21
  4. Réponses: 3
    Dernier message: 11/08/2008, 16h56
  5. Réponses: 1
    Dernier message: 30/05/2008, 15h52

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