有没有办法根据if条件将宏变量分配给SAS数据集的输出?

Is there a way to assign macro variable to output of SAS data set based on if condition?

我想知道是否有一种方法可以根据 if 语句从 SAS table 中提取输出,然后将该输出分配给宏变量?

我已经尝试过下面的代码,但它不起作用

      /*Working*/
      libname param '<directory>'; /*contain parameter table*/

      data _null_;
          set PARAM.RPTAUTO_PARAMETERTBL_MP;
          call symput('task_id', task_id);
        call symput('functionality', functionality);
        call symput('parameter', parameter);
        call symput('value', value);
        put task_id= functionality= parameter= value= ;
      run;

      /*Not Working*/

      data _null_;
      set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and           FUNCTIONALITY='&functionality.' )); 

      if parameter='mnthly'         then call symput('mnthly',mnthly);
 else if parameter='emailsubject'   then call symput('emailsubject',emailsubject);
 else if parameter='emailrecipient' then call symput('emailrecipient',emailrecipient);
 else if parameter='emailcc'        then call symput('emailcc',emailcc);
 else if parameter='content_type'   then call symput('contenttype',contenttype);
 else if parameter='attach'         then call symput('attach',attach);
 else if parameter='finyrs'         then call symput('finyrs',finyrs);
 else if parameter='ext_dt'         then call symput('ext_dt',ext_dt);

 title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
       substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
       call symput('title',trim(title)) ;

       /*view results in Log file. It shouldn't be blank*/
       put mnthly= emailsubject= emailrecipient= emailcc= content_type=      attach= finyrs= ext_dt= title= ; 
 run;     

我的 SAS table RPTAUTO_PARAMETERTBL_MP 在照片中。

RPTAUTO_PARAMETERTBL_MP

我基本上想在参数 = 'mthly' 时为宏变量 'mthly' 分配 'parameter' 列的值;当参数 = 'emailsubject' 等

时,宏变量 'emailsubject' 的值为 'parameter' 列

您的意思是将 "VALUE" 列中的值作为宏名称分配给 "PARAMETER" 中的值吗?

如果是这样,这应该可以满足您的需求

data _null_;
set PARAM.RPTAUTO_PARAMETERTBL_MP;
call symput(parameter, value);
run;

问题在于引用宏变量。如果你想比较字符变量的值和宏参数,你应该使用"&macro_var",而不是'&macro_var'

因此,修复数据步骤中的 where 语句:

set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID="&task_id." and FUNCTIONALITY="&functionality." ));

显示的代码似乎不稳定。 set 语句

set PARAM.RPTAUTO_PARAMETERTBL (where=(TASK_ID='&task_id.' and … 

return 是一行还是几行(每个参数一个)?

如果是多个,我希望结构和内容是

      task_id functionality parameter    parameter_value
      ------- ------------- ---------    ---------------
row 1 ttttt   fffff         mnthly       xxxx
row 2 ttttt   fffff         emailsubject yyyy
…                           … 
      ttttt   fffff         ext_dt       zzzz                   

而不是(如代码所示)

      task_id functionality parameter    mnthly  emailsubject … ext_dt
      ------- ------------- ---------    ------  ------------ … ------
row 1 ttttt   fffff         mnthly       xxxx
row 2 ttttt   fffff         emailsubject         yyyy
…                           … 
      ttttt   fffff         ext_dt                               zzzz

无论如何,

SYMGET用于在数据步长为运行时获取宏变量的当前值。无法使用 & 解析检索到的值以影响 运行 步骤的源代码。

因此,& 代码如下:

 … 
 else if parameter='finyrs'         then call symput('finyrs',finyrs);
 else if parameter='ext_dt'         then call symput('ext_dt',ext_dt);

 title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
       substr(put(&ext_dt+1),3,3)||… 

将重述为

 … 
 else if parameter='finyrs'         then call symput('finyrs',finyrs);
 else if parameter='ext_dt'         then call symput('ext_dt',ext_dt);

 title="TASK1045V2 Benefit Type summary for last " 
       || symget('finyrs') || years. NOTE: YEAR extends from "
       || substr(put(     symget('ext_dt')   +1),3,3) || … 

但是,您可能需要重新考虑该策略。

运行 步骤部分首先使用 SYMPUTs,以填充宏变量,然后在第二步中使用

data _null_;
  … symputs … 
run;

* populated macro variables can be resolved with & in title assignment source code;
data _null_;
  title="TASK1045V2 Benefit Type summary for last &finyrs years. NOTE: YEAR extends from "||
       substr(put(&ext_dt+1),3,3)||' to '||substr(put(&ext_dt),3,3);
       call symput('title',trim(title)) ;

       /*view results in Log file. It shouldn't be blank*/
       put mnthly= emailsubject= emailrecipient= emailcc= content_type=      attach= finyrs= ext_dt= title= ; 
 run;     

另一种选择是 retain 数据步 PDV 中的参数变量值,而不是将它们存储在宏符号 table 中。使用的方法取决于实际的参数table数据结构

如果实际结构是一行如

      task_id functionality parameter    mnthly  emailsubject … ext_dt
      ------- ------------- ---------    ------  ------------ … ------
row 1 ttttt   fffff         mnthly       xxxx    yyyy         … zzzz

那么你写的多个ifs就不需要了,也不需要宏变量的symput,赋值的时候直接使用PDV中已有的数据集变量即可。