1

我有一个带有数组的 fcmp 函数,但 IN 运算符似乎不起作用。我究竟做错了什么?

proc fcmp outlib=mylib.UserFuncLib.dateFuncs;
function previousWorkingDayDate(dateWeekday);
    * Not a weekend and not a bank holiday;
    dayBefore = intnx('Day',dateWeekday,-1);

    * Array of bank holidays, needs to be kept updated;
    array bankHolidays[9] / nosymbols 
        ('03Jan2022'd '15Apr2022'd '18Apr2022'd '02May2022'd 
            '02Jun2022'd '03Jun2022'd '29Aug2022'd '26Dec2022'd 
            '27Dec2022'd );

    do while ((dayBefore in bankHolidays) or weekday(dayBefore) < 2 or weekday(dayBefore) > 6);
        dayBefore = intnx('Day',dateWeekday,-1);
    end;
    return(dayBefore);
endsub;

bankHolidays 中的代码dayBefore给出ERROR 79-322: Expecting a (.

帮助!谢谢。

4

1 回答 1

1

我认为这只是 FCMP 不支持的 SAS 语法的一种情况。事实上,我认为 SAS 知道这一点......当我稍微改变它以包含括号时,错误消息告诉我们:

  80             do while ((dayBefore in (bankHolidays) or weekday(dayBefore) < 2 or weekday(dayBefore) > 6));
 ERROR: The array 'bankHolidays' cannot be an argument of the 'IN' operation.

FCMP Documentation,我认为这是更明确的说明:

PROC FCMP 中使用的 ARRAY 语句不支持 DATA 步中的 ARRAY 语句的所有功能。以下是仅适用于 PROC FCMP 的差异列表:

  • 所有数组引用都必须有明确的下标表达式。

您可以通过几种不同的方式解决此问题;最简单的就是迭代它(或者甚至为你编写另一个 FCMP 函数),或者使用宏变量。

如果您真的打算这样做,您可以直接询问 SAS(support@sas.com),看看他们是否可以就是否有直接的方法给您一个明确的答案。

于 2022-02-23T15:51:45.073 回答