SAS-feil kavalkade Viggo Skar vigska@ous-hf.no Oslo Universitetssykehus HF (OUS)
Litt om meg: Født 1973. Jobbet med SAS siden 1999. Begynte i forsikring, har jobbet i helse siden 2009. Kaller meg selv for datavarehusutvikler, men har også en del oppgaver i forhold til rapportutvikling, uttrekk, analyser og systemansvar.
-Syntaksfeil Dette er feil som SAS markerer som ERROR i loggen. -Semantiske feil SAS gir ingen feil på koden, men man får ikke det resultat man forventer. Ofte gir SAS en WARNING i loggen (men slett ikke alltid). -Tekniske feil SAS-systemet virker ikke av årsaker som ikke er direkte knyttet til koden man har skrevet. Disse arter seg forskjellig. Oftest får man en feilmelding i loggen som man ikke forstår noe av.
Syntaksfeil options DATASTMTCHK=ALLKEYWORDS; data nyttdatasett set andredata; 22 GOPTIONS ACCESSIBLE; 23 options DATASTMTCHK=ALLKEYWORDS; 24 data nyttdatasett 25 set andredata; 57 ERROR 57-185: SET is not allowed in the DATA statement when option DATASTMTCHK=ALLKEYWORDS. Check for a missing semicolon in the DATA statement, or use DATASTMTCHK=NONE. 26 options DATASTMTCHK=NONE; data nyttdatasett set andredata; data semifeil; var1 = 1; var2 = var1 + 2 28 options DATASTMTCHK=NONE; 29 data nyttdatasett 30 set andredata; 31 NOTE: The data set WORK.NYTTDATASETT has 1 observations and 0 variables. NOTE: The data set WORK.SET has 1 observations and 0 variables. NOTE: The data set WORK.ANDREDATA has 1 observations and 0 variables. NOTE: DATA statement used (Total process time): real time 0.08 seconds cpu time 0.03 seconds 34 data semifeil; 35 var1 = 1; 36 var2 = var1 + 2 37 22 ERROR 22-322: Syntax error, expecting one of the following:!,!!, &, *, **, +, -, /, <, <=, <>, =, >, ><, >=, AND, EQ, GE, GT, IN, LE, LT, MAX, MIN, NE, NG, NL, NOTIN, OR, ^=,,, ~=.
Syntaksfeil data ubalanse; format tekst1 $1000.; tekst1 = '&rapport. &dato.!!" OUS LIS"; data helt_aar; format start slutt eurdfdd10.; do mnd = 1 to 12; start = mdy(mnd, 1, 2017); slutt = intnx('month', start, 1)-1; dager = sum(slutt, -start, 1); output; 23 data ubalanse; 24 format tekst1 $1000.; 25 tekst1 = '&rapport. &dato.!!" OUS LIS"; 26 27 25 tekst1 = '&rapport. &dato.!!" OUS LIS"; 49 NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS release. Inserting white space between a quoted string and the succeeding identifier is recommended. 28 data helt_aar; 29 format start slutt eurdfdd10.; 30 do mnd = 1 to 12; 31 start = mdy(mnd, 1, 2017); 32 slutt = intnx('month', start, 1)-1; 33 dager = sum(slutt, -start, 1); 34 output; 36 32 slutt = intnx('month', start, 1)-1; 388 ERROR 388-185: Expecting an arithmetic operator. 28 data helt_aar; 29 format start slutt eurdfdd10.; 30 do mnd = 1 to 12; 31 start = mdy(mnd, 1, 2017); 32 slutt = intnx('month', start, 1)-1; 33 dager = sum(slutt, -start, 1); 34 output; 35 36 _ 117 ERROR 117-185: There was 1 unclosed DO block.
Semantikk-feil data missingverdier; var1 = 1; var2 =.; sum1 = var1 + var2; sum2 = sum(var1, var2);
Semantikk-feil data ekstab; format tekst1 $10.; tekst1 = '123'; tall1 = 321; output; tekst1 = 'ABC'; tall1 = '111'; output; data konvertert; set ekstab; sum1 = tekst1 + tall1; sum2 = sum(tekst1, tall1); 23 data ekstab; 24 format tekst1 $10.; 25 tekst1 = '123'; 26 tall1 = 321; 27 output; 28 tekst1 = 'ABC'; 29 tall1 = '111'; 30 output; 31 NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column). 29:11 33 data konvertert; 34 set ekstab; 35 sum1 = tekst1 + tall1; 36 sum2 = sum(tekst1, tall1); 37 NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column). 35:10 36:14 NOTE: Invalid numeric data, tekst1='abc', at line 35 column 10. NOTE: Invalid numeric data, tekst1='abc', at line 36 column 14. tekst1=abc tall1=111 sum1=. sum2=111 _ERROR_=1 _N_=2 NOTE: Missing values were generated as a result of performing an operation on missing values. Each place is given by: (Number of times) at (Line):(Column). 1 at 35:17
data liten_tab; kat_var = 1; var1 = 123; output; var1 = 321; output; var1 =.; output; kat_var =.; var1 = 101; output; Semantikk-feil proc summary data= liten_tab; class kat_var; variable var1; output out=sum_missing sum=; proc summary data= liten_tab missing; class kat_var; variable var1; output out=sum_missing2 sum=;
Semantikk-feil data forlitetall; format litetall 3. stortnok 8.; litetall = 1973; alder = sum(year(today()), -litetall); stortnok = litetall; proc print =forlitetall; data forlitentekst; format litentekst $3.; litentekst = "FANS"; proc print =forlitentekst;
Semantikk-feil data datoer; format dt_var date9. dttm_var datetime20. dttm_varkort dttm_varkort2 datetime9.; dt_var = today(); dttm_var = datetime(); dttm_varkort = dttm_var; dttm_varkort2 = '01mar2017:00:00:00'dt; proc print data=datoer; data utregning; set datoer; dager = sum(dttm_varkort, -dttm_varkort2); keep dager; proc print data=utregning;
Semantikk-feil * Amerikansk vs norsk; data ukedag; * Lørdag; dag1 = weekday("04mar2017"d); * Søndag; dag2 = weekday("05mar2017"d); ukenr1 = week("05mar2017"d); ukenr2 = week("05mar2017"d, 'v');
Ekte feil data org; format enhet enhetkode $10.; input enhet $1-5 enhetkode $; cards; AVD A AA AVD B AB AVD C AC AVD D AD ; data orgtillegg; format enhet enhetkode $10.; input enhet $1-5 enhetkode $; cards; AVD D AD ; proc append base=org data=orgtillegg force; quit;
Ekte feil data org_fmt; format start label fmtname $10.; set org; start = strip(enhetkode); label = strip(enhet); fmtname = '$org_eks'; drop enhet enhetkode; proc format cntlin=org_fmt; quit; 53 proc format cntlin=org_fmt; ERROR: For format $ORG_EKS, this range is repeated, or values overlap: AD-AD. 54 quit;
Ekte feil data trans; format enhetkode $10.; input enhetkode $ tulletall; cards; AA 123 AA 213 AB 312 AB 495 AC 484 AC 348 AD 383 AD 976 ; data transfiks_feil; set trans; enhet = put(enhetkode, $org_eks.); 70 data transfiks_feil; 71 set trans; 72 enhet = put(enhetkode, $org_eks.); 484 NOTE 484-185: Format $ORG_EKS was not found or could not be loaded.
Ekte feil data ett_aar; do mnd = 1 to 12; verdi = round(rand('normal')*1000, 100); output; end; options validvarname=v7; proc transpose data=ett_aar out=trans_aar; id mnd; var verdi; quit; options validvarname=any; proc transpose data=ett_aar out=trans_aar2; id mnd; var verdi; quit;
Sjekkliste -Les loggen. -Sjekk endringer (programmering, kilder, system, dato). -Sjekk mot forventninger (gjerne en gammel log). -Kjør koden steg for steg. -Be om hjelp. -Google. The usual suspects: -Feilsøking (options obs=1000). -Hardkoding. -Macro (options symbolgen mprint mlogic). -Endring metadata.