45%macro mp_sortinplace(libds
48%local lib ds tempds1 tempds2 tempvw sortkey;
51%mp_abort(iftrue=(%sysfunc(countc(&libds,.)) ne 1)
53 ,msg=%str(LIBDS (&libds) should have LIBREF.DATASET format)
55%mp_abort(iftrue=(%mf_existds(&libds)=0)
57 ,msg=%str(&libds does not exist)
60%let lib=%scan(&libds,1,.);
61%let ds=%scan(&libds,2,.);
62%mp_abort(iftrue=(%mf_getengine(&lib) ne V9)
64 ,msg=%str(&lib is not a BASE engine library)
68%let tempds1=%mf_getuniquename(prefix=&sysmacroname);
69%mp_getpk(lib=&lib,ds=&ds,outds=work.&tempds1)
71%
if %mf_nobs(work.&tempds1)=0 %then %
do;
72 %put &sysmacroname: No PK found in &lib..&ds;
73 %put Sorting will not take place;
78%let sortkey=%mf_getvarlist(&libds);
83 call symputx(
'sortkey',coalescec(pk_fields,symget(
'sortkey')));
88%let tempds2=%mf_getuniquename(prefix=&sysmacroname);
89proc append base=&lib..&tempds2 data=&libds(obs=0);
93%let tempvw=%mf_getuniquename(prefix=&sysmacroname);
95create view work.&tempvw as select * from &lib..&ds
96order by %mf_getquotedstr(&sortkey,quote=N);
99proc append base=&lib..&tempds2 data=work.&tempvw;
103%mp_abort(iftrue=(&syscc ne 0)
105 ,msg=%str(syscc=&syscc prior to replace operation)
107%mp_abort(iftrue=(%mf_nobs(&lib..&tempds2) ne %mf_nobs(&lib..&ds))
109 ,msg=%str(
new dataset has a different number of logical obs to the old)
117proc datasets library=&lib;