es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo incluir condicionalmente una archivo *.sas que define una macro?

Utilizo una macro en varios programas de SAS, por lo que la he definido en un archivo separado /myFolder/myMacro.sas.

Cuando se ejecuta en modo por lotes, quiero usarla de la siguiente manera: %include '/myFolder/myMacro.sas;'

Cuando estoy probando cambios en el código en Enterprise Guide, quiero editar y ejecutar /myFolder/myMacro.sas, luego editar y ejecutar los programas que la utilizan. ¿Cómo puedo incluir condicionalmente las definiciones de la macro?

%if &server = BATCH_SERVER %then %include '/myFolder/myMacro.sas;' no funciona: El archivo se incluye de todos modos y la declaración %if se aplica al comentario en la parte superior del archivo y resulta en el siguiente error:


ERROR: Expected %DO not found.
ERROR: Skipping to next %END statement.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en SAS, incluido SAS-macro, recomendaría utilizar la función de macro %SYSEVALF para detectar si el código se está ejecutando en el modo por lotes o no. Esta función devuelve un valor numérico de 0 o 1 basado en la condición lógica especificada. Así es como se usa en este escenario:

    %macro run_myMacro();
      %let isBatch = %sysevalf(%sysfunc(getoption(mode)) = batch);
      %if &isBatch = 1 %then %include "/myFolder/myMacro.sas";
    %mend;
    
    %run_myMacro();
    

    En esta macro, la función %sysfunc(getoption(mode)) devuelve el modo de ejecución actual (ya sea interactivo o por lotes). La función %sysevalf evalúa si el modo es por lotes (0 = interactivo, 1 = por lotes) y establece la variable de macro isBatch en consecuencia. Si es por lotes, se incluye el archivo que contiene las definiciones de la macro.

    Al encapsular las definiciones de la macro en una macro separada y utilizar la instrucción %if con la función %sysevalf, puede incluir condicionalmente las definiciones de la macro basadas en el modo de ejecución. Este enfoque debería funcionar tanto en modo por lotes como en Enterprise Guide.

Comments are closed.