在QLikView脚本中,生成依赖于函数调用中的参数的代码

时间:2018-06-27 13:59:21

标签: code-generation qlikview

我在QLikView中有一个脚本来提取和检查我的数据。它必须执行12次单独的数据提取。我做了一个可以正常工作的函数,但是有些事情是经过硬编码的,我想用相同的参数调用同一函数12次。我的问题是代码生成取决于函数中的参数。

我的代码的一部分是:

SUB SplitsenOpMiddel(middel, eersteVraag, laatsteVraag)

Temp_Middel_$(middel):
LOAD
    Veldzoeknaam                                AS ZoekNaam,
    VeldP_id                                    AS $(middel)_VeldP_id,
    Middel                                      AS $(middel)_Middel,
    MATEnr                                      AS $(middel)_MATE,
    IF(Vraagnr=1, VeldWaarde)                   AS $(middel)_Vraag001,
    IF(Vraagnr=2, VeldWaarde)                   AS $(middel)_Vraag002,
    IF(Vraagnr=3, VeldWaarde)                   AS $(middel)_Vraag003,
    IF(Vraagnr=4, VeldWaarde)                   AS $(middel)_Vraag004,
    IF(Vraagnr=5, VeldWaarde)                   AS $(middel)_Vraag005,
    IF(Vraagnr=6, VeldWaarde)                   AS $(middel)_Vraag006,
    IF(Vraagnr=1, VeldTypeGrp)                  AS $(middel)_Vraag001Type,
    IF(Vraagnr=2, VeldTypeGrp)                  AS $(middel)_Vraag002Type,
    IF(Vraagnr=3, VeldTypeGrp)                  AS $(middel)_Vraag003Type,
    IF(Vraagnr=4, VeldTypeGrp)                  AS $(middel)_Vraag004Type,
    IF(Vraagnr=5, VeldTypeGrp)                  AS $(middel)_Vraag005Type,
    IF(Vraagnr=6, VeldTypeGrp)                  AS $(middel)_Vraag006Type

RESIDENT Data2
WHERE Vraagsort = '$(middel)';

在这种情况下,函数调用为:

CALL SplitsenOpMiddel('A', 1, 6)    

到目前为止,数字1到6已被硬编码,但是我想要的是生成依赖于第二个和第三个参数的代码。

我的第二个函数调用将是:

CALL SplitsenOpMiddel('B', 7, 10)

自动地,代码必须是:

Temp_Middel_$(middel):
LOAD
    Veldzoeknaam                                AS ZoekNaam,
    VeldP_id                                    AS $(middel)_VeldP_id,
    Middel                                      AS $(middel)_Middel,
    MATEnr                                      AS $(middel)_MATE,
    IF(Vraagnr=7, VeldWaarde)                   AS $(middel)_Vraag007,
    IF(Vraagnr=8, VeldWaarde)                   AS $(middel)_Vraag008,
    IF(Vraagnr=9, VeldWaarde)                   AS $(middel)_Vraag009,
    IF(Vraagnr=10, VeldWaarde)                  AS $(middel)_Vraag010,
    IF(Vraagnr=7, VeldTypeGrp)                  AS $(middel)_Vraag007Type,
    IF(Vraagnr=8, VeldTypeGrp)                  AS $(middel)_Vraag008Type,
    IF(Vraagnr=9, VeldTypeGrp)                  AS $(middel)_Vraag009Type,
    IF(Vraagnr=10, VeldTypeGrp)                 AS $(middel)_Vraag0010Type

RESIDENT Data2
WHERE Vraagsort = '$(middel)';

QlikView中有一种方法可以执行此操作吗?

我需要相同类型代码生成的另一部分代码是:

Check_Middel_$(middel):
NOCONCATENATE LOAD
    ZoekNaam,
    $(middel)_VeldP_id,
    $(middel)_Middel,
    $(middel)_MATE,

    IF(ISNULL($(middel)_Vraag001), 
    IF(ISNULL($(middel)_Vraag002) AND
        ISNULL($(middel)_Vraag003) AND
        ISNULL($(middel)_Vraag004) AND
        ISNULL($(middel)_Vraag005) AND
        ISNULL($(middel)_Vraag006), 'G', 'F'))
                                                AS $(middel)_Leeg_Check,

    IF($(middel)_Vraag001 = 0,
    IF($(middel)_Vraag002 = 0 AND
    $(middel)_Vraag003 = 0 AND
    $(middel)_Vraag004 = 0 AND
    $(middel)_Vraag005 = 0 AND
    $(middel)_Vraag006 = 0, 'G', 'F'))
                                                AS $(middel)_0_Check,

    IF(($(middel)_Vraag001 <> 0 AND NOT ISNULL($(middel)_Vraag001)), 
    IF(ISNULL($(middel)_Vraag002) OR
       ISNULL($(middel)_Vraag003) OR
       ISNULL($(middel)_Vraag004) OR
       ISNULL($(middel)_Vraag005) OR
       ISNULL($(middel)_Vraag006), 'F',
    IF(($(middel)_Vraag002 = 0) AND ($(middel)_Vraag003 = 0) AND ($(middel)_Vraag004 = 0) AND ($(middel)_Vraag005 = 0) AND ($(middel)_Vraag006 = 0), 'M', 'G')))
                                                AS $(middel)_Vol_Check,

    $(middel)_Vraag001,
    $(middel)_Vraag002,
    $(middel)_Vraag003,
    $(middel)_Vraag004,
    $(middel)_Vraag005,
    $(middel)_Vraag006
RESIDENT Middel_$(middel);

DROP TABLE Middel_$(middel);

2 个答案:

答案 0 :(得分:1)

您需要即时“构建”脚本。以下代码显示了如何通过第一个功能SplitsenOpMiddel来实现此目的。像这样call SplitsenOpMiddel('A', 1, 6)调用此函数将生成带有必填字段的表。

您可以查看示例qvw here。试图涵盖这两种情况,但可能无法按预期工作,但会给您一个想法。

sub SplitsenOpMiddel(middel, eersteVraag, laatsteVraag)

  let Temp_Middel = 'Temp_Middel_' & '$(middel)' & ':' & chr(13) & 'Load' & chr(13);

  for b = $(eersteVraag) to $(laatsteVraag)
      let Temp_Middel = '$(Temp_Middel)' & 'IF(Vraagnr=' & $(b) & ', VeldWaarde) AS' & ' $(middel)' & '_Vraag00' & $(b) & ',' & chr(13) & 
                        'IF(Vraagnr=' & $(b) & ', VeldTypeGrp) AS' & ' $(middel)' & '_Vraag00' & $(b) & 'Type,' &  chr(13);  
  next

  let Temp_Middel = '$(Temp_Middel)' & 'Veldzoeknaam AS ZoekNaam,' & chr(13) & 
                    'VeldP_id AS ' & '$(middel)' & '_VeldP_id,' & chr(13) & 
                    'Middel AS ' & '$(middel)'& '_Middel,' & chr(13) & 
                    'MATEnr AS ' & '$(middel)' & '_MATE ' & chr(13) & 
                    'Resident Data2' & chr(13) & 
                    'WHERE Vraagsort =' & chr(39) & '$(middel)' & chr(39) & ';';  

  $(Temp_Middel);
end sub

答案 1 :(得分:0)

如果您的问题是是否可行,我会回答是。 QlikView中的变量被处理为在调用时要替换的文本,因此我想出理由为什么它不起作用。