BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
slacey
Obsidian | Level 7

I've become interested in the PROC DS2 package functionality and have been trying to learn as much as I can. 

 

I'm reading this paper right now for reference: https://support.sas.com/resources/papers/proceedings16/7280-2016.pdf 

 

In the paper, the author talks about how SAS automatically includes getter and setter methods in packages that can be called by adding the prefix "get_" or "set_". My question, is there any documentation on the methods that are automatically included in packages?

 

Additionally, in the paper (bottom of page 6, top of page 7) they create a teacher package which "inherits" from the person package. At one point they reference "get_pname" to get the name from the person package and I was wondering if "get_p" is a predefined prefix? or is there something I'm missing?

 

Thanks!

1 ACCEPTED SOLUTION

Accepted Solutions
yabwon
Onyx | Level 15

I may be wrong but it seems that in the doc. this is the only place where "get_" pops-up:

https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/ds2pg/n0uuczirxf453en14a69dnwl3kyp.htm

in 

next = cur.get_next();

but it does not mention anything about getters or setters. 

But the article is 100% accurate, this code (extended version of the paper one):

data class;
 set sashelp.class;
run;

Proc ds2;
 package counter / overwrite=yes;
 dcl int Bvalue;

 method counter();
  Bvalue=0;
 end;

 method add();
  Bvalue=Bvalue+1;
 end;

 endpackage;

 package gluerer / overwrite=yes;
 dcl varchar(1024) Gvalue;

 method counter();
  Gvalue='';
 end;

 method add();
  Gvalue=Strip(Gvalue)!!'+';
 end;

 endpackage;
run;


data _null_;
 dcl package counter boycounter();
 dcl package gluerer girlcounter();
 dcl int nummales;
 dcl varchar(1024) charfemales;

 method init();
  boycounter.set_Bvalue(100);
  girlcounter.set_Gvalue('***');
 end;


 method run();
  set class;
    put sex=;
    if sex='M' then boycounter.add();
               else girlcounter.add();
 end;

 method term();
   nummales=boycounter.get_Bvalue();
   charfemales=girlcounter.get_Gvalue();
   put nummales= charfemales=;
 end;
enddata;
run;
quit;

gives the following log:

1    data class;
2     set sashelp.class;
3    run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.CLASS has 19 observations and 5 variables.
NOTE: DATA statement used (Total process time):
      real time           0.03 seconds
      cpu time            0.00 seconds


4
5    Proc ds2;
NOTE: Writing HTML Body file: sashtml.htm
6     package counter / overwrite=yes;
7     dcl int Bvalue;
8
9     method counter();
10     Bvalue=0;
11    end;
12
13    method add();
14     Bvalue=Bvalue+1;
15    end;
16
17    endpackage;
18
19    package gluerer / overwrite=yes;
20    dcl varchar(1024) Gvalue;
21
22    method counter();
23     Gvalue='';
24    end;
25
26    method add();
27     Gvalue=Strip(Gvalue)!!'+';
28    end;
29
30    endpackage;
31   run;
NOTE: Created package counter in data set work.counter.
NOTE: Created package gluerer in data set work.gluerer.
NOTE: Execution succeeded. No rows affected.
32
33
34   data _null_;
35    dcl package counter boycounter();
36    dcl package gluerer girlcounter();
37    dcl int nummales;
38    dcl varchar(1024) charfemales;
39
40    method init();
41     boycounter.set_Bvalue(100);
42     girlcounter.set_Gvalue('***');
43    end;
44
45
46    method run();
47     set class;
48       put sex=;
49       if sex='M' then boycounter.add();
50                  else girlcounter.add();
51    end;
52
53    method term();
54      nummales=boycounter.get_Bvalue();
55      charfemales=girlcounter.get_Gvalue();
56      put nummales= charfemales=;
57    end;
58   enddata;
59   run;
Sex=M
Sex=F
Sex=F
Sex=F
Sex=M
Sex=M
Sex=F
Sex=F
Sex=M
Sex=M
Sex=F
Sex=F
Sex=F
Sex=F
Sex=M
Sex=M
Sex=M
Sex=M
Sex=M
nummales=110 charfemales=***+++++++++
NOTE: Execution succeeded. No rows affected.
60   quit;

NOTE: PROCEDURE DS2 used (Total process time):
      real time           0.16 seconds
      cpu time            0.14 seconds

Bart

 

_______________
Polish SAS Users Group: www.polsug.com and communities.sas.com/polsug

"SAS Packages: the way to share" at SGF2020 Proceedings (the latest version), GitHub Repository, and YouTube Video.
Hands-on-Workshop: "Share your code with SAS Packages"
"My First SAS Package: A How-To" at SGF2021 Proceedings

SAS Ballot Ideas: one: SPF in SAS, two, and three
SAS Documentation



View solution in original post

4 REPLIES 4
yabwon
Onyx | Level 15

I may be wrong but it seems that in the doc. this is the only place where "get_" pops-up:

https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/ds2pg/n0uuczirxf453en14a69dnwl3kyp.htm

in 

next = cur.get_next();

but it does not mention anything about getters or setters. 

But the article is 100% accurate, this code (extended version of the paper one):

data class;
 set sashelp.class;
run;

Proc ds2;
 package counter / overwrite=yes;
 dcl int Bvalue;

 method counter();
  Bvalue=0;
 end;

 method add();
  Bvalue=Bvalue+1;
 end;

 endpackage;

 package gluerer / overwrite=yes;
 dcl varchar(1024) Gvalue;

 method counter();
  Gvalue='';
 end;

 method add();
  Gvalue=Strip(Gvalue)!!'+';
 end;

 endpackage;
run;


data _null_;
 dcl package counter boycounter();
 dcl package gluerer girlcounter();
 dcl int nummales;
 dcl varchar(1024) charfemales;

 method init();
  boycounter.set_Bvalue(100);
  girlcounter.set_Gvalue('***');
 end;


 method run();
  set class;
    put sex=;
    if sex='M' then boycounter.add();
               else girlcounter.add();
 end;

 method term();
   nummales=boycounter.get_Bvalue();
   charfemales=girlcounter.get_Gvalue();
   put nummales= charfemales=;
 end;
enddata;
run;
quit;

gives the following log:

1    data class;
2     set sashelp.class;
3    run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.CLASS has 19 observations and 5 variables.
NOTE: DATA statement used (Total process time):
      real time           0.03 seconds
      cpu time            0.00 seconds


4
5    Proc ds2;
NOTE: Writing HTML Body file: sashtml.htm
6     package counter / overwrite=yes;
7     dcl int Bvalue;
8
9     method counter();
10     Bvalue=0;
11    end;
12
13    method add();
14     Bvalue=Bvalue+1;
15    end;
16
17    endpackage;
18
19    package gluerer / overwrite=yes;
20    dcl varchar(1024) Gvalue;
21
22    method counter();
23     Gvalue='';
24    end;
25
26    method add();
27     Gvalue=Strip(Gvalue)!!'+';
28    end;
29
30    endpackage;
31   run;
NOTE: Created package counter in data set work.counter.
NOTE: Created package gluerer in data set work.gluerer.
NOTE: Execution succeeded. No rows affected.
32
33
34   data _null_;
35    dcl package counter boycounter();
36    dcl package gluerer girlcounter();
37    dcl int nummales;
38    dcl varchar(1024) charfemales;
39
40    method init();
41     boycounter.set_Bvalue(100);
42     girlcounter.set_Gvalue('***');
43    end;
44
45
46    method run();
47     set class;
48       put sex=;
49       if sex='M' then boycounter.add();
50                  else girlcounter.add();
51    end;
52
53    method term();
54      nummales=boycounter.get_Bvalue();
55      charfemales=girlcounter.get_Gvalue();
56      put nummales= charfemales=;
57    end;
58   enddata;
59   run;
Sex=M
Sex=F
Sex=F
Sex=F
Sex=M
Sex=M
Sex=F
Sex=F
Sex=M
Sex=M
Sex=F
Sex=F
Sex=F
Sex=F
Sex=M
Sex=M
Sex=M
Sex=M
Sex=M
nummales=110 charfemales=***+++++++++
NOTE: Execution succeeded. No rows affected.
60   quit;

NOTE: PROCEDURE DS2 used (Total process time):
      real time           0.16 seconds
      cpu time            0.14 seconds

Bart

 

_______________
Polish SAS Users Group: www.polsug.com and communities.sas.com/polsug

"SAS Packages: the way to share" at SGF2020 Proceedings (the latest version), GitHub Repository, and YouTube Video.
Hands-on-Workshop: "Share your code with SAS Packages"
"My First SAS Package: A How-To" at SGF2021 Proceedings

SAS Ballot Ideas: one: SPF in SAS, two, and three
SAS Documentation



slacey
Obsidian | Level 7

Appreciate both the replies. Unfortunate that the feature isn't really documented since having automatic generation of getters and setters would seem to be useful functionality.

 

Concerning my other question about the "get_pname()" statement. I had been wondering if the "get_p" prefix was an auto generated parent getter but, I just ran through the code, it seems like it's just a typo and should have been "get_name()". 

 

Thank you again for the help.

yabwon
Onyx | Level 15

@SASJedi 

Mark, maybe you will be able to help here? 

 

Bart

_______________
Polish SAS Users Group: www.polsug.com and communities.sas.com/polsug

"SAS Packages: the way to share" at SGF2020 Proceedings (the latest version), GitHub Repository, and YouTube Video.
Hands-on-Workshop: "Share your code with SAS Packages"
"My First SAS Package: A How-To" at SGF2021 Proceedings

SAS Ballot Ideas: one: SPF in SAS, two, and three
SAS Documentation



SASJedi
SAS Super FREQ

@yabwon I've used this type of code before in DS2 programs but have never seen it documented. I'll attempt to find out why...

 

Check out my Jedi SAS Tricks for SAS Users

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 572 views
  • 8 likes
  • 3 in conversation