【问题标题】:is it possible to use MaximumFuntion within an Entry Funciton in Progress 4gl是否可以在进行中的输入函数中使用 MaximumFuntion 4gl
【发布时间】:2015-05-05 11:42:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: progress-4gl openedge 4gl


    【解决方案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.
    

    【讨论】:

    • 将变量numberEntry定义为字符视图-作为填写不可撤销。
    • 嗨 Austin,感谢您的回复,但是我已经仔细检查过,并且有一个名为 Maximum 的函数,请在下面找到代码。这是我到目前为止的整个过程。将变量 N​​umberEntry 定义为字符视图-作为填充不撤消。将变量 UsersInput 定义为字符不可撤消。将变量 i 定义为整数不可撤销。将变量 totalEntries 定义为整数 no-undo。将变量 m 定义为字符不可撤销。将变量 n 定义为字符不可撤销。定义按钮 bFind。
    • 定义框架主编号条目标签“输入以分号分隔的数字”跳过bFind标签“查找最大值和最小值”与侧标签。 /*按钮触发器*/ 在主框架中选择 bFind 时:/*检索用户输入*/ Usersinput = (numberEntry :screen-value)。 /*找出用户输入了多少个字符。*/ totalEntries = num-entries(UsersInput, ‘;’).显示总条目。 /*逐个提取用户输入值的逻辑。*/ 重复 i = 1 到 totalEntries:M = entry(i, UsersInput, “;”)。显示 m。结尾。 /*逻辑找到最大元素。 */ ..... 结束。
    • 最大功能不适用于条目列表。它的工作原理是这样的:MAXIMUM(1,2,3) 将返回 3。所以 NOT MAXIMUM ("1,2,3")
    【解决方案2】:

    奥斯汀很遗憾,Progress 中没有内置函数可以从列表中给出最大或最小数字。

    在您的评论中,您提到 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() 并使用由分号分隔的CHAR 列表INTEGER 值从Progress MAXIMUM 和MINIMUM 函数获取MAX 或MIN 值,而无需完整代码块进行比较并获取每个必要情况的信息。

    希望对你有帮助。

    【讨论】:

    • 嗯,现在我知道我哪里出错了,代码工作正常。谢谢你们:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2014-12-16
    • 2014-01-03
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多