Ein einfaches Beispiel für die Maskengenerierung und Dateneingabe mit SAS/FSP

Das statistische Analysesystem SAS ermöglicht bei Verwendung des Moduls SAS/FSP die Erzeugung einer Eingabemaske. Diese dient nicht nur der eigentlichen Datenerfassung, sondern kann bereits bei der Dateneingabe einfache Eingabefehler vermeiden helfen.

Vor der Generierung einer Eingabemaske ist es sinnvoll, einen Kodierplan zu stellen. Unter  Kodierplan  können Sie einige Informationen zur Definition eines Kodierplans abrufen.



I Maskengenerierung mit SAS/FSP

Es soll nun vorgestellt werden, wie mit SAS/FSP eine Eingabemaske erstellt werden kann. Dabei wird exemplarisch an dem oben vorgestellten Beispiel vorgegangen.
Die Eingabe-Maske soll wie folgt aussehen, wobei für die Automarken die Methode multipler Kategorien verwendet wird.


<F1>  Seite vorwaerts                  <F2>  Seite rueckwaerts <F3>  ein Fragebogen weiter            <F4>  ein Fragebogen zurueck <F5>  einen neuen Fall einfuegen       <F6>  BEENDEN DER EINGABE                VARIABLE          NAME     WERT                Fragebogennummer  LFD:     ___                1 bis 500                Alter             ALTER:   ___                1 bis 120                Geschlecht        GESCHL:  _                1 = weiblich                2 = maennlich                Groesse (cm)      GROESSE: ___                20 bis 250                Gewicht (kg)      GEWICHT: ___                1 bis 200                Automarken                1 = BMW           AUTO1:   _                2 = Fiat          AUTO2:   _                3 = Ford          AUTO3:   _                4 = Mercedes                5 = Opel                6 = VW                7 = andere                                      Fehlende Werte sind mit der entsprechenden Anzahl von "9" zu kodieren.

1. Schritt: Erzeugung des Datensatzes

Erzeugen Sie zunächst einen Datensatz mit den gewünschten Variablen. Der Datensatz muß keine Beobachtungen enthalten.

Beispiel:

LIBNAME hrz "c:\benutzer\maske";
PROC FORMAT; 
  VALUE geschlf 0="maennlich" 1="weiblich"; 
  VALUE autof 1="BMW" 2="Fiat" 3="Ford" 
              4="Mercedes" 5="Opel" 6="VW" 7="Andere"; 
DATA hrz.kurs; 
 INPUT lfd Alter Geschl Groesse Gewicht Auto1 Auto2 Auto3; 
 LABEL lfd     = "Nummer" 
       Alter   = "Alter" 
       Geschl  = "Geschlecht" 
       Groesse = "Groesse (cm)" 
       Gewicht = "Gewicht (kg)" 
       Auto1   = "Automarke1" 
       Auto2   = "Automarke2" 
       Auto3   = "Automarke3"; 
 FORMAT Geschl geschlf.; 
 FORMAT lfd 3.0     Alter 3.0 
        Geschl 1.0  Groesse 3.0 
        Gewicht 3.0 Auto1 1.0 
        Auto2 1.0   Auto3 1.0; 
CARDS; 
; 
RUN; 
PROC FSEDIT DATA=hrz.kurs 
            SCREEN = hrz.screen1 
            MODIFY; 
RUN;

2. Schritt: Anpassen der Maske

SAS/FSP bietet u.a. die folgenden Möglichkeiten, die Maske den eigenen Wünschen anzupassen.
    1 Information about screen modification
    2 Screen Modification and Field Identification
    3 Edit Program Statements and Compile
    4 Assign Special Attributes to Fields
    5 Modification of General Parameters
    6 Browse Program Statements
Mit dem Auswahlmenue kann der Bildschirm entsprechend der Vorgabe angepaßt werden. U.a. kann man eingeben:

<F1>  Seite vorwaerts                  <F2>  Seite rueckwaerts <F3>  ein Fragebogen weiter            <F4>  ein Fragebogen zurueck <F5>  einen neuen Fall einfuegen       <F6>  BEENDEN DER EINGABE                VARIABLE          NAME     WERT                Fragebogennummer  LFD:     ___                1 bis 500
               .....
               .....
               .....









Passend hierzu sollte natürlich auch die Tastaturbelegung innerhalb von SAS/FSP geändert werden (vgl. Schritt 5). Für die Gestaltung des Bildschirms ist die Einblendung der Zeilennummern am Anfang jeder Zeile hilfreich. Dies erreicht man durch Eingabe des Befehls "NUM ON" in der Kommando-Zeile. Man kann den Bildschirmtext auch farbig gestalten. Um die Textfarbe zu wechseln, muß man die <ESCAPE>-Taste und einen bestimmten Buchstaben für die jeweilige Farbe drücken:
 
<ESC>-<A> für grau  <ESC>-<K> für schwarz 
<ESC>-<P> für pink  <ESC>-<B> für blau 
<ESC>-<M> für magenta  <ESC>-<R> für rot 
<ESC>-<C> für cyan  <ESC>-<N> für braun 
<ESC>-<W> für weiß  <ESC>-<G> für grün 
<ESC>-<O> für orange  <ESC>-<Y> für gelb 
Verläßt man das Fenster zur Bildschirmgestaltung, so erscheint (falls man Änderungen vorgenommen hat) die Abfrage I.a. wird man diese Frage mit n (no) beantworten. Danach gelangt man in das "IDENTIFY"-Fenster, in dem man eventuell verschobene Variablen-Felder neu identifizieren muß. Grob gesprochen bedeutet dies, daß Sie dem Programm mitteilen müssen, wo das jeweilige Eingabefeld für eine Variable auf dem Bildschirm jetzt lokalisiert ist.

3. Schritt: SAS/SCL Programme

Mit dem Auswahlmenue
        3 Edit Program Statements and Compile
kann man ein SAS/SCL Programm (SCL steht für Screen Control Language) mit der Eingabemaske verbinden. Dieses Programm kann z.B. dazu dienen, daß nur gültige Werte eingegeben werden können und gleichzeitig schon einfache Plausibilitätschecks durchgeführt werden. Dies ist eine wichtige Maßnahme zur Sicherstellung einer hohen Datenqualität.

In dem folgenden SCL-Programm wird für jede Variable geprüft, ob der eingegebene Wert ein gültiger Wert ist. Andernfalls erscheint auf dem Bildschirm ein entsprechender Hinweis und ein Alarmton wird erzeugt.

Beispiel 1: Datenkontrolle bei der Eingabe

* Daten-Kontrolle bei der Dateiengabe mit FSEDIT ; 
* mit Hilfe der Sprache SCL ; 

*------------------------------------------------*; 
INIT: 
RETURN; 
*------------------------------------------------*; 
MAIN: 
* Ueberpruefung der Variablen 1: lfd ; 
IF (lfd  LE 0 OR lfd  GT 500) AND lfd NE 999 THEN 
DO; 
     ERRORON lfd; 
     _MSG_ = "Variable LFD  überprüfen "; 
     ALARM; 
     lfd  =.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 2: Alter ; 
IF (Alter LE 0 OR Alter GT 120) AND Alter NE 999 
THEN DO; 
     ERRORON Alter; 
     _MSG_ = "Variable ALTER  überprüfen "; 
     ALARM; 
     Alter =.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 3: Geschl ; 
IF (Geschl NE 1 AND Geschl NE 2 AND Geschl NE 9  ) 
THEN DO; 
     ERRORON Geschl; 
     _MSG_ = "Variable Geschl  überprüfen "; 
     ALARM; 
     Geschl =.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 4: Groesse ; 
IF (Groesse LT 20 OR Groesse GT 250) AND Groesse 
NE 999 THEN DO; 
     ERRORON Groesse; 

     _MSG_ = "Variable Groesse überprüfen "; 
     ALARM; 
     Groesse =.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 5: Gewicht ; 
IF (Gewicht LT 1 OR Gewicht GT 200) AND Gewicht NE 
999 THEN DO; 
     ERRORON Gewicht; 
     _MSG_ = "Variable Gewicht  überprüfen "; 
     ALARM; 
     Gewicht =.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 4 und 5: Groesse UND 
Gewicht; 
IF ( (Groesse LT 100 AND Gewicht GT 100) OR 
     (Groesse GT 150 AND Gewicht LT 20 )  ) THEN 
DO; 
     ERRORON Groesse; 
     _MSG_ = "Überprüfen Sie die Variablen 
(Groesse, Gewicht)"; 
     ALARM; 
     Groesse = .; 
     Gewicht = .; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 6: Auto1; 
IF (Auto1 LT 1 or Auto1 GT 7) AND Auto1 NE 9 THEN 
DO; 
     ERRORON Auto1; 
     _MSG_ = "Variable Auto1 überprüfen"; 
     ALARM; 
     Auto1=.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 7: Auto2; 
IF (Auto2 LT 1 or Auto2 GT 7) AND Auto2 NE 9 THEN 
DO; 
     ERRORON Auto2; 
     _MSG_ = "Variable Auto2 überprüfen"; 
     ALARM; 
     Auto2=.; 
  GOTO INIT; 
END; 
* Ueberpruefung der Variablen 8: Auto3; 
IF (Auto3 LT 1 or Auto3 GT 7) AND Auto3 NE 9 THEN 
DO; 
     ERRORON Auto1; 
     _MSG_ = "Variable Auto3 überprüfen"; 
     ALARM; 
     Auto3=.; 
  GOTO INIT; 
END; 
RETURN; 
*--------------------------------------------------------*; 
TERM: 
RETURN; 
*--------------------------------------------------------*;

Beispiel 2: Datenkontrolle bei der Eingabe mit Hilfe eines SAS/Macros

Aus dem obigen Beispiel ist ersichtlich, daß es oft sinnvoll sein kann, mit Hilfe eines SAS-Macros das SCL-Programm deutlich zu verkürzen, da oft für mehrere Variablen die vorzunehmenden Überprüfungen von ähnlicher Struktur sind.
*----------------------------------------------------------*; 
INIT: 
RETURN; 
*----------------------------------------------------------*; 
MAIN: 

*----------------------------------------------------------*; 
*MACRO zur Ueberpruefung einer 
Variablen                   *; 
*      var     = Name der Variable                         *; 
*      lgrenze = unterer zulaessiger Wert                  *; 
*      rgrenze = oberer zulaessiger Wert                   *; 
*      keinea  = Zahl fuer keine Angabe                    *; 
*      missing = Zahl fuer fehlende Werte (missing values) *; 
*----------------------------------------------------------*; 
%MACRO testen(var,lgrenze,rgrenze,keinea,missing); 
    IF (&var < &lgrenze OR &var > &rgrenze) 
        AND &var NE &keinea 
        AND &var NE &missing AND &var NE . THEN 
DO; 
      ERRORON &var; 
      _MSG_="Falsche Eingabe bei der Variable 
&var"; 
      ALARM; 
      &var=.; 
      RETURN; 
    END; 
%MEND testen; 

%testen(lfd,1,500,999,999); 
%testen(alter,1,120,999,999); 
%testen(geschl,1,2,9,9); 
%testen(groesse,20,250,999,999); 
%testen(gewicht,1,200,999,999); 
%testen(auto1,1,7,9,9); 
%testen(auto2,1,7,9,9); 
%testen(auto3,1,7,9,9); 

/* ... weitere Tests ... */

RETURN; 
*------------------------------------------------------*; 
TERM: 
RETURN; 
*------------------------------------------------------*;

Beispiel 3: Datenkontrolle bei der Eingabe für größere Fragebögen

Bei der Maskengenerierung für größere Fragebögen kommt es häufiger vor, daß man für viele Variablen die gleichen Plausibilitätschecks durchführen möchte und die Variablen durchnumeriert sind. Nehmen Sie z.B. an, Sie haben 40 identisch kodierte Variablen Fach1 bis Fach40 mit gültigen Werten 1 bis 5 sowie 8 (keine Angabe) und 9 (fehlender Wert). Außerdem seinen 100 identisch kodierte Variablen Bed1 bis Bed100 mit gültigen Werten 1 bis 14 sowie 88 (keine Angabe) und 99 (fehlender Wert) vorhanden. In diesem Fall wäre es recht arbeitsaufwendig, das SAS/SCL-Programm für jede einzelne Variable selbst zu schreiben. Mit dem folgenden SAS-Macro kann man sich daher viel Zeit sparen.
*-----------------------------------------------------------*; 
INIT: 
RETURN; 
*-----------------------------------------------------------*; 
MAIN: 

*-----------------------------------------------------------*; 
*MACRO zur Ueberpruefung aller Variablen VAR1 bis VARzahl   *; 
*      var     = Name der Variable                          *; 
*      zahl    = Anzahl der Variablen                       *; 
*      lgrenze = unterer zulaessiger Wert                   *; 
*      rgrenze = oberer zulaessiger Wert                    *; 
*      keinea  = Zahl fuer keine Angabe                     *; 
*      missing = Zahl fuer fehlende Werte (missing values)  *;                      *; 
*-----------------------------------------------------------*; 

%MACRO testen2(var, zahl, lgrenze, rgrenze, keinea, missing); 
 %DO i=1 %TO &zahl; 
    IF (&var.&i < &lgrenze OR &var.&i > &rgrenze) 
        AND &var.&i NE &keinea 
        AND &var.&i NE &missing AND &var.&i NE . THEN DO; 
      ERRORON.&i; 
      _MSG_="Falsche Eingabe bei der Variable &var.&i"; 
      ALARM; 
      &var.&i=.; 
      RETURN; 
   END; 
 %END; 
%MEND testen; 

%testen2(Fach,40,1,5,8,9); 
%testen2(Bed,100,1,14,88,99); 

/* ... weitere Tests ...  */

RETURN; 
*------------------------------------------------------------*; 
TERM: 
RETURN; 
*------------------------------------------------------------*;
Mit CLOSE schließt man das Fenster. Das SCL-Programm wird compiliert. Oft ist es ratsam, daß das SCL-Programm zusätzlich getrennt abgespeichert wird. Bei Bedarf steht ein Debugger zur Verfügung.

4. Schritt: Vergabe von Feldattributen

Mit dem Auswahlmenue kann man einzelnen oder auch allen Feldern der Maske unterschiedliche Attribute zuordnen. Hier sei nur eine Auswahl der wichtigsten Attribute genannt:
 
Attribut Bedeutung
INITIAL Vorgabewert
MAXIMUM größter zulässiger Wert
MINIMUM kleinster zulässiger Wert
REQUIRED gültiger Wert erforderlich zum Abspeichern des Falls
FCOLOR Farbe des Feldes
ECOLOR Farbe des Feldes, wenn der eingegebene Wert des Feldes ungültig ist
JUSTIFY Ausrichtung der Werte:LEFT, CENTER, RIGHT

5. Schritt: Optionen und Funktionstasten

Bei Bedarf kann mit dem Auswahlmenue die Bedeutung allgemeiner Parameter geändert werden. Dies kann z.B. sinnvoll sein, wenn bei der Eingabe der Daten nach jedem 5. Fragebogen das Programm automatisch die Daten abspeichern soll. Dies kann mit der Option AUTOSAVE angegeben werden.

Area           Color       Attribute  Background     WHITE  Border         BLACK       NONE              Allow DELETE  command: Y  Banner         BLACK       NONE              Allow ADD/DUP command: Y  Command        BLACK       NONE  Message        RED         NONE  Protected      BLACK                         Keys name:   HRZ  Unprotected    BLACK  Override on errors:        Y                 Window rows:       39  Override on required:      Y                 Window cols:      100  Autosave value:            5                 Start row:          1  Modify password:           ________          Start col:          1  Name command variable:     ________  String command variables:  ________ ________ ________ ________ ________  ________ ________ ________ ________ ________ ________ ________ ________  ________ ________ ________ ________ ________ ________ ________ ________  ________ ________ ________ ________ ________ ________ ________ ________
Hier kann man auch ein neues KEYS-Fenster festlegen, in diesem Beispiel mit dem Namen HRZ, in dem man dann die Tastatur entsprechend belegen kann. Dazu ruft man nach Änderung des "Keys name" im obigen Fenster und nach Verlassen dieses Fensters mit Hilfe des Kommandos KEYS das Keys-Fenster auf und gibt hier hinter den Funktionstasten die passenden Kommandos ein. Für dieses Beispiel können die folgenden lokalen Tastenbelegungen gemacht werden. Die Kommandos haben folgende Bedeutung:
right eine Bildschirmseite vorwärts
left eine Bildschirmseite zurück
forward einen Fall weiter
backward einen Fall zurück
add neuen, leeren Fall einfügen
end abspeichern und Eingabe beenden

Bei mehrseitigen Eingabemasken ist es sinnvoll, die Taste F5 mit den Befehlen

F5         add; =1
zu belegen. Dies bewirkt, daß bei Einfügen eines neuen Falles automatisch die erste
Seite der Eingabemaske angezeigt wird.

Schließlich sei noch erwähnt, daß durch Auswahl von

das verwendete SAS/SCL-Programm angezeigt werden kann, ohne Veränderungen vornehmen zu dürfen.

Nach Beendigung der Maskenerstellung kann gleich mit der Dateneingabe begonnen werden.  Es sei aber noch erwähnt, daß die Eingabemaske ein eigentlich schreibgeschütztes Feld darstellt, welches nur durch einschalten des Einfügemodus mit der Hilfe der "Einfg"-Taste auf der Tastatur überschreibbar gemacht werden kann.  Existiert der Datensatz bereits, z.B. weil die Dateneingabe unterbrochen wurde und PROC FSEDIT verlassen wurde, kann die Maske mit den folgenden Befehlen erneut aufgerufen werden.

II Weitere Möglichkeiten von SAS/FSP

SAS/FSP bietet zahlreiche weitere Optionen, die Eingabemaske den eigenen Wünschen anzupassen. Hierzu sei auf das SAS-Manual verwiesen.

In Ausnahmefällen ergibt sich die Notwendigkeit, nachträglich noch eine oder mehrere Variablen in eine Eingabemaske hinzuzufügen. Eine Möglichkeit dies zu tun, wird im folgenden beschrieben.

Nachträgliches Einfügen von Variablen

Wenn man nach Fertigstellung der Maske feststellt, daß man leider Variablen vergessen hat bzw. noch zusätzliche Variablen in die Eingabemaske aufnehmen möchte (dies sollte jedoch bei sorgfältigen Vorüberlegungen die Ausnahme sein), so kann man folgendermaßen vorgehen.

Zuerst muß man die neue Variable in einem DATA-Step dem Datensatz hinzufügen.

Beispiel:

DATA hrz.kursneu; 
SET hrz.kurs 
INPUT schuh; 
LABEL schuh ="Schuhgrösse"; 
FORMAT schuh 2.0; 
CARDS; 
; 
RUN;
Dann muß man PROC FSEDIT mit dem neuen Datensatz und dem alten Screen aufrufen.

Beipiel:

PROC FSEDIT DATA=hrz.kursneu 
            SCREEN=HRZ.screen1 
            MODIFY 
            ; 
RUN;
Aus dem Menue muß man Punkt 2 auswählen und dann die neue Variable, d.h. den gewünschten Text und die entsprechende Anzahl von Underscores für das Eingabefeld, eingeben. Anschließend verläßt man das Fenster zur Bildschirmgestaltung, beantwortet die folgende Abfrage mit n (no) und gelangt in das &quotIdentify"-Fenster. Hier muß man das Kommando in die Kommandozeile eingeben, um zu zeigen, daß die Variable schuh in die Eingabe-Maske aufgenommen werden soll. Anschließend wird man aufgefordert, den Cursor auf das zu der neuen Variable gehörenden Eingabefeld (d.h. die Underscores) zu plazieren und <RETURN> zu drücken. Damit ist die neue Variable in die Eingabemaske aufgenommen und man kann das "Identify"-Fenster und das MODIFY-Menue verlassen.

III Literatur

  1. SAS Institute Inc., SAS Screen Control Language: Usage, Version 6, First Edition, Cary, NC: SAS Institute Inc., 1991.
  2. SAS Institute Inc., SAS Screen Control Language: Reference, Version 6, First Edition, Cary, NC: SAS Institute Inc., 1990.
  3. SAS Institute Inc., SAS Screen Control Language: Reference, Version 6, Second Edition, Cary, NC: SAS Institute Inc., 1994.
  4. SAS Institute Inc., SAS Guide to Macro Processing, Version 6, Second Edition, Cary, NC: SAS Institute Inc., 1990.
  5. SAS Institute Inc., SAS/TUTOR: Developing Custom Data Entry Applications Course Guide, OS/2 and Windows (Release 6.08), Open VMS and UNIX (X Windows Environments), Windows NT (Release 6.09), Cary, NC: SAS Institute Inc., 1993.
  6. SAS Institute Inc., SAS/FSP Software: Usage and Reference, Version 6, First Edition, Cary, NC: SAS Institute Inc., 1989.

Author: Dr. Andreas Christmann, 26.02.2003