Проблема с вызовом PLPCALL
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Kairat Участник
Вступление в Клуб: 05.01.2015
|
Чт Май 07, 2015 11:53  Проблема с вызовом PLPCALL |
|
Полезность: Нет оценки
|
Здравствуйте!
Есть одна операция, которая должна отработать для нескольких экземпляров. В коде операции сделал цикл для нахождения id, потом в цикле вызываю через PLPCALL вторую операцию. Проблема в том, что хотя ссылки найдены правильно, PLPCALL отрабатывает только для последнего экземпляра столько раз, сколько найдено ссылок. Как заставить операцию вызываться над каждым экземпляром?
UPD.: нужна экранная форма операции, вызвать t1.des.[FGK_REJECT_GASH] не получится
Код: | for(select t(t : id) in [PR_CRED] where t.[GR_CRED] = this)
loop
for(
select t1(t1 : des) in ::[DECL_EARLY_SLAK]
where t1.[CRED_REF] = t.id
)
loop
V_DECL := t1.des;
stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL.[FGK_REJECT_GASH]() %>');
end loop;
end loop; |
|
|
 |
Alex294 Участник со стажем
Вступление в Клуб: 02.06.2013
|
Чт Май 07, 2015 13:51   |
|
Полезность: Нет оценки
|
PLPCALL не отрабатывает мгновенно,а только после передачи управления (отработки блока). Надо после каждого PLPCALL делать выход. Я бы решал с помощью скрипта. Например, с начала сохранил бы все выбранные id, а потом бы их по одному обрабатывал в валидации из скрипта (ScriptServerValidate). |
|
 |
Amper Профи
Вступление в Клуб: 29.10.2010
|
Чт Май 07, 2015 18:09   |
|
Полезность: Нет оценки
|
Должно быть что-то вроде:
Код: | stdio.put_line_buf('<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH](%THIS% => ''' || to_char(t1.des) || ''') %>'); |
не уверен в синтаксисе, т. к. под рукой нет админа словаря. |
|
 |
Kairat Участник
Вступление в Клуб: 05.01.2015
|
Пт Май 08, 2015 06:41   |
|
Полезность: Нет оценки
|
Цитата: |
Должно быть что-то вроде:
Код: | stdio.put_line_buf('<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH](%THIS% => ''' || to_char(t1.des) || ''') %>'); |
не уверен в синтаксисе, т. к. под рукой нет админа словаря. |
Вот что выдал этот код:
Не удалось разобрать команду, начиная с указанной '-->' позиции:
<% PLPCALL [DECL_EARLY_SLAK].[FGK_REJECT_GASH]( --> %THIS% => '1720415859') %>.
Цитата: | PLPCALL не отрабатывает мгновенно,а только после передачи управления (отработки блока). Надо после каждого PLPCALL делать выход. Я бы решал с помощью скрипта. Например, с начала сохранил бы все выбранные id, а потом бы их по одному обрабатывал в валидации из скрипта (ScriptServerValidate). |
Вы это про VB скрипт? Допустим, я сохряню все айдишники в массив, потом в секции Клиент-скрипт вызывать PLPCALL? А разница будет? Увы, в VB не силен от слова совсем  |
|
 |
Alex294 Участник со стажем
Вступление в Клуб: 02.06.2013
|
Пт Май 08, 2015 10:11   |
|
Полезность: Нет оценки
|
Подумал, можно обойтись без VB скрипта. Просто V_DECL описываем как массив, а вызовы в цикле формируем как:
Код: |
stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL(i).[FGK_REJECT_GASH]() %>');
|
Правда в вызовах PLPCALL массивы не использовал, может и не сработать. |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Пт Май 08, 2015 10:58  Re: Проблема с вызовом PLPCALL |
|
Полезность: Нет оценки
|
Kairat пишет: | Здравствуйте!
Есть одна операция, которая должна отработать для нескольких экземпляров. В коде операции сделал цикл для нахождения id, потом в цикле вызываю через PLPCALL вторую операцию. Проблема в том, что хотя ссылки найдены правильно, PLPCALL отрабатывает только для последнего экземпляра столько раз, сколько найдено ссылок. Как заставить операцию вызываться над каждым экземпляром?
UPD.: нужна экранная форма операции, вызвать t1.des.[FGK_REJECT_GASH] не получится
Код: | for(select t(t : id) in [PR_CRED] where t.[GR_CRED] = this)
loop
for(
select t1(t1 : des) in ::[DECL_EARLY_SLAK]
where t1.[CRED_REF] = t.id
)
loop
V_DECL := t1.des;
stdio.put_line_buf('<% PLPCALL %VAR%.V_DECL.[FGK_REJECT_GASH]() %>');
end loop;
end loop; |
|
Перенесите этот цикл в Клиент-скрипт, по идее должно помочь. |
|
 |
Kairat Участник
Вступление в Клуб: 05.01.2015
|
Пн Май 11, 2015 12:59   |
|
Полезность: Нет оценки
|
Цитата: | Подумал, можно обойтись без VB скрипта. Просто V_DECL описываем как массив, а вызовы в цикле формируем как |
Не сработало, не скушал массив.
Вывернулся по другому - вызов в цикле оставил как раньше, а на форму вывел те поля, которые находятся на вызываемой форме, благо, там их немного. Потом в цикле вызвал t1.des.[FGK_REJECT_GASH] с передачей выбранных параметров с формы. Но есть один нюанс - параметры с формы будут одни для всех экземпляров.
Цитата: | Перенесите этот цикл в Клиент-скрипт, по идее должно помочь. |
Спасибо за предложение, тоже проверю ваш вариант как запасной |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|