2017-01-04 6 views
0

Ich versuche, Code auszuführen, der hoffentlich mehrere Monate oder Jahre Daten zusammenfügen wird. Ich versuche herauszufinden, wann ein Feld mit einem Wert gefüllt wurde. I.e. In meinem Datensatz befindet sich das Feld XYZ, das im November 2016 mit dem Wert A gefüllt wird. Wenn ich meinen Code von Januar bis Dezember verwende, möchte ich ein neues Feld mit dem Datum füllen, an dem SAS in diesem Feld einen nicht leeren Wert findet.SAS Fehler beim Durchlaufen mehrerer Datensätze

Hier ist mein Code:

options mprint symbolgen source mlogic merror syntaxcheck ; 

%macro append_monthly(iStart_date=, iEnd_date=); 

    %local tmp_date i; 
    %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ; 

    %do %while (&tmp_date le &iEnd_date); 

    %let i = %sysfunc(sum(&tmp_date),yymmn4.); 
    %put &i.; 

    %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ; 

    libname note "my.qualifiers.fords.note&i." disp=shr; 

data new ; 
set note.file ; 

%if ln_note_crbur_date_delinq ne '' %then spc_cmt_date = &i.; 

run; 

    %end; 


%mend; 
%append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)), iEnd_date=%sysfunc(mdy(10,1,2016))); 

LIBNAME _ALL_ CLEAR; 

Hier ist ein Beispiel von Protokoll mit Fehlern:

SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
SYMBOLGEN: Macro variable IEND_DATE resolves to 20728 
MLOGIC(APPEND_MONTHLY): %DO %WHILE(&tmp_date le &iEnd_date) condition is TRUE; loop will iterate again. 
MLOGIC(APPEND_MONTHLY): %LET (variable name is I) 
SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
MLOGIC(APPEND_MONTHLY): %PUT &i. 
SYMBOLGEN: Macro variable I resolves to 1606 
1606 
MLOGIC(APPEND_MONTHLY): %LET (variable name is TMP_DATE) 
SYMBOLGEN: Macro variable TMP_DATE resolves to 20606 
MPRINT(APPEND_MONTHLY): spc_cmt_date = 1605 run; 
SYMBOLGEN: Macro variable I resolves to 1606 
MPRINT(APPEND_MONTHLY): libname note "my.qualifiers.fords.note1606" disp=shr; 
ERROR: Unable to clear or re-assign the library NOTE because it is still in use. 
ERROR: Error in the LIBNAME statement. 
NOTE: The SAS System stopped processing this step because of errors. 
WARNING: The data set WORK.NEW may be incomplete. When this step was stopped there were 0 observations and 622 variables. 
WARNING: Data set WORK.NEW was not replaced because this step was stopped. 
NOTE: The DATA statement used 0.01 CPU seconds and 49483K. 

NOTE: The address space has used a maximum of 4292K below the line and 240388K above the line. 

ich kann nicht herausfinden, warum dies nicht funktioniert. Vielleicht könnte das mit Proc append funktionieren.

Grundsätzlich möchte ich nur meine Ausgabe mit einem Feld, das ein Datum in Form von YYMM zurückgibt, wenn das Feld ln_note_crbur_date_delinq nicht leer war.

Jede Hilfe sehr geschätzt

Antwort

1

würde ich den Grund für Ihre Fehler erraten würde, ist, dass der Griff nicht auf der Quelldatei vor der nächsten libname Anweisung versucht gelöscht wird erneut assign.

Eine einfache Lösung wäre, einen anderen Alias ​​zu verwenden (libref) jedes Mal, wie folgt:

libname note&i "my.qualifiers.fords.note&i." disp=shr; 

dann Ihre Daten Schritt einstellen wie folgt:

data new ; 
    set note&i..file ; 

Der nächste Teil erscheint Verwirrung zwischen Makro-Logik und Datenschritt sein. Entfernen Sie einfach die % Symbole wie folgt:

if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.; 

schließlich eine proc append vor dem %end hinzufügen wie folgt:

proc append base=work.final data=new; run; 

Wenn work.final nicht vorhanden ist, wird es im gleichen Format wie new erstellt werden.

EDIT:

in den Kommentaren folgende Diskussion, hier ist ein überarbeitetes Konzept:

%macro append_monthly(iStart_date=, iEnd_date=); 
    %local tmp_date i set_statement; 
    %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ; 
    %do %while (&tmp_date le &iEnd_date); 
    %let i = %sysfunc(sum(&tmp_date),yymmn4.); 
    %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ; 
    %let set_statement=&set_statement &i..file; 
    libname note&i "my.qualifiers.fords.note&i." disp=shr; 
    %end; 
    data new ; 
    set &set_statement; 
    if ln_note_crbur_date_delinq ne '' then spc_cmt_date = &i.; 
    run; 
%mend; 
%append_monthly(iStart_date=%sysfunc(mdy(5,1,2016)), iEnd_date=%sysfunc(mdy(10,1,2016))); 

LIBNAME _ALL_ CLEAR; 
+0

ich Makros neu bin. Ich nahm immer an, dass Sie innerhalb eines Makros Makrofunktionen verwenden, auch wenn es sich um einen Datastep handelt. Also% Zeichen vorne hinzufügen. Danke für diese Klarstellung :) – DukeLuke

+0

Frage: Würde die set-Anweisung die neue note.file nicht zu work.new verketten? Ich dachte, verschiedene Datensätze in der Set-Anweisung erreicht dies die Notwendigkeit für proc append zu entfernen? vielleicht überschreibt es es. Ich bin nur neugierig, wie das funktioniert – DukeLuke

+1

Nö .. Die Makro-Sprache ist ein Textgenerator, den Sie verwenden, um (nicht Makro) SAS-Code zu schreiben. Aus diesem Grund laufen Makroanweisungen immer VOR den zugrunde liegenden Datenschritten usw. –

Verwandte Themen