2017-07-24 2 views
1

Une fois que j'ai une valeur dans une variable:Affectation de sortie de la fonction à une variable macro

select max(input(record_date, yymmdd10.)) into :LastDate from My_TABLE; 

(record_date est un char, dont la sortie est au-dessus de 23JUL2017).

Comment ferais-je pour manipuler cette valeur? Disons que je voulais le décrémenter d'un jour. Quand je fais:

%let LastDate = intnx("day", &LastDate, -1); 

La valeur de LastDate devient littéralement intnx("day", 21023, -1), alors que j'espérais 22Jul2017 ou 21022.

+0

Vous parlez d'affecter des valeurs aux variables, mais votre code consiste à affecter des valeurs aux variables MACRO. Les variables de macro sont totalement différentes des variables des jeux de données. – Tom

+0

titre corrigé – Ben

Répondre

4

Si vous souhaitez utiliser les fonctions SAS dans le code de macro, elles doivent être entourées de la macro %sysfunc(). Souvenez-vous également que vous n'avez pas besoin d'ajouter de guillemets autour des littéraux de chaîne dans le code de la macro puisque tout est une chaîne de caractères pour le processeur de macros.

%let LastDate = %sysfunc(intnx(day,&LastDate,-1)); 

Mais cela semble vraiment exagéré puisque les dates ne sont que des nombres de jours. Vous pouvez simplement en soustraire un.

%let LastDate = %eval(&LastDate -1); 

Ou si vous utilisez littéraux de date comme « 23JUL2017'd alors vous devez utiliser la fonction au lieu %sysevalf().

%let LastDate = %sysevalf(&LastDate -1); 

Bien sûr, vous pouvez également simplement soustraire le jour avant de créer la variable macro.

select max(input(record_date, yymmdd10.))-1 
    into :LastDate trimmed 
    from My_TABLE 
;