BookmarkSubscribeRSS Feed
Hagay
SAS Employee

אחת מהמשימות החוזרות על עצמן בעת עבודה עם נתונים היא בניית לולאת מאקרו שרצה על מספר חודשים בין תאריך תחילה מסוים ותאריך סיום מסוים. לדוגמא, בנינו מאקרו אשר שולף ומעבד נתונים של חודש אחד ועכשיו אנחנו רוצים להריץ אותו על כל השנה האחרונה.

 

ישנן, כמובן, דרכים רבות לבנות לולאה שכזו והקוד להלן הוא ההצעה שלי שנראית לי קריאה, יעילה ונוחה לשימוש חוזר. 

 

קודם הקוד ואח"כ ההסברים:

%let from_ym=201901; * The starting year and month;
%let to_ym=202103; * The ending year and month;

%macro loop_months;
	%let months=%sysfunc(intck(month, %sysfunc(inputn(&from_ym, yymmn6.)), 
		%sysfunc(inputn(&to_ym, yymmn6.)))); * (1);
	%put &=months;

	%do i=0 %to &months;
		%let curr_ym=%sysfunc(intnx(month, %sysfunc(inputn(&from_ym, yymmn6.)), &i), yymmn6.); * (2);
		%put &=curr_ym;

		/*Insert here the macro call or other code we need to loop around on with the CURR_YM parameter*/
	%end;
%mend;
%loop_months;

(1) בשלב הראשון אנחנו צריכים לחשב את מספר החודשים בין השנה והחודש של ההתחלה והשנה והחודש של נקודת הסיום. מכיוון שאנחנו כותבים מאקרו של SAS אנחנו צריכים להשתמש בפונקציית ה - %sysfunc כדי לקרוא לפונקציות ה – SAS ה – "רגילות" בהן אנחנו עושים שימוש. כדי לפשט את חישוב מספר החודשים (במעבר בין שנים למשל) אנחנו הופכים את פרמטר תחילת התקופה ופרמטר סיום התקופה לתאריך "אמיתי" של SAS בעזרת פונקציית ה – inputn ואז משתמשים בפונקציית ה – intck לחישוב מספר התקופות.

 

(2) בכל לולאה אנחנו מחשבים את החודש הנוכחי שהוא חודש ההתחלה פלוס הערך שבמשתנה הלולאה שלנו. פונקציית ה – intnx מוסיפה את מספר החודשים הנדרש לתאריך ההתחלה ואנחנו מעצבים בחזרה את התוצאה למחרוזת של שנה וחודש בעזרת הפורמט yymmn6.

 

מוצאי שבת הבאה הם ערב חג הפסח אז חג שמח ונפגש בשבוע העוקב. 

חגי

2 REPLIES 2
EyalGonen
Lapis Lazuli | Level 10

והנה זה בגרסת ה LUA 

proc lua restart;
submit;
	local from_ym = '201901'
	local to_ym = '202103'
	months = sas.intck('month', sas.inputn(from_ym, 'yymmn6.'), sas.inputn(to_ym, 'yymmn6.'))
	for i = 0, months do
		curr_ym = sas.put(sas.intnx('month', sas.inputn(from_ym, 'yymmn6.'), i), 'yymmn6.')
		print (curr_ym)
		-- Insert here the macro call or other code we need to loop around on with the CURR_YM parameter
		-- For example
		-- sas.submit([[ title "@curr_ym@"; proc print data=sashelp.class;run; ]])
	end
endsubmit;
run;

 

כפי שניתן לראות אפשר להשתמש בפונקציות SAS בתוך קוד LUA (שהופעל מתוך SAS...)

 

EyalGonen
Lapis Lazuli | Level 10

ואם כבר מדברים על תאריכים אני מבקש להזכיר בלוג קודם שלי שבו אפשר לראות איך אפשר בעזרת אותן הפונקציות ממש להזיז תאריכים לפי לוחות שנה שונים כגון לוח השנה העברי!

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 2 replies
  • 563 views
  • 1 like
  • 2 in conversation