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 dynamique de macro variable à partir d'une table


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Création dynamique de macro variable à partir d'une table
    Bonjour,

    Je commence récemment à coder avec des macros et des macros variables sous SAS 9.4 .
    J'ai fait pas mal de recherche sur la création des macros variable mais je peine sur la création dynamique des macros variables je m'explique :

    Je veux créer une macro qui ajoute une ligne vide pour chaque changement de modalité d'une variable
    Le but étant de faciliter la mise en forme des données sous excel avec une formule qui affiche les données sur la feuille INFOS depuis la table exportée sur la feuille DATA

    Exemple : INFOS!D4 =SI(OU(DATA!D4="";DATA!A4=0;DATA!D4=".");"";DATA!D4)

    Les seules informations que je passe à la macros sont : le nom de la table et la variable choisie pour faire les ajouts de ligne vide

    Voici la macro tel qu'elle existe

    Code sas : 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
     
    %macro mise_en_forme_automatise_profil(BASE=, VAR_AJOUT_LIG=);
     
    proc sql ; create table &BASE as select * from &BASE order by &VAR_AJOUT_LIG ;quit;
     
    proc sql noprint ; select count(distinct &VAR_AJOUT_LIG) into: nb_ajout from &BASE;quit;
    proc sql noprint ; select distinct &VAR_AJOUT_LIG into: nom_modal_1-:nom_modal_50 from &BASE;quit;
     
    proc datasets lib=work memtype=data nolist;delete MISE_FORME_&BASE;run;
     
     
    			%do i = 1 %to &nb_ajout;
     
    					proc sql; create table modal_&i as	select * from &BASE 
    					where &VAR_AJOUT_LIG = "&&nom_modal_&i";
    					quit;
     
    					DATA modal_&i;SET modal_&i END=fin ;
    					OUTPUT ; IF fin THEN DO ;
    				  			 	CALL MISSING(OF _ALL_) ;
    							  	OUTPUT ;
    							 END ;
    					RUN ;
     
    						%IF %sysfunc(exist(MISE_FORME_&BASE)) ne 1 %then %do; data MISE_FORME_&BASE; set modal_&i; run;%end;
    						%else %do; data MISE_FORME_&BASE;set MISE_FORME_&BASE modal_&i;run; %end;
     
    					proc datasets lib=work memtype=data nolist;delete modal_&i;run;
    			%end;
     
    %mend mise_en_forme_automatise_profil;

    Ce que je voudrait savoir c'est comment on peut remplacer "nom_modal_50" du code "into: nom_modal_1-:nom_modal_50" par "nom_modal_&nb_ajout" ?

    Même si je fixe un "nom_modal_999" pour être tranquille, je préfère trouver une solution qui adapte le nombre de macro variable à créer, une solution plus "propre".

    Merci de votre attention !

  2. #2
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose cette solution:

    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
    40
     
    Data test;
    set sashelp.class;
    run;
     
    %macro mise_en_forme_automatise_profil(BASE=, VAR_AJOUT_LIG=);
    ;
    proc sql ; create table &BASE as select * from &BASE order by &VAR_AJOUT_LIG ;quit;
     
    proc sort data =&base out=base1 nodupkeys; by &VAR_AJOUT_LIG; run;
     
    data _null_;
    set base1;
    call symputx('nom_modal_'||left(_n_),&VAR_AJOUT_LIG);
    call symputx('nb_ajout',_n_);
    run;
    proc datasets lib=work memtype=data nolist;delete MISE_FORME_&BASE;run;
    			%do i = 1 %to &nb_ajout;
     
     
    					proc sql; create table modal_&i as	select * from &BASE 
    					where &VAR_AJOUT_LIG = "&&nom_modal_&i";
    					quit;
     
    					DATA modal_&i;SET modal_&i END=fin ;
    					OUTPUT ; IF fin THEN DO ;
    				  			 	CALL MISSING(OF _ALL_) ;
    							  	OUTPUT ;
    							 END ;
    					RUN ;
     
    						%IF %sysfunc(exist(MISE_FORME_&BASE)) ne 1 %then %do; data MISE_FORME_&BASE; set modal_&i; run;%end;
    						%else %do; data MISE_FORME_&BASE;set MISE_FORME_&BASE modal_&i;run; %end;
     
    					proc datasets lib=work memtype=data nolist;delete modal_&i base1;run;
    			%end;
     
    %mend mise_en_forme_automatise_profil;
     
    %mise_en_forme_automatise_profil(BASE=test, VAR_AJOUT_LIG=name);
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Je pensais pas qu'on pouvait faire des concaténations pour créer des macros variables avec l'instruction call symputx.

    Merci beaucoup !

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

Discussions similaires

  1. Création dynamique de macros variables
    Par Ouvrier11023 dans le forum Macro
    Réponses: 3
    Dernier message: 10/01/2014, 11h18
  2. Réponses: 4
    Dernier message: 12/03/2013, 17h07
  3. Réponses: 4
    Dernier message: 22/02/2012, 18h07
  4. Réponses: 2
    Dernier message: 11/01/2012, 15h08
  5. [MySQL] Création d'un fichier xml à partir d'une table
    Par astrolane dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/12/2006, 23h12

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