Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2011, 11h18   #1
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut Problème avec une boucle %if %then %do

Bonjour à tous,
j'ai un soucis au niveau de la macro test suivante. Le compilateur ne comprend pas la condition "%if (&diff<0)...".
j'aimerais que si la différence est négative, cela me renvoie la valeur absolue...
Comment y remédier ? Est ce que cela pose problème si "&diff" est négatif dans une boucle %if %then %do?
Je vous remercie beaucoup par avance


Code :
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
%macro test();                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                 
%let a = 50; 
%let b = 70;                                                                                        
%let cval = 95;                                                                                                                                                                                                                                                 
%put valeur avant boucle de cval = &cval;                                                                                                   
                                                                                                                                            
                                                                                                                                            
%do %while ((&cval < 100) or (&cval >200)); 
                         
      %if (&cval < 100) %then                                                                                                              
      %do;                                                                                                                                                                                       
            %let diff=%sysevalf(&a.-&b.);
                                                                                                                                                                                                     
            %if (&diff < 0) %then                                                                                                        
            %do;                                                                                                                                                           
                  %let diff = %sysevalf(&b.- &a.);      /* Si la différence est négative je renvoie la valeur absolue */                                                                                 
            %end;                                                                                                              	                                                                                         
	    %let cval = %sysevalf(&cval.+ 0.1);                                                                                             
                                                                                                                                            
      %end;                                                                                                                             
      %put valeur après la boucle de cval = &cval;                                                                                          
                                                                                                                                   
%mend test;                                                                                                                                                                                                                                                                       
%test()
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 11h41   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
il te manque un %end ligne 20.

ensuite, je n'ai pas compris ce que ce code est censé faire avec ton WHILE. Le truc ne s'arrête pas quand on l'exécute.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 11h43   #3
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
tout ce résume à cela en fait ?

%let diff = %sysevalf(%sysfunc(abs(&a.- &b.)));
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 13h33   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Je dirais même que ça se résume à
Code :
%let diff = %sysfunc(abs(&a.- &b.));
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 13h45   #5
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
ah oui en plus
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 15h30   #6
Invité de passage
 
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 1
Points : 1
Par défaut remerciement

oui effectivement avec la macro-fonction %sysfunc cela fonctionne très bien ! Merci
yemal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h38.


 
 
 
 
Partenaires

Hébergement Web