Frage zu Markoschleife und PROC SQL
Liebe Redscope-Community,
ich habe (mal wieder ;)) ein Problem mit der Umsetzung eines Algorithmus (s. Codeauszug), wobei ich auf eine Access-Datenbank zugreife:
In einer Tabelle sind zeilenweise Einträge einzelner Fonds für das aktuelle Geschäftsjahr gespeichert (wobei in dieser Tabelle anfangs je Fonds nur ein Eintrag existiert).
Ziel ist es nun, abhängig für jeden Fonds (äußere Schleife) von einem jeweils in der Variablen min_date gespeicherten Startdatum Jahr bis ein Jahr vor dem aktuellen Geschäftsjahreseintrag (gjahr) für jedes Jahr eine neue Zeile einzufügen (innere Schleife), wobei zeitinvariate Werte (bspw. isin) fest eingetragen werden, zeitvariate Variablen dagegen einen MV bekommen.
Das folgende Makro ist meine (blöderweise nicht funktionierende) Umsetzung des obigen Algorithmus.
Im Logfile erscheint übrigens keine Warn-/Fehlermeldung, nur der Wert "-1".
Was genau mache ich falsch bzw. was ist verbesserungswürdig? ;)
Danke schon mal für die Hilfe!
%let dsid=%sysfunc(open(%bquote(&table)));
%let nobs=%sysfunc(attrn(&dsid,NOBS));
%put &nobs;
/*äußere Schleife über alle Fonds*/
%do i=1 %to &nobs;
/*Schleife, die alle fehlenden Zeilen ab min_date bis (year(datepart(gjahr))-1)
erzeugt*/
proc sql;
/* Zuweisen der auszufüllenden (gleichbleibenden) Konstanten je Fonds
v_<Spalte>, v:= value*/
select
fonds into:v_fonds,
fondsname into:v_fondsname,
kurzname into:v_kurzname,
isin into:v_ISIN,
tranche into:v_tranche,
hatfeevar into:v_hatfeevar,
feevartext into:v_feevartext,
manager into:v_manager,
min_date into:v_min_date,
max_date into:v_max_date
from %bquote(&table);
%put v_fonds;
%put v_fondsname;
%put v_kurzname;
%put v_isin;
%put v_tranche;
%put v_hatfeevar;
%put v_feevartext;
%put v_manager;
%put v_min_date;
%put v_max_date;
Quit;
/* innere Schleife erzeugt für jeden Fonds für jedes Jahr beginnend ab dem in min_date
gespeicherten Jahr bis ein Jahr vor dem aktuellsten (=gjahr)Eintrag
eine neue Spalte mit den folgenden Einträgen.
Dabei wird der jeweilige Eintrag des Geschäftsjahrs wir folgt dynamisch berechnet:
Tag, Monat aus aktuellstem Wert der Variable gjahr
Jahreszahl über Counter der inneren Schleife */
%do j=year(datepart(min_date)) %to (year(datepart(gjahr))-1);
Proc sql;
insert into %bquote(&table)
values(v_fonds,
v_fondsname,
v_kurzname,
v_isin,
v_tranche,
dhms(mdy(month(datepart(gjahr)),day(datepart(gjahr)),
j),0,0,0)),
.,
.,
v_hatfeevar,
v_feevartext,
v_manager,
v_min_date,
v_maxdate,
.);
Quit;
%end;
/* Löschen des Inhalts der Makrovariablen, um für den nächsten Fonds
"Platz zu schaffen"*/
%let v_fonds=.;
%let v_fondsname=.;
%let v_kurzname=.;
%let v_isin=.;
%let v_tranche=.;
%let v_hatfeevar=.;
%let v_feevartext=.;
%let v_manager=.;
%let v_min_date=.;
%let v_maxdate=.;
%end;
%mend;
* Aufruf des Makros;
%m_gjahre(table=library.tabellenname);
