在SAS中使用切换语句

时间:2017-11-03 14:48:02

标签: if-statement sas toggle

我正在尝试创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码只应在prog1变量设置为Y时运行。但是,我的日志显示代码运行无论如何。有谁知道发生了什么?

代码:

## Category based sum ##
function cat_cart_sum($cat_id) {
    if ( ! is_page( 'winkelmand' ) ) {
        return;
    }
    $cat_count = 0; 
    // Iterating through each cart item
    foreach(WC()->cart->get_cart() as $cart_item)  
        if( has_term( $cat_id, 'product_cat', $cart_item['product_id'])) {
            $regularprice = $cart_item['data']->get_price();
            $price = $regularprice * $cart_item['quantity'];
            $cat_count += $price;
        }
    if ($cat_count >= 40 && $cat_count <= 100) {
        wc_add_notice('U krijgt bij het afhalen €10 gratis vuurwerk!', 'notice');
        } elseif ($cat_count > 100 && $cat_count <= 200) {
            wc_add_notice('U krijgt bij het afhalen €25 gratis vuurwerk!', 'notice');
        } elseif ($cat_count > 200 && $cat_count <= 300) {
            wc_add_notice('U krijgt bij het afhalen €50 gratis vuurwerk!', 'notice');
        } elseif ($cat_count > 300 && $cat_count <= 400) {
            wc_add_notice('U krijgt bij het afhalen €75 gratis vuurwerk!', 'notice');
        } elseif ($cat_count >= 400) {
            wc_add_notice('U krijgt bij het afhalen €100 gratis vuurwerk!', 'notice');
        }
    return $cat_count;
}

日志:

Log file showing that the macro runs even when the prog variable is set to N

3 个答案:

答案 0 :(得分:2)

它正在做你告诉它要做的事情。首先评估宏引用和宏代码。然后,宏引用生成的任何SAS代码都将由SAS处理。所以你编写了一个DATA步骤,它将有条件地跳过宏生成的SAS代码。但是宏本身总会运行。

如果您将主程序编码为宏而不是开放SAS代码,那么您可以添加像%IF这样的宏逻辑来有条件地生成宏调用。

或者对于这个简单的示例,您可以使用CALL EXECUTE()或其他代码生成方法来控制宏调用的生成。这样,如果条件为假,SAS将永远不会在输入流中看到宏调用。

data _null_;
  if "&prog1." = "Y" then do;
    call execute('%nrstr(%findit)(&file1.)');
    call execute('%nrstr(%findit)(&file2.)');
  end;
run;

答案 1 :(得分:0)

您的代码中有一些错误。 (将宏功能用于数据集,在宏变量的调用中滥用&amp;(ampercent)。

1)始终使用&amp; (ampercent)调用一个宏变量 2)添加像&amp; path这样的点。必要时,如果&amp; path宏变量后面还有另一个字符串或宏变量。 3)更喜欢使用%if,%then,ect。

进行宏观功能检查

你应该让你的程序更加面向宏:

%let prog1 = Y;
%let prog2 = Y;

%macro check();

%if "&prog1." = "Y" %then %do;
    %put execute 1;
    %findit(&file1);
    %findit(&file2);
%end;

%if "&prog2." = "Y" %then %do;
    %put execute 2;
    %findit(&file3);
%end;

%mend;

%check;

现在可以使用,

此致

答案 2 :(得分:0)

你的第二个if语句正在检查“prog2”。不是“&amp; prog2。”并在您的日志中宏变量“&amp; prog3。”是一个得到解决而不是&amp; prog1。和&amp; prog2。

尝试将此添加到您的代码中,该代码会将所有用户宏变量打印到日志中。

%put _user_;