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 :

créer sa propre fonction


Sujet :

Macro

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut créer sa propre fonction
    Bonjour,

    J'ai créé une macro qui récupère un nom de variable dans une table.
    Mon problème c'est que je ne sais pas comment réutiliser cette "fonction".
    Je voudrais faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %macro recup (tabName);
       %global &vbName;
      /* ... */
      &vbName;
    %mend;
     
    %macro modif (tabName);
      /*...*/
      %if %recup(tabName)=1 %then do;
          /*...*/
    %mend;

  2. #2
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    une fois que tu as créé ta macro il faut la compiler, c'est-à-dire lancer le code de %macro à %mend. viens ensuite la deuxième phase, l'éxécution, il suffit d'appeler la macro contenant les paramètres que tu désires.

    dans le cas de ta première macro ca donnerais:

    mais pour info, tu peux récupérer tes variablezs sans passer par le language macro via la proc contents, par exemple

  3. #3
    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
    Bonjour,
    C'est plus facile de t'aider si tu postais ton code.
    Personne va te le piquer, en tout cas pas moi!

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Désolé mais je ne comprend pas la réponse.

    En fait ma 1ière macro récupère le nom de ma 1ière variable (en utilisant un proc contents). Voici le code (je l'avais enlever par soucis de simplicité mais c'est raté apparemment )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    %macro RecupName (mvtable) ;
       %global mvname ;
       proc contents DATA=&mvtable out=resuproc noprint ; run ;
       DATA resultat ;
          SET resuproc (keep=varnum name WHERE=(varnum=1)) ;
          call symputx ("mvname", name) ;
       run ;
       &mvname;
    %mend ;
    Et dans ma 2ième macro je veux faire -entre autre- un test sur cette 1ière variable sans connaitre son nom (d'où l'appel de la 1ière macro).
    /* Je ne pense pas qu'il soit utile de mettre toute la macro */

    Mais la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     %if %RecupName (lib.tab)=1
    engendre un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERREUR: Opérateur requis manquant dans expression : %RecupName (...)=1

  5. #5
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    qd tu lances ce code sas "enregistre", si on peux dire, la macro et ce qu"elle peut faire.

    après il faut l'appliquer sur des données concrètes. C'est l'éxécution. par exemple si tu veux appplliquer ce code au data set appelé test et situé dans la llibraiie bib, il faut que tu lances:

    %recup (bib.test);

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par cemyr Voir le message

    Désolé mais je ne comprend pas la réponse.


    Nous non plus, on comprend pas ce que tu veux.
    dis nous ce que tu veux vraiment faire, on va réflichir avec toi.Il se peut que tu n'as besoin que d'un seul CODE MACRO.

    Julie.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Points : 224
    Points
    224
    Par défaut
    Salut,

    A la place de

    %if %RecupName (lib.tab)=1 , pourquoi ne ferais tu pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %RecupName (lib.tab);
    %if &mvname=1 %then ....
    Et dans ta macro RecupName, ta dernière ligne est inutile (et engendre une erreur chez moi)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut hum hum
    Désolée d'être incompréhensible

    Pour chacune de mes tables, Je veux faire un traitement particulier sur la 1ière variable dont je ne connais pas le nom.

    Pour le moment ,
    1=> je fais "tourner" ma macro 1 qui récupère le nom de ma 1ière variable.
    2=> ensuite je veux l'appeler dans ma macro 2

    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
     
    /* Engendre un message d'erreur */
    %macro essai();
    	data a;
    	set F1.F110780061tab01_a;
    	%if %RecupName (F1.F110780061tab01_a)="" %then a=1;
    	run;
    %mend;
    %essai();
     
    /* Pas de message d'erreur mais ne fonctionne pas */
    %macro essai();
    	data a;
    	set F1.F110780061tab01_a;
    	%RecupName (F1.F110780061tab01_a);
    	%if &mvname="" %then a=1;
    	run;
    %mend;
    %essai();
    En espérant avoir été plus claire...

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 161
    Points : 224
    Points
    224
    Par défaut
    Et çà, c'est bon ?

    Perso, j'évite de mélanger une etape data avec du macro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %macro essai();
     
    	%RecupName (F1.F110780061tab01_a);
     
    	DATA a;
    	SET F1.F110780061tab01_a;
    	IF &mvname="" then a=1;
    	run;
    %mend;
    %essai();

  10. #10
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    si tu essaies de voir ce que sas va faire tourner quand tu lances tes deux macros recupname et essai, tu verras que tu fais une étape data dans une étape data, ce qui n'est un code correct pour sas.

    comme rose le dit, essaie de tout compresser dans une seule macro

  11. #11
    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
    Si On suppose que tu veux faire un proc means sur ta variable passée en paramètre. Je sais pas si j'ai bien compris ce que tu veux

    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
    DATA TEST;
    INPUT X Y Z $;
    CARDS;
    11 45 L
    10 25 M
    78 14 U
     
    ;
    RUN;
     
     
     
    %MACRO RecupName(mvtable=, var=) ;
     
       proc contents DATA=&mvtable. out=resuproc noprint ; 
        run ;
     
     
       PROC SQL;
       SELECT NAME into: mvname separated by ' ' from RESULTAT ;QUIt;
     
    %IF "&var."="&mvname." %then %do;
    	proc means data =TEST;
    		var &var.;
    		output out=Aout(DROP=_TYPE_  _FREQ_);
    	run;
    %END;
     
    %MEND RecupName;
     
    %RecupName(mvtable=TEST,var=X);

  12. #12
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Effectivement je n'avais même pas vu mes étapes data imbriquées!!!
    Ma 2ième macro est très longue et va faire appel de nombreuses fois à la 1ière. C'est pour ca que je les ai séparé.

    en tout cas merci pour votre acharnement et désolé pour cette stupide erreur/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    %macro essai();
    	%RecupName (lib.tab);
    	data a;
    	set lib.tab;
    	if &mvname="" then vara="1";
    	run;
    %mend;
    %essai();

  13. #13
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    pas de soucis...

    une dernière chose: ta macro essai n'a pas de paramètres. Ce qui veux dire qu'à chaque fois que tu vas lancer %essai, tu le feras sur la table physique lib.tab. Ce ne serait pas mieux de passer cette table en dynamique, c'est-à-dire en paramètre?

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    oui bien sûr.. je me répète ma 2ième macro est bien plus longue que celle-ci... ca ce n'était qu'un "essai" pour tester le problème que j'ai rencontré

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    sans macro :

    Utilisation d'un tableau pour y stocker les variables caracteres.
    La première position est la première variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    data WORK.CLASS; 
       length ANALIZ $ 40;
       set SASHELP.CLASS end=eof;
       if mod(_N_, 2) then ANALIZ = "";
                      else ANALIZ = "cqssqd";
       if eof then ANALIZ = repeat(" ", 30) || "  vide";
    run;
     
    data WORK.CHECK;
       set WORK.CLASS;
       array char $32767. _CHAR_ ;
       if char{1} = "" then a = 1;
                       else a = 2;
    run;

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

Discussions similaires

  1. Créer sa propre fonction d'agrégat
    Par Dominique49 dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/07/2012, 14h57
  2. Comment créer mes propres fonctions
    Par matnes dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/09/2007, 09h52
  3. [MySQL] créer ses propres fonctions
    Par essono dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/11/2006, 15h09
  4. Réponses: 4
    Dernier message: 13/08/2005, 10h20
  5. Programme permettant de créer ses propres paquets TCP/UDP
    Par mat087 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2004, 21h42

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