|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour,
Pour les besoins de mon programme, j'ai crée au sein d'une étape data (plus précisément au sein d'une boucle array) une macro, cette macro dépend de i qui est mon compteur de boucle array J'explique brièvement le but de mon programme: J'ai plusieurs lignes dans ma table, chaque ligne contient des informations sur une personne, et pour chaque personne je dois calculer la variable indice en fonction de l'age de la personne projeté sur 10 années. J'ai dans ma table une variable Age et des variables var1, var2,...var100. Je calcule la variable indice en fonction de la variable Age et de i, si Age+i=25 alors indice(i)=var25. Je voudrais savoir si le fait de créer des macros au sein de mon étape data peut poser problème? Ces macros dépendent de i qui varie avec ma boucle, est ce deconseillé? Merci d'avance. Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() |
Je ne pense pas que le compilateur acceptera ce genre de syntaxe.
Je testerai demain ton code. Je l'écrirai plutôt comme ça. Code :
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
|
||
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour.
Ta macro n'est pas créée "au sein de l'étape DATA" même si le code en donne l'impression. Elle est créée avant l'exécution de l'étape DATA car le compilateur macro travaille toujours avant le compilateur SAS. Tu aurais donc pu même définir le macro-programme (de %MACRO à %MEND) avant le début de l'étape DATA, ça n'aurait rien changé. C'est au moment de l'appel (%test) que tout se joue : soit le code SAS généré par le compilateur macro s'intègre bien au contexte (et tout va bien), soit ce n'est pas le cas et en découvrant le résultat, le compilateur SAS va tordre du nez. Dans le code que tu donnes, le %DO ne fait jamais qu'un copier/coller. Le code SAS généré (tu peux le visualiser avec OPTION MPRINT ; et constater par toi-même) est correct, même s'il est un peu bavard. Mais pourquoi tant de macros ? Alors que 2 arrays iraient si bien ensemble !!! Code :
Bon courage. Olivier |
||
|
|
10
|
|
|
#4 |
|
Invité de passage
![]() Inscription : novembre 2011 Messages : 6 ![]() |
Merci pour vos réponses Olivier et Bahraoui.
Merci pour ton code avec les 2 array Olivier, mais je ne peux pas l’utiliser car j’ai créé plusieurs macros dans mon étape data, certaines macro faisant des calculs. J’ai simplifié la macro pour mon post, car ma question repose plus sur la logique de programmation. Mon code fonctionne correctement, mais je veux savoir si ma façon de programmer est correcte, car en général on créé les macros en dehors de l’étape data. Je me demandais aussi si c’est courant d’utiliser i à l’intérieur de la macro alors que la boucle sur i est à l’extérieur de la macro. Je vous pose ces questions pour savoir quelle est la logique de programmation en SAS pour éviter de faire des erreurs à l’avenir. |
|
|
00
|
|
|
#5 | ||||||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour.
Citation:
C'est au moment où on utilise (appel) le macro-programme (%test) que le compilateur macro s'active. Et il travaille avant le compilateur SAS, c'est à dire avant que l'étape DATA ne démarre. Donc tu peux écrire avec le même résultat Code :
Code :
Un macro-programme, c'est surtout du copier/coller. Et le but premier est d'avoir un code réutilisable. Donc la définition du macro-programme à l'intérieur (visuellement) d'une étape DATA est déroutante, mais pas inexacte. Cela dit, sans doute ma solution n'est pas adaptée dans ton cas réel, mais l'idée de faire des boucles supplémentaires dans l'étape DATA est souvent une alternative aux macro-programmes. Citation:
Dans le sens inverse (tu utilises la valeur de la macro-variable &J dans une condition SAS), pas de souci : le compilateur macro écrit le IF de SAS (sans le comprendre car ça ne le concerne pas) en remplaçant les &J par la valeur qui va bien, autant de fois qu'il passe dans la boucle %DO. Si le code SAS qui en résulte est correct, tout va pour le mieux. Et bon courage pour la suite. Olivier |
||||||
|
|
10
|
|
|
#6 |
|
Invité de passage
![]() Inscription : novembre 2011 Messages : 6 ![]() |
Tes explications sont très claires, ça m'aide à mieux comprendre le fonctionnement de SAS pour mieux coder.
Merci encore Olivier. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com