Her er koden til vores CAS loader: 1. Der er en ’fejl’ der bliver lavet strip også på de numeriske variabler. 2. Som Erik fortale så tages der ikke højde for index. 3. Det med rækkefølgen kendt vi ikke til så det er der heller ikke. /*******************************************************************************/ /* CAS loader erlu 22. feb 2020 */ /* */ /* User written DI Studio transformation til at loade sas7bdat-tabel til CAS. */ /* */ /* Input-tabellen loades til kalderens persolige CASUSER library og promotes */ /* derefter til output library. */ /* */ /*******************************************************************************/ %let targetcaslibref = %scan(&_OUTPUT,1,.); %let targetTableName = %scan(&_OUTPUT,2,.); %let ncharmultiplier = 1.5; %let tempvarprefix = xwzx; %let sessionname = &sysuserid.%sysfunc(putn(%sysevalf(%sysfunc(datetime())*1000),13.0)); options CASNCHARMULTIPLIER=&ncharmultiplier; /*------------------------------------------------------------------------------ Find CAS libname til targetlib - slås op i metadata ud fra sas9 libref. ------------------------------------------------------------------------------*/ %let libsearcharg = %str(omsobj:SASLibrary?@Libref=%')&targetcaslibref%str(%'); %let caslib =; data _null_; length liburi propuri $256 DefaultValue PropertyName $60 ; call missing(liburi, propuri, DefaultValue, PropertyName); rc = metadata_getnobj("&libsearcharg",1,liburi); rc = metadata_getnasn(liburi,"Properties",1,propuri); rc = metadata_getattr(propuri,'DefaultValue',DefaultValue); rc = metadata_getattr(propuri,'PropertyName',PropertyName); if PropertyName = 'CASLIB' then call symputx('CASLIB','"'||trim(DefaultValue)||'"'); run; %put &=caslib; /*------------------------------------------------------------------------------ Load CAS tabel fra input. ------------------------------------------------------------------------------*/ * Gem CAS session reference; %global sessref_option; %let sessref_option=%sysfunc(getoption(SESSREF)); * Create CAS session og sæt miljø op; %let casserver = %sysget(CAS_SERVER); cas &sessionname host="&casserver" port=5570; libname MYCAS cas; %let path=%sysfunc(pathname(mycas)); caslib &caslib list; caslib _all_ assign; * Drop session tabel; proc casutil sessref=&sessionname; droptable casdata="&targetTableName" incaslib=&caslib quiet; quit; * Drop target tabel; proc casutil sessref=&sessionname; droptable casdata="&targetTableName" incaslib=&caslib quiet; quit; data _null_; length thisinputvar thisname $32 thisinputcnt thislength mapkey 8 thistype $1 thisformat $33 thisexpression thislabel $256; length statement renamespec assignspec inkeepspec outkeepspec $32767; * Dan Data statement; call execute("data MYCAS.&targetTableName"||';'); * Loop over output variable; do i = 0 to %eval(&_OUTPUT_col_count-1); * Hent kolonnenavn, input_count og expression; thisname = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_name'); thisinputcnt = input(resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_input_count'),8.); thisexpression = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_exp'); * Giv warning for umappede kolonner - sættes missing vha. mapkey=0; mapkey = 1; if thisinputcnt = 0 then do; put 'WARNING: Umapped kolonne ' thisname 'fundet i output-tabel, kolonnen sættes missing.'; mapkey = 0; %let syscc = 4; end; * Giv warning for kolonner med expressions- sættes missing vha. mapkey=0; if thisexpression ne '' then do; put 'WARNING: Expression fundet til kolonne ' thisname '- expressions understøttes ikke, kolonnen sættes missing.'; mapkey = 0; %let syscc = 4; end; * Hent kolonneattributer for mappede output variable; thislength = input(resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_length'),8.); thistype = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_type'); thisformat = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_format'); thislabel = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_label'); if mapkey = 1 then thisinputvar = resolve('&_OUTPUT_col' || strip(put(i,8.)) || '_input'); * Dan Length statement ud fra output variabelattributter; * numerisk: n (længde på input-variabel); * char med format $n: $n (format_længde eller - hvis missing - input_længde, CAS engine tilføjer multiplier); * char uden format: varchar(n) længde på input-variabel * multiplier, dog mindst 16); if thistype = '' then statement = 'length '||trim(thisname)||' '||strip(put(thislength,8.))||';'; else do; if thisformat =: '$' then statement = 'length '||trim(thisname)||' $'||strip(coalescec(compress(thisformat,,'kd'),put(thislength,8.)))||';'; else statement = 'length '||trim(thisname)||' varchar('||strip(put(max(16,ceil(thislength * %sysevalf(&ncharmultiplier))),8.))||');'; end; call execute(statement); * Dan Format statement hvis et format er angivet; if thisformat ne '' then do; call execute('format '||trim(thisname)||' '||strip(thisformat)||';'); end; * Dan Label statement hvis en olabel er angivet; if thislabel ne '' then do; call execute('label '||trim(thisname)||'="'||strip(thislabel)||'";'); end; * Byg assign statements og lister til data set options rename og keep; if mapkey = 1 then do; renamespec = catx(' ',renamespec,trim(thisinputvar)||'='||"&tempvarprefix"||strip(put(i,8.))); assignspec = catx(' ',assignspec,trim(thisname)||'=strip('||"&tempvarprefix"||strip(put(i,8.))||');'); inkeepspec = catx(' ',inkeepspec,trim(thisinputvar)); end; outkeepspec = catx(' ',outkeepspec,trim(thisname)); end; * Dan SET statement med keep og rename af alle variables til tempnavne; call execute('set &_INPUT (rename=('||trim(renamespec)||') keep='||trim(inkeepspec)||');'); * Dan Keep statement for alle outputvariable; call execute('keep '||trim(outkeepspec)||';'); * Dan statements til at assigne værdier til output variable fra input variable med tempnavne; call execute(assignspec); * run; call execute('run;'); run; /* SAS 9 */ proc casutil outcaslib=&caslib; promote casdata="&targetTableName"; quit; /* VIYA */ proc casutil incaslib=&caslib outcaslib=&caslib sessref=&sessionname; save casdata="&targetTableName" replace; quit; * Afslut CAS sessionen; cas &sessionname terminate; /* Re-set CAS session reference */ options sessref=&sessref_option.; %let _SESSREF_=&sessref_option.; %symdel sessref_option; * Slut på Userwritten code;