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 :

[Macro] Problème de syntaxe (utilisation de variables du type &var&i )


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 4
    Points : 5
    Points
    5
    Par défaut [Macro] Problème de syntaxe (utilisation de variables du type &var&i )
    Bonjour,

    Dans ma programmation, je donne des valeurs à plusieurs variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %let inf_piece_2002=1.017;
    %let inf_piece_2003=1.013;
    %let inf_piece_2004=1.033;
    %let inf_piece_2005=1.028;
    %let inf_piece_2006=1.032;
    %let inf_piece_2007=1.044;
    %let inf_piece_2008=1.044;
    Puis, j'essaie d'appeler ces variables au sein d'une boucle du type "do" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do i=2002 to 2007; 		
    do j=i+1 to 2008;
    var=var*&inf_piece_&j;
    end; end;
    J'essaie ainsi d'utiliser les valeurs inf_piece_2002, inf_piece_2003, ... de façon automatisée.
    Malheureusement, la syntaxe &inf_piece_&j n'est pas bonne. Quelle syntaxe faut il utiliser ?

    Merci d'avance !

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    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
     
     
    %macro test;
    %let inf_piece_2002=1.017;
    %let inf_piece_2003=1.013;
    %let inf_piece_2004=1.033;
    %let inf_piece_2005=1.028;
    %let inf_piece_2006=1.032;
    %let inf_piece_2007=1.044;
    %let inf_piece_2008=1.044;
     
     
    %let var=1;
    %do i=2002 %to 2007; 
    	%do j=&i+1 %to 2008;
     
    		%let var=%sysevalf(&var*&&inf_piece_&j);
    	%end; 
    %end;
    %put &var;
    %mend;
    %test;
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  3. #3
    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
    Bonjour thiblightt.

    Plusieurs problèmes se superposent dans le code proposé.

    1) l'utilisation de la variable J comme si c'était une macro-variable : les deux types d'information ont des vies très différentes, la variable J étant stockée dans une table, et voyant ses valeurs changer dans la boucle de l'étape Data, pendant qu'une macro-variable &J est stockée en mémoire (pas dans une table) et voit sa valeur modifiée par des %LET ou une boucle %DO dans un macro-programme (d'où la solution proposée par Bahraoui).

    2) est-ce que la solution toute en macro proposée par Bahraoui est vraiment optimale dans le genre de programme proposé ? En tout cas, ce n'est pas forcément la seule solution. A partir de la forme proposée initialement, en gardant les 7 macro-variables, on peut utiliser la fonction SYMGET dans l'étape Data pour récupérer la valeur d'une macro-variable. SYMGET a comme argument le nom de la macro-variable, sous forme d'une chaîne de caractères, qui peut être construite par concaténation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do i=2002 to 2007; 
    do j=i+1 to 2008;
    var=var*SYMGET(COMPRESS("inf_piece_"!!j)) ;
    end; end;
    3) une autre piste, vu le code proposé, serait d'abandonner le côté macro-langage pour utiliser plutôt des Arrays. Ce sont des séries de valeurs indexées par un nombre, et ici J jouerait ce rôle dans le même esprit que le code initial. Ca deviendrait (en adaptant les valeurs de J pour qu'elles commencent à 1 pour l'année 2002) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ARRAY inf_piece (7) (1.017 1.013 1.033 1.028 1.032 1.044 1.044) ;
    do i=2002 to 2007; 
    do j=(i-2002)+1 to 7 ;
    var=var*inf_piece(j) ;
    end; end;
    4) enfin, comme l'indique Bahraoui, si on utilise des macro-variables à l'intérieur d'une boucle %DO, on n'obtient pas le résultat escompté avec &var&i. En effet, le compilateur macro transforme les expressions en utilisant les 5 règles suivantes :
    a) l'expression est lue de la gauche vers la droite, et à chaque fois qu'on rencontre un des motifs (b) à (e), il est remplacé et on passe au motif suivant. Si, une fois la lecture terminée, il reste des signes & dans le résultat des transformations, une autre lecture sera effectuée sur le même principe.
    b) le motif &MV est remplacée par la valeur de la macro-variable MV
    c) le motif &MV. est remplacée par la valeur de la macro-variable MV
    d) le motif && est remplacée par la valeur &
    e) le motif composé d'un texte sans &, par exemple MV, est conservé tel quel.

    Par exemple, avec
    %LET var = annee ;
    %LET var1 = 2008 ;
    %LET j = 1 ;

    &var&j --> annee1 (règle b pour &var et règle b pour &j)
    &&var&j --> &var1 --> 2008
    (règle d pour &&, règle e pour var, règle b pour &j
    puis règle a, 2e lecture : règle b pour &var1)

    Olivier
    Bon courage.
    Olivier

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Ok, ca marche, merci pour toutes ces réponses rapides, claires, et précises

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/04/2013, 11h45
  2. Réponses: 0
    Dernier message: 03/02/2009, 23h30
  3. [CR XI] Problème dans l'utilisation des variables partagées
    Par sep_ghis dans le forum Formules
    Réponses: 14
    Dernier message: 03/07/2008, 16h32
  4. Problème avec l'utilisation des variables de session
    Par WagaSeb dans le forum Langage
    Réponses: 16
    Dernier message: 22/06/2007, 15h46
  5. Réponses: 1
    Dernier message: 21/12/2005, 19h08

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