Выполнение инструкции if

#progress-4gl #openedge

#прогресс -4gl #openedge

Вопрос:

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

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

 INPUT FROM "r:_contentstephen4gl appsdploutput.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*/
  

Комментарии:

1. задавать вопросы — это то, как мы учимся 🙂 Хорошая вещь, которую нужно сделать, это выполнить проверку синтаксиса, это уже должно подчеркнуть для вас, что есть проблема — сказал бы что-то вроде Неспособности понять после — «END»

2. также вам не нужно (ЕСЛИ myRow[5] = «» ТОГДА) между ELSE и DO: поскольку существует только 2 варианта <> и = 🙂

Ответ №1:

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

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

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

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

выражения:

Константа, имя поля, имя переменной или выражение, значение которого является логическим (TRUE или FALSE). Выражение может включать сравнения, логические операторы и круглые скобки.

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

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

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

Комментарии:

1. Более 1 другого ВАРИАНТА использования, конец аргумента 😀

Ответ №2:

Вместо того, чтобы использовать вложенный IF / ELSE, вам было бы лучше использовать оператор CASE следующим образом:

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

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

Ответ №3:

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

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

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