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 :

Comportement des macro-fonctions et macro-variables avec des données manquantes


Sujet :

Macro

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut Comportement des macro-fonctions et macro-variables avec des données manquantes
    Bonjour,

    J'ai un soucis et j'aimerai comprendre mieux la façon dont fonctionnent les macro-variables et macro-fonctions dans un programme macro.

    En fait j'ai un soucis, que j'ai réussis à résoudre, avec un macro-programme. Simplement je ne comprends pas pourquoi une solution fonctionne mais pas les autres.

    Voilà le premier macro-programme que j'ai fait (simplifié à l'extrême dans l'exemple) :

    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
    data table;
    v2 = "";
    run;
     
    option mprint mlogic;
     
    %macro test(var=);
    data table;
    set table;
    %if &var. = "" %then %do;
    v3 = 1;
    %end;
    run;
    %mend;
    %test(var=v2);
    &var. = "" en FALSE alors que c'est vrai. Je sais que les macros-variables ne sont rien de plus que du texte, mais comment demander si une variable caractère est en données manquantes ?

    J'ai essayé sans les guillemets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %macro test(var=);
    data table;
    set table;
    %if &var. =  %then %do;
    v3 = 1;
    %end;
    run;
    %mend;
    %test(var=v2);
    Sans succès.

    Et j'ai enfin réussis mais c'est en ne mettant pas mes %IF en macro-fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    %macro test(var=);
    data table;
    set table;
    if &var. = "" then do;
    v3 = 1;
    end;
    run;
    %mend;
    %test(var=v2);
    Pourtant j'avais cru comprendre qu'il fallait utiliser des macro-fonctions quand on s'intéressait à des macro-variables (ici &var.). Pourquoi ne faut-il pas de % ? Et pourquoi dans d'autres cas il en faut un ?
    Je crois avoir déjà parlé un peu de ça dans un ancien sujet mais visiblement je n'ai toujours pas compris.

    Merci,

    alers

  2. #2
    Membre actif
    Homme Profil pro
    KEYRUS - Chef de projet
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : KEYRUS - Chef de projet

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 277
    Points
    277
    Par défaut
    Bonjour,

    J'imagine que "V2" est une variable de la table "MATABLE" ?

    Si c'est le cas et que vous utilisez "%if", il est normal que SAS réagisse de cette manière car votre égalité compare non pas la variable SAS "v2" mais la chaîne de caractère v2.

    Pour tester la variable SAS, il faut utiliser votre dernier code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    macro test(var=);
    DATA TABLE;
    SET TABLE;
    IF &var. = "" then do;
    v3 = 1;
    end;
    run;
    %mend;
    %test(var=v2);
    Vous pouvez utiliser la fonction missing (if missing(&var.) then do).


    Votre premier code va exécuter le code suivant car la chaîne de caractères v2 est différent de la chaîne de caractères ""

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DATA TABLE;
    SET TABLE;
    run;
    Cordialement

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 347
    Points : 235
    Points
    235
    Par défaut
    Merci pour votre réponse c'est déjà bien plus clair pour moi.

    Si je comprends bien, " %IF &var. = "" " va chercher la valeur que j'ai indiquée à l'appel de ma macro et retourner donc " IF v2 = "" " mais en tant que chaine de caractères (et évidemment v2 n'a rien à voir avec une chaine vide), alors que IF &var. va aller chercher la valeur prise par ma variable à chaque ligne.

  4. #4
    Membre actif
    Homme Profil pro
    KEYRUS - Chef de projet
    Inscrit en
    Avril 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : KEYRUS - Chef de projet

    Informations forums :
    Inscription : Avril 2014
    Messages : 45
    Points : 277
    Points
    277
    Par défaut
    Bonjour

    C'est exactement cela.

    %IF &var. = "" va comparer la chaine de caractère v2 à doublequote doublequote, ce qui est différent

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/03/2015, 09h38
  2. Réponses: 2
    Dernier message: 01/12/2008, 14h18
  3. Réponses: 1
    Dernier message: 08/10/2008, 15h30
  4. Réponses: 4
    Dernier message: 13/06/2007, 09h45
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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