是否可以在进行中的输入函数中使用 MaximumFuntion 4gl

is it possible to use MaximumFuntion within an Entry Funciton in Progress 4gl

我是新手,我正在努力弄清楚如何让它发挥作用。我的任务是从用户那里获取一个以分号分隔的整数值列表,并向该列表中的最高值和最低值发送消息。到现在为止,我已经使用了一个入口函数来帮助我得到用户一个接一个地输入的整数。像这样

repeat I = 1 to  totalEntries:
    m = entry (I, Userinput, ";").
    display m. 
end.

在此之后我想找出所有条目的最大值。我该怎么做,因为最大函数接受多个值进行比较。

没有内置函数可以从给定的数字列表中给出最大或最小数字。您需要像大多数编程语言一样编写自己的逻辑。这是一个例子:

DEF VAR i     AS INT.
DEF VAR nlist AS CHAR INIT "1;2;7;3;6;9".

DEF VAR imin  AS INT.
DEF VAR imax  AS INT.

imin = INTEGER(ENTRY (1, nlist, ";")).
imax = INTEGER(ENTRY (1, nlist, ";")).

REPEAT i = 2 TO  NUM-ENTRIES(nlist, ";"):

    IF INTEGER(ENTRY(i, nlist, ";")) > imax THEN
        imax = INTEGER(ENTRY(i, nlist, ";")).

    IF INTEGER(ENTRY(i, nlist, ";")) < imin THEN
        imin = INTEGER(ENTRY(i, nlist, ";")).

END.

MESSAGE imax.
MESSAGE imin.

Austin 很遗憾,Progress 中没有内置函数来给出列表中的最大或最小数字。

在您的评论中,您提到了 MAXIMUM(1,2,3) 有效。是的,它有效,但您必须确定您将三个参数传递给函数,而不是单个 CHAR 变量中的数字列表。

要解决您的问题,您可以使用 Austin 给出的解决方案,或者您可以使用两个函数接收 CHAR 变量,其中值以分号分隔,并且 return 最大值或最小值。

这是一个基于您的代码的示例。

FUNCTION iMax RETURNS INTEGER
    ( INPUT pData AS CHAR ):

    DEF VAR iOutput     AS INT  NO-UNDO.
    DEF VAR iCount      AS INT  NO-UNDO.

    iOutput = ?.

    DO iCount = 1 TO NUM-ENTRIES(pData,';'):
        IF iOutput = ? THEN DO:
            iOutput = INT(ENTRY(iCount,pData,';')).
            NEXT.
        END.
        iOutput = MAX(iOutput,INT(ENTRY(iCount,pData,';'))).
    END.

    RETURN iOutput.

END FUNCTION.

FUNCTION iMin RETURNS INTEGER
    ( INPUT pData AS CHAR ):

    DEF VAR iOutput     AS INT  NO-UNDO.
    DEF VAR iCount      AS INT  NO-UNDO.

    iOutput = ?.

    DO iCount = 1 TO NUM-ENTRIES(pData,';'):
        IF iOutput = ? THEN DO:
            iOutput = INT(ENTRY(iCount,pData,';')).
            NEXT.
        END.
        iOutput = MIN(iOutput,INT(ENTRY(iCount,pData,';'))).
    END.

    RETURN iOutput.

END FUNCTION.

/****************/

Define variable NumberEntry as character view-as fill-in no-undo. 
Define variable UsersInput as character no-undo. 
Define variable i as integer no-undo. 
Define variable totalEntries as integer no-undo. 
Define variable m as character no-undo. 
Define variable n as character no-undo. 
Define button bFind. 
Define frame main numberEntry label "Enter numbers separated by semi colon" skip 
    bFind label "Find Max and Min" with side-labels. /*Trigger for button*/ 
On choose of bFind in frame main do: /*Retrieve the users input*/ 
    Usersinput = (numberEntry:screen-value). /*to find out how many characters the user has enterd.*/ totalEntries = num-entries(UsersInput,';'). Display totalentries. /*Logic to extract Users input values one by one.*/ 
    Repeat i = 1 to totalEntries: M = entry(i, UsersInput, ";"). 
        Display m. 
    End. /*Logic to find the maximum element. */ ..... 
    MESSAGE 'MAXIMUM :' iMax(UsersInput) SKIP 
            'MINIMUM :' iMin(UsersInput)
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
END.

VIEW FRAME main.
ENABLE ALL WITH FRAME main.
WAIT-FOR CHOOSE OF bfind.

您可以调用 iMax()iMin() 并使用 CHAR 列表从 Progress MAXIMUMMINIMUM 函数中获取最大值或最小值18=] 值由分号分隔,无需制作完整的代码块即可进行比较并获取出现的每种情况所需的信息。

希望对您有所帮助。