2016-04-10 3 views
1

J'ai un ensemble de données nommant error_table comme suit. Toutes les variables sont le caractèreSAS logique conditionnelle pour exécuter un autre programme sas basé sur la condition

Errorno Error  Resolution 
001  login  check 
002  datacheck check 

Je voulais une logique qui exécute un programme sas Si le Errorno est pas 001 et 002. Sinon, arrêtez l'exécution et affichez le error_table.

J'ai essayé le suivant

%macro test(); 
    proc sql; 
     select trim(Error_No) into: num from error_table; 
    quit; 

    %if &num. not in ("001","002") %then %do; 
     %include "/path/dev/program.sas"; 
    %end; 
    %else %do; 
     proc print data = error_table; 
     run; 
    %end; 
%mend; 
%test; 

Mais, il jette une erreur.

Quelqu'un peut-il corriger s'il vous plaît la logique.

+0

Quelle erreur lance-t-elle? – Quentin

+1

Curieux de votre logique. Voulez-vous dire: s'il y a un enregistrement dans error_table où errorno Not in ("001" "002") alors exécutez le programme; else imprimer error_table? – Quentin

Répondre

0

Vous devez faire attention au cas où le SELECT renvoie zéro rangée. Vous devez définir une valeur par défaut pour la variable de macro NUM.

Votre jeu de données est-il une variable numérique ou caractère? Utilisez la clause TRIMMED ou SEPARATED BY au lieu de la fonction TRIM() pour empêcher les espaces dans la variable de macro générée par la clause INTO.

%let num=NONE; 
select Error_No into: num trimmed from error_table; 

Rappelez-vous que tout le processeur de macro est une chaîne, mais il ne faut pas les guillemets autour des valeurs que vous essayez de faire correspondre à moins qu'ils ne sont en fait une partie de la valeur.

%if NOT (&num. in (001,002)) %then %do; 

également d'utiliser l'opérateur IN dans le code macro vous devez vous assurer que vous avez défini l'option MINDELIMITER.

+0

Je pense que vous vouliez dire 'MINOPERATOR'. L'opérateur 'in' ne nécessite pas non plus' (',') 'et', '. – fl0r3k

0

Je choisirais la condition de déplacement avec les codes d'erreur à proc sql.

proc sql; 
    select count(*) into :num_errors 
    from error_table 
    where Errorno in ("001", "002"); 
quit; 

Puis, en macrovariable vous avez nombre d'erreurs qui sont 001 ou 002. L'étape suivante consiste à vérifier la macro-condition:

%if &num_errors. > 0 %then %do; 
    %include "/path/dev/program.sas"; 
%end; 
%else %do; 
    proc print data = error_table; 
    run; 
%end; 
%mend;