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 :

Récupérer le résultat d'un macroprogramme


Sujet :

Macro

  1. #1
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut Récupérer le résultat d'un macroprogramme
    Bonjour à toutes et à tous,

    Je n'arrive pas à récupérer le retour d'un macroprogramme dans une macrovariable.

    Je souhaite la liste de toutes les tables qui commencent par la chaine "TFU_DATE_VJ0_". Après le dernier underscore j'ai un nombre, éventuellement composé de plusieurs chiffres.

    J'ai donc écrit la macro suivante (à qui je fournis le modèle du nom des tables qui m'intéressent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %MACRO ListeTable(NomTable);
     
    	%LET Nom = %SYSFUNC(TRANWRD(&NomTable.,_,\_));
    	%LET Nom1 = %SYSFUNC(CAT(&Nom.,\_%));
     
    	PROC SQL NOPRINT ;
    		SELECT CATT("Db.",MEMNAME," (IN=dans",MEMNAME,")") INTO :NomListe SEPARATED BY ' ' FROM SASHELP.VSTABLE WHERE libname = upcase("DB") AND MEMNAME LIKE upcase("&Nom1.") ESCAPE "\";
    	QUIT ;
    	"&NomListe";
    %MEND ListeTable;
    (J'ai aussi essayé de supprimer les guillemets autour de &NomListe. dans la dernière instruction avant le %MEND ; mais ça ne change rien au résultat.)

    La liste des tables est stockée dans la macrovariable &NomListe. Pour écrire ce code je me suis appuyé sur le faq, notamment la question suivante :
    http://sas.developpez.com/faq/sas/?p...-macrovariable

    Ensuite dans un autre macroprogramme, j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %LET ListeTableVJ0 = %ListeTable(TFU_DATE_VJ0);
    %PUT VJ0 &ListeTableVJ0.;
    Le résultat est le suivant :
    VJ0 PROC SQL NOPRINT ; SELECT CATT("Db.",MEMNAME," (IN=dans",MEMNAME,")") INTO :NomListe SEPARATED BY ' ' FROM SASHELP.VSTABLE
    WHERE libname = upcase("DB") AND MEMNAME LIKE upcase("TFU\_DATE\_VJ0\_%") ESCAPE "\"; QUIT ; "&NomListe";

    Il recopie tout le contenu du macroprogramme %ListeTable sans me donner le résultat du PROC SQL.

    J'ai beau chercher, je coince... Avez-vous une idée pour que ça marche enfin ? Merci d'avance !

    Bonne journée
    Laurent

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    mais il ne te suffit pas de déclarer NOMLISTE en variable globale et du supprimer "&NomListe"; du code tout simplement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ods _all_ close;
    ods output members=members;
    proc datasets lib=sashelp nodetails;
    quit;
     
    proc sql noprint;
    select QUOTE(STRIP(name)) into :list separated by ','
    from members
    where MemType='DATA' and Name like 'A%'
    ;
    quit;
     
    %put list=&list;
    En plus je ne vois pas quelle chaîne tu concois avec ce code (Notamment ce ESCAPE ...). Ca donnerait si elle était rédigée à la main ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  3. #3
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Merci pour la réponse. Je précise que je débute sous SAS.

    Citation Envoyé par datametric Voir le message
    mais il ne te suffit pas de déclarer NOMLISTE en variable globale et du supprimer "&NomListe"; du code tout simplement ?
    Je préférerais ne pas utiliser de variables génériques pour pouvoir stocker les résultats des divers appels de ce macroprogramme dans des macrovariables distinctes dont je me sers dans la suite du macroprogramme. En fait je n'ai pas besoin du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %PUT VJ0 &ListeTableVJ0.;
    Je l'ai rajouté à des fins de débogages.

    Citation Envoyé par datametric Voir le message
    En plus je ne vois pas quelle chaîne tu concois avec ce code (Notamment ce ESCAPE ...). Ca donnerait si elle était rédigée à la main ?
    Si j'ai bien compris le fonctionnement de LIKE, underscore (_) est un joker qui indique 1 caractère. Or là je veux expressément le caractère '_' dans la chaine. Du coup je le fais précéder d'un caractère d'échappement que j'indique après le mot-clé ESCAPE. Ainsi je cherche dans mon exemple les tables dont le nom commencent par TFU_DATE_VJ0_ (donc par exemple TFU_DATE_VJ0_1, TFU_DATE_VJ0_TRUC, etc...) sans retenir les tables nommés TFU2DATESVJ0A1, etc...
    Pour répondre formellement à la question, à la main, j'écrirais pour un résultat similaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROC SQL NOPRINT ;
    	SELECT CATT("Db.",MEMNAME," (IN=dans",MEMNAME,")") INTO :NomListe SEPARATED BY ' ' FROM SASHELP.VSTABLE WHERE libname = upcase("DB") AND MEMNAME LIKE upcase("TFU\_DATE\_VJ0\_%") ESCAPE "\";
    QUIT ;
    J'espère avoir au moins répondu à la question...

    A plus tard,
    Laurent

  4. #4
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Pour préciser je mentionnais "&NomListe"; qui traîne après QUIT;
    je ne le sens pas utile puisque tu as INTO qui défini la macro variable.
    essaie de relancer ta macro sans cela.

    OK pour ESCAPE, as-tu des tables de type TFU2DATESVJ0A1 (des fois on se complique pour pas grand chose) ?

    CATT("Db.",MEMNAME," (IN=dans",MEMNAME,")") donnerait donc une chaîne contenant :

    db.TFU_DATE_VJ0_1 in=dansTFU_DATE_VJ0_1 db.TFU_DATE_VJ0_2 in=dansTFU_DATE_VJ0_2 db.TFU_DATE_VJ0_3 in=dansTFU_DATE_VJ0_4 ... etc ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  5. #5
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Merci pour ta réponse que je comprends mieux.

    Citation Envoyé par datametric Voir le message
    Pour préciser je mentionnais "&NomListe"; qui traîne après QUIT;
    je ne le sens pas utile puisque tu as INTO qui défini la macro variable.
    J'ai rajouté ce "&NomListe"; en suivant les recommandations de la faq http://sas.developpez.com/faq/sas/?p...-macrovariable
    De ce que je comprends de la faq, rajouter le "&NomListe"; indique au macroprogramme la variable à retourner. Evidemment la réponse date de 2008. Depuis la rivière SAS a coulé sous de nombreux ponts...

    Je suis allé chercher cette faq parce que justement je n'arrivais pas à récupérer la liste que je voulais, je ne voyais pas comment faire d'un macroprogramme une véritable fonction à qui l'on fournit un argument et qui retourne une valeur.

    J'ai essayé la macrovariable globale et ça marche. Merci beaucoup donc !!!

    Par contre pour ma culture générale, si vous savez comment faire une fonction avec SAS, je suis preneur !!!

    Citation Envoyé par datametric Voir le message
    OK pour ESCAPE, as-tu des tables de type TFU2DATESVJ0A1 (des fois on se complique pour pas grand chose) ?
    Je n'ai pas de table TFU2DATESVJ0A1 mais j'ai une table TFU_DATE_VJ0. Pour la discriminer des tables TFU_DATE_VJ0_1, etc... je n'ai pas trouvé d'autres méthodes que celle-ci un peu lourde. D'ailleurs je n'ai pas compris pourquoi un LIKE TFU_DATE_VJ0_% inclut dans son résultat le TFU_DATE_VJ0... Du coup je m'en suis sorti comme ça.
    Evidemment je suis preneur de toute autre solution plus légère ou de toute explication sur l'inclusion de TFU_DATE_VJ0 à partir de l'instruction LIKE TFU_DATE_VJ0_%

    Citation Envoyé par datametric Voir le message
    CATT("Db.",MEMNAME," (IN=dans",MEMNAME,")") donnerait donc une chaîne contenant :

    db.TFU_DATE_VJ0_1 in=dansTFU_DATE_VJ0_1 db.TFU_DATE_VJ0_2 in=dansTFU_DATE_VJ0_2 db.TFU_DATE_VJ0_3 in=dansTFU_DATE_VJ0_4 ... etc ?
    C'est effectivement cette chaine que je veux/voulais et que j'ai obtenu !

    Merci en tous les cas pour le temps et l'aide apportée.

    A bientôt
    Laurent

  6. #6
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    J'ai cet article qui parle de la proc FCMP

    Site datametric : comment créer des fonctions avec la proc FCMP

    Elle permet de créer des fonctions.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  7. #7
    Membre habitué
    Homme Profil pro
    Data Manager
    Inscrit en
    Octobre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Manager
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 151
    Points : 167
    Points
    167
    Par défaut
    Citation Envoyé par datametric Voir le message
    J'ai cet article qui parle de la proc FCMP

    Site datametric : comment créer des fonctions avec la proc FCMP

    Elle permet de créer des fonctions.
    Ben super ! Merci beaucoup.

    Tout y est, je passe le topic en résolu.

    A bientôt
    Laurent

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

Discussions similaires

  1. Récupérer le résultat d'un macroprogramme
    Par salmabarik dans le forum Macro
    Réponses: 12
    Dernier message: 11/08/2013, 20h42
  2. Réponses: 1
    Dernier message: 28/06/2005, 09h15
  3. récupérer le résultat d'une requete
    Par sheira dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2004, 11h04
  4. [C#] Récupérer le résultat d'une procédure stockée
    Par fabrice1596 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/10/2004, 13h45
  5. Réponses: 5
    Dernier message: 05/10/2004, 13h05

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