代码以在填充字段中增加x分钟的时间

时间:2018-12-18 21:57:14

标签: openedge progress-4gl

我是编程和开发的初学者,在StackOverflow上发表第一篇文章,希望我在正确的位置发帖!

我有一个填充字段,我在其中输入时间(hh:mm)字符格式。我还有两个箭头,一个指向前方,另一个指向后方,我希望它们在按下时分别加减20分钟。

什么是为此编写代码的好方法?将当前时间值设置为午夜后的整数和秒,然后加/减1200秒?如何将结果恢复为hh:mm格式以显示在填充中?

任何帮助深表感谢! /艾伦

3 个答案:

答案 0 :(得分:1)

我认为这将满足您的需求。让箭头按钮上的ON CHOOSE触发器运行changeMins过程。从您的填写中输入字符时间字符串,然后输入“添加”或“减”。输出值将是新的调整后的时间字符串。然后,您可以将填写内容的屏幕值设置为该输出值。

DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.

cTime = "12:45".
RUN changeMins (INPUT-OUTPUT cTime, INPUT "Add").
MESSAGE cTime VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.


PROCEDURE changeMins:

    DEFINE INPUT-OUTPUT PARAMETER pcTime AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.

    DEFINE VARIABLE iHr AS INTEGER NO-UNDO.
    DEFINE VARIABLE iMn AS INTEGER NO-UNDO.

    /* Split the time string into hours and minutes */
    ASSIGN
        iHr = INTEGER(ENTRY(1, pcTime, ":"))
        iMn = INTEGER(ENTRY(2, pcTime, ":"))
        NO-ERROR.

    IF ERROR-STATUS:ERROR THEN RETURN.

    /* Adjust the time */
    CASE pcAction:
        WHEN "Add" THEN iMn = iMn + 20.
        WHEN "Subtract" THEN iMn = iMn - 20.
    END CASE.

    /* Correct for boundaries */
    IF iMn > 59 THEN
        ASSIGN
            iMn = iMn - 60
            iHr = iHr + 1.

    IF iMn < 0 THEN
        ASSIGN
            iMn = iMn + 60
            iHr = iHr - 1.

    IF iHr > 23 THEN iHr = iHr - 24.
    IF iHr < 0 THEN iHr = iHr + 24.

    /* Build the new time string */
    pcTime = STRING(iHr, "99") + ":" + STRING(iMn, "99").

END PROCEDURE.

在此示例中,将cTime字符串更改为不同的时间并运行它。

答案 1 :(得分:0)

Progress TIME函数返回午夜之后的整数秒数。因此,您转换为这样的整数的想法与4gl中的其他用法是一致的。

我个人将UI和内部存储保持独立。所以我可能会有一个小时的变量,另一个是分钟的变量,第三个是秒的变量(如果需要的话)。而且我会全部使用3而不是字符。

我不知道什么版本的Progress或运行的环境是什么,但是这个快速而肮脏的小片段可能会有一些有用的花絮:

define variable hh as integer no-undo format ">9".
define variable mm as integer no-undo format "99".
define variable ss as integer no-undo format "99".

define variable myTime as integer no-undo.

form
  hh mm ss
 with
  frame a
.

on value-changed of hh in frame a do:
  if integer( self:screen-value ) > 23 then
    do:
      hh = 23.
      display hh with frame a.
    end.
end.

on value-changed of mm in frame a do:
  if integer( self:screen-value ) > 59 then
    do:
      mm = 59.
      display mm with frame a.
    end.
end.

on value-changed of ss in frame a do:
  if integer( self:screen-value ) > 59 then
    do:
      ss = 59.
      display ss with frame a.
    end.
end.

update hh mm ss with frame a.

myTime = (( hh * 3600 ) + ( mm * 60 ) + ss ).

display string( myTime, "hh:mm:ss am" ).

答案 2 :(得分:0)

源自TheDrooper的代码,我可能会编写类似于以下代码的内容,以充分利用内置函数。 短代码至少仍然易于理解通常是可取的。 还要考虑到Progress没有优化的编译器。如果您可以用较少的语句替换一些简单的语句(即使这些语句比所需的更为复杂和强大),则代码不仅更易于维护,而且速度更快。

DEFINE VARIABLE cTime AS CHARACTER NO-UNDO.

cTime = "12:45".
RUN changeMins (INPUT-OUTPUT cTime, INPUT "Add").
MESSAGE cTime VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.


PROCEDURE changeMins:

DEFINE INPUT-OUTPUT PARAMETER pcTime AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pcAction AS CHARACTER NO-UNDO.

DEFINE VARIABLE iMn AS INTEGER NO-UNDO.

iMn = INTEGER(ENTRY(1, pcTime, ":")) * 60
    + INTEGER(ENTRY(2, pcTime, ":"))
    NO-ERROR. /* Calculate minutes since midnight */

IF ERROR-STATUS:ERROR THEN RETURN.

/* Adjust the time */
CASE pcAction:
    WHEN "Add" THEN iMn = iMn + 20.
    WHEN "Subtract" THEN iMn = iMn - 20.
END CASE.

/* Build the new time string */
pcTime = string(iMn * 60, 'HH:MM'). /* Convert minutes to seconds and convert the result to a string */

END PROCEDURE.

如果需要允许更大的小时值(例如,如果该字段不代表一天中的某个时间,而是一个时间间隔),则不能只使用字符串函数转换所得的整数。在这种情况下,您可以写

pcTime = string(iMn / 60, '99') + ':' + string(iMn mod 60, '99').

(TheDrooper和Tom Bascom似乎都是一天中的时间。)