使用查询结果控制ECL循环宏

时间:2016-10-17 13:52:04

标签: hpcc hpcc-ecl

我们正在尝试使用break函数编写循环宏。基本上我们想重复某个动作,直到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 个答案:

答案 0 :(得分:2)

由于模板语言指令是由编译器处理的,目的是生成ECL代码,因此您不能对模板语言代码具有运行时依赖项(例如,从逻辑文件加载的数据集)。

您可以使用数据集,但前提是它们是常量表达式(例如,内联数据集)。

将模板语言视为C中的宏。如果您确实需要基于运行时依赖项生成代码,则可以解决的方法是编写一个函数,该函数使用您的代码生成STRING,然后提交SOAPCALL连接到群集。

答案 1 :(得分:1)

这可以使用LOOP()命令,您可以在那里指定一个中断条件。 请参阅(平庸)文档here和博文here