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 :

Problème syntaxe macro


Sujet :

Macro

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut Problème syntaxe macro
    Salut,
    je rencontre qq soucis à l'éxecution de ma macro ...
    dû à des soucis de syntaxe a mon avis ^^

    le message d'erreur est :
    ERREUR: A character operand was found in the %EVAL function or %IF condition where a numeric
    operand is required. The condition was: &nbEcg
    ERREUR: The %TO value of the %DO I loop is invalid.
    ERREUR: The macro UNSCHEDULED will stop executing.
    et mon code :
    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
    42
    43
    44
     
    %macro unscheduled(tabIn, TabOut, nbEcg);
     
    /* declaration du compteur */
    %local i;
    /*%let i=1;*/
    %local nbvisit;
    %let nbvisit=0;
    %local temp;
    %let temp=0;
     
    /*data &tabIn;
    set &tabOut;*/
     
    /* teste chaque obseration */
    %do i=1 %to &nbEcg;
    	data tabIn&i;
    	set tabOut&i
    	%if (%SUBSTRN(visitname, %length(visitname), 1)='U') %then %do;
    				%let nbvisit = %eval(&nbvisit + 1); 
                                                       /* compte les UNS */
    				/* passe à l'observation precendente */
    				%let temp=%eval(&i-1);
    				data tabIn&temp
    				 set tabOut&temp
    				%do %until (%SUBSTRN(visitname, %length(visitname), 1)<>'U');
    		                        /*compte les UNS */					          %let nbvisit = %eval(&nbvisit+1); 
                                                     /* decremente les observations */
    			         %let temp = %eval(&temp -1); 				          data tabIn&temp
                                                     set tabOut&temp;
    			         %end; /* fin du compte des UNS
    				/* on connait le nb de UNS, on renomme les formats visit */
    				/* temp contient l'indice observation du 1er UNS de la visit */
    				/* on est positionner sur temp */
    			     %do %while ( temp<=i);
    			      data tabIn&temp
    			     set tabOut&temp;
    			    visno= %CAT( %substr(visno, 1, %length(visno)-1),(%eval(%substr(visno, %length(visno)-1),1)+1));
    			   %let temp = %eval(&temp +1);
    			     %end; /* fin do while */
    		   %end; /* fin if */
    %end;
     
    %mend;

    Je precise que je suis totalement débutante SAS
    et que ce n'est pas bourré de conneries je l'espere !


    MErci d'avance pour votre aide

  2. #2
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Je vois déjà une première erreur : data tabIn&temp;
    Un conseil met des %PUT pour afficher tes sorties dans le log.

    C'est étonnant tu crée deux fois la table 'data tabIn&temp'

    Je te conseil d'y aller progressivement avec le langage macro, il vaut mieux que tu fasse par étapes pour bien comprendre le fonctionnement des macro-variables, des appels de variables : & et && et des boucles...... je te rassure ce n'est pas très compliqué.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci encore pour ton aide !
    je prefererai aussi y aller petit a petit, je panique un peu car demain apres midi, il faut que çà fonctionne ...
    Je vais revoir çà pas à pas ... je n'ai pas trop le choix ^^
    par contre il ya qqchose que je ne comprend pas ... pas dans la macro ... mais dans l'autre programme la ou jai mes proc data, j'ai déclarer une variable globale du genre : %global nbocc;

    et dans mon proc data, j'affiche dans un des champs
    %let nbocc= _N_ ;

    donc il m'affiche bien l'indice de chaque observation, cependant j'ai l'impression que lorsque je le passe en parametre de la macro, il n'a pas de valeur ...

    c'est possible ?

    je precise qu'il ya 1semaine je n'avais jamais vu un prog sas, ma question peut peut être paraitre bête

    Merci

  4. #4
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Je sais pas si j'ai bien compris ton pb mais bon je pense que ça va pouvoir t'aider.
    Les macros variabes sont écrites en mémoire tampon .... tu peux quand même les afficher dans ton log .... pour les avoir dans une base ou un data il faut que tu utilise dans ton étape data la fonction symget et call symput.
    Ci-dessous un petit exemple qui t'aidera peut être à mieux comprendre.
    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
    DATA base;
    INPUT var1 var2;
    cards ;
    10 11
    15 22
    ;
    RUN;
    %MACRO test();
    %let nbocc= _N_ ;
    DATA base2;
    SET base;
    CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),&nbocc);
    varId=symget("mavar"||left(put(_N_,4.)));
    RUN;
    %MEND test;
    %test();

  5. #5
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Pour voir les subtilités essaye ça.
    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
    DATA base;
    INPUT var1 var2;
    cards ;
    10 11
    15 22
    ;
    RUN;
    %MACRO test();
    DATA base2;
    SET base;
    CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
    varId=symget("mavar"||left(put(_N_,4.)));
    RUN;
    %MEND test;
    %test();

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Bonjour,

    Donc si je comprend bien, je devrais utiliser call symput, a chaque test d'une observation pour récupérer la valeur du champs souhaité ?

    et symget pour rebasculer la valeur changée ?

  7. #7
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    L'avantage des macros - variables est que tu peux ensuite comparer les valeurs d'une colonne données entre différents individus et créer d'autres variables (macro) indiquant la différence observées (en oubliant pas référencer l'individu (un peu comme un tableau)).
    Ensuite tu peux sortir les resultats dans ton data avec call symput et symget.

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci je vais tester

    j'ai l'impression de ramer ^^

  9. #9
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Citation Envoyé par goulhasch Voir le message
    Bonjour,

    Donc si je comprend bien, je devrais utiliser call symput, a chaque test d'une observation pour récupérer la valeur du champs souhaité ?

    et symget pour rebasculer la valeur changée ?
    C bien ça.

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    ok! je viens de tester, çà me parle un peu mieux

    PAr contre il y a encore quelquechose qui me parait flou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ("mavar"||left(put(_N_,4.)
    enfaite "mavar" c'est un nom que tu donne par défaut comme çà ?
    Et "left" sert à quoi ?
    ke put veut dire que tu souhaite qu'il affiche ta valeur de l'observation n ?

    Merci vraiment beaucoup, je vais essayer de faire qqchose de correct maintenant ^^

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Derniere petite question, enfaite je n'ai pas besoin d'utiliser de compteur ?
    juste en utilisant _N_ çà s'incremente tout seul pour chaque test ?

  12. #12
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Citation Envoyé par goulhasch Voir le message
    ok! je viens de tester, çà me parle un peu mieux

    PAr contre il y a encore quelquechose qui me parait flou :

    ("mavar"||left(put(_N_,4.)

    enfaite "mavar" c'est un nom que tu donne par défaut comme çà ?
    Et "left" sert à quoi ?
    ke put veut dire que tu souhaite qu'il affiche ta valeur de l'observation n ?

    Merci vraiment beaucoup, je vais essayer de faire qqchose de correct maintenant ^^
    En fait tu crée une macro-variable pour chaque valeur. Donc dans le cas présent tu as crée deux marco-variable : mavar1 et mavar2 .... le but du left est juste d'incrémenter l'indice.

  13. #13
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Toujours le même programme qui va encore peut être t'aider
    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
     
    DATA base;
    INPUT var1 var2;
    cards ;
    10 11
    15 22
    ;
    RUN;
    %MACRO test();
    %let nbocc= _N_ ;
    DATA base2;
    SET base;
    CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
    varId=symget("mavar"||left(put(_N_,4.)));
    RUN;
    %DO i=1 %TO 2;
    	%LET mavar2&i = %eval(&&mavar&i +10 + &i);
    %END;
    DATA base3;
    SET base;
    varId=symget("mavar2"||left(put(_N_,4.)));
    RUN;
    %MEND test;
     
    %test();

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    ok d'acc, beh je te remercie tout plein,
    comme tu me l'a dit je fais petit à petit,
    je viens de recopier une de mes colonne dans une nouvelle, c'est cool

    le plus dur reste à venir, merki


    je vais tester çà

  15. #15
    Responsable SAS


    Inscrit en
    Septembre 2006
    Messages
    3 176
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 176
    Points : 16 157
    Points
    16 157
    Par défaut
    Le même prog avec les put :
    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
    %MACRO test();
    %let nbocc= _N_ ;
    DATA base2;
    SET base;
    CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
    varId=symget("mavar"||left(put(_N_,4.)));
    RUN;
    %DO i=1 %TO 2;
    	%LET mavar2&i = %eval(&&mavar&i +10 + &i);
    %END;
    DATA base3;
    SET base;
    varId=symget("mavar2"||left(put(_N_,4.)));
    RUN;
    %PUT &mavar1;
    %PUT &mavar22;
    %MEND test;

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    merci encore, c'est beaucoup plus clair

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

Discussions similaires

  1. ajout clé étrangère problème syntaxe
    Par philippe281281 dans le forum Outils
    Réponses: 7
    Dernier message: 11/04/2006, 14h20
  2. Réponses: 1
    Dernier message: 05/04/2006, 14h22
  3. [Tableaux] problème syntaxe concaténation variable
    Par mussara dans le forum Langage
    Réponses: 3
    Dernier message: 01/03/2006, 11h24
  4. Problème syntaxe sql
    Par devdev dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 11/04/2005, 16h31
  5. problème syntaxe sql
    Par mpat dans le forum ASP
    Réponses: 6
    Dernier message: 01/02/2005, 19h28

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