|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() statisticienne Inscription : mai 2011 Messages : 3 ![]() |
Bonjour à tous,
J'ai un petit souci dans ma programmation que je ne m'explique pas... Dans une macro : J'ai une variable, dont je récupère le minimum dans une table SAS. Avec un call symput, j'attribue cette valeur à une macro-variable. Je cherche ensuite (et c'est là que j'ai un souci!) à avoir une condition sur la suite de la macro sur cette macro variable. Le problème est que cette condition est "si macro-variable<0", et que SAS la reconnait comme caractère et non numérique. Et avec un %eval, ça ne marche pas non plus... Voilà ma macro (simplifiée au maximum pour cet exemple) : Code :
Avez-vous une idée? Merci d'avance pour toute piste!! |
||
|
|
00
|
|
|
#2 | ||||
|
Membre Expert
![]() Biostatisticien Inscription : juin 2009 Messages : 1 143 ![]() |
Bonjour,
Pour commencer je te propose une autre syntaxe via la proc sql qui évite de créer une table temporaire et optimise le traitement: Code :
Code :
|
||||
|
|
10
|
|
|
#3 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
tes instructions sont un peu trop mal placées.
on utilise le pour ne pas créer une table. le call symput est une façon s'assigner des macros variables à des OBS, et là toi tu ne récupére qu'une seule valeur. donc un %let pourra faire l'affaire. |
|
|
00
|
|
|
#4 | |||||
|
Invité de passage
![]() statisticienne Inscription : mai 2011 Messages : 3 ![]() |
Merci pour vos réponses!
Super pour l'astuce de la proc sql Manoutz, je n'y pense jamais à celle là! Citation:
Voici mon code amélioré: Code :
Code :
Merci s_a_m pour ta réponse, mais je ne peux pas faire un %let parce que la valeur que je veux récupérer est dans une table SAS, ce n'est pas comme si je savais à l'avance que je voulais écrire %let minvar=-3, là ça va dépendre à chaque fois des données. Pour le data _null_, oui c'est pour ne pas créer de table, ici effectivement je ne veux pas en créer mais recueillir une valeur dans une table pour en faire une condition... |
|||||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() statisticienne Inscription : mai 2011 Messages : 3 ![]() |
Ah excusez-moi, il y avait beaucoup de choses dans vos réponses j'ai oublié de tout tester!
Sans le %eval j'avais le même message d'erreur, mais en utilisant %sysevalf cela marche parfaitement, plus d'erreur, c'est génial. MERCI!!! ![]() ![]() |
|
|
00
|
|
|
#6 |
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
utilise plutot %unquote et non pas %eval ( qui sert pour les calcules )
|
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Géraldine CADE DESCHAMPSSupport Clients SAS (France et Europe) Inscription : février 2010 Messages : 62 ![]() |
Bonjour,
C'est LA REGLE ESSENTIELLE en macro : une macro-variable c'est du texte, rien que du texte ! Il faut utiliser les fonctions macros si l'on veut la traiter en numérique, faire des traitements dessus etc. Géraldine Deschamps |
|
|
00
|
|
|
#8 | ||||
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
Bonjour,
oui une macro variable est une chaine de caractère. Mais le système ne l'interprète pas toujours de tel. Exemple. Code :
et j'ai eu ce résultat: Code :
|
||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Non, SAM, ta macro-variable est bien restée du texte.
C'est le texte 14 (c'est à dire 1 puis 4) qui a été copié par le compilateur macro dans le texte du code SAS, après le signe =. Il faut bien distinguer le compilateur macro, qui considère les macro-variables (et quasiment tout ce qui lui passe sous la main d'ailleurs) comme du texte, et le compilateur SAS, qui n'a accès à rien de ce que fait le compilateur macro et en subit uniquement les conséquences. L'ordre d'exécution de ta proc SQL est : 1) le compilateur macro passe : presque tout est du texte qui l'indiffère, seul le &age retient son attention. Il remplace le texte &a par le texte 14. 2) le compilateur SAS se voit transmettre le résultat de l'étape 1. Il interprète la valeur 14 comme un nombre mais ne sait pas que ça provient d'une macro-variable. Ca aurait tout aussi bien pu être en dur dans le code. |
|
|
00
|
|
|
#10 | ||||||
![]() ![]() Samir SELMANEConsultant en Business Intelligence Inscription : février 2011 Messages : 1 006 ![]() |
Merci Olivier pour les explications plus précises.
Je n'ai pas précisé qu'il y a un compilateur marco et compilateur SAS qui Interprète le code ( que j'ai appelé système). Mais le compilateur SAS n'interprète pas toujours tout ce qui est chiffre comme du numérique?!!! alors j'ai fais ce teste: Code :
Code :
mais avec : Code :
|
||||||
|
|
00
|
|
|
#11 | ||||
|
Membre habitué
![]() Sébastien RinguedéInscription : janvier 2011 Messages : 61 ![]() |
Bonjour
dans ton programme, tu indiques : Code :
aussi, quand tu indiques : Code :
a+ |
||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com