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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut CALL SYMPUT dans une macro
    Bonjour à tous,

    Je rencontre un petit souci avec un CALL SYMPUT, si quelqu'un avait une solution, je la prendrais avec grand plaisir.

    Explications :

    Je vais essayer de faire court et simple, mais l'idée est de récupérer la valeur d'une de mes variables (elle s appelle ENTREE_PRP, variable numérique), afin d'en remplir d'autres .

    Voici le 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
     
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
    DATA PTAUX01RC;
     
       set PTAUX01RC ;
     
    CALL SYMPUT ('debut',ENTREE_PRP);
    %PUT &debut;
     
    %DO I=1  %TO 12 ;
         /*AUTRE*/
    	 SITUATION_&I="AUTRE";
     
    	 /*PRP*/
    	 IF MOTCD&debut=67 THEN SITUATION_&I="PRP";
     
     
    %END;
     
    RUN;
    %MEND;
    %DEJAPRP(MMOISDEB=379,MMOISFIN=390);
    Comme le montre le code, j ai besoin de créer une macro-variable, afin de récupérer la valeur de ENTREE_PRP( je ne vois pas comment faire autrement).

    A mon grand regret, ma mv %debut ne prend pas toutes les valeurs de ENTREE_PRP, mais simplement "ENTREE_PRP" , tout le temps

    Par contre, si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DATA _NULL_;
    	 set PTAUX01RC ;
    CALL SYMPUT ('debut',ENTREE_PRP);
    %PUT &debut;
    run;
    La mv %debut prend bien toutes les valeurs de ENTREE_PRP.

    Voilà, en espérant que quelqu'un ait une idée, je vous souhaite une excellente journée bien ensoleillée!!! (et c est pas souvent le cas quand on habite à Lille )

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Si je suis bien, il faut creer et appeler une mv dans la meme etape.

    Pour cela il faut utiliser un CALL SYMPUT puis utiliser un RESOLVE.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    En gros oui.

    RESOLVE je ne connais pas, je vais l essayer merci.

    Par contre j ai creusé un peu sur d autres topics, ce qui m a permis d avancer et d'écrire ceci :

    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
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
    DATA _null_; 
    SET PTAUX01RC;
    call symput('debut_'||LEFT(trim(numdo)),ENTREE_PRP);
    run;
    
    DATA PTAUX01RC;
    
       set PTAUX01RC ;
    
     
    %DO I=1  %TO 12 ;
         /*AUTRE*/
    	 SITUATION_&I="AUTRE";
     
    	 /*PRP*/
    	 IF MOTCD&debut=67 THEN SITUATION_&I="PRP";
     
     
    %END;
     
    RUN;
    %MEND;
    %DEJAPRP(MMOISDEB=379,MMOISFIN=390);
    Grace à cela, je crée bien toutes mes mv en fonction de "numdo". ça c est top!

    le problème qu'il me reste maintenant, est d'appeler la bonne mv dans ma boucle (l ancienne mv "&debut" doit etre remplacée par "&debut_numdo", avec le bon "numdo")

    je continue de chercher.

    merci pour l aide

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    J ai testé RESOLVE

    malheureusement il ne fonctionne pas dans ma première version.

    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
     
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
    DATA PTAUX01RC;
     
       set PTAUX01RC ;
     
    BY NUMDO;
     
    call symput('debut',ENTREE_PRP);
    var1=resolve(&debut);
    %put &var1;....
     
    RUN;
    %MEND;
    %DEJAPRP(MMOISDEB=379,MMOISFIN=390);
    me retourne "&var1" en affichage, et non pas la valeur de ENTREE_PRP.

    Je ne comprends vraiment pas tout mais je vais trouver!!

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Bon, j avais déjà essayé cette solution mais sans réussite, mais ce matin à ça marche!
    J avais du faire une fausse manip vendredi.

    Pour info, j ai défini la mv en global en début de 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
     
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
    %GLOBAL debut;
     
    DATA PTAUX01RC2;
     
       set PTAUX01RC ;
     
    call symput('debut',ENTREE_PRP);
     
    %DO I=1  %TO 12 ;
         /*AUTRE*/
    	 SITUATION_&I="AUTRE";
     
    	 /*PRP*/
    	 IF MOTCD&debut=67 THEN SITUATION_&I="PRP";
     
    %END;
     
    RUN;
    %MEND;
    merci!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Finalement avec %GLOBAL ça ne fonctionne pas :

    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
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
     
    %GLOBAL debut;
     
    DATA PTAUX01RC2;
     
       set PTAUX01RC ;
     
     
    call symput('debut',LEFT(TRIM(DEBUT_PRP)));
     
    %DO I=1  %TO 12 ;
         /*AUTRE*/
    	 SITUATION_&I="AUTRE";
     
    	 /*PRP*/
    	 IF MOTCD&debut=67 THEN SITUATION_&I="PRP";
     
     
    %END;
    ne me convient finalement pas car &debut a toujours la même valeur (la valeure de "DEBUT_PRP" pour mon premier enregistrement).

    Je n arrive pas à faire en sorte que &debut change de valeur à chaque enregistrement (même avec un %SYMDEL)

    Une idée? Merci

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    Bjr,

    Pourquoi ne pas créer une liste de macro variables au départ et ensuite rassembler ces macro variables en un seul ?
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data _null_ ;
    set bidon end = fin ;
    call symput(TRIM('variable'||compteur),nomvariable);
    if fin = 1 then call symput('max',compteur);
    run ;
    ensuite il faudrait faire une boucle allant de 1 à &max pour concatener les variables sous une macro

    Ou encore , il pourrait concaténer tous les valeurs de ENTREE_PRP dans une colonne d'un data classique. Et ensuite on récupère que la dernière ligne du data ?

    Cdt

    PS : Ouais , le temps est excellent , surtout après un mois de juillet pas fameux. Je te salue cher lillois ( je suis lillois malgrè mon pseudo )
    Rom

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Merci beaucoup pour ton aide mais j'avoue que je ne vois pas trop quoi faire avec une concatenation de l ensemble de mes mv

    J ai besoin de la valeur de chaque mv pour MAJ les données de chacun de mes enregistrements..


    Peut etre ne suis je pas clair dans mes explications...ce ne serait pas nouveau chez moi!

  9. #9
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Bonjour Kykin,

    Au vu de ton code, tu es parti dans le mauvaise direction. Tu peux arriver à tes fins sans avoir recours au langage macro qui est fait pour produire du code conditionnellement à des macroparamètres et non à de la donnée SAS - même si du fait de la plasticité du code SAS, les développeurs mélangent les 2 notions. Poste une version simplifiée de ton problème avec le contenu d'entrée - par exemple quelques observations sur 4 variables SITUATION1, SITUATION2 et Moteurcd1 moteurcd2 - et tu auras des réponses.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    j y suis arrivé!!

    Ce fut compliqué, peut être pas le plus simple à faire, même si la solution tient sur 4 lignes!

    Si ça peut servir à certain(e)s :

    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
    %MACRO DEJAPRP(MMOISDEB,MMOISFIN);
     
    DATA _null_;
    SET PTAUX01RC end=fin;
    call symput('debut_'||LEFT(trim(_n_)),LEFT(TRIM(ENTREE_PRP)));
    IF fin then call symput('nb',_n_);
    run;
     
    DATA PTAUX01RC4(KEEP=NUMDO ENTREE_PRP SITUATION_1-SITUATION_12);
     
     
    set PTAUX01RC ;
     
     
    BY NUMDO;
    %DO h=1 %TO &nb;
     
    	IF &h=_n_ then do;
     
    		%DO I=1  %TO 12 ;
    			IF %EVAL(&&debut_&h.+&i) LE &MMOISFIN THEN DO;
     
        			 /*AUTRE*/
    	 				SITUATION_&I="AUTRE";
     
    				 /*PRP*/
    					IF MOTCD%EVAL(&&debut_&h.+&i)=67 THEN SITUATION_&I="PRP";
     
    			END;
     
    		%END;
     
    	END;
     
    %END;
     
    RUN;
    %MEND;
    %DEJAPRP(MMOISDEB=379,MMOISFIN=390);
    Ainsi, avec _n_, je mets bien en face de chaque enregistrement la mv correspondante.



    A+ et Merci

  11. #11
    Membre éprouvé
    Homme Profil pro
    Ingénieur Pilotage
    Inscrit en
    Avril 2009
    Messages
    405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Pilotage
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 405
    Points : 1 063
    Points
    1 063
    Par défaut
    c'est exactement ce que je voulais dire congrats

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    oui en effet j ai eu un déclic en relisant ta soluce que je n avais pas comprise au début

  13. #13
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonjour, je pense comme sasadm que le code macro est ici de trop (et pas vraiment fait pour ça), si j'ai bien compris ta problématique voici une solution sans code macro

    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
    DATA a;
    input id entree_prp motcd01 motcd02 motcd03
    motcd04 motcd05 motcd06 motcd06 motcd07 motcd08 motcd09
    motcd10 motcd11 motcd12 motcd13 motcd14 motcd15 motcd16
    motcd17 motcd18 motcd19;
    cards;
    1 3 0 0 0 67 0 0 67 0 67 67 67 0 0 0 0 0 0 0 0 0
    2 3 0 0 67 0 0 0 67 0 0 0 0 0 0 0 0 0 0 0 0 0 
    3 5 0 0 0 0 67 0 67 0 0 67 0 0 0 0 0 0 0 0 0 0
    4 5 0 0 67 0 0 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    ;
    run;
    %LET MMOISFIN=15;
     
     
    PROC TRANSPOSE DATA=a OUT=b;
    BY id entree_prp;
    VAR motcd: ;
    RUN;
    DATA b; SET b;LENGTH SITUATION $6;
    IF (entree_prp+1)<=substr(_name_,6)<=(entree_prp+12)
    and substr(_name_,6)<=&MMOISFIN;
    IF COL1=67 THEN SITUATION='PRP';ELSE SITUATION='AUTRES';
    NUM=substr(_name_,6)-entree_prp;
    RUN;
    PROC TRANSPOSE DATA=b OUT=c PREFIX=SITUATION;
    BY id ;
    VAR situation;
    ID NUM;
    RUN;

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    En effet c est une méthode différente

    Assez complexe à mettre sur l ensemble de mon programme (j ai plusieurs critères de selection)
    Mais je la garde pour m en servir plus tard

    merci

  15. #15
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Le problème c'est que si tu as besoin de travailler sur des millions d'observations (même quelques dizaines ou centaines de milliers) tu vas alors très vite trouver les limites de ton code... (à cause du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %DO h=1 %TO &nb;....%END;
    )

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    En effet je m étais fait cette remarque.
    Mais je sais que ma table ne dépassera jamais les 10 000 enregistrements donc ça ira bien

    merci en tous cas des conseils

+ 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. Réponses: 2
    Dernier message: 21/01/2010, 17h02
  3. call symput dans une macro
    Par Manoutz dans le forum Macro
    Réponses: 8
    Dernier message: 29/06/2009, 08h46
  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