Makro: Suche nach Variable (über Name oder Label) in "allen" SAS-Dateien

Der Macro %xref (xref wie "Cross-Referenz") sucht nach einer oder mehreren Variablen in SAS-Dateien oder kompletten Librarys. Die Suche kann eingeschränkt werden auf eine Datei (datei=) oder Library (lib=), wobei die Vorgabe „ab Wort-Anfang“ gilt. Die Treffer werden in ein SAS-Dataset geschrieben und mit proc print ausgegeben.

Beispiel:

 %xref(var=labor, lib=dm3_g); 

Output:

Quer-Verweis-Liste (Suche in 'sashelp.vcolumn')
Selek-Bed: 'name LIKE "LABOR%" AND libname LIKE "DM3_G%"'
 
Library     Member     Column    Col.    Col
 Name        Name       Name     Type    Len           Column Label
 
 DM3_G     A_KOPO_G    LABOR     char     3     PM-GRUPPE (VBAP-MARA-LABOR)
 DM3_G     F_KOPO_G    LABOR     char     3     PM-GRUPPE (VBAP-MARA-LABOR)
 DM3_G     L_KOPO_G    LABOR     char     3     PM-GRUPPE (VBAP-MARA-LABOR)

Weitere Muster-Aufrufe:

nur bestimmte Variable, egal wo (in allen Bibliotheken und Dateien)

 %xref( var=KDVKV ); 

nur bestimmte Variablen, (hier: 'wkurH' und 'wkurB'), egal wo

  %xref( var=wkur ); 

nur bestimmte Variablen
(hier: 'dwhwaehr' od. 'wkurH' bzw. 'wkurB'), egal wo

  %xref( var1=dwhwaehr, var2=wkur ); 

alle Variablen, aus bestimmten Dateien

  %xref( data=adr_neu ); 

nur bestimmte Variable, aus bestimmten Libraries

  %xref( var=KDVKV, lib=library );  

nur bestimmte Variable, aus bestimmten Dateien

  
%xref( var=KDVKV   , data=kkr1998G ); 
%xref( var=kunnum  , data=adr_neu1, lib=dw_read );
%xref( var=archidat,                lib=d3     ); 

Variable(n), DataSet und LibName werden mit automatischem substr "ab Anfang" gesucht.
Die Suche über Label geht auf "Zeichenfolge irgendwo im LabelText".

Groß-/Kleinschreibung ist bei der Suche unwichtig/ egal.

Für die gleichzeitige Suche nach 2 Variablen müssen die Paramter var1 und var2 benutzt werden (oder-Verknüpfung).

Und die Macro-Definition (auch als Dateianhang):

%macro xref(
var= /* Groß-/Kleinschr. egal, Suche "ab Wort-Anfang" */
, var1= /* Groß-/Kleinschr. egal, Suche "ab Wort-Anfang" - oder-verknüpft mit var2 */
, var2= /* Groß-/Kleinschr. egal, Suche "ab Wort-Anfang" - oder-verknüpft mit var1 */
, data= /* optional, Groß-/Kleinschr. egal, Suche "ab Wort-Anfang" */
, lib= /* optional, Groß-/Kleinschr. egal, Suche "ab Wort-Anfang" */
, label= /* Groß-/Kleinschr. egal, Suche "irgendwo im Text" */
);

/*------------------------------------------------------------------
* Quer-Verweis-Liste
* ==================
* über alle Dateien des DWH
*
* Ablauf:
* Datenselektion:
* in "sashelp.vcolumn",
* abh. von (optionalen) Selektions-Parameter(n)
* Sortierung nach "LIBNAME MEMNAME NAME"
*
* Ausgabe:
* SAS-Datei, Name "tmp_col"
*
* (Druck-)Ausgabe:
* - Library Name
* - Member Name
* - Column Name
* - Col. Type Feld-Typ (Text oder numerisch)
* - Col Len Feld-Länge (nur bei "Text" wichtig)
* - Column Label
* Muster-Aufrufe:
* ===============
*
* nur bestimmte Variable, egal wo
* %xref( var=KDVKV );
*
* nur bestimmte Variablen, (hier: 'wkurH' und 'wkurB'), egal wo
* %xref( var=wkur );
*
* nur bestimmte Variablen
* (hier: 'dwhwaehr' od. 'wkurH' bzw. 'wkurB'), egal wo
* %xref( var1=dwhwaehr, var2=wkur );
*
* alle Variablen, aus bestimmten Dateien
* %xref( data=adr_neu );
*
* nur bestimmte Variable, aus bestimmten Libraries
* %xref( var=KDVKV, lib=library );
*
* nur bestimmte Variable, aus bestimmten Dateien
* %xref( var=KDVKV, data=kkr1998G );
* %xref( data=adr_neu1, var=kunnum, lib=dw_read );
* %xref( lib =d3 , var=archidat);
*----------------------------------------------------------- */
%let _selbed=;
%let var =%upcase(&var.);
%let var1 =%upcase(&var1.);
%let var2 =%upcase(&var2.);
%let data =%upcase(&data.);
%let lib =%upcase(&lib.);
%let label=%upcase(&label.);

%if &var. ne %then %do;
%let _selbed=&_selbed. AND name LIKE "&var.%nrbquote(%)";
%end;
%if &var1. ne AND &var2. ne %then %do;
%let _selbed=&_selbed.
AND (name LIKE "&var1.%nrbquote(%)"
OR name LIKE "&var2.%nrbquote(%)"
);
%end;
%if &var1. ne AND &var2. eq %then %do;
%let _selbed=&_selbed. AND name LIKE "&var1.%nrbquote(%)";
%end;
%if &var1. eq AND &var2. ne %then %do;
%let _selbed=&_selbed. AND name LIKE "&var2.%nrbquote(%)";
%end;
%if &data. ne %then %do;
%let _selbed=&_selbed. AND memname LIKE "&data.%nrbquote(%)";
%end;
%if &lib. ne %then %do;
%let _selbed=&_selbed. AND libname LIKE "&lib.%nrbquote(%)";
%end;
%if &label. ne %then %do;
%let _selbed=&_selbed. AND label LIKE "%nrbquote(%)&label.%nrbquote(%)";
%end;

data vcolumn;
set sashelp.vcolumn;
name=upcase(name);
memname=upcase(memname);
libname=upcase(libname);
label=upcase(label);
run;
data tmp_SD1;
set vcolumn;
where 1=1 &_selbed.;
run;
proc sort data=tmp_SD1 out=tmp_col;
by LIBNAME MEMNAME NAME;
run;
title2 "Quer-Verweis-Liste (Suche in 'sashelp.vcolumn') ";
title3 "Selek-Bed: '%qsubstr(&_selbed.,5)' ";
options linesize=101;
proc print data=tmp_col noobs label;
var LIBNAME MEMNAME /* MEMTYPE */ NAME TYPE LENGTH LABEL;
label
TYPE ="Col. Type"
LENGTH="Col Len"
;
run;
%mend xref;