Извлечение из кода TheDrooper's Я, вероятно, написал бы что-то вроде следующего кода, чтобы полностью использовать встроенные функции.Более короткий код, который по крайней мере так же легко понять, часто предпочтительнее.Также учтите, что в 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, и Том Баском предполагают время суток.)