Неофициальный форум разработчиков QlikView и Qlik Sense

Форум разработчиков QlikView и Qlik Sense. Получи любые ответы на вопросы по QlikView и Qlik Sense в течении нескольких часов!

Вы не вошли.

Готовые решения на платйорме QlikView

#1 2016-01-21 13:24:17

Yulia
Участник
Зарегистрирован: 2016-01-13
Сообщений: 34
Windows XPChrome 47.0.2526.111

Циклы и процедуры

Добрый день!

Подскажите, пожалуйста, можно ли использовать итерационную ссылку процедуры на саму процедуру в QV?

Пример, который хочу реализовать,
таблица:
StrCd StrParams
1000  1100;1200;
1100  1150;1190;
1150  1110;1120;1130;
1190  1140;1160;1170;
1200  1210;1220;

в процедуру передаю строку rdStroka = '1100;1200;'
В результате хочу получить для строки 1000 итоговую строку ItgStr, состоящую только из детальных строк:
1110;1120;1130;1140;1160;1170;1210;1220;

знаю, какие строки являются детальными - конечными:
Let StrDetList = '1110;1120;1130;1140;1160;1170;1210;1220;';
ItgStr = '';
процедура:
SUB FIND_DET_ROWS(rdStroka)
    Let i=;
    For i = 1 To SubStringCount('$(rdStroka)',';')
        Let PodStr = SubField('$(rdStroka)',';','$(i)');
        If SubStringCount('$(StrDetList)','$(PodStr)') > 0 Then
            Let ItgStr = '$(ItgStr)'&'$(PodStr)';
        Else
            CALL FIND_DET_ROWS('$(PodStr)');    //Можно ли так указывать?   
        EndIf
    Next i;
ENDSUB

Заранее большое спасибо!


новичок в QlikView

Неактивен

#2 2016-01-21 15:14:45

Oleg Orlov
Участник
Зарегистрирован: 2015-02-16
Сообщений: 14
Windows 8Firefox 43.0

Re: Циклы и процедуры

Юлия, добрый день!

Да, вызывать в теле подпрограммы эту же подпрограмму можно.

По Вашему коду небольшие советы:
1. Вместо использования глобальной переменной StrDetList лучше передавайте ее в качестве второго параметра в подпрограмму. Это позволит использовать как созданную константу, так и любую другую строку (гибкость).
2. При поиске подстроки в строке лучше добавить знаки ';' слева и справа (в исходную строку также добавить знак ';' на первое место), тогда Вы обезопасите себя от возможных будущих ошибок. Например, в строке "100500;" подстрока "500" есть, но такого числа нет.
If SubStringCount('$(StrDetList)',';$(PodStr);') > 0 Then
3. Любые переменные, объявленные в теле подпрограммы являются глобальными и лучше их именовать так, чтобы не было совпадений с переменными вне этой подпрограммы (я лично добавляю префикс в виде наименования подпрограммы и знака '_' - в Вашем случае это "FIND_DET_ROWS_"). Иначе может произойти так, что подпрограмма изменит значение переменной, используемой в другой части скрипта (если их наименования совпадают). С параметрами подпрограммы все иначе. Параметры даже при несовпадении идентификаторов могут быть изменены, так как передаются по ссылке.

С уважением,
Орлов Олег

Редактировался Oleg Orlov (2016-01-21 15:16:29)

Неактивен

#3 2016-01-22 14:33:07

Yulia
Участник
Зарегистрирован: 2016-01-13
Сообщений: 34
Windows XPChrome 47.0.2526.111

Re: Циклы и процедуры

Добрый день!
Подскажите, пожалуйста, есть ли ограничение по длине строковой переменной в QV (например, StrDetList из предыдущего примера)?
Заранее спасибо!


новичок в QlikView

Неактивен

#4 2016-01-22 17:17:01

Oleg Orlov
Участник
Зарегистрирован: 2015-02-16
Сообщений: 14
Windows 8Firefox 43.0

Re: Циклы и процедуры

Здравствуйте, Юлия!

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

С уважением,
Олег Орлов

Неактивен

Сейчас в этой теме форумчан: 0, гостей: 1
[Bot] claudebot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.016 сек, 10 запросов выполнено - Использовано памяти: 1.49 Мбайт (Пик: 1.64 Мбайт) ]