Прогресс, если оператор

Я новичок в прогрессе, у меня проблемы с базовыми блоками.

Ниже проблема находится в моем выражении if else. Он отлично работает, когда это просто если, то, иначе тогда, но когда я хочу поместить более одного оператора в часть если, я должен поместить его в блок, поэтому я использую если, затем сделайте: иначе, тогда сделайте: но это не работает для меня. Какие очевидные ошибки вы видите? Мое сообщение об ошибке: **Двоеточие, за которым следует пробел, завершает оператор. (199)

INPUT FROM "r:\_content\stephen\4gl apps\dpl\output.csv".
REPEAT:
  ASSIGN i_cntr = (i_cntr + 1).
  myRow = "".
  IMPORT DELIMITER ',' myRow.

  IF myRow[5] <> "" THEN DO:
      /*change this to assign 2 rows - 2 creates - 2 sets of four*/
      c_fname = myRow[1].

      MESSAGE 
      c_fname SKIP
      myRow[2] SKIP
      myRow[3] skip
      myRow[4] skip
      myRow[5] SKIP
      i_cntr
      VIEW-AS ALERT-BOX INFO BUTTONS OK.
   END./*end of if, then do:*/
   ELSE IF myRow[5] = "" THEN DO:
   MESSAGE 
   myRow[1] SKIP
   myRow[2] skip
   myRow[3] skip
   myRow[4] skip
   i_cntr
   VIEW-AS ALERT-BOX INFO BUTTONS OK.
END./*end of else if, then do:*/   
END./*end of repeat*/

person Stephen Kennedy    schedule 18.06.2014    source источник
comment
Задавая вопросы, мы учимся :) Хорошо сделать проверку синтаксиса, так как она уже должна подчеркнуть для вас, что есть проблема - Скажет что-то вроде Невозможно понять после - КОНЕЦ   -  person AquaAlex    schedule 18.06.2014
comment
также вам не нужен ( IF myRow[5] = THEN) между ELSE и DO: так как есть только 2 варианта ‹› и = :-)   -  person AquaAlex    schedule 18.06.2014


Ответы (3)


Очень простая синтаксическая ошибка: вам нужен хотя бы один пробел после оператора END.

END. /*end of if, then do:*/
/*  ^ Make sure there's space above here! */

И если вы не хотите следовать отличному совету в ответе Тима (используйте CASE). Это «полный» синтаксис оператора IF.

IF expression1 THEN DO:
  /* Code goes here */
END.
ELSE IF expression2 THEN DO:
  /* Code goes here */
END.
ELSE DO:
  /* Code goes here */
END.

выражения:

Константа, имя поля, имя переменной или выражение, значение которого является логическим (ИСТИНА или ЛОЖЬ). Выражение может включать сравнения, логические операторы и круглые скобки.

Вы также можете опустить DO: END. Когда исполняемый код IF состоит только из одного оператора:

IF TRUE THEN DISPLAY "TRUE".
ELSE DISPLAY "NOT TRUE".

Вы также можете использовать другие блочные операторы (такие как FOR или REPEAT), но это, скорее всего, только создаст код, который трудно прочитать.

person Jensd    schedule 18.06.2014
comment
Более 1, иначе используйте CASE, конец аргумента :-D - person AquaAlex; 18.06.2014

Вместо использования вложенных IF/ELSE вам лучше использовать оператор CASE, например:

CASE varname:
WHEN ""      THEN DO: /*something */ END.
WHEN "value" THEN DO: /*something */ END.
OTHERWISE         DO: /*something */ END.
END CASE.

Проверьте документы по этому заявлению для получения более подробной информации.

person Tim Kuehn    schedule 18.06.2014

Я понял проблему. Это не было вызвано ошибкой кодирования. Очевидно, что Progress не любит комментарии слишком близко к коду, из-за чего он выдает ошибку.

END. /*end of if, then do:*/ => This is ok.
END./*end of if, then do:*/ => This caused the issue comments too close to statement.

Спасибо Тиму Куэну за его ответ.

person Stephen Kennedy    schedule 18.06.2014