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 :

Affichage sur 2 digits dans une fonction CAT


Sujet :

Macro

  1. #1
    Candidat au Club
    Femme Profil pro
    Ingénieur Statistiques
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Statistiques
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Affichage sur 2 digits dans une fonction CAT
    Bonjour,
    J'ai écrit une macro devant me permettre d'afficher une liste de dates (9 premiers mois sous la forme YYMMM (ex:17M01, pour le mois de janvier 2017) et 3 derniers mois sous la forme YYWXX (ex: 17W09 pour la semaine 9 de 2017).
    Pour cela, j'ai créer des variables intermédiaires dans une macro à l'aide de l'instruction %SYSFUNC.
    Ma variable x3 contient le mois et s'affiche bien sur 2 digits lors de l'affectation par le %LET, mais quand je l'introduis dans une fonction CAT (val2) , il n'y a plus qu'1 seul digit qui s'affiche (17M1).
    Quelqu'un connait-il la raison et la solution ?

    Ci-dessous le code que j'utilise:
    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
     
    %macro remplir_references_dates();
    %DO LOOP=7 %to 12;
    	%LET x1=%SYSFUNC(INTNX(month,%SYSFUNC(INTNX(day,%SYSFUNC(today()),%SYSFUNC(day(%SYSFUNC(today())))-1)),&LOOP.-19));
    	%LET x2=%SYSFUNC(MONTH(&x1.));
    	%LET x3=%SYSFUNC(PUTN(&x2., Z2.));
    	%LET val1=&x1.;
    	%LET val2=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M,&x3.));
     
    	PROC SQL;
    		INSERT INTO RDMTSSMF.REFERENCES_DATES
    			VALUES(&val1.,"&val2.");
    	QUIT;	
    %END;
    %DO LOOP=1 %to 29;
    	%LET val3=%SYSFUNC(INTNX(week,%SYSFUNC(INTNX(day,%SYSFUNC(today()),%SYSFUNC(day(%SYSFUNC(today())))-1)),&LOOP.-30));
    	%LET val4=%SYSFUNC(PUTN(%SYSFUNC(INTNX(week,%SYSFUNC(INTNX(day,%SYSFUNC(today()),%SYSFUNC(day(%SYSFUNC(today())))-1)),&LOOP.-30)),WeekV5.0));
    	PROC SQL;
    		INSERT INTO RDMTSSMF.REFERENCES_DATES
    			VALUES(&val3.,"&val4.");
    	QUIT;	
    %END;
    %mend remplir_references_dates;

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    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 : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    bonjour,
    C’est un peu compliqué avec la fonction CAT dans une macro. Essayez plutôt l’instruction suivante ; c’est direct, facile et ça marche !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %LET val2=%SYSFUNC(PUTN(&x1., year2.))M&x3.  ;
    Cdt Ward

  3. #3
    Candidat au Club
    Femme Profil pro
    Ingénieur Statistiques
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Statistiques
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci.
    Le support SAS m'a fourni une solution quasi similaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %LET val2=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M))&x3.;
    qui fonctionne très bien.

  4. #4
    Candidat au Club
    Femme Profil pro
    Ingénieur Statistiques
    Inscrit en
    Octobre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur Statistiques
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Mais votre solution est bien plus simple...

  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,
    Le sujet est intéressant.
    Je n'arrive pas à comprendre pourquoi cat ne prends pas en compte les zéros.
    La longueur de la macro variable x3 est 2 pour les mois <10.
    Une autre question, pourquoi la fonction repeat quand le nombre de répétition égal à 0 ajoute tout de même le 0 (ce qui explique l'utilisation de la boucle)
    %macro remplir();
    %DO LOOP=7 %to 12;
    %LET x1=%SYSFUNC(INTNX(month,%SYSFUNC(INTNX(day,%SYSFUNC(today()),%SYSFUNC(day(%SYSFUNC(today())))-1)),&LOOP.-19));
    %LET x2=%SYSFUNC(MONTH(&x1.));
    %LET x3=%SYSFUNC(PUTN(&x2., Z2.));
    %let len=%length(&x3.);
    %let len1=%length(&x2.);
    %LET val1=&x1.;
    %LET val12=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M,&x3.));
    %LET val13=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M,%sysfunc(repeat(0,%eval(2-%length(&x2.)))) ,&x2.));
    %if &len1.=1 %then %do;
    %LET val14=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M,%sysfunc(repeat(0,%eval(2-%length(&x2.)))) ,&x2.));
    %end;
    %else %do;
    %LET val14=%SYSFUNC(CAT(%SYSFUNC(PUTN(&x1.,year2.)),M,&x3.));
    %end;
    %put &=x3/&=len./&=val12./&=val12./&=val13./&=val14.;
    %end;
    %mend remplir;
    %remplir;
    *******
    Log
    *******
    X3=11/LEN=2/VAL12=16M11/VAL12=16M11/VAL13=16M011/VAL14=16M11
    X3=12/LEN=2/VAL12=16M12/VAL12=16M12/VAL13=16M012/VAL14=16M12
    X3=01/LEN=2/VAL12=17M1/VAL12=17M1/VAL13=17M01/VAL14=17M01
    X3=02/LEN=2/VAL12=17M2/VAL12=17M2/VAL13=17M02/VAL14=17M02
    X3=03/LEN=2/VAL12=17M3/VAL12=17M3/VAL13=17M03/VAL14=17M03
    X3=04/LEN=2/VAL12=17M4/VAL12=17M4/VAL13=17M04/VAL14=17M04
    Cordialement
    Certification des Talents de la programmation In Memory Statistics sur HADOOP:
    http://talents-imstat.groupe-avisia....avance?uid=162

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

Discussions similaires

  1. Affichage de plusieurs courbes dans une fonction
    Par Seikyo67 dans le forum MATLAB
    Réponses: 14
    Dernier message: 21/05/2014, 10h03
  2. Réponses: 11
    Dernier message: 23/11/2011, 16h46
  3. [Debutant]Integrer l'affichage d'un Component dans une fonction
    Par jeremie64 dans le forum Ext JS / Sencha
    Réponses: 5
    Dernier message: 03/06/2010, 15h54
  4. recuperer l'affichage sur un ecran dans une variable
    Par oussama127 dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2006, 23h34
  5. Affichage d'un vector dans une fonction
    Par jamesleouf dans le forum SL & STL
    Réponses: 1
    Dernier message: 16/03/2006, 19h05

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