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

In a QLikView script generate code dependent of parameters in function call

我在 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);

如果你的问题是它是否可行,我会回答是。 QlikView 中的变量被处理为文本,在调用时被替换,所以我明白为什么它不应该工作。

您需要"build" 即时编写脚本。下面的代码显示了如何实现第一个函数 SplitsenOpMiddel 可以看到的。像这样调用此函数 call SplitsenOpMiddel('A', 1, 6) 将生成具有所需字段的 table。

你可以看看样本 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