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 :

Utilisation %put dans boucle : texte


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Chargé d'études statistiques
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut Utilisation %put dans boucle : texte
    Bonjour à tous,

    J'ai un problème existentiel avec les % put que quelqu'un a peut-être rencontré : comment résoudre l'intérieur d'un %put avant que le %put ne le comprenne comme du texte ? (difficile à bien expliquer)

    Je vous expose le contexte :
    J'ai plein de tables dont la terminaison évolue chaque mois : 1201, 1202, 1203....

    Je dois appeler, en fonction d'une date, les n dernières tables => je dois connaitre les n dernières terminaisons de ces tables.

    J'ai créé cette 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
    %macro N_DERNIERS_MOIS(VAR,NMOIS);
    data _null_;
     DATE = mdy(
                 %substr(&VAR,3,2)
                ,01
                ,%sysevalf(2000 + &VAR/100,floor)
               );
    do i=0 to &NMOIS;
     call symput (compress("DATE"!!put(i,12.)),put(year (intnx('month',DATE,-1*i))-2000,z2.)
                            !!put(month(intnx('month',DATE,-1*i)),z2.));
    end;
    run;
    %do i=1 %to %eval(&NMOIS-1);
     %put &&DATE&i.;
    %end;
    %mend N_DERNIERS_MOIS;
     
    %N_DERNIERS_MOIS(1204,6);

    Les dates se mettent les unes après les autres dans la log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1203
    1202
    1201
    1112
    1111

    Maintenant, je veux les voir apparaître en ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1203 1202 1201 1112 1111
    La macro ci-dessous ne marche pas parce qu'après le %put, SAS interprète tout comme du texte :

    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
    %macro N_DERNIERS_MOIS(VAR,NMOIS);
    data _null_;
     DATE = mdy(
                 %substr(&VAR,3,2)
                ,01
                ,%sysevalf(2000 + &VAR/100,floor)
               );
    do i=0 to &NMOIS;
     call symput (compress("DATE"!!put(i,12.)),put(year (intnx('month',DATE,-1*i))-2000,z2.)
                            !!put(month(intnx('month',DATE,-1*i)),z2.));
    end;
    run;
    %put
        %do i=1 %to &NMOIS;
         &&DATE&i.;
        %end;
        ;
    %mend N_DERNIERS_MOIS;
     
    %N_DERNIERS_MOIS(1204,6);
    Comment faire en sorte que SAS comprenne que la boucle doit être compilée ??

    Merci d'avance pour votre aide
    Laure.

  2. #2
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello,
    il n'est pas possible d'utiliser un %do,.... dans les %LET car tout ce qui vient après le = du %let est intérpreté comme du texte.
    Tu peux contourner ton problème en passant par une proc sql;
    à adapter :
    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
     
    %macro N_DERNIERS_MOIS(VAR,NMOIS);
    DATA _null;
     DATE = mdy(
                 %substr(&VAR,3,2)
                ,01
                ,%sysevalf(2000 + &VAR/100,floor)
               );
     
    do i=0 TO &NMOIS;
     
    dte=put(year (intnx('month',DATE,-1*i))-2000,z2.)
                            !!put(month(intnx('month',DATE,-1*i)),z2.);output;
     
    end;
    run;
     
     
     
    proc sql noprint;
    select dte into: date separated by '  ' from _null;
    quit; 
        %put  NOTE: DATE= &DATE.;
     
    %mend N_DERNIERS_MOIS;
     
    %N_DERNIERS_MOIS(1204,6);
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  3. #3
    Membre à l'essai
    Femme Profil pro
    Chargé d'études statistiques
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Bonjour SAM, merci de ta réponse.

    En fait je veux vraiment créer autant de macro-variables que de mois parce qu'après je vais demander à ce qu'elles soient globales pour les utiliser hors macro.

    Donc mon début de programme doit rester le même.

    Je me dis qu'il doit bien y avoir un moyen pour faire tourner cette boucle et utiliser le %put ! Ça me rend dingue !

  4. #4
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Désolé, mais je n'ai pas tout saisi.
    si tu rajoutes un GLOBAL sa ne fait pas l'affaire non plus ?:
    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
     
    %macro N_DERNIERS_MOIS(VAR,NMOIS);
     
     %global DATE;
     
    DATA _null;
     DATE = mdy(
                 %substr(&VAR,3,2)
                ,01
                ,%sysevalf(2000 + &VAR/100,floor)
               );
     
    do i=0 TO &NMOIS;
     
    dte=put(year (intnx('month',DATE,-1*i))-2000,z2.)
                            !!put(month(intnx('month',DATE,-1*i)),z2.);output;
     
    end;
    run;
     
     
     
    proc sql noprint;
    SELECT dte INTO: date separated BY '  ' FROM _null;
    quit; 
     
     
    %mend N_DERNIERS_MOIS;
     
    %N_DERNIERS_MOIS(1204,6);
     
     
        %put  NOTE: DATE= &DATE.;
    Sinon tes macro variables , tu veux les utiliser où et comment ?
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  5. #5
    Membre à l'essai
    Femme Profil pro
    Chargé d'études statistiques
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    En fait tous les mois je dois savoir quels sont les territoires qui sont sans commerciaux depuis X mois => je dois merger mes tables d'effectifs des commerciaux des X derniers mois.

    Donc j'utilise cette macro en début de programme pour déterminer que :
    - ma table du mois dernier est la table effectif_1206
    - la table d'il y a deux mois est la table effectif_1205...

    Mes macros doivent donc être mises en %global pour pouvoir être utilisées par la suite ou alors il faut que je mette tout dans la macro.

    Et de toute façon, au delà de ça, c'est la curiosité : il doit bien y avoir un moyen de faire un boucle après un %put si tu as n macrovariables à afficher en ligne, non ?

  6. #6
    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
    Non.
    tu le fais avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %do i=1 %to 2;
    %put &i;
    %end;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  7. #7
    Membre à l'essai
    Femme Profil pro
    Chargé d'études statistiques
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Points : 14
    Points
    14
    Par défaut
    Bonjour Datametric,
    Non je ne les veux pas en colonne mais en ligne

Discussions similaires

  1. [JpGraph] Comment utiliser le caractère 'à' dans un texte ?
    Par [ZiP] dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 28/12/2007, 22h35
  2. Réponses: 3
    Dernier message: 07/09/2007, 14h14
  3. Réponses: 12
    Dernier message: 31/05/2007, 14h19
  4. Utiliser une constante dans un texte
    Par 78alex78 dans le forum Langage
    Réponses: 1
    Dernier message: 08/01/2007, 15h23
  5. Utilisation de replace dans champs text
    Par cdelamarre dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 01/12/2004, 17h26

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