******************************************************************************************************; *** Marco GILARDETTI ***; *** A.O.U. Città della Salute e della Scienza (Molinette) ***; *** S.C. Epidemiologia dei Tumori - CPO U ed SSD Epidemiologia Clinica e Valutativa - CPO ***; *** ***; *** ***; *** Accesso e utilizzo del patrimonio informativo sanitario pseudonimizzato ***; *** tramite l’ambiente CloneDWH su piattaforma SAS Enterprise Guide ***; *** ***; *** MODULO 12: PARAMETRIZZAZIONE ED ELEMENTI DI MACRO PROGRAMMAZIONE ***; *** ***; ******************************************************************************************************; ******************************************************************************************************; *** PARAMETRIZZAZIONE DI UN PROGRAMMA ***; ******************************************************************************************************; data sdo17; set as909out.corsosla_sdoreg17; if year(D_NASC) eq 2017; * Vogliamo estrarre i ricoveri dei nati nell'anno; keep ID_ANONIMO_RIC D_NASC; format D_NASC monyy5.; run; data sdo18; set as909out.corsosla_sdoreg18; if year(D_NASC) eq 2018; keep ID_ANONIMO_RIC D_NASC; format D_NASC monyy5.; run; * Il programma è ridondante. È possibile sintetizzarlo re-impiegando le parti comuni?; * Definiamo un parametro denominato "anno", che assumerà i valori che ci interessano, ed introduciamolo nelle istruzioni del programma; %let anno = 17; *%let anno = 18; data sdo&anno; set as909out.corsosla_sdoreg&anno; if year(D_NASC) eq 20&anno; keep ID_ANONIMO_RIC D_NASC; format D_NASC monyy5.; run; * Il programma funziona, ma se deve ripetere numerosi cicli può essere d'impiego difficoltoso; * È possibile renderlo più "automatizzato"? Sì, inserendolo in una MACRO routine; ******************************************************************************************************; *** TRASFORMAZIONE DI UN PROGRAMMA PARAMETRIZZATO IN UNA MACRO ROUTINE ***; ******************************************************************************************************; * Convertiamo il programma parametrizzato in una macro routine; * Esegue esattamente le stesse operazioni di prima, ma è di impiego più pratico; %macro estrai(anno); /* La macro "estrai" si attende di ricevere il parametro "anno" */; data sdo&anno; set as909out.corsosla_sdoreg&anno; if year(D_NASC) eq 20&anno; keep ID_ANONIMO_RIC D_NASC; format D_NASC monyy5.; run; %mend; %estrai(17); %estrai(18); * È possibile estendere la parametrizzazione anche ad altre parti del programma; * Ad esempio istruzioni, formati, condizioni logiche, eccetera; %macro seleziona(anno,condizione,formato); /* La macro "seleziona" attende tre parametri: "anno, "condizione" e "formato" */; data sdo&anno; set as909out.corsosla_sdoreg&anno; if year(D_NASC) &condizione; keep ID_ANONIMO_RIC D_NASC; format D_NASC &formato; run; %mend; %seleziona(17,eq 2017,ddmmyy10.); * Ricoveri dei nati nel 2017, con la data precisa di nascita; %seleziona(17,lt 2017,monyy5.); * Ricoveri dei nati precedentemente il 2017, con mese ed anno di nascita; %seleziona(18,eq 2018,ddmmyy10.); * Come il primo esempio, ma relativamente all'anno 2018; %seleziona(18,ne 2018,monyy5.); * Come il secondo esempio, ma relativamente all'anno 2018; * Una routine MACRO può contenere più passi di dati e di procedura; %macro tabella(anno,condizione,formato); data sdo&anno; set as909out.corsosla_sdoreg&anno; if year(D_NASC) &condizione; keep ID_ANONIMO_RIC D_NASC; format D_NASC &formato; run; proc freq data=sdo&anno; tables D_NASC; run; %mend; %tabella(17,eq 2017,monyy5.); * Come elaborazioni precedenti, ma i risultati sono presentati aggregati da una procedura FREQ; %tabella(18,eq 2018,monyy5.);