En ocasiones necesitamos saber si existe un fichero o una tabla y para ello utilizamos la función exist
, pero ¿qué pasa si queremos saber si en la tabla que estamos procesando hay un determinado campo?
Es una situación menos habitual y lo malo es que no existe una función para evaluarlo directamente, así que nos toca remangarnos y usar un poco nuestra imaginación.
Existen varias soluciones para abordar esto, seguro que cada una más adecuada en según qué circunstancias. En este caso vamos a evaluar si en la tabla SASHELP.US_DATA tenemos el campo «capital» y os propongo varias soluciones:
La primera que se me ocurre es utilizando vectores:
%macro comprobar_variable1(campo_buscado=);
%let dsid = %sysfunc(open(SASHELP.US_DATA));
%let rc = %sysfunc(fetchobs(&dsid,1));
%let r1 = %sysfunc(varnum(&dsid,&campo_buscado));
%let r2 = %sysfunc(varnum(&dsid,&campo_buscado));
%let resultado = %sysfunc(max(&r1>0,&r2>0));
%put &=resultado;
%let rc = %sysfunc(close(&dsid));
%mend;
%comprobar_variable1(campo_buscado=CAPITAL);
%comprobar_variable1(campo_buscado=region);
Otra solución aparentemente más sencilla de programar sería utilizando proc contents
. A mi me resulta muy útil este procedimiento para resolver muchos problemas de automatización de procesos.
%macro comprobar_variable2(campo_buscado=);
proc contents data=SASHELP.US_DATA out=VARIABLES (keep=name) noprint;
run;
proc sql noprint;
select count(1) into :resultado
from VARIABLES
where name=upcase("&campo_buscado");
quit;
%put &=resultado;
%mend;
%comprobar_variable2(campo_buscado=CAPITAL);
%comprobar_variable2(campo_buscado=region);
Os propongo que enviéis alguna más que se os pueda ocurrir.