是否可以在Progress 4gl的Entry Funciton中使用MaximumFuntion

时间:2015-05-05 11:42:03

标签: progress-4gl openedge 4gl

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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.

答案 1 :(得分:0)

正如Austin所悲伤的那样,正在进行的内置函数无法从列表中提供最大或最小数字。

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

要解决您的问题,您可以使用Austin提供的解决方案,或者您可以使用两个函数接收带有半冒号分隔值的CHAR变量并返回最大值或最小值。

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

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()列表来调用MAXIMUMMINIMUM并从进度CHARINTEGER函数中获取MAX或MIN值由半冒号分隔的值,无需制作完整的代码块来进行比较,并获得必要的每种情况的信息。

希望它有所帮助。