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 :

Calcul automatique d'une macro-variable


Sujet :

Macro

  1. #1
    Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Août 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 62
    Points : 63
    Points
    63
    Par défaut Calcul automatique d'une macro-variable
    Bonjour,

    Pour actualiser mon programme chaque mois, j'ai besoin de rentrer plein de mois différents en macro-variables en plus du mois actuel. Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %let mois_actuel = "24AUG2014"d;
    %let mois_precedent ="24JUL2014"d;
    %let mois_moins12 = "24AUG2013"d;
    %let mois_moins18 = "24FEB2013"d;
    etc...

    Y a t'il un moyen (avec sysevalf ou eval, sysfunc ?) pour que toutes mes macro-variables soient automatiquement calculées lorsque je rentre le mois actuel pour éviter de les changer mensuellement à la main ?


    intuitivement j'essaierais ceci, mais je ne sais pas quelle unité (mois, année, jour ?) est considérée quand on fait des opérations sur une date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %let mois_actuel = "24AUG2014"d;
    %let mois_precedent = &mois_actuel - 1;

  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
    DATA _null_;
    call symput ('mois_actuel', put (today(),date9.)) ;
    call symput ('mois_precedent',put(intnx('month',today(),-1,'same'),date9.) );
    do i=2 to n ;
    	call symput ('mois_moins'||LEFT(i) , put(intnx('month',today(),-i,'same'),date9.) );
    end;
    run;
    Cordialement

  3. #3
    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,
    Voici une 2ème proposition :
    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
     
    /* Créer les macros macro-variables*/
    %let date= "24AUG2014"d;
    data _null_ ;
    do i=1, 3, 6, 9, 12, 18, 24 ;
    call symputx(cats('mois_moins_', i), put(intnx('Month', &date, -i, 'same'), ddmmyy10.)) ;
    end ;
    run ;	
     
    /* Récupérer les macro-variables et créer une nouvelle variable via la fonction symget */
    data ex_mac ;
    do i=1, 3, 6, 9, 12, 18, 24 ;
    mois=cats('Mois_Moins_', i) ;
    date=input(symget(cats('Mois_Moins_', i)), ddmmyy10.);	 
    output ;
    end ;	  
    format date date9. ;
    run ;
    Cdt Ward

  4. #4
    Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Août 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    Merci de vos réponses.

    Pour le 1er programme, je n'ai aucun message d'erreur sur le journal mais ça ne marche pas. Aucune de mes variables date n'est générée.

    Pour le second programme, les macro-variables générées ont toutes un "G" supplémentaire à la date, du coup elles ne sont pas reconnues. Ex "24GAUG2014"d
    Par contre, j'ai oublié de préciser que %let date est de format 201408 car c'est ce qui me sert à référencer mon chemin de libname.

  5. #5
    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 AllXS7117,

    1/ reessayer avec ce programme est envoyer la log
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DATA _null_;
    call symput ('mois_actuel', put (today(),yymmn6.)) ;
    call symput ('mois_precedent',put(intnx('month',today(),-1,'same'),yymmn6.) );
    do i=2,4,6,8 ;
    	call symput ('mois_moins'||LEFT(i) , put(intnx('month',today(),-i,'same'),yymmn6.) );
    end;
    run;
     
    %put _GLOBAL_;
    2/ Tu pourras également vérifier dans la table sashelp.vmacro si les macro variables récemment créées sont bien présents avec leur valeurs

    Cordialement

  6. #6
    Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Août 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    les variables sont bien créées en global. mais certaines de mes procédures ne marchent pas à cause de la fonction today.

    En fait je travaille sur les données du 30 de chaque mois, celle du mois de juin 2014 actuellement (du coup j'ai mis &mois_actuel (que j'appelle &date dans le journal ci-dessous) dans la fonction today, mais ça ne marche pas partout étrangement, en particulier pour mes proc sql quand je fais appel à mes macro-variables dates. je réessaierai avec la fonction month peut-être)


    Je précise aussi : j'ai mis le format yymmn6. pour mois_actuel, mais pour les mois_precedents (que j'appelle M_ ci-dessous), j'ai du mettre ddmmyy10. vu que je les utilise dans mon programme avec les appels "&"

    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
     
     
     %let date = 201406; /********** Mois M  **********/
    11   DATA _null_;
    12   call symput ('date', put (today(),yymmn6.)) ;
    13   call symput ('M_',put(intnx('month',today(),-1,'same'),ddmmyy10.) );
    14   do i=1,12,18,21,24,36 ;
    15       call symput ('M_'||LEFT(i) , put(intnx('month',today(),-i,'same'),ddmmyy10.) );
    16   end;
    17   run;
     
     
     %put _GLOBAL_;
    GLOBAL M_24 26/08/2012
    GLOBAL M_18 26/02/2013
    GLOBAL M_36 26/08/2011
    GLOBAL DATE 201408
    GLOBAL M_ 26/07/2014
    GLOBAL M_1 26/07/2014
    GLOBAL M_12 26/08/2013
    GLOBAL M_21 26/11/2012

  7. #7
    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
    Si j'ai bien compris, tu cherche à prendre un date de réference et par la suite tu calcul le reste.
    Si c'est le cas, voici une 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
     DATA _null_;
     
    /*Si tu veux fixer un date*/
     
    *date_ref='30Jun2014'd;
     
    /*Si la date est toujours celle du dernier jour du mois precedent ou plus, voici la procedure de calcul   */
    date_ref=intnx('month',today(),-1,'end');
     
    /*Stocker la date de réference */
    call symput ('date',put( date_ref,ddmmyy10.)) ;
     
    /*Calcul les autres dates suivant la date de reference que tu va fixer*/
    call symput ('M_',put(intnx('month',date_ref,-1,'same'),ddmmyy10.) );
     
    do i=2,12,18,21,24,36 ;
     
    call symput ('M_'||LEFT(i) , put(intnx('month',date_ref,-i,'same'),ddmmyy10.) );
       end;
    run;
    Les valeurs des macro variables calculées sont les suivantes:
    %put &date ref;
    31/07/2014 ref
    %put &M_;
    30/06/2014
    %put &M_2;
    31/05/2014
    %put &M_12;
    31/07/2013
    %put &M_18;
    31/01/2013

  8. #8
    Membre du Club
    Homme Profil pro
    Statisticien
    Inscrit en
    Août 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    oui, ça s'approche de ce que je cherche.
    Mais avec la date référente 201406 (je n'ai que des données jusqu'au 30 juin), il faut que mes macro-variables soient : M_12 = "30JUN2013"d, M_18 ="30DEC2012",M_21="30SEPT2012", M_24="30JUN2012, M_36="30JUN2011"d etc...

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/03/2015, 15h43
  2. calcul automatique d'une variable
    Par biologiste dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2008, 12h33
  3. [VBA-E] calculs automatique sur une seule feuille
    Par repié dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2006, 11h53
  4. [VBA-E] Lancement automatique d'une macro (débutante)
    Par pom_poir dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/11/2005, 17h57
  5. exécution automatique d'une macro
    Par faayy dans le forum Access
    Réponses: 12
    Dernier message: 15/06/2005, 14h52

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