Как перейти к следующей записи в находке в пределах каждого progress4gl?

Я работал над кодом, который запускает for each внутри другого for each и find внутри него, и мне нужно пропустить запись, найденную оператором find, если она не соответствует второму значению for each, но я случайно пропускаю таблица по первому for each.

for each <table>.
   for each <table1>.
      find <table2> where <table2>.<code> = <table1>.<code> no-lock no-error.
      if not avail <table2> 
      then next.
   end.
end.

Вместо того, чтобы пропускать <table1>, когда он не найден, он пропускает <table>. Есть ли способ исправить это?

Версия:

OpenEdge версии 10.2B

Предупреждение: я новичок в прогрессе


person Kyle    schedule 15.02.2016    source источник
comment
Вы это делаете. Пропуск относится к циклам и итерациям, а не к находкам.   -  person Jensd    schedule 15.02.2016
comment
Вероятно, нет другой таблицы1, поэтому он переходит к оставшейся части цикла для каждой таблицы, который пуст, поэтому он переходит к следующей записи ‹table›. Вы можете доказать это, поместив сообщение после конца для каждой таблицы 1. Итак, мы ясно, NEXT всегда пропускает текущую итерацию ближайшего цикла (если вы не укажете иное, используя именованные блоки).   -  person bupereira    schedule 15.02.2016


Ответы (2)


Мне тоже не очень понятно, о чем вы просите ...

Но при работе с вложенными циклами всегда проще использовать метки блоков, чтобы контролировать, в какой из циклов вы переходите следующим. externalloop и innerloop - это просто произвольно выбранные имена для циклов.

outerloop:
for each <table>:
   innerloop: 
   for each <table1>:
      find <table2> where <table2>.<code> = <table1>.<code> no-lock no-error.
      if not avail <table2> 
      then next innerloop .
   end.
end.
person Mike Fechner    schedule 16.02.2016
comment
О, я никогда раньше такого не видел, спасибо, чувак, за простое и изящное решение и объяснение +1 - person Kyle; 16.02.2016
comment
Не уверен, насколько упрощен был ваш пример кода. Но вы также можете объединить две команды FOR EACH в один цикл: for each <table>, for each <table1> where table1.... = table....: find <table2> where <table2>.<code> = <table1>.<code> no-lock no-error. if not avail <table2> then next . end. end. - person Mike Fechner; 16.02.2016
comment
Это полезно, я все еще изучаю progress4gl, поэтому я почти не разбираюсь в простых вещах, еще раз спасибо за помощь - person Kyle; 16.02.2016

Очень непонятно, что вы пытаетесь сделать. Но, возможно, вот оно:

for each table1 no-lock:

  find table2 no-lock where table2.code = table1.code no-error.

  if available table2 then
    do:
      /* do something that involves table2 */
    end.
   else
    do:
      /* do stuff that does not involve table2 -- in other words "skip it" */
    end.

end.
person Tom Bascom    schedule 15.02.2016
comment
Мне очень жаль, Том, я опередил себя, задавая вопрос, я его отредактировал - person Kyle; 15.02.2016