如何在SAS报告Webout文件中打印已选中和未选中的复选框

时间:2017-12-15 07:32:31

标签: sas sas-macro

我有一个名为Proposal的表,其中有一个列名为value_cd。  此列包含一些复选框的值,这些复选框将在我的网络报告中进行检查。我想检查其相关值在此列中的所有复选框。

table:Proposal 
  value_cd

   New_par
   Rev_par

这是我的代码

data _null_;
 put numberOfObservationes=;
 set work.Proposal nobs=numberOfObservationes;
 file _webout;
    if value_cd eq "New_par" then put '<input type=checkbox disabled checked /> <label>New Parameter</label> <br /> <hr /> ';
          else put '<input type=checkbox disabled /> <label>New Parameter</label> <br /> <hr /> ';
    if value_cd eq "Rev_par" then put '<input type=checkbox disabled checked /> <label>Revised Parameter</label> <br /> <hr /> ';
          else put '<input type=checkbox disabled /> <label>Revised Parameter</label> <br /> <hr /> ';
    if value_cd eq "New_pro" then put '<input type=checkbox disabled checked /> <label>New Process</label> <br /> <hr /> ';
          else put '<input type=checkbox disabled /> <label>New Process</label> <br /> <hr /> ';
run;

我想在报表中只打印一次复选框,应该根据我的表的列value_cd的值来检查或取消选中它,但是如果值不相等则if条件运行else语句并且代码是打印复选框,直到value_cd计数。

如何根据value_cd打印一次复选框。

我想要这个

  checkbox checked New Parameter        *if-statement;
  checkbox checked Revised Parameter    *if-statement;
  checkbox New Process                  *else-statement;

上面的代码是打印输出

  checkbox checked New Parameter  *if-statement;
  checkbox Revised Parameter      *else-statement;
  checkbox New Process            *else-statement;
  checkbox New Parameter          *else-statement;
  checkbox checked Revised Parameter   *if-statement;
  checkbox New Process            *else-statement;

1 个答案:

答案 0 :(得分:2)

行方向发生了什么,6个复选框:

row-1: logic-1-output logic-2-output logic-3-output
row-2: logic-1-output logic-2-output logic-3-output

想要什么,3个复选框:

row-1: track-logic-1-for-true track-logic-2-for-true track-logic-3-for-true
row-2: track-logic-1-for-true track-logic-2-for-true track-logic-3-for-true
last-row: output-based-on-tracked-logics

这是一种方法

跟踪在所有行上发生的value_cd状态,然后执行输出。

data _null_;
 put numberOfObservationes=;
 set work.Proposal nobs=numberOfObservationes end=last_row;

 array boxes[3] _temporary_; * 1st slot is for New_par, 2nd for Rev_par, etc..;

 * track for true using OR;
 boxes[1] = boxes[1] or (value_cd eq "New_par");
 boxes[2] = boxes[2] or (value_cd eq "Rev_par");
 boxes[3] = boxes[3] or (value_cd eq "New_pro");

 if last_row then do;
    if boxes[1]
      then checked_attribute='checked'; 
      else checked_attribute='';

    put '<input type=checkbox disabled ' checked_attribute '/> <label>New Parameter</label> <br /> <hr /> ';

    if boxes[2]
      then checked_attribute='checked'; 
      else checked_attribute='';

    put '<input type=checkbox disabled ' checked_attribute '/> <label>Revised Parameter</label> <br /> <hr /> ';

    if boxes[3]
      then checked_attribute='checked'; 
      else checked_attribute='';

    put '<input type=checkbox disabled ' checked_attribute '/> <label>New Process</label> <br /> <hr /> ';
  end;
run;

注意:上面的代码实际上是将value_cd数据从列旋转到单行。

在DATA Step中,变量值通常会在隐式循环的顶部重置为缺失(在这种情况下,当您从第1行转到第2行时)。为了跟踪行到行的条件,不应该通过隐式循环重置变量。

有两种方法可以避免重置:

  • 使用RETAIN变量
  • 使用_temporary_数组
  • 绝不允许隐式循环多次出现:
    • 在明确编码的SETdo while循环中使用do until
  • 将您的所有州信息放在一行(即转动)