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 :

Pouvoir utiliser la valeur numérique d'une macro variable pour une autre macro variable


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Pouvoir utiliser la valeur numérique d'une macro variable pour une autre macro variable
    Bonjour,
    En fait..J’ai une table numéro/date_activation/recharge_1./recharge_2…recharge_122
    la variable recharge_1 représente la recharge du 1er avril-2016 , recharge_2 celle du 2 avril ..etc
    Je veux calculer une nouvelle variable à partir des variables 'recharge' mais conditionnée par la date_activation :
    Je m’explique :
    si la date_activation d'un numéro est le 5-avril-2016 alors ma variable day_cum1 doit contenir la valeur recharge_5
    si la date_activation d'un numéro est le 10-avril-2016 alors ma variable day_cum1 doit contenir la valeur recharge_10
    si la date_activation d'un numéro est le 1-mai-2016 alors ma variable day_cum1 doit contenir la valeur recharge_31

    Le code d’en dessous ne marche pas parce que la variable i est statique et ne prend que la date_activation de la dernière observation:

    data _NULL_;
    set test;
    call symputx('i',intck('day','01apr2016'd,datepart(activation_date))+1);
    run;

    %macro cl();
    DATA test2;
    set test;
    day_cum1=rech_b&i.;
    day_cum2=sum(rech_b&i.,rech_b%eval(&i.+1));
    day_cum3=sum(rech_b&i.,rech_b%eval(&i.+2));
    run;
    %mend;
    %Cl();

  2. #2
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour
    Moi je n'ai pas bien compris le code car vous avez parlé de day_cum1 mais je vois dans le code day_cum2 et day_cum3.
    Cependant, en me basant sur votre explication de début, j'ai construit un code qui renvoie les information indiquées.
    J'ai d'abord créé un table pour faire la vérification.

    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 test;
    input date $9.;
    cards;
    01apr2016
    18apr2016
    29apr2016
    01may2016
    18may2016
    03jun2016
    11jul2016
    01aug2016
    ;run;
     
     
    data test;
    set test;
    day_cum1=compress('recharge_' || input(Date,date7.)-input('01apr2016',date7.)+1);
    run;

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci
    Merci bcp Haache pour votre retour,
    En fait, la table initiale contient en plus des dates, les valeurs des recharges (recharge_1, recharge_2 ..recharge_122) : en fait l'indice de la variable recharge représente la diff entre la date_activation et le 1avr2016 pour chaque observation.
    Je dois construire des nouvelles variables day_cum1, day_cum2..day_cumn en se basant sur le contenu des variables recharge_:
    par exemple:
    On peut se contenter de calculer day_cum1 pour le moment:
    si la date_activation est le 05avril2016 et recharge_5 est 10 alors :day_cum1 doit contenir 10
    si la date_activation est le 05mai2016 et recharge_35 est 1 alors :day_cum doit contenir 1
    si la date_activation est le 01mai2016 et recharge_31 est 20 alors :day_cum doit contenir 20
    etc..
    Merci d'avance

  4. #4
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Je pense que ce n'est pas clair
    La table de départ a combien de variables et combien d'observations ?
    C'est comme si on a 123 variables et tantôt la variable créée est liée avant recharge_5 après c'est recharge 31
    Donnez un exemple d'une base de 5 observations environs et indiquer la sortie qu'on doit avoir.
    Est ce qu'on a la variable date et 122 autres variables après ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Novembre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2016
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci Haache pour votre retour,
    Je joins ma réponse un fichier excel qui explique la demande , j'espère que cela devient plus claire maintenant.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par abdesslem_hammami Voir le message
    Merci Haache pour votre retour,
    Je joins ma réponse un fichier excel qui explique la demande , j'espère que cela devient plus claire maintenant.
    Oui c'est clair
    Donc le code que j'avais donné marche. Je ne sais pas pourquoi on a besoin des recherche avant de trouver day_cum
    Dans le code j'ai pu calculé day_cum sans calculer recherche1, 2 .... 121.
    Day_cum c'est juste la différence entre la date et 1/4/16 non ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour Hammami,
    En fait, on peut résoudre ce problème sans recours à une macro programme (c’est faisable mais un peu compliqué). Un simple code d’une étape data, peut faire l’affaire, en utilisant par exemple Call Execute, un Array ou un code Hash. Je te suggère ceci qui donne la somme totale de la colonne day_cum juste après sa création :
    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
    %let date="01apr2016"d ; 
    data Table_1 ; 
    set Tatable ; 
    Diff=intck('day', &date., date_Activ)+1 ;
    run;	
     
    data _null_ ;
    set Table_1 end=Fin ;	
    if _n_=1 then call execute( 'data Finale(keep=somme) ; 
                   set Table_1 end=last ; 
    			   retain somme ;' ) ; 
    call execute( 'if Diff ='||strip(Diff)||' then do ;' 
                   ||'day_cum'|| '=' ||cats("recharge_", Diff)|| '; 
                   somme=sum(somme, day_cum) ;    end ;' ) ;
    if Fin   then call execute('if last then output ;  run ;') ;  
    run;
    Cordialement
    Ward

Discussions similaires

  1. Réponses: 40
    Dernier message: 04/11/2016, 17h28
  2. Réponses: 7
    Dernier message: 17/09/2014, 11h30
  3. Utiliser la valeur numérique d'une macro-variable?
    Par Laurent Q. dans le forum Macro
    Réponses: 4
    Dernier message: 14/12/2011, 17h17
  4. Réponses: 6
    Dernier message: 24/09/2011, 00h40
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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