【问题标题】:Controlling ECL loop macro using results of a query使用查询结果控制 ECL 循环宏
【发布时间】:2016-10-17 13:52:04
【问题描述】:

我们正在尝试编写一个带有中断函数的循环宏。基本上,我们希望重复某个动作,直到 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;

【问题讨论】:

    标签: hpcc hpcc-ecl


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这可以使用 LOOP() 命令来实现,您可以在此处指定中断条件。 请参阅(平庸)文档here 和博客文章here

      【讨论】:

        猜你喜欢
        • 2012-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多