Hallo zusammen,
folgende Erkenntnis möchte ich mit der Community teilen (gibt es aber schon seit SAS 9.3).
Ist m.E. eine nützliche Sache.
Viele Grüße
Johannes Lang
== Motivation == Man möchte Regeln für die Gültigkeitsprüfung von Zeichenketten formulieren, und zwar als Muster. Außerdem sollen diese Regeln separat von der Datenverarbeitungslogik gehalten werden, damit Domänenexperten diese pflegen können, ohne den Code ändern zu müssen. == Vorgehen == Um Geschäftsregeln in SAS auszulagern, bieten sich oftmals SAS Formate an. Die Formatdefinitionen können außerhalb von SAS z.B. in einer CSV-Datei verwaltet und zur Laufzeit eingelesen werden. Für das oben genannte Szenario lässt sich seit SAS 9.3 ein neues Feature nutzen: Die Angabe von regulären Ausdrücken innerhalb eines SAS Informats. Die Idee dabei ist, die Regel für gültige bzw. ungültige Werte als regulärer Ausdruck zu formulieren, und alle gültigen bzw. ungültigen Werte auf einen einheitlichen Wert (1 bzw. 0) zu mappen, der dann im Programm abgefragt wird. Beispiel für Informat-Definition:
%*** Informat für die Validierung von RGB-Farbwerten ***;
PROC FORMAT LIBRARY=Work;
invalue validrgb
'/^cx[0-9a-fA-F]{6}$/' (REGEXP) = 1
OTHER = 0
;
RUN;
Beispiel für Anwendung:
%Macro test1;
%LET l_sValue = black; /* Ungültige Zeichen */
%LET l_sValue = cx000000; /* Gültiger Ausdruck */
%LET l_sValue = cx0012345; /* Ausdruck zu lang */
%IF %SYSFUNC(inputn(&l_sValue., validrgb.)) EQ 1 %THEN %DO;
%PUT *** Valid value;
%END;
%ELSE %DO;
%PUT *** Invalid value;
%END;
%Mend;
%test1;
== Nutzung im Kontext des HMS Parameterprüfungsframeworks == * Entwickelt von Andreas Bachert (HMS Analytical Software), um Parameterprüfungen metadatengestützt durch ein allgemeines Prüfmacro durchführen zu können. * Wird auch von mir genutzt, bei Interesse bitte melden
=== Steuertabelle OPTIONS vorbereiten ===
Hinweise:
Der Parametertyp FMT_VALUE besagt, dass die gültigen Werte durch ein (In-)Format definiert sind.
Wie das (In-)Format heißt steht in PARM_FMTNAME_<ParamName>,
wie es angewendet werden soll steht in PARM_FMTFUNCTION_<ParamName>,
und was der Code für ungültige Werte ist steht in PARM_INVALIDVALUE_<ParamName>.
Weitere hier nicht aufgeführte Parametertypen sind NUM_RANGE (numerische Werte in einem bestimmten Bereich), ALPHA_LIST (vordefinierte Liste von Strings).
Name
Value
PARM_NAME_LICHTGRAU
g_sLichtGrau
PARM_TYPE_LICHTGRAU
FMT_VALUE
PARM_DEFAULT_LICHTGRAU
cxc0c0c0
PARM_FMTNAME_LICHTGRAU
validrgb
PARM_FMTFUNCTION_LICHTGRAU
INPUTN
PARM_INVALIDVALUE_LICHTGRAU
0
PARM_DESCR_LICHTGRAU
Lichtgrau für Dashboards
PARM_MISSINGALLOWED_LICHTGRAU
0
PARM_NAME_HELLGRAU
g_sHellGrau
PARM_TYPE_HELLGRAU
FMT_VALUE
PARM_DEFAULT_HELLGRAU
cx969696
PARM_FMTNAME_HELLGRAU
validrgb
PARM_FMTFUNCTION_HELLGRAU
INPUTN
PARM_INVALIDVALUE_HELLGRAU
0
PARM_DESCR_HELLGRAU
Hellgrau für Dashboards
PARM_MISSINGALLOWED_HELLGRAU
0
=== Aufruf des Prüfmacros ===
Hinweise:
Das Prüfmacro %CheckAllParamsInList konsultiert anhand der übergebenen Macrovariablennamen die obige Steuertabelle OPTIONS und wendet die dort hinterlegten Gültigkeitsprüfungen an.
Beim ersten erkannten ungültigen Wert wird eine formatierte Fehlermeldung ausgegeben, sowohl ins SAS-Log als auch in eine konfigurierbare Tabelle. Der Meldungstext ist ebenfalls über eine eigene Steuertabelle konfigurierbar.
%CheckAllParamsInList (p_sParamNames = %STR(g_sLichtGrau~g_sHellGrau)
, p_sParamValues =
, p_sDelimiter = %STR(~)
, p_sVarParamsOK = l_nParamCheckRC
);
%IF %EVAL(&l_nParamCheckRC. NE 1) %THEN %DO;
%LET _ERR_ = 1;
%LET l_bMessageRegistered = 1;
%GOTO EXIT;
%END;
== Links == * Langston, Rick (2012): Using the New Features in PROC FORMAT, in: Proceedings of SAS Global Forum 2012. * Liste der Farbcodes in SAS/GRAPH (pdf)
... View more