如果找不到匹配项,则返回默认值

时间:2019-08-22 18:05:46

标签: openedge progress-4gl

我有一个GetQuantity函数,该函数返回一个小数。在某些情况下,我不希望返回任何内容,即返回空字符串,以便显示“”。

实际行为:

  1. GetQuantity(1)-> 1.0
  2. GetQuantity(2)-> 2.0
  3. GetQuantity(3)-> 3.3

期望的行为:

  1. GetQuantity(1)-> 1.0
  2. GetQuantity(2)-> 2.0
  3. GetQuantity(3)->''

在情况3中,我显然可以返回-1.0之类的东西,但这不是我所需要的。

FUNCTION GetQuantity RETURNS DECIMAL(INPUT num  AS INTEGER):
    DEFINE VARIABLE quantity AS DECIMAL NO-UNDO FORMAT "->,>>>,>>9.9<<<<<<<<".

    quantity = 3.3. //initialization is neccessary as IRL my value is initialized

    IF num = 1 THEN DO:
        RETURN 1.0.
    END.

    ELSE IF num = 2 THEN DO:
        RETURN 2.0.
    END.

    RETURN quantity. //base case return ' '
END.

DISPLAY GetQuantity(3)

2 个答案:

答案 0 :(得分:5)

一种方法是返回?如果是默认值,请在输出例程中进行处理。

是吗?也是计算失败的结果(除以0),这可能很危险。

另一种选择是编写一个具有Value属性,Default标志和ToString()覆盖的类。

BLOCK-LEVEL ON ERROR UNDO, THROW.

USING Progress.Lang.*.

CLASS Test.SampleValueHolder: 

    DEFINE PUBLIC PROPERTY Value AS DECIMAL NO-UNDO
    GET.
    PRIVATE SET.

    DEFINE PUBLIC PROPERTY IsDefault AS LOGICAL NO-UNDO
    GET.
    PRIVATE SET.

    CONSTRUCTOR PUBLIC SampleValueHolder (pdeValue AS DECIMAL, 
                                          plDefault AS LOGICAL):

        ASSIGN THIS-OBJECT:Value     = pdeValue 
               THIS-OBJECT:IsDefault = plDefault .                                          

    END CONSTRUCTOR.

    METHOD PUBLIC OVERRIDE CHARACTER ToString ():

        IF THIS-OBJECT:IsDefault THEN 
            RETURN "" .
        ELSE 
            RETURN STRING (THIS-OBJECT:Value, "->,>>>,>>9.9<<<<<<<<") .

    END METHOD.

END CLASS.

现在,您可以将RETURN NEW SampleValueHolder(1.0,FALSE)或RETURN NEW SampleValueHolder(?,TRUE)转换为类型Test.SampleValueHolder的变量。

每当显示该值的STRING()时,您都将获得格式化值或默认值“”。

答案 1 :(得分:3)

上述Mike的另一种解决方案是更改getQuantity()以返回一个Character值,而不是当前的十进制值。尽管这当然会导致修复所有调用点的大量工作。我不知道它的使用范围。

此外,如果您所处的条件数量比您所显示的要多,那么CASE的维护要比许多IF语句容易得多。像这样:

FUNCTION GetQuantity RETURNS CHARACTER(INPUT num  AS INTEGER):
    DEFINE VARIABLE quantity AS CHARACTER NO-UNDO INITIAL "3.3".

    CASE num:
        WHEN 1 THEN quantity = "1.0".
        WHEN 2 THEN quantity = "2.0".
        OTHERWISE quantity = "". 
    END CASE.

    RETURN STRING(quantity). 
END.

DISPLAY GetQuantity(3).