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 :

[Macro] Caractères spéciaux dans les paramètres d'une macro


Sujet :

Macro

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Par défaut [Macro] Caractères spéciaux dans les paramètres d'une macro
    J'ai fait une macro qui prends parmi les autres paramètres la liste des valeurs séparés par une virgule. Évidement on ne peut pas juste mettre cette liste dans la ligne d'appel de la macro - SAS verra les virgules, pensera qu'il s'agit de plusieurs paramètres au lieu d'un et affichera l'erreur "ERREUR: Nbre de paramètres positionnels supérieur au nbre de paramètres définis."

    Donc, j'utilise la fonction %str pour (si je comprends bien son fonctionnement) remplacer les caractères spéciaux (genre virgule) par d'autres caractères qui seront traités ensuite comme des remplaçants des virgules. Mon code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %let variables = %str(NB_SIN, REG_BRUT, FRANCHISE);
    %normalizeTriangle(EX_SURV_SIN, DEROULEMENT, %str(&variables.));
    Tous fonctionne à merveille. Mes je n'écris pas que pour vous faire part de cet exploit. Le problème commence quand je veux alimenter la variable "variables" d'une manière plus automatique. A vrai dire elle est composée des champs d'une table, donc je peux lire la view sashelp.COLUMNS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proc sql;
    	select NAME
    	into :variables separated by ", "
    	from sashelp.VCOLUMN
    	where MEMNAME = "TR_PLAT"
    		and NAME not in ("EX_SURV_SIN", "DEROULEMENT")
    ;
    quit;
    Au premier regard (%put &variables.;) ma variable contient exactement la même chose qu'avant. Or quand j'appelle ma macro avec %str(&variables.) comme paramètre j'ai bon vieux "ERREUR: Nbre de paramètres positionnels supérieur au nbre de paramètres définis."

    Est-ce que quelqu'un comprends ce qui se passe ? Comment faire ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    Bonjour,

    que veux tu faire avec "%str()" exactement ? supprimer les virgules ?

    => Si oui, alors ce n'est %str() qu'il faut utiliser car cette fonction (si je ne me trompe pas) te permet de ne pas interprétrer ce qui y est dedant ou un truc comme ça. Ex : Perso je l'utilise souvent pour écrire la double cote : %str(")

    => Si non, alors c'est par ce que tu as des virgules dans &VARIABLES, du coup dans l'appelle de ta macro tu écris 10 milles paramêtres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %let VARIABLES = %str(NB_SIN, REG_BRUT, FRANCHISE);
    %normalizeTriangle(EX_SURV_SIN, DEROULEMENT, %str(&variables.));
    Donne :

    %normalizeTriangle(EX_SURV_SIN, DEROULEMENT, NB_SIN, REG_BRUT, FRANCHISE);

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 233
    Par défaut
    Bonjour Alex !

    Comme j'ai écris dans mon message, j'ai deux morceaux de code. L'un qui marche, et l'autre qui ne marche pas. Ce que je cherche, c'est de comprendre la différence entre eux et adapter celui qui ne marche pas, parce que c'est lui qui m'intéresse in fine.

    Tu vois mon problème ?

    Sinon j'ai écris un cas de test simple :
    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
    data TEST;
       input CLIENT GARANTIE $ TAUX;
       datalines;
    1 1 10
    1 2 11
    2 1 12
    2 2 13
    2 2 14
    ;
    run;
     
    %macro normalizeTriangle(variables);
    proc sql;
    create table TEST2 as
    	select &variables.
    	from TEST
    ;
    quit;
    %mend normalizeTriangle;
     
    /* Ça marche */
    %let variables = %str(CLIENT, GARANTIE, TAUX);
    %normalizeTriangle(%str(&variables.));
     
    /* Ça ne marche pas */
    proc sql;
    	SELECT NAME
    	INTO :VARIABLES separated BY ", "
    	FROM sashelp.VCOLUMN
    	WHERE MEMNAME = "TEST"
    ;
    quit;
    %normalizeTriangle(%str(&variables.));

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    Salut,

    Il faut que tu positionnes des %put dans ton code, pour bien voir ce que tes Macro var retourne (ou tu mets l'option symbolgen pour afficher la valeur de tes macro var mais c'est lourd):

    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
     
    DATA TEST;
       input CLIENT GARANTIE $ TAUX;
       datalines;
    1 1 10
    1 2 11
    2 1 12
    2 2 13
    2 2 14
    ;
    run;
     
    %macro normalizeTriangle(VARIABLES);
    %put Var_IN_MACRO = &VARIABLES;
    proc sql;
    CREATE TABLE TEST2 AS
    	SELECT &variables.
    	FROM TEST
    ;
    quit;
    %mend normalizeTriangle;
     
    /* Ça marche */
    %put -- OK --;
    %let VARIABLES = %str(CLIENT, GARANTIE, TAUX);
    %put VARIABLES = &VARIABLES;
     
    %normalizeTriangle(%str(&variables.));
     
     
    /* Ça ne marche pas */
    proc sql;
    	SELECT NAME
    	INTO :VARIABLES separated BY ", "
    	FROM sashelp.VCOLUMN
    	WHERE MEMNAME = "TEST"
    ;
    quit;
    %put -- KO --;
    %put VARIABLES = &VARIABLES;
    %normalizeTriangle(%str(&variables.));
    et moi j'ai ceci :

    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
    1096  /* Ça marche */
    1097  %put -- OK --;
    -- OK --
    1098  %let VARIABLES = %str(CLIENT, GARANTIE, TAUX);
    1099  %put VARIABLES = &VARIABLES;
    VARIABLES = CLIENT, GARANTIE, TAUX
    1100
    1101  %normalizeTriangle(%str(&variables.));
    Var_IN_MACRO = CLIENT, GARANTIE, TAUX
    
    ...
    
    1112  %put -- KO --;
    -- KO --
    1113  %put VARIABLES = &VARIABLES;
    VARIABLES = SYSDATE, CLIENT, GARANTIE, TAUX
    1114  %normalizeTriangle(%str(&variables.));
    ERROR: More positional parameters found than defined.
    Tu as remarqué ce "SYSDATE" qui c'est ajouté dans le 2nd script, c'est par ce que CHEZ MOI, j'ai une autre table TEST dans une autre librairie....

    Dans ta requete SQL rajoute dans ton where le filtre sur le nom de ta librairie (LIBNAME="WORK").

    Bon par contre je te rassure pas du tout : ca ne marche tjs pas

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    Ok c'est a cause du 1er %str() qui n'est pas présent dans ton 2nd code si tu test ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %let VARIABLES = CLIENT, GARANTIE, TAUX;
    %put VARIABLES = &VARIABLES;
     
    %normalizeTriangle(%str(&variables.));
    Ca ne marche pas non plus.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    Voici ce que je peux te proposer :
    Tu utilises le séparateur 'espace' et tu remplace 'espace' par ',' dans ta 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
    19
    20
    21
    22
    23
     
    %macro normalizeTriangle(VARIABLES);
    %let Var = %sysfunc(translate(&VARIABLES,', ',' '));
    %put &Var;
    proc sql;
    CREATE TABLE TEST2 AS
    	SELECT &var.
    	FROM TEST
    ;
    quit;
    %mend normalizeTriangle;
     
    proc sql;
    	SELECT NAME
    	INTO :VARIABLES separated BY " "
    	FROM sashelp.VCOLUMN
    	WHERE LIBNAME="WORK" and MEMNAME = "TEST"
    ;
    quit;
     
    %put -- KO--;
    %put VARIABLES = &VARIABLES;
    %normalizeTriangle(&variables.);
    en espérant que ça te convienne.

  7. #7
    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 : 48
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Salut.
    Je suis toujours embêté avec le quoting (les fonctions comme %STR, %NRSTR, etc.) : j'arrive à faire fonctionner à peu près mes programmes, mais rarement à expliquer correctement POURQUOI ça fonctionne.
    Dans ton exemple simplifié, il faudrait, pour être tranquille, mettre une fonction de quoting plus "costaude" au moment de l'appel de la macro-variable (%NRBQUOTE) puis une fonction "inverse" (%UNQUOTE) au moment où on veut utiliser la valeur avec ses virgules.
    L'idée du quoting c'est de masquer (temporairement) les caractères problématiques. Donc au moment où on dit %NRBQUOTE(&var.) le compilateur macro ne voit rien, puis à %UNQUOTE(&param.), il a le droit d'y fourrer son nez.
    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
    DATA TEST;
       input CLIENT GARANTIE $ TAUX;
       datalines;
    1 1 10
    1 2 11
    2 1 12
    2 2 13
    2 2 14
    ;
    run;
     
    %macro normalizeTriangle(VARIABLES);
    proc sql;
    CREATE TABLE TEST2 AS
    	SELECT %UNQUOTE(&variables.)
    	FROM TEST
    ;
    quit;
    %mend normalizeTriangle;
     
    /* Ça marche */
    %let VARIABLES = %str(CLIENT, GARANTIE, TAUX);
    %normalizeTriangle(%NRBQUOTE(&variables.));
     
    /* Ça marche aussi */
    proc sql;
    	SELECT NAME
    	INTO :VARIABLES separated BY ", "
    	FROM sashelp.VCOLUMN
    	WHERE MEMNAME = "TEST"
    ;
    quit;
    %normalizeTriangle(%NRBQUOTE(&variables.));
    Olivier

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

Discussions similaires

  1. Afficher les paramètres d'une macro dans un ordre aléatoire
    Par oc_alex86 dans le forum Programmation (La)TeX avancée
    Réponses: 2
    Dernier message: 10/11/2013, 18h10
  2. Caractères spéciaux dans les paramètres d'URL
    Par zekabyle dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 28/05/2013, 10h45
  3. [Batch] caractère espace dans les paramètres d'une commande
    Par coleed dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 02/08/2011, 16h11
  4. Caractères spéciaux dans les noms de variables POST
    Par guidav dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2007, 13h36
  5. [RegEx] Caractères spéciaux dans le nom d'une variable
    Par Cartouche dans le forum Langage
    Réponses: 7
    Dernier message: 11/05/2007, 23h51

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