Konstanten als Makrovariablen

Zeichenketten, die mehrfach gebraucht werden oder die sich ändern können, werden an zentraler Stelle Makrovariablen zugewiesen. Dabei werden normalerweise keine Anführungszeichen verwendet. An zentraler Stelle heißt: am Anfang des Programms oder auch in einem zu Beginn der Sitzung auszuführenden Programm, das zentrale Zuweisungen enthält.

Begründung: Redundantes pflegen von Informationen an verschiedenen Stellen im Programm führt leicht zu Fehlern, weil man leicht eine Stelle vergisst. Wenn die Zuweisungen an zentraler Stelle erfolgen, findet man sie leichter.
Anführungszeichen sollte man weglassen, weil man dann mit den Inhalten der Makrovariablen flexibler umgehen kann. Zum Beispiel kann man sie dann einfacher mit anderen Strings verketten.

Beispiel

/* hier den Pfad auf die Messdatei eintragen */
%LET file=c:/mess/lab.xls;

/* lies Messdaten */
PROC IMPORT OUT=lab DATAFILE="&file" DBMS=EXCEL REPLACE;
   SHEET=
"Lab$";
RUN;

/* lies Referenzmessungen */
PROC IMPORT OUT=ref DATAFILE="&file" DBMS=EXCEL REPLACE;
   SHEET=
"Ref$";
RUN;

so lieber nicht

/* lies Messdaten */
PROC IMPORT OUT=lab DATAFILE="c:/mess/lab.xls" DBMS=EXCEL REPLACE;
   SHEET=
"Lab$";
RUN;

/* lies Referenzmessungen */
PROC IMPORT OUT=ref DATAFILE="c:/mess/lab.xls" DBMS=EXCEL REPLACE;
   SHEET=
"Ref$";
RUN;
denn wenn der Name oder der Ort der Datei sich ändern, muss man diese mehrfach pflegen.

Pfade und Portierbarkeit

Hierzu fällt mir noch folgendes ein: Häufig setzt man einen Verzeichnispfad per Makrovariable, um dann darin mehrere Dateien zu erzeugen:

%let pfad=C:\temp;
filename datei1 "&pfad\datei1.txt";
filename datei2 "&pfad\datei2.txt";
Dadurch ist der Code aber nicht mehr portierbar, z.B. läuft er nicht auf UNIX, wo das Verzeichnis-Trennzeichen nicht \ sondern / ist.
Daher besser das Trennzeichen ebenfalls in die Makrovariable:
%let pfad=C:\temp\;
filename datei1 "&pfad.datei1.txt";
filename datei2 "&pfad.datei2.txt";
Das kann man dann leicht anpassen zu
%let pfad=/usr/tmp/;
...
Will man sogar Unterordner ansprechen, muss man vielleicht sogar so vorgehen:
%let pfad=C:\temp\;
%let verz_trenner=\;
filename datei1 "&pfad.ordner1&verz_trenner.datei1.txt";
filename datei2 "&pfad.ordner2&verz_trenner.datei2.txt";
Das kann man dann anpassen zu
%let pfad=/usr/tmp/;
%let verz_trenner=/;
...
Wenn man dies macht, kann man natürlich zur Sicherheit auch folgendes schreiben:
%let pfad=C:\temp\;
%let verz_trenner=\;
filename datei1 "&pfad&verz_trenner.ordner1&verz_trenner.datei1.txt";
filename datei2 "&pfad&verz_trenner.ordner2&verz_trenner.datei2.txt";
Dann spielt es keine Rolle, ob der Anwender
%let pfad=C:\temp\;
oder
%let pfad=C:\temp;
schreibt.

Trenner zwischen Pad- und Datei-Name

SAS ist so nett und ignoriert die (blöde) Unterscheidung zw. DOS und UNIX bei der Pad- und Datei-Angabe.
Wir verwenden konsequent immer den "slash" (also den Schrägstrich über der 7). Wir verwenden nie den "back slash" (neben dem ß):
filename test "C:/tmp/test.txt";
klappt auf dem PC unter Windows und
filename test "/tmp/test.txt";
klappt auf der UNIX-Kiste (Sun/Solaris)
Wenn man ein relatives Unter-Verzeichnis ansprechen will ist es ganz einfach (nämlich gleich). Zum Beispiel:
ods html path="." body="html/&_JOBNAM..html";
bzw. besser umgebrochen:

ods html
  
path="."
  
body="html/&_JOBNAM..html"    
;
Anderes Beispiel für die konsequente Verwendung der / als Trenner zwischen Pfad- und Datei-Name:
footnote8 "<a href='html/&_JOBNAM..html' target='_top'><u><b>&_JOBNAM.</b></u></a>";

Also:
An dieser Stelle ist die Verwendung von Makro-Variablen nicht nötig.

Überarbeitet

Das mit den portablen Pfaden befindet sich jetzt unter Kompatibilität/Portabilität - portable Pfade verwenden.

Die Backslashes in den Beispielen habe ich in Slashes umgewandelt.

Ups...

Das ist ja klasse - wieder was dazugelernt :-) Dann können wir meinen ersten Kommentar ja wieder löschen...