Ermitteln von Spaltennamen abhängig von Inhalten

Hallo,

ich habe eine Tabelle aus einer Datenbank abegzogen, in der "Änderungsbelege" für eine recht breite Tabelle stehen:

Schlüssel und Datum sind dabei immer gefüllt.

Die 25 anderen Spalten sind nur dann gefüllt, wenn sich für diesen Schlüssel an diesem Datum überhaupt etwas geändert hat. Dann sind die jeweiligen Felder mit dem neuen Inhalt gefüllt.

Ich könnte jetzt 25 Abfragen auf je eines der Felder machen, um die Belege zu filtern, die Änderungen für jeweils eines der 25 Felder beinhalten.

Es kann aber auch sein, dass einige Belege mehrere Feldinhalte zeitgleich ändern (bspw. Straße, Hausnummer, PLZ und Ort bei einem Umzug).

Wie kann ich an die Ursprungstabelle ein neues Feld anfügen, dass für jeden Satz die Namen der Felder als konkatenierten String (mit einem Trennzeichen wie ;) enthält, die in diesem Satz gefüllt sind?

Dann liesse sich die Tabelle einfacher filtern.

Ich hoffe, meine Frage ist deutlich geworden?

Schönen Gruß

Olaf Musch

ARRAY und die VNAME-Funktion

Beispieldaten:

data aenderungsbeleg;
   key=
1; Strasse='Ulmenweg '; Hausnummer=14; PLZ=12345; Ort='Dreilinden'; output;
   key=
2; Strasse='         '; Hausnummer=15; PLZ=.    ; Ort='          '; output;
   key=
3; Strasse='Pappelweg'; Hausnummer=16; PLZ=.    ; Ort='          '; output;
   key=
4; Strasse='         '; Hausnummer=. ; PLZ=.    ; Ort='          '; output;
run;
Wenn man weiß, wie die Variablen heißen, ist es einfach:
data aenderungsbeleg1;
   
set aenderungsbeleg;
   
length geaendert $256;
   
if Ort        ne ' ' then geaendert = 'Ort;'        !! geaendert;
   
if PLZ        ne .   then geaendert = 'PLZ;'        !! geaendert;
   
if Hausnummer ne .   then geaendert = 'Hausnummer;' !! geaendert;
   
if Strasse    ne ' ' then geaendert = 'Strasse;'    !! geaendert;
run;
Wenn man die Variablen nicht alle hinschreiben möchte oder beim Programmieren noch nicht weiß, wie sie heißen werden, kann man es mit ARRAYs und der VNAME-Funktion machen, die von einem Array-Element den Variablennamen herausfindet:
data aenderungsbeleg2;
   
set aenderungsbeleg;
   
array vars_num _numeric_;   
   
array vars_chr _character_;
   
length geaendert $256;
   
do over vars_num;
      
if vname(vars_num) ne 'key' AND vars_num ne .
         
then geaendert = trim(vname(vars_num)) !! ';' !! geaendert;
   
end;
   
do over vars_chr;
      
if vars_chr ne ' '
         
then geaendert = trim(vname(vars_chr)) !! ';' !! geaendert;
   
end;
run;