Странное поведение оператора if в Progress 4gl

Я заметил очень странное поведение оператора IF в Progress 4gl.

Я определяю целое число в формате «999», что означает, что оно должно состоять из 3 цифр, а затем я присваиваю значение ниже 100 (например, 12), а затем, когда я показываю его, оно отображается как «012», как и должно.

Но когда я добавляю оператор IF внутри оператора DISPLAY, который на самом деле ничего делать не должен, переменная отображается как «12».

Это тестовый код для выяснения различий. LABEL не влияет на вывод переменной.

DEF VAR tmp AS INTEGER FORMAT "999".
ASSIGN tmp = 12.

DISPLAY 
    tmp LABEL "disp1".

DISPLAY
    IF TRUE THEN tmp ELSE tmp LABEL "disp2".

Такого же поведения можно добиться, изменив формат на «> 99».

У меня вопрос: почему оператор IF изменяет способ отображения переменной?

С уважением // MrBucket


person MrBucket    schedule 04.10.2012    source источник


Ответы (1)


Ваш второй пример похож на:

define variable tmp1 as integer no-undo format "999".
define variable tmp2 as integer no-undo format "99999".

display
  if true then tmp1 else tmp2
.

Компилятор видит, что функция ЕСЛИ возвращает целое число, и применяет форматирование по умолчанию для целого числа. Компилятор не пытается угадать вас и замечает, что (в вашем примере) оба результата - это одна и та же переменная.

(В этом случае IF - это функция, встроенная в DISPLAY, а не отдельный оператор.)

Чтобы получить желаемый результат:

display
  ( if true then tmp1 else tmp2 ) format "999"
.

Каждый раз, когда я встраиваю функцию ЕСЛИ, я заключаю ее в круглые скобки - это помогает прояснить, что она встроена, и ясно показывает, где применимы такие вещи, как фраза FORMAT.

person Tom Bascom    schedule 04.10.2012
comment
Спасибо за ответ Том. Я немного новичок в этом языке, и мне это показалось немного странным. Я не забуду переформатировать переменную, если снова столкнусь с этой проблемой. - person MrBucket; 04.10.2012