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 :

Création de variables dans un Array à partir de macro variables


Sujet :

Macro

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut Création de variables dans un Array à partir de macro variables
    Bonjour,
    J'essaie d'automatiser un code qui permet, à partir d'une liste de variable de faire différents calculs.

    Dans mon cas:
    La table Table_Com contient une colonne age (de 0 a 120), et une colonne lx_TD contenant des valeurs associées à chaque age.
    Je crée 120 macros variables (lxtd1, lxtd2,...) à partir des 120 ages.
    Je voudrais dans un array créer des nouvelles variables à partir de ces macros variables.
    J'ai plusieurs calculs à faire plus ou moins simples à partir de ces 120 macros variables, par exemple je voudrais ensuite créer une variable qui dépend de deux indices différents:
    qi=lxtd(i+1)/lxtdi. Voila pourquoi je voudrais passer par une boucle et non pas faire 120 cas pour chaque calcul.

    Dans l'exemple qui suit j'essaie simplement d'attribuer à 120 nouvelles variables les 120 macros variables existantes, mais ça ne fonctionne pas.

    Code SAS:

    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
    data Table_Com;
    set Table_Com;
    call symput(COMPRESS("lxtd"!!age), lx_TD);
    run;
     
     
    %macro a();
    data Table_test;
    set Table;
    array lx(120);
     
    		%do i=1 %to 120;
    		lx(i)=&&lxtd&i.;
    		/*lx(i)=symget("lxtd"!!LEFT(&i.));*/
    		%end;
     
    run;
    %mend;

    Voila le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NOTE: Ligne générée par la variable macro "I".
    1     &lxtd118.
          -
          386
           --------
           201
    AVERTISSEMENT: Référence symbolique apparente LXTD118 non traitée.
    NOTE: Ligne générée par la variable macro "I".
    Pouvez m'aider ou m'indiquer quelques pistes s'il vous plaît?

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    Est ce que tu es sur d'avoir créer 120 macro variables?
    Tu peux afficher la 118, 119 et la 120?

  3. #3
    Membre Expert
    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
    Par défaut
    Bonjour,
    Il faut indicer chacune de tes macro-variables comme suit:
    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
     
    DATA Table_Com;
    do i=1 to 120;
    age=ranuni(13);
    output;
    end;
    run;
    DATA _null_;
    SET Table_Com;
    call symput('age'||left(_n_), age);
    call symput('nb', _n_);
    run;
    /* affichage dans l'output*/
    %MACRO M;
    %do i=1 %to &nb.;
    %PUT age&i.=&&age&i.;
    %end;
    %MEND;
    %M;

    Mais la solution adaptée à ton pb :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DATA Table_test;
    SET Table_Com;
    array age2(*) age; 
    	do i=1 to dim(age2);
    		lx=age2(i);
    	end;
     
    run;
    Il n'est pas nécessaire d'utiliser des vecteurs dans ce cas, mais si c'est pour ta culture générale, why not?

  4. #4
    Membre Expert
    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
    Par défaut
    Un bon exemple pour comprendre (à partir de n dates de naissance, tu générées n ages):

    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
    DATA age;
    input dt_nais1 dt_nais2 dt_nais3 dt_nais4;
    format dt: date9.;
    cards;
    456 1589 158 2765
    ;
    run;
     
    data ag2;
    set age;
    array dt[*] dt_nais1-dt_nais4;
    array age[*] age1-age4;
    do i=1 to dim(age);
    age[i]=int((today()-dt[i])/365);
    end;
    drop i;
    run;

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 6
    Par défaut
    Bonjour,
    Tout d'abord merci pour vos réponses, bahraoui tu as raison j'avais mal déclaré mes macro-variables, mais même après les avoir créé mon code ne fonctionne pas.
    MEGAMIND j'ai utilisé call symput('age'||LEFT(_n_), age); pour créer mes macros variables comme tu me l'as indiqué, et je penses avoir compris le fonctionnement de l'array, mais je n'arrive pas à résoudre mon problème:

    Tout d'abord je crée 100 macro variables indicées de 1 a 100, par exemple macro1, macro2.....
    J'ai un tableau de 100 observations, dans lequel je veux ajouter une colonne QX contenant ces 100 macros variables.
    Dans ma première ligne je veux mettre &macro1. dans la variable QX, dans la deuxième ligne &macro2. dans la variable QX, et ainsi de suite


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data Table;
    set Table;
    array varr(*)
    		QX;
     
     
    		do i=1 to dim(varr);
     
    			varr(i)=&&macro&i..;
     
     
    		end;
    run;

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Par défaut
    La langage base ne contrôle pas le macro langage.
    Le langage macro est exécuté avec le langage base.
    C'est un peu compliquer à expliquer
    Ci-dessous un exemple avec ce que tu veux faire
    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
     
    data a;
    a=1;output;
    a=2;output;
    run;
     
    data _null_;
    set a;
    call symput("mac"||left(trim(_n_)),a);
    call symput("nb",_n_);
    run;
    %macro r;
     
    data t;
    array t(2);
     
    	%do i=1 %to &nb;
    		%put &&mac&i.;
    		t(&i)=&&mac&i.;
    	%end;
    run;
     
    %mend;
    %r;

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/12/2012, 11h09
  2. Macro variable dans le nom d'une macro
    Par foxrol dans le forum Macro
    Réponses: 3
    Dernier message: 28/02/2012, 14h23
  3. Réponses: 3
    Dernier message: 03/09/2008, 15h47
  4. [Tableaux] Insertion de variable dans un array
    Par Lenorah dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2008, 12h32
  5. Réponses: 6
    Dernier message: 28/06/2007, 11h17

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