Управление макросом цикла ECL с использованием результатов запроса

Мы пытаемся написать макрос цикла с функцией прерывания. По сути, мы хотели бы повторить определенное действие до тех пор, пока X (полученный из набора данных) не станет истинным. Компилятору, похоже, не нравится этот подход (возвращает "Ожидается постоянное выражение"), поэтому нам было интересно, есть ли известный обходной путь?

Ниже приведен полностью искусственный пример, который называется:

LoopFunction(5);  

из окна BWR.

EXPORT LoopFunction(NMax = 5) := MACRO

  Rec := RECORD
    INTEGER i;
  END;

    #DECLARE(i);


  OUTPUT(DATASET([1], REC), ,'~TEMP::MB::LOOPTEST' + %i%, COMPRESSED, OVERWRITE);

    #SET(i, 2);

  shouldIbreak :=  DATASET('~TEMP::MB::LOOPTEST' + (%i% - 1), Rec, THOR);

  #LOOP

    OUTPUT(shouldIbreak +DATASET([%i%], REC), ,'~TEMP::MB::LOOPTEST' + %i%, COMPRESSED, OVERWRITE);

    #SET (i, %i%+1);    

        #IF (COUNT(shouldIbreak) > Nmax);
       #BREAK
        #END
    #END

ENDMACRO;

2 ответа

Решение

Так что это невозможно в HPCC V5, компилятору это просто не нравится. У меня еще не было возможности попробовать это в V6, но я подозреваю, что та же самая проблема присутствует (поскольку никто из людей HPCC не сказал мне, что обновление спасет меня).

Вы не можете иметь зависимости времени выполнения (например, набор данных, загруженный из логического файла) в коде языка шаблонов, так как директивы языка шаблонов обрабатываются компилятором с целью генерации кода ECL.

Вы можете использовать наборы данных, но только если они являются константными выражениями (например, встроенный набор данных).

Думайте о языке шаблонов как о макросах в C. Если вам действительно нужно генерировать код на основе зависимостей времени выполнения, то в качестве обходного пути вы можете написать функцию, которая генерирует STRING с вашим кодом, а затем отправить его в кластер с помощью SOAPCALL,

Другие вопросы по тегам