我正在尝试创建一个程序,根据用户输入打开或关闭代码的某些部分。下面的代码只应在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;
}
日志:
答案 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_;