-3

これには2番目の目が必要です。

%MACRO FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE(limOrDedOption,limOrDedValue);
    %LET numOptions = %Sysfunc(Countw(&limOrDedOption.));

    limOrDedSetFlag = 'N';
    %DO curLimOrDed = 1 %TO &numOptions.;
        IF limOrDedSetFlag = 'N' AND &curLimOrDed = 1 AND &limOrDedValue. <= %Scan(&limOrDedOption.,&curLimOrDed.) THEN DO;
            &limOrDedValue. = %Scan(&limOrDedOption,1);
            limOrDedSetFlag = 'Y';
        END;
        IF limOrDedSetFlag = 'N' AND &curLimOrDed. >= 2 THEN DO;
            lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);
            upperLimOrDed = %Scan(&limOrDedOption.,&curLimOrDed);
            IF &limOrDedValue. < %Scan(&limOrDedOption.,&curLimOrDed) THEN DO;
                IF (&limOrDedValue. - lowerLimOrDed)/ (upperLimOrDed - lowerLimOrDed) < 0.5 THEN 
                    &limOrDedValue. = lowerLimOrDed;
                ELSE &limOrDedValue. = upperLimOrDed;
                limOrDedSetFlag = 'Y';
            END;
        END;
    %END;

    IF MISSING(&limOrDedValue.) THEN &limOrDedValue. = 0;
/*  DROP lowerLimOrDed upperLimOrDed;*/
%MEND FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE;

次のエラーが表示されます。

MPRINT(FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE):   IF limOrDedSetFlag = 'N' AND 1 >= 2 THEN DO;
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: 
       prevLimOrDed 
ERROR: Argument 2 to macro function %SCAN is not a number.
NOTE 137-205: Line generated by the invoked macro "FIND_CLOSEST_LIMIT_OR_DEDUCTIBLE".
104         DO;    lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);    upperLimOrDed =
                                                                                         _
                                                                                         22
104      ! %Scan(&limOrDedOption.,&curLimOrDed);    IF &limOrDedValue. < %Scan(&limOrDedOption.,&curLimOrDed) THEN DO;     IF
104      ! (&limOrDedValue. - lowerLimOrDed)/ (
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant, a datetime constant, 
              a missing value, INPUT, PUT.  

SAS は &curLimOrDed - 1 を好まないようです。

ありがとうございました!

4

2 に答える 2

2

私はあなたが同封する必要があると思います&curLimOrDed - 1

%EVAL()期待どおりに評価するために、関数に変換します。%EVAL(&curLimOrDed - 1)

これを除いて、エラーメッセージは実際に問題を示しています:

The condition was: prevLimOrDed 

それはあなたの声明で:

lowerLimOrDed = %Scan(&limOrDedOption,prevLimOrDed, &curLimOrDed. - 1);

prevLimOrDedマクロ変数としては使用されませんが、マクロ関数内で使用されます。データステップ変数ですか?関数の場合%SCANは、テキスト「prevLimOrDed」のみを表しますが、関数は数値引数を想定しています。

于 2014-10-20T14:31:02.060 に答える