Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 15h46   #1
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
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 :
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 :
libname gvfile34 'F2F.CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00' access=readonly;
devient
Code :
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 :
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.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h07   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Essaies les doubles quotes:

Code :
libname gvfile34 "&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00 " access=readonly;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h27   #3
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Citation:
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 :
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.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h37   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
C'est peu être le fait de combiner %windows avec des macros qui marche pas
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h40   #5
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 :
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2011, 16h48   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
C'est pas plus simple comme ça Olivier?

Code :
libname gvfile34 "%BQUOTE(&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00)" access=readonly;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h52   #7
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Citation:
Envoyé par MEGAMIND2 Voir le message
C'est pas plus simple comme ça Olivier?

Code :
libname gvfile34 "%BQUOTE(&prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00) access=readonly;
Ben déjà il faudrait écrire
Code :
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.)
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h59   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 10h33   #9
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
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 :
1
2
3
4
%let prefix=F2F;
%put &prefix;
 
%syslput remote_prefix=&prefix;
J'ai testé les 4 possibilités

Essai 1
Code :
libname gvfile34 %BQUOTE(')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%BQUOTE(') access=readonly;
SAS est pas content -->log:
Code :
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 :
libname gvfile34 %STR(%')&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00%STR(%') access=readonly;
SAS est pas content -->log:
Code :
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 :
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 :
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 :
libname gvfile34 %BQUOTE('&remote_prefix..CY.DW.GVD0D$CY.ICDCY250.DS000.G1012V00') access=readonly;
SAS est pas content non plus --> log:
Code :
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
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 10h46   #10
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 :
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/02/2011, 12h20   #11
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
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 :
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 :
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
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h36.


 
 
 
 
Partenaires

Hébergement Web