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 :

call symput ne me renvoie pas de variable


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2019
    Messages : 8
    Points : 9
    Points
    9
    Par défaut call symput ne me renvoie pas de variable
    Bonjour,

    J'ai un souci avec mon programme ci-dessous.

    Je teste avec une odate :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    x "setenv ODATE 2019-10-31";
     
     
    data _null_;
    	format 	today ddmmyy10. ;
    	/*	Création des macro-variables avec adjonction des quotes pour sql oracle	*/
    	today=mdy(input(substr("&ODATE.",6,2),2.),
                    input(substr("&ODATE.",9,2),2.),
                    input(substr("&ODATE.",1,4),4.));
     
    	put "today :" today;
     
     
    	/*mois de la ODATE */
     
    	annee_obs = year(today);
    	annee_obs1 = put(annee_obs,4.);
    	MV_AN=substr(annee_obs1,3,2);
    	mois= month(today);
     
    	/* Ajout du 0 lorsque le mois est inférieur à 10*/
     
    	if mois<10
    		then 	mois_obs_0=compress('0'||mois);
    		else 	mois_obs_0=cat(''||mois);
     
    	MV_Echeance=compress(mois_obs_0 || MV_AN);
    	MV_MOIS=mois_obs_0;
     
     	/*call symput('MVAnneeN', annee_obs);
        call symput('MVTrim', mois_obs);*/
        call symput('MV_AN', MV_AN);
    	call symput('MV_MOIS', MV_MOIS);
    	call symput('MV_Echeance', MV_Echeance);
    	%let MV_Realisateur = Jacques Provost;
    	*call symput('MV_REALISATEUR',Jacques Provost);
    	/*call symput('MV_realisateur',"'"||sysget("ORA_USER_1")||"'") ;*/
    	*call symput('MV_Realisateur',compress("&sysuserid.")) ;
    	/*call symput('MV_Realisateur',compress("'"||"&sysuserid."||"'")) ;
     
    	/*put annee_obs;*/
    	put mois;
    	put MV_AN;
    	put MV_MOIS;
    	put MV_Realisateur;
    	put MV_Echeance;
     
    run;

    ce qui s'affiche dans le journal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
          158:34   159:28   
    NOTE: Variable MV_Realisateur is uninitialized.
    today :31/10/2019
    10
    19
    10
    .
    1019

    la variable MV_Realisateur ne renvoie rien. Je ne comprends pas. Vous pouvez m'aider.

    Merci d'avance.

    Cordialement,

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    C'est un problème de timing.
    Le %LET est exécuté immédiatement, où qu'il soit. Il n'y a donc pas d'intérêt de mettre le %LET à l'intérieur de l'étape DATA, il pourrait tout aussi bien être avant.
    L'étape DATA, elle, est compilée puis exécutée. CALL SYMPUTX ne rend disponibles les macro-variables qu'il crée qu'après le RUN.
    Il faut réorganiser ton programme.
    Bon courage.
    Olivier

  3. #3
    Membre du Club
    Femme Profil pro
    Formatrice en SAS (en ligne)
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Formatrice en SAS (en ligne)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Points : 46
    Points
    46
    Par défaut Quelques astuces pour simplifier ton code
    1. Pour appeler une macro variable dans une instruction put, on aura besoin d'utiliser &var. entre guillemets doubles.
    2. Pour appeler une macro variable dans une instruction %put, on n'aura pas besoin des guillemets.
    3. Pour ajouter un zéro pour un mois à un chiffre, tu peux utiliser le format z2. dans une fonction put.
    4. Pour travailler avec des valeurs numériques, utilise call symputx (routine qui existe depuis sas 8.2) au lieu de call symput (ancienne routine).
    5. Pour récupérer la valeur d'une macro variable dans la même étape data que celle où elle est créée, tu peux créer une variable avec la fonction symget.




    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 ODATE=2019-10-31;
    %let MV_Realisateur = Jacques Provost;
     
    data _null_;
        call symputx('MV_AN'  ,     substr("&ODATE.",3,2));
        call symputx('MV_MOIS',     substr("&ODATE.",6,2));
        call symputx('MV_Echeance', substr("&ODATE.",6,2) || substr("&ODATE.",3,2));
     
        length MV_AN $2 MV_MOIS $2  MV_Echeance $4;
        MV_AN      =symget('MV_AN');
        MV_MOIS    =symget('MV_MOIS');
        MV_Echeance=symget('MV_Echeance');
     
        put MV_AN;
        put MV_MOIS;
        put MV_Echeance;
        put "&MV_Realisateur.";
    run;
     
    %put &MV_Realisateur.;
    Véronique

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

Discussions similaires

  1. [SQL]Variable qui ne renvoie pas le résultat mais la requête:
    Par vendramelionel dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 02/08/2019, 15h04
  2. Réponses: 4
    Dernier message: 22/04/2015, 17h26
  3. Stockage pas dynamique avec call symput
    Par enicnath dans le forum SAS Base
    Réponses: 1
    Dernier message: 18/10/2012, 16h39
  4. call symput et macro-variable
    Par fafabzh6 dans le forum Macro
    Réponses: 2
    Dernier message: 11/12/2009, 10h15
  5. jointure renvois pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/08/2002, 12h51

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