%macro sdtm_split(din=, supp=, ids=, vars=, origins=, evals=); *** get data type of idvars and qnams ****; proc contents data=&din out=&din._contents noprint; run; data _null_; set &din._contents; call symput("t"||strip(name), strip(put(type, best.))); run; data supp; set &din; length idvar idvarval $200 qnam $8 qlabel $40 qval qorig qeval $200; idvar=""; idvarval=""; qorig=""; qeval=""; %do v=1 %to %sysfunc(countw(&vars)); %let q&v=%scan(&vars, &v); %if %upcase(&supp)^=SUPPDM %then %do; %let i&v=%scan(&ids, &v); idvar="&&i&v.."; %if "&&&&t&&i&v.."="2" %then %do; idvarval=&&i&v..; %end; %else %if "&&&&t&&i&v.."="1" %then %do; idvarval=strip(put(&&i&v.., best.)); %end; %end; %if &origins ne %then %do; %let o&v=%scan(&origins, &v); qorig=&&o&v..; %end; %if %sysfunc(compress(&evals, |)) ne %then %do; %let e&v=%scan(&evals, &v, |); qeval=&&e&v..; %end; if missing(&&q&v..)=0 then do; qnam=upcase("&&q&v.."); qlabel=vlabel(&&q&v..); %if &&&&t&&q&v..=2 %then %do; qval=strip(&&q&v..); output; %end; %else %if &&&&t&&q&v..=1 %then %do; qval=strip(put(&&q&v.., best.)); output; %end; end; %end; keep studyid domain usubjid idvar idvarval qnam qlabel qval qorig qeval; rename domain=rdomain; label studyid="Study Identifier" domain="Related Domain Abbreviation" usubjid="Unique Subject Identifier" idvar="Identifying Variable" idvarval="Identifying Variable Value" qnam="Qualifier Variable Name" qlabel="Qualifier Variable Label" qval="Data Value" qorig="Origin" qeval="Evaluator" ; run; *%set_maxlen(din=, vars=, dout=); data vsdtm.&supp(label="&&&supp._lbl."); retain studyid rdomain usubjid idvar idvarval qnam qlabel qval qorig qeval; set supp; run; %mend sdtm_split; /**/ /*%sdtm_split(din=dm, */ /* supp=suppdm,*/ /* ids=,*/ /* vars=race1 race2 race3 raceoth,*/ /* origins=%str("CRF" "CRF" "CRF" "CRF" ),*/ /* evals=);*/