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 macro variable texte en dehors d'une macro


Sujet :

Macro

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut utilisation macro variable texte en dehors d'une macro
    Bonjour,

    J'ai le problème suivant.

    J'utilise un %window pour récupérer des macros variables.
    Jusque là, tout va bien

    Ces macro variables sont globales.

    J'ai un libname statement (qui n'est pas dans une macro):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 'F2F.CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00' access=readonly;
    La macro variable devrait changer les 3 premières lettres du chemin du fichier (en fonction de ce que l'utilisteur à demandé dans %window).
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 'F2F.CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00' access=readonly;
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 'F2I.CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00' access=readonly;
    Ma macro variable est donc quelque chose comme:
    Le problème est que je n'arrive pas à faire interpréter ma variable par SAS.
    Je pensais faire quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 '&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00' access=readonly;
    Auriez vous une idée?
    Je me permets d'insister sur le fait que le code de libname n'est pas dans une macro.

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Essaies les doubles quotes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00 " access=readonly;

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    Essaies les doubles quotes:


    Code :
    libname gvfile34 "&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00 " access=readonly;
    Malheureusement, il n'interprète pas.
    Voici le log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    4    %let prefix=F2F;
    5    %put &prefix;
    F2F
    6    libname gvfile34 "&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00 " access=readonly;
    NOTE: Library GVFILE34 does not exist.

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    C'est peu être le fait de combiner %windows avec des macros qui marche pas

  5. #5
    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
    Salut.
    Oui, Brice a mis le doigt sur le souci : tout texte entre apostrophes n'est pas interprété par le compilateur macro.
    Cependant, dans ton cas précis, impossible de passer aux guillemets doubles : MVS n'accepte, je crois, que des apostrophes autour du chemin d'un LIBNAME. Ce qui correspond à l'erreur que tu obtiens.
    La solution qui devrait fonctionner consiste à laisser les apostrophes, puisqu'on ne peut pas faire sans, mais à les masquer au compilateur macro (pour ne pas le stresser. Le pauvre, avec tout ce qu'on lui demande, il faut le comprendre). Ca s'appelle du quoting. Une (parmi une dizaine) des macro-fonctions qui permet de faire cela s'appelle %BQUOTE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %BQUOTE(')&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%BQUOTE(') access=readonly;
    D'autres macro-fonctions de quoting comme %STR feraient l'affaire, on pourrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %STR(%')&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%STR(%') access=readonly;
    mais le % supplémentaire exigé par %STR a tendance à m'énerver (il complique le code, qui n'a généralement pas besoin de ça).
    Bon courage.
    Olivier
    Bon courage.
    Olivier

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    C'est pas plus simple comme ça Olivier?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "%BQUOTE(&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00)" access=readonly;

  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 : 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
    Citation Envoyé par MEGAMIND2 Voir le message
    C'est pas plus simple comme ça Olivier?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "%BQUOTE(&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00) access=readonly;
    Ben déjà il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %BQUOTE('&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00') access=readonly;
    Après, la simplicité varie toujours d'une personne à l'autre. Ce que je trouve lisible, quelqu'un d'autre le trouve compliqué, et vice-versa. L'écriture que je proposait isolait exprès les apostrophes, pour bien souligner qu'il n'y avait qu'elles qui posaient souci. Mais vouloir mettre une seule fonction de quoting se comprend bien aussi.
    Tant que ça fonctionne ! (Pour le moment, on ne le sait pas, d'ailleurs.)
    Bon courage.
    Olivier

  8. #8
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    J'ai pas dit que c'est faux, j'ai du mal à comprendre les imbrications c'est tout!
    C'est pas de ma faute mais de mon cerveau

  9. #9
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Tant que ça fonctionne ! (Pour le moment, on ne le sait pas, d'ailleurs.)
    Et voici le verdict

    Avant de le donner, j'ai découvert autre chose pour mon problème.
    Je lance ma ligne de commande en rsubmit;

    Ce qui fait donc que je dois aussi passer ma variable prefix en remote.
    J'ai donc utilisé le code suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %let prefix=F2F;
    %put &prefix;
     
    %syslput remote_prefix=&prefix;
    J'ai testé les 4 possibilités

    Essai 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %BQUOTE(')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%BQUOTE(') access=readonly;
    SAS est pas content -->log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    121  rsubmit;
    NOTE: Remote submit to SYC2SAS commencing.
    ERROR: Libref in LIBNAME statement must be followed either by quoted string or engine name or
           semicolon; "'" found.
    ERROR: Error in the LIBNAME statement.
    157  libname gvfile34 %BQUOTE(')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V0
    158  0%BQUOTE(') access=readonly;
    NOTE: Remote submit to SYC2SAS complete.
    Essai 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %STR(%')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%STR(%') access=readonly;
    SAS est pas content -->log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    137  rsubmit;
    NOTE: Remote submit to SYC2SAS commencing.
    163  libname gvfile34 %STR(%')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%
    ERROR: Libref in LIBNAME statement must be followed either by quoted string or engine name or
           semicolon; "'" found.
    ERROR: Error in the LIBNAME statement.
    164  STR(%') access=readonly;
    NOTE: Remote submit to SYC2SAS complete.
    Essai 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "%BQUOTE(&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00)" access=readonly;
    SAS est très content ( et moi très très content)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    145  rsubmit;
    NOTE: Remote submit to SYC2SAS commencing.
    166  libname gvfile34 "%BQUOTE(&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00
    NOTE: Libref GVFILE34 was successfully assigned as follows:
          Engine:        BASE
          Physical Name: F2F.CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00
    167  )" access=readonly;
    NOTE: Remote submit to SYC2SAS complete.
    Essai 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %BQUOTE('&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00') access=readonly;
    SAS est pas content non plus --> log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    153  rsubmit;
    NOTE: Remote submit to SYC2SAS commencing.
    169  libname gvfile34 %BQUOTE('&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00
    ERROR: Libref in LIBNAME statement must be followed either by quoted string or engine name or
           semicolon; "'" found.
    ERROR: Error in the LIBNAME statement.
    170  ') access=readonly;
    NOTE: Remote submit to SYC2SAS complete.
    C'est vraiment galère le traitement des quotes en SAS!
    Quel dommage...



    En tout cas, encore un tout grand merci pour votre aide.
    Bonne journée à vous

  10. #10
    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
    Salut.
    Bon, déjà, un problème résolu, c'est bien.
    Maintenant il faut qu'on comprenne. Et ce qui est bien avec le quoting, c'est qu'on a toujours des surprises. J'aurais dû faire des tests sur mon PC avant de poster, j'aurais eu le même message que toi.
    1) depuis le début, le souci c'était une macro-variable inconnue du serveur puisque non "remontée" par %SYSLPUT, plus des apostrophes qui bloquaient le compilateur macro
    2) de ton essai 3, on peut conclure que les guillemets doubles fonctionnent très bien dans ce cas. Donc %BQUOTE est inutile et la solution moins compliquée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00" access=readonly;
    doit fonctionner tout aussi bien (tu peux le confirmer ?).
    3) visiblement le quoting est accueilli assez fraîchement par l'instruction LIBNAME. Il faut donc (après essais sur mon PC cette fois) masquer au compilateur macro (avec %STR ou%BQUOTE) les apostrophes, et ensuite éliminer ce masquage pour le compilateur SAS que ça perturbe (d'où la macro fonction %UNQUOTE !). Là, on touche à une belle saloperie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 %UNQUOTE(%BQUOTE('&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00')) access=readonly;
    Cette syntaxe est à réserver aux gens qu'on n'aime pas, ou à des questions vachardes pour des étudiants en stage.

    Bonne journée.
    Olivier
    Bon courage.
    Olivier

  11. #11
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Salut.
    de ton essai 3, on peut conclure que les guillemets doubles fonctionnent très bien dans ce cas. Donc %BQUOTE est inutile et la solution moins compliquée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00" access=readonly;
    doit fonctionner tout aussi bien (tu peux le confirmer ?).
    Efectivement Olivier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libname gvfile34 "&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00" access=readonly;
    Je confirme, cela fonctionne tout à fait.

    C'est fou cette différence entre simple et double quote!

    Merci encore pour votre aide

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

Discussions similaires

  1. Macro variable dans le nom d'une macro
    Par foxrol dans le forum Macro
    Réponses: 3
    Dernier message: 28/02/2012, 14h23
  2. Réponses: 7
    Dernier message: 03/01/2012, 11h14
  3. Réponses: 11
    Dernier message: 22/02/2011, 16h41
  4. Utiliser le contenu d'une macro variable
    Par stefsas dans le forum Macro
    Réponses: 8
    Dernier message: 22/05/2008, 10h17
  5. Réponses: 9
    Dernier message: 14/04/2008, 11h58

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