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