Files
dc/sas/sasjs/services/public/getrawdata.sas
allan f6d7d6f90c
All checks were successful
Build / Build-and-ng-test (pull_request) Successful in 4m14s
Build / Build-and-test-development (pull_request) Successful in 9m0s
fix: export unregistered formats
Closes #158
2025-06-10 09:41:18 +01:00

179 lines
4.0 KiB
SAS

/**
@file
@brief Downloads data in a variety of formats
@details To enable direct download, this service runs in a dedicated stream
as a GET request using URL parameters as inputs.
The inputs are:
@li table - the libds of the table to be downloaded
@li type - either SAS, CSV, EXCEL, MARKDOWN, WEBCSV or WEBTAB
@li filter - the filter RK if used
<h4> SAS Macros </h4>
@li mf_verifymacvars.sas
@li mf_getuser.sas
@li mf_existfeature.sas
@li dc_assignlib.sas
@li mp_ds2cards.sas
@li mp_abort.sas
@li mp_binarycopy.sas
@li mp_cntlout.sas
@li mp_streamfile.sas
@li mpe_filtermaster.sas
@version 9.2
@author 4GL Apps Ltd
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
and may not be re-distributed or re-sold without the express permission of
4GL Apps Ltd.
**/
%global table type filter ds format is_fmt txfrom txto;
%mpeinit()
%let user=%mf_getuser();
%let is_fmt=0;
%mp_abort(iftrue= (%mf_verifymacvars(type table)=0)
,mac=&_program..sas
,msg=%str(Invalid inputs: type table)
)
%let libds=%upcase(&table); /* actual source */
%let table=%upcase(&table); /* used as label for fmt catalogs */
%let lib=%scan(&table,1,.);
%let ds=%scan(&table,2,.);
%dc_assignlib(READ,&lib)
data _null_;
set &mpelib..MPE_TABLES;
where upcase(libref)="&lib" and upcase(dsn)="&ds";
/* if a TXTEMPORAL table then filter as such */
call symputx('txfrom',var_txfrom);
call symputx('txto',var_txto);
run;
/* if a format, extract relevant info */
data _null_;
ds=symget('ds');
is_fmt=0;
if subpad(cats(reverse(ds)),1,3)=:'CF-' then do;
ds=scan(ds,1,'-');
table=cats("&lib..",ds);
putlog "Format Catalog Captured";
is_fmt=1;
call symputx('libds','work.fmtextract');
call symputx('table',table);
end;
call symputx('is_fmt',is_fmt);
putlog (_all_)(=);
run;
%mp_cntlout(
iftrue=(&is_fmt=1)
,libcat=&table
,fmtlist=0
,cntlout=work.fmtextract
)
%put preparing query;
%mpe_filtermaster(DLOAD,&libds,
dclib=&mpelib,
filter_rk=&filter,
outref=filtref,
outds=work.query
)
%put printing generated filterquery:;
data _null_;
infile filtref;
input;
putlog _infile_;
run;
options obs=200000;/* stop limit */
data staged(drop=&txfrom &txto);
set &libds;
where %inc filtref;;
run;
options obs=max;
options validvarname=upcase;
%macro mpestp_getrawdata();
%local outfile;
%if &type=SAS %then %do;
%let outfile=%sysfunc(pathname(work))/&table..sas;
%mp_ds2cards(base_ds=staged
, tgt_ds=&table
, cards_file= "&outfile"
, maxobs=100000)
%let ext=sas;
%let mimetype=text;
%end;
%else %if &type=CSV or (&type=EXCEL and %mf_existfeature(EXPORTXLS) ne 1)
/* cannot proc export excel if PC Files is not licensed */
%then %do;
%let outfile=%sysfunc(pathname(work))/&table..csv;
PROC EXPORT DATA= staged
OUTFILE= "&outfile"
DBMS=csv REPLACE;
RUN;
%let ext=csv;
%let mimetype=csv;
%end;
%else %if &type=EXCEL %then %do;
%let ext=xlsx;
%let outfile=%sysfunc(pathname(work))/&table..&ext;
PROC EXPORT DATA= staged
OUTFILE= "&outfile"
DBMS=xlsx ;
RUN;
%let mimetype=XLSX;
%end;
%else %if &type=MARKDOWN %then %do;
%let ext=md;
%let outfile=%sysfunc(pathname(work))/&table..&ext;
filename mdref "&outfile" lrecl=32767;
%mp_ds2md(staged,outref=mdref,showlog=NO)
%let mimetype=MARKDOWN;
%end;
%else %if &type=WEBCSV %then %do;
PROC EXPORT DATA= staged
OUTFILE= _webout
DBMS=csv REPLACE;
RUN;
/* don't set headers */
%return;
%end;
%else %if &type=WEBTAB %then %do;
PROC EXPORT DATA= staged
OUTFILE= _webout
DBMS=tab REPLACE;
RUN;
/* don't set headers */
%return;
%end;
%else %do;
%mp_abort(msg=type &type not supported,mac=mpestp_getrawdata.sas);
%end;
%mp_abort(iftrue= (&syscc ne 0)
,mac=&_program..sas
,msg=%str(syscc=&syscc)
)
%mp_streamfile(contenttype=&mimetype
,inloc=%str(&outfile)
,outname=&table..&ext
)
%mend mpestp_getrawdata;
%mpestp_getrawdata()
%mpeterm()