2016-11-30 1 views
3

J'ai plusieurs programmes dans un projet SAS, par exemple le programme A -> programme B -> .... Je veux créer une dépendance entre les programmes en utilisant des variables macro.SYSERR Automatique Macro Variable

Le programme A traitera peu de pas de données et de processus. Si toute procédure dans le programme A exécute avec des erreurs, je voudrais exécuter le programme C. programme B. Sinon, l'exécution

Cela semble être délicat, car syserr remet à zéro à chaque limite pas. Si le premier pas de données dans le programme A s'exécute avec erreur et le reste pas, alors à la fin du programme A, syserr est toujours 0. J'ai besoin que la valeur de la variable macro soit autre chose que 0 une fois qu'une erreur se produit et que la valeur peut rester jusqu'à la fin du programme.

Si la dépendance du programme est basée sur d'autres critères (par exemple des valeurs), les variables de macro définies par l'utilisateur peuvent gérer cela. Pour quelque chose en rapport avec les erreurs du système, je pense que SAS a déjà quelque chose qui peut faire l'affaire.Mais je ne peux pas trouver autre chose sauf syserr, ce qui ne semble pas aider.

Note: Je trouve ceci SAS stop on first error. Mais fondamentalement, il s'agit de vérifier le statut de l'erreur après chaque étape de données. Cela semble fou si le programme A contient plus de 50 étapes de données.

Répondre

5

Facile - il suffit d'utiliser syscc!

SYSCC est une lecture/écriture variable de macro automatique qui vous permet de réinitialiser le code de condition d'emploi et de récupérer des conditions qui empêchent les étapes ultérieures de la course.

Voir documentation, mais je suppose que vous serez à la recherche de quelque chose comme:

%if &syscc > 4 %then %do; 
    %inc "/mypath/pgmB.sas"; 
%end; 
%else %do; 
    %inc "/mypath/pgmA.sas"; 
%end; 

La valeur la plus élevée de syscc est conservée à travers les frontières étape, toujours avec un entier pour représenter le niveau d'erreur. Exemples de valeurs:

Les valeurs de SYSCC sont:

  • 0 est aucune erreur aucun avertissement
  • 4 est avertissements
  • supérieur à 4 signifie qu'une erreur est survenue

Notez qu'il n'y sont certaines choses qu'il ne sera pas attraper, mais pour améliorer son efficacité, vous pouvez utiliser:

options errorcheck=strict; 

Enfin - vous mentionnez 'projet sas', si par là vous voulez dire que vous utilisez Enterprise Guide alors s'il vous plaît soyez conscient des conseils dans ce usage note.

-1

Utilisez une macro, appelez-la runquitA.appelez cette macro à la fin de chaque proc sql ou proc data à la place de quit; et courir;

Exemple:

/*Program A*/ 

%macro runquitA; 
    ; run; quit; 
    %if &syserr. ne 0 %then %do; 
    /*Call Program C*/ 
    %end; 
%mend runquitA; 

proc sql; 
    create table class1 as 
    select * from sashelp.class; 
%runquitA; 

data class2; 
    set sashelp.class; 
%runquitA; 

/*Call Program B*/ 

/*end of Program A*/ 
+0

Ceci ne répond pas à la question (comme la question mentionne explicitement cette possibilité et demande une meilleure option). – Joe

+0

Je pense que la question est: comment ne pas continuer à exécuter le programme A s'il y a une erreur. S'il y a une erreur, allez directement exécuter le programme C et n'exécutez pas le programme A jusqu'à la fin. –

+0

Lisez le dernier paragraphe de la question. – Joe

2

Vous pouvez définir une macro qui a gardé trace de l'état d'erreur et exécuter ce après chaque étape. La macro ressemblerait à ceci:

%macro track_err; 
    %global err_status; 
    %let err_status = %sysfunc(max(&err_status, &syserr ne 0)); 
%mend; 

Exemple d'utilisation ci-dessous. Commencez par initialiser la valeur pour suivre le statut de l'erreur globale. La première datastep échouera, la deuxième se déroulera avec succès et la valeur finale de err_status sera 1.

%let err_status = 0; 

data oops; 
    set sashelp.doesnt_exist; 
run; 
%track_err; 

data yay; 
    set sashelp.class; 
run; 
%track_err; 

%put &=err_status; 

Sortie finale:

ERR_STATUS=1 

En ce qui « sonne fou pour vérifier l'état après chaque step '... bien SAS ne fournit pas quelque chose pour l'exigence exacte que vous avez, donc la seule façon de le faire est littéralement d'avoir quelque chose à vérifier après chaque étape.

EDIT: Correction - ressemble à l'approche syscc mentionnée dans la réponse de RawFocus montre réellement quelque chose qui fait cela dans SAS.


Si vous voulez que le chèque « mélange dans » plus avec le code, puis envisager de remplacer vos déclarations run et quit avec une macro qui effectue la course/quitter, puis vérifie l'état tout en un. Cela donnera un code légèrement plus propre. Quelque chose comme ceci:

%macro run_quit_track; 
    run;quit; 
    %global err_status; 
    %let err_status = %sysfunc(max(&err_status, &syserr ne 0)); 
%mend; 

%let err_status = 0; 

data oops; 
    set sashelp.doesnt_exist; 
%run_quit_track; 

data yay; 
    set sashelp.class; 
%run_quit_track; 

%put &=err_status;