Wsparcie techniczne
Zrób to sam
Dla aktywnych
Nasze dokumenty
Architektura SAS® 9
FAQ
Hotline
Kilka słów o nas
 

FAQ - Programowanie w SAS (+ ODS )

  • Makrozmienna w makrze
  • W jaki sposób odczytać wartość zmiennej środowiskowej?
  • W jaki sposób użyć makrozmiennej SYSDATE?
  • Jak zmienić tytuł w Output?
  • Jak użyć makra, aby sprawdzić czy zbiór istnieje?
  • Maksymalna długość makrozmiennej
  • Jak usunąć globalne makrozmienne zdefiniowane przez użytkownika?
  • Jak otworzyć zbiór zawierający kolumny z nałożonymi formatami, których nie posiadamy?
  • Jak debugować działanie data-stepu?
  • Jakiego formatu użyć aby wyświetliś liczbę "po polsku", z przecinkiem dziesiętnym?
  • Ile procesów jest startowanych po uruchomieniu SAS-a poleceniem sas na Unixie?
  • Jak przekierować wynik działania procedury do zbioru SAS?
  • Jak powiązać nazwę katalogu zawierającego bibliotekę WORK z identyfikatorem sesji SAS?
  • Jak ograniczyć zajętość biblioteki WORK podczas sortowania dużych tabel?
  • Gdzie szukać przykładowych kodów SAS?
  • Z jaką precyzją SAS przechowuje liczby?
  • Jak interpretować błędy w logu?
  • Jak usprawnić tworzenie grafiki w SAS?
  • Co zrobić, aby okno DOS zamykało się automatycznie po wykonaniu polecenia X?
  • Jak programowo wyczyścić okienko LOG?
  • Jak programowo sprawdzić czy dany produkt jest licencjonowany?
  • Jak uzyskać więcej informacji w okienku LOG?
  • Jak debugować działanie SAS/Access do relacyjnych baz danych?
  • Jak wczytać dane z arkusza Excel, jeśli kolumna zawiera dane mieszanych typów?
  • Jak zainstalować SAS/GRAPH control for ActiveX
  • Jak grupować po wartościach wyliczanych w procedurze SQL?
  • Jak zapisywać log w trakcie przetwarzania, bez potrzeby czekania na koniec zadania?
  • Co zrobić, żeby w Enhanced Edytorze działała kombinacja klawiszy ctrl+home?
  • Czy konieczne jest uruchamianie PC File Server, aby wykorzystywać SAS/ACCESS to PC File Formats na UNIXach?
  • Co oznacza komunikat NOTE: The query requires remerging summary statistics back with the original data.?
  • Jak sprawdzić jaki format ODS jest aktualnie aktywny?
  • Jak kontrolować rozmiar strony w ODS dla formatu RTF i PDF?
  • Jak dodać tekst pomiędzy wynikami w pliku HTML ODS?
  • Ogólne informacje o ODS Graphics Designer

  • Makrozmienna w makrze

    W makroprogramie wyliczam makrozmienną. Niestety dostaję komunikat WARNING: Apparent symbolic reference L_OBS not resolved.

    Najprawdopodobniej makrozmienna w programie nie została zadeklarowana jako makrozmienna globalna. Domyślnie wszystkie makrozmienne tworzone w ramach makroprogramu są lokalne.

    Przykład działającego programu

      %macro lobs(dset);
      %global L_OBS;
      proc sql noprint;
      select count(*) into :L_OBS from &dset;
      quit;
      %mend;
      %lobs(sashelp.air);
      %put &L_OBS
  • Powrót na górę

  • W jaki sposób odczytać wartość zmiennej środowiskowej?

    Do odczytania wartości zmiennej środowiskowej służy m.in. funkcja sysget() i makro funkcja %sysget().

    Przykładowo:

      data _null_;
      x=sysget('TMP');
      put x;
      run;
      %let OS_NAME=%sysget(OS);
      %put &OS_NAME;
  • Powrót na górę

  • W jaki sposób użyć makrozmiennej SYSDATE?

    Przykład:

      options yearcutoff = 1920 ;
      data _null_ ;
      date = input("&sysdate",date7.) ;
      put date ddmmyy10. ;
      run ;
  • Powrót na górę

  • Jak zmienić tytuł w Output?

    Domyślnie przy wykonywaniu poleceń na górze strony drukowany jest tytuł "The SAS System". Można wyłączyć tą opcję specyfikując TITLE;. Możemy również usunąć drukowanie daty i numerów stron przez użycie opcji NODATE i NONUMBER.

  • Powrót na górę

  • Jak użyć makra by sprawdzić czy zbiór istnieje?

    Zmienna exist będzie ustawiona na 1 jeśli zbiór istnieje lub na zero jeśli nie.

      %let exist=%sysfunc(exist(nazwa_zbioru));
  • Powrót na górę

  • Maksymalna długość makrozmiennej.

    Wartość ta zależy od platformy sprzętowej, zwykle jest to 32767 bajtów dla wersji 6 oraz 65534 dla następnych.

  • Powrót na górę

  • Jak usunąć globalne makrozmienne zdefiniowane przez użytkownika?

    Można do tego użyć makro funkcji %SYMDEL w następujący sposób

      %SYMDEL makrozmienna(e);

    Aby usunąć wszystkie globalne makrozmienne użytkownika można użyć kodu:

      %macro delvars; data vars;
      set sashelp.vmacro;
      run;
      data _null_;
      set vars;
      if scope='GLOBAL' then
      call execute('%symdel '||trim(left(name))||';');
      run;
      %mend;
      %delvars
  • Powrót na górę

  • Jak otworzyć zbiór zawierający kolumny z nałożonymi formatami, których nie posiadamy?

    Przed otwarciem należy ustawić opcję options nofmterr;

  • Powrót na górę

  • Jak debugować działanie data-stepu?

    Należy dodać opcję "/debug", jak w przykładzie poniżej:

      data zbior / debug;
      ...
      run;
  • Powrót na górę

  • Jakiego formatu użyć aby wyświetliś liczbę "po polsku", z przecinkiem dziesiętnym?

    Poniższy data step demonstruje użycie kilku formatów:

      data _null_;
      l=-3384.70;

      *domyślny format;
      put l;

      *bez spacji między tysiącami;
      put l numx12.2;

      *ze spacją między tysiącami przy locale=Polish;
      put l nlnum12.2;

      *z kropką między tysiącami;
      put l commax12.2;

      * długość formatu jest przykładowa;
      run;
  • Powrót na górę

  • Ile procesów jest startowanych po uruchomieniu SAS-a poleceniem sas na Unixie?

    Startowane są 2 lub 3 procesy. Dla sesji batchowej są to sas i elssrv, dla sesji interaktywnej: sas, elssrv i motifxsassm.

    Rolę procesu (m.in.) elssrv opisuje nota: SN-015231.

  • Powrót na górę

  • Jak przekierować wynik działania procedury do zbioru SAS?

    Niektóre procedury mają wpudowany mechanizm zapisu wyników do zbioru. Mechanizmem uniwersalnym, dla wszystkich procedur jest ODS output.

    Jeżeli wynik działania procedury zawiera kilka sekcji to wczesniej należy uruchomić komendę ODS trace on. Spowoduje ona wypisanie w logu wszystkich sekcji 'outputu'.

    Przykład:

      ods trace on;
      ods output summary=tabelka;
      proc means data=sashelp.class;
      run;

    Wynik działania procedury MEANS (sekcja summary) zostanie zapisany w zbiorze tabelka.

  • Powrót na górę

  • Jak powiązać nazwę katalogu zawierającego bibliotekę WORK z identyfikatorem sesji SAS?

    Nazwa katalogu ze zbiorami roboczymi zawiera w sobie numer sesji (PID).

    Przykład dla Windows:
    Dla sesji SAS o numerze PID 2212 powstaje katalog _TD2212

    Przykład dla UNIX:
    Dla sesji SAS o numerze 9730 powstaje katalog SAS_work2E6E00002602_sun1. W tym przypadku 2602 to zapisana szesnastkowo dziesiętna liczba 9730.

  • Powrót na górę

  • Jak ograniczyć zajętość biblioteki WORK podczas sortowania dużych tabel?

    W tym celu należy użyć opcji TAGSORT (jest to opcja procedury SORT). Dzięki niej, w plikach roboczych zapisywane są jedynie pola kluczowe a nie całe rekordy. Opcja ta może dać bardzo dużą poprawę wydajności jeżeli sortujemy zbiór o dużej liczbie zmiennych a sortowanie odbywa się według jednej lub kilku zmiennych.

  • Powrót na górę

  • Gdzie szukać przykładowych kodów SAS?

    Przykładowe kody SAS można znaleźć na stronie: http://support.sas.com/samples.

  • Powrót na górę

  • Z jaką precyzją SAS przechowuje liczby?

    Upraszczając, na zachowanie precyzji przy przechowywaniu liczb w SAS-ie można liczyć przy liczbach o długości do 15 znaków.

    Uściślając:

    • maksymalna liczba całkowita możliwa do przechowania jest zwracana przez funkcję constant('EXACTINT',8).
    • trzeba pamiętać, że liczby z częścią ułamkową zamieniane na reprezentację binarną (komputerową) mogą stracić na precyzji.

    Ilustruje to poniższy kod:

      data _null_;
      v=12345678901234567;
      put v= @18 v 17.;
      v=999999999999999; *15 cyfr;
      put v= @18 v 17.;
      v=9999999999999999; *16 cyfr;
      put v= @18 v 17.;
      v=0.1234567890123456;
      put v= @18 v 17.16;
      v=123456.7890123456;
      put v= @17 v 18.10;
      v=0.999999999999999; *15 cyfr po przecinku (kropce);
      put v= @18 v 17.16;
      v=0.9999999999999999; *16 cyfr po przecinku (kropce);
      put v= @18 v 17.16;
      x=15.7-11.9;
      if x=3.8 then
      put 'równe';
      else
      put 'wyliczone ' x= 'nie jest równe 3.8';
      x=0;
      do i=1 to 10;
      x+0.1;
      end;
      if x=1 then
      put 'równe';
      else
      put 'wyliczone ' x= 'nie jest równe 1';
      run;

    W szczegółach zagadnienie precyzji obliczeń wykonywanych w SAS-ie omawia techniczny dokument: http://support.sas.com/techsup/technote/ts230.html.

    Warto też wspomnieć, że zagadnienie jest bardziej związane z przechowywaniem liczb dziesiętnych w formacie zmiennoprzecinkowym w pamięci komputera, niż z samym SAS-em.

  • Powrót na górę

  • Jak interpretować błędy w logu?

    Jeżeli komunikat o błędzie jest niezrozumiały zalecamy przeszukanie not sasowych (SAS Notes) pod kątem występowania danego komunikatu.

    W tym celu należy wejść na stronę: http://support.sas.com.

    Lub z Menu głównego SAS-a wybrać: Pomoc-> SAS na Webie-> Wsparcie Techniczne

    Następnie mozna skorzystać z okienka 'Search' w górnej części ekranu. Należy wpisać treść błędu dopisując ewentualnie dodatkowe informacje, takie jak wersję SAS-a czy wersję systemu operacyjnego.

    Uwaga: Jeżeli komunikat z błędem jest po polsku należy uruchomić SAS-a w wersji angielskiej i przeszukiwać noty z komunikatem w wersji angielskiej.

  • Powrót na górę

  • Jak usprawnić tworzenie grafiki w SAS?

    Tym, którym tworzenie zaawansowanych wykresów w systemie SAS wydaje się trudne lub skomplikowane polecamy:

  • Powrót na górę

  • Co zrobić, aby okno DOS zamykało się automatycznie po wykonaniu polecenia X ?

    Należy ustawić opcję:

    options NOXWAIT

  • Powrót na górę

  • Jak programowo wyczyścić okienko LOG ?

    Wykonanie polecenia:

    dm editor 'log;clear';

    wyczyści wprawdzie zawartość okienka LOG, ale otworzy dodatkowo okienko 'Program Edytora'. Aby temu zapobiec, należy wykonać:

    dm editor 'log;clear' wedit;

  • Powrót na górę

  • Jak programowo sprawdzić czy dany produkt jest licencjonowany?

    Należy użyć funkcji sysprod('nazwa produktu'). Funkcja zwraca 1 jeśli licencja dla danego produktu jest ważna, 0 jeśli jest nieważna, -1 jeśli nazwa produktu jest nierozpoznana. Funkcji można użyć w datastep-ie, SCL lub w IML step-ie, np.:

      data _null_;
      licensed=sysprod('pc file formats');
      put licensed=;

      licensed=sysprod('base’);
      put licensed=;

      licensed=sysprod('abc');
      put licensed=;
      run;
  • Powrót na górę

  • Jak uzyskać więcej informacji w okienku LOG?

    W tym celu można ustawić w SAS dodatkowe opcje. Oto najczęściej używane:

    Base SAS

      DETAILS, ERRORS, MSGLEVEL, NOTES, SOURCE, SOURCE2, ECHOAUTO

    makra

      MLOGIC, MPRINT, SYMBOLGEN, MERROR, SERROR

    wydajność

      FULLSTIMER

    SAS/Access

      SN-000207 - podłożyć link http://support.sas.com/techsup/unotes/SN/000/000207.html

    SAS/Connect

      odkomentować pierwsze wiersze w pliku tcp*.scr (trace on; echo on;)
      ustawić opcje

      -set TCPDEBUG N /* N = 0..63 */
      -set TCPDFILE 'sciezka do pliku z logiem tcp'

    inne

      DATASTMTCHK, DKRICOND, DKROCOND, DLDMGACTION, DSNFERR
      MERGENOBY,
      DATE, NEWS, OVP, PRINTMSGLIST
      UNBUFLOG

    Niektóre opcje zależą od systemu operacyjnego. Informacje na ich temat można uzyskać w SAS Online Doc lub SAS Help.

  • Powrót na górę

  • Jak debugować działanie SAS/Access do relacyjnych baz danych?

    Należy ustawić poniższe opcje, które spowodują zapisanie w logu SASowym szczegółowych informacji na temat poleceń wysyłanych do silnika bazy danych. Szczegóły w dokumentacji "Online Doc".

    options sastrace=',,d,d' sastraceloc=saslog;

  • Powrót na górę

  • Jak wczytać dane z arkusza Excel, jeśli kolumna zawiera dane mieszanych typów?

    Polecamy notę: SN-006123.

  • Powrót na górę

  • Jak zainstalować SAS/GRAPH control for ActiveX?

    Raporty w HTMLu zawierające obiekty ActiveX wymagają zainstalowania ActiveX na komputerze uzytkownika, który tę stronę będzie oglądał. Jak to zrobić? Jak to wygląda licencyjnie?

    Licencyjnie nie ma żadnych ograniczeń. Kontrolka może być instalowana u dowolnej liczy użytkowników.

    Najnowszą wersję programu instalacyjnego można ściągnąć z naszych stron zewnętrznych: http://www.sas.com/apps/demosdownloads/setupintro.jsp --> SAS/GRAPH Software.

    Udostępniając użytkownikom strony html zawierające obiekty ActiveX, mamy 2 możliwości:

    1. Zainstalować kontrolkę ręcznie, kopiując na lokalny komputer program instalacyjny
    2. Program instalacyjny może być uruchamiany automatycznie, kiedy użytkownik po raz pierwszy wyświetla stronę z grafiką w tym formacie.
    3. W tym przypadku program instalacyjny musi być umieszczony na serwerze www, a w instrukcji ODS tworzącej stronę HTML musi być użyta opcja ARCHIVE= wskazująca na miejsce, gdzie umieszczony został program instalacyjny, np.

      ODS HTML File = 'c:\temp\sastest.html' Archive = "http://www.server.com/sasweb/graph/sasgraph.exe";

    Przy okazji warto wspomnieć, że aplikacja Web Report Studio nie wspiera grafiki wygenerowanej w formacie ActiveX. Grafika generowana w tym formacie jest automatycznie zamieniana na ACTXIMG (podobnie, kiedy wykorzystywany jest driver JAVA, jest on automatycznie zamieniany na JAVAIMG). Dzieje się tak, żeby WRS mogło pozostać w pełni aplikacją, która nie wymaga instalowania na lokalnym komputerze żadnego oprogramowania.

  • Powrót na górę

  • Jak grupować po wartościach wyliczanych w procedurze SQL?

    Pisząc zapytania w SQL często konieczne jest wyliczenie i pogrupowanie danych według nowej wartości. Czy jest to możliwe do wykonania w jednym kroku, a jeżeli tak, to jak to zrobić?

    Pierwszym podejściem jest na ogół umieszczenie formuły wyliczającej nową wartość w klauzuli SELECT i powtórzenie jej w klauzuli GROUP BY, np.

      SELECT oddzial || '-' || departament as oddzial1, sum(wartość)
      FROM dane.zbior
      GROUP BY oddzial || '-' || departament;

    Po uruchomieniu takiego kodu wynik nie jest taki, jaki był oczekiwany, a w logu pojawia się komunikat NOTE: The query requires remerging summary statistics back with the original data.

    Oznacza on, że grupowanie nie mogło zostać przeprowadzone poprawnie. Dzieje się tak dlatego, że dla SASa wyrażenie w SELECT i GROUP BY to dwa różne wyrażenia, co oznacza, że użytkownik chciał grupować dane według zmiennej, której nie ma w SELECT. A takie grupowanie nie jest poprawne.

    Wystarczy jednak drobna modyfikacja kodu, żeby uzyskać spodziewany wynik:

      SELECT oddzial || '-' || departament as oddzial1, sum(wartość)
      FROM dane.zbior
      GROUP BY CALCULATED oddzial1;

    W tym przypadku grupy zostaną wyznaczone poprawnie, dane będą zagregowane, a w logu nie będzie żadnego ostrzeżenia.

  • Powrót na górę

  • Jak zapisywać log w trakcie przetwarzania, bez potrzeby czekania na koniec zadania?

    Domyślnie informacje, które będą zapisywane w logu, są buforowane i wypisywane dopiero po zapełnieniu bufora lub zakończeniu zadania. Na takie zachowanie ma wpływ opcja LOGPARM, ustawiana przy starcie SASa, a konkretnie jej parametr WRITE, który domyślnie ma wartość BUFFERED:

      LOGPARM="WRITE=BUFFERED | IMMEDIATE"
    Jeżeli istnieje potrzeba śledzenia logu na bieżąco, należy ustawić:
      LOGPARM="WRITE=IMMEDIATE"
    Przy takim ustawieniu informacje do loga będą wypisywane natychmiast
  • Powrót na górę

  • Co zrobić, żeby w Enhanced Edytorze działała kombinacja klawiszy ctrl+home?

    W polskiej wersji SAS nie działa skrót ctrl+home w edytorze SASa na Windows. Problem nie dotyczy wersji 9.2. Dla wersji 9.1, jako tymczasowe obejście należy usunąć katalog:

    C:\Program Files\SAS Institute\Shared Files\Enhanced Editor\nls\pol

    i na nowo uruchomić SASa.

    Skutkiem ubocznym będzie angielskie menu w Tools --> Options --> Enhanced Editor.

  • Powrót na górę

  • Czy konieczne jest uruchamianie PC File Server, aby wykorzystywać SAS/ACCESS to PC File Formats na UNIXach?

    SAS/Access to PC File Formats na UNIXach daje możliwość exportu lub importu plików do Excela za pomocą procedury export/import, np.

      proc export dbms=xls outfile='./myexcel.xls'
      dbms=xls data=sashelp.class replace;
      run;

      proc import datafile='./myexcel.xls'
      out=class dbms=xls replace;
      sheet='Sheet1';
      run;

    Począwszy od SAS 9.1.3 Service Pack 3 nie ma potrzeby uruchamiania PC File Servera (na PC).

    Możliwość eksportu do konkretnego arkusza dostępna jest w wersji SAS 9.2, natomiast w 9.1.3 po zainstalowaniu hot fixa E9PF06.

    Szczegóły można znaleźć w notach SN-16812 i SN-30646.

  • Powrót na górę

  • Co oznacza komunikat NOTE: The query requires remerging summary statistics back with the original data.?

    Gdy w PROC SQL, we frazie SELECT jest więcej zmiennych bez funkcji agregujących niż we frazie GROUP BY, SAS w odróżnieniu od innych baz danych pokaże komunikat: NOTE: The query requires remerging summary statistics back with the original data a agregacja nie zostanie wykonana - zwrócone zostaną dane szczegółowe. Jest to opisane w dokumentacji, jak również w nocie SN-4308

    W wersji SAS 9.2 dostępna jest opcja NOSQLREMERGE, której ustawienie spowoduje, że w sytuacji "remerging" pojawi się błąd i przetwarzanie zostanie przerwane.

  • Powrót na górę

  • Jak sprawdzić jaki format ODS jest aktualnie aktywny?

    Wraz z SAS 9.2, można programowo sprawdzić jaki format wyników ODS jest aktualnie aktywny. Można to zrobić przez wykonanie zapytania na tabeli słownikowej DICTIONARY.DESTINATIONS. W wyniku zapytania otrzymujemy informację o aktywnym formacie ODS oraz o aktualnie przypisanym stylu. Podobnie jak dla innych tabeli słownikowych, te same informacje znajdujš się w widoku SASHELP.VDEST.

  • Powrót na górę

  • Jak kontrolować rozmiar strony w ODS dla formatu RTF i PDF?

    Rozmiar strony jest kontrolowany poprzez opcję :
    OPTIONS PAPERSIZE=LETTER;
    Wartoœć tej opcji jest uzależniona od sterownika drukarki.
    Przykładowe wartoœci to LETTER, LEGAL, A4. Możliwe jest także ustawienie własnego formatu papieru poprzez:
    options papersize=("4.5" "7");
    Takie użycie powoduje ustawienie formatu papieru 4,5 cala na 7 cali.

  • Powrót na górę

  • Jak dodać tekst pomiędzy wynikami w pliku HTML ODS?

    Należy użyć wyrażenia ODS TEXT='text-string', np.:

      options center nodate nonumber;

      ods html file='c:\temp\info.html' style=sasweb;

      proc print data=sashelp.class(obs=5);
      title 'Informacje z PROC PRINT';
      footnote 'Stopka procedury PRINT';
      var name age height weight;
      run;

      ods html text='
      To jest tekst dopisany bezpoœrednio za porcedurš PRINT.
      ';

      proc freq data=sashelp.shoes;
      title 'Informacje z PROC FREQ';
      footnote 'Stopka proc FREQ';
      tables region;
      run;

      ods html text='
      Tekst po wynikach PROC FREQ.
      ';
      ods html close;
  • Powrót na górę

  • Ogólne informacje o ODS Graphics Designer

    Nowe narzędzie do edycji i tworzenia wykresów.
    Dostępne wraz z modułem SAS/GRAPH. Uruchomienie poprzez wywołanie makra

      %sgdesign;

    ODS Graphics Designer jest dostępny poczšwszy od wersji SAS 9.2 Etap 2 (TS2M0).
    Szczegóły w nocie 37185
  • Powrót na górę

    Data ostatniej aktualizacji dokumentu: 31.12.2010

     

  • Citat
    Warsztaty SAS® 9 dla Administratorów
    Rodzaje serwerów SAS® 9
    Przypisywanie bibliotek SAS® 9
    Pozycja 'SAS' w menu MS Excel
    SAS Dates, Times, and Datetimes
    SAS Free Tutorials
    Hotline NEWS






    Kontakt
    Wsparcie techniczne
    +48-22-5604666
    od poniedziałku do piątku w godzinach od 8.30 do 16.30.
     
    support@spl.sas.com