2017-10-03 6 views
0

Je cours un processus qui répertorie les tâches sur lesquelles je veux vérifier la date de modification. Je liste les travaux dans un ensemble de données, puis les transmets aux variables de macro avec un nombre.Arrêtez SAS d'essayer de résoudre et de référencer dans une macro macro

par exemple.

Data List_Prep; 
Format Folder 
     Code $100.; 
Folder = 'C:\FilePath\Job ABC'; Code = '01 Job Name.sas'; Output; 
Folder = 'C:\FilePath\Job X&Y'; Code = '01 Another Job.sas'; Output; 
Run; 
%Macro List_Check(); 
Data List; 
    Set List_Prep; 
    Job + 1; 

    Call Symput (Cats("Folder", Job), Strip(Folder)); 
    Call Symput (Cats("Code", Job), Strip(Code)); 

Run; 
%Put Folder1 = &Folder1; 
%Put Folder2 = &Folder2; 
%MEnd; 
%List_Check; 

Il imprime l'instruction% Mettez bien pour foler 1, mais le dossier 2 ne fonctionne pas correctement.

Folder1 = C:\FilePath\Job ABC 
WARNING: Apparent symbolic reference Y not resolved. 
Folder2 = C:\FilePath\Job X&Y 

Quand je vais alors dans une boucle pour vérifier les ensembles de données, encore une fois, ça marche, donc cherche Dossier1, Code1 etc, mais je reçois toujours les avertissements.

Comment puis-je arrêter ces avertissements? J'ai essayé% Str ("&") à la place, mais toujours le problème.

Répondre

1

Vous pouvez empêcher SAS de tenter de résoudre l'esperluette de la valeur en utilisant la fonction %superq

%put Folder2 = %superq(Folder2); 
+0

Excellent, je n'avais pas entendu parler de% SuperQ. Merci beaucoup. – Satkin2

2

La fonction macro %superq() est une excellente façon de masquer les déclencheurs macro qui sont déjà dans une variable macro. Vous pouvez soit n'oubliez pas de citer les valeurs lors de leur utilisation,

%put Folder1 = %superq(Folder1) ; 

ou vous pouvez ajuster votre processus pour les citer juste après leur création.

data List_Prep; 
    length Folder Code $100; 
    Folder = 'C:\FilePath\Job ABC'; Code = '01 Job Name.sas'; Output; 
    Folder = 'C:\FilePath\Job X&Y'; Code = '01 Another Job.sas'; Output; 
run; 
data List; 
    set List_Prep; 
    Job + 1; 
    length dummy $200 ; 
    call symputx(cats("Folder", Job), Folder); 
    dummy = resolve(catx(' ','%let',cats("Folder", Job),'=%superq(',cats("Folder", Job),');')); 
    call symputx(cats("Code", Job), Code); 
    dummy = resolve(catx(' ','%let',cats("Code", Job),'=%superq(',cats("Code", Job),');')); 
    drop dummy; 
run; 

P.S. N'utilisez pas FORMAT pour définir des variables. Utilisez des instructions telles que LENGTH ou ATTRIB conçues pour définir des variables. FORMAT est pour attacher des formats à la variable, pas pour les définir. La seule raison pour laquelle FORMAT a fonctionné est qu'il a eu l'effet secondaire de SAS définissant le type et la longueur de la variable pour correspondre au format auquel vous l'avez attaché car c'était le premier endroit où vous avez référencé la variable dans l'étape de données.

+0

Beaucoup plus de perspicacité à cela, merci beaucoup. – Satkin2

+0

Je ne pense pas qu'il y ait quelque chose de mal en utilisant 'format' si vous avez l'intention d'attacher un format, plutôt que d'utiliser les deux instructions simultanément. Mais pour la plupart, on n'attache pas de formats de caractères, donc vos conseils sont pertinents. – Joe

+0

@Tom, approche soignée de l'exécution d'une instruction% LET pendant l'exécution d'une étape DATA. Cela ressemble à une limitation que CALL SYMPUTX ne peut pas faire de macro en lui-même. Pensez-vous qu'il serait raisonnable de recommander l'ajout d'un argument à CALL SYMPUTX, ce qui vous permet de créer une macro avant de l'écrire dans la table des symboles? Donc pseudocode comme 'data _null_; appelez symputx ("macvar", "jack & Jill", "NRSTR"); courir; % put & macvar; 'n'essaierait pas de résoudre & jil? – Quentin