В скрипте QLikView генерировать код, зависящий от параметров при вызове функции - PullRequest
0 голосов
/ 27 июня 2018

У меня есть скрипт в 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 голосов
/ 28 июня 2018

Вам нужно «собрать» скрипт на лету. Приведенный ниже код показывает, как этого можно достичь для первой функции SplitsenOpMiddel. Вызов этой функции, такой как call SplitsenOpMiddel('A', 1, 6), создаст таблицу с обязательными полями.

Вы можете посмотреть образец qvw здесь . Попытка охватить оба случая, но может не сработать, как вы ожидали, но даст вам представление.

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
0 голосов
/ 27 июня 2018

Если ваш вопрос, может ли это сработать, я бы ответил да. Переменные в QlikView обрабатываются как текст, который нужно заменить при вызове, поэтому я вижу причину, по которой он не должен работать.

...