CftClub.ru
Клуб специалистов ЦФТ-Банк

Передача параметров по PLPCALL
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеВт Дек 20, 2011 13:02   Передача параметров по PLPCALL Ответить с цитатой
Полезность: Нет оценки
Можно ли передать массив структур из одной операции в другую?
Операцию вызываю так:
Код:

stdio.put_line_buf('<% PLPCALL [SVB_207P_AN].[SVB_AN_XLS](P_DATE_S =>'''||P_DATE_BEG||''', %PARAM%.P_DATE_E =>'''|| P_DATE_END||''', %PARAM%.P_FILIAL => '''||P_FILIAL||''') %>');


Простое присваивание

Код:

[SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR := V_ACC_ARR;


и поэкземплярная передача не работают...
Код:

i := V_ACC_ARR.first;
while i<=V_ACC_ARR.count loop
   [SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR(i).ACC := V_ACC_ARR(i).ACC;
   [SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR(i).BOOL := V_ACC_ARR(i).BOOL;
             i := i+1;
           end loop;
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеВт Дек 20, 2011 13:15   Re: Передача параметров по PLPCALL Ответить с цитатой
Полезность: Нет оценки
ssa774 пишет:
Можно ли передать массив структур из одной операции в другую?
Операцию вызываю так:
Код:

stdio.put_line_buf('<% PLPCALL [SVB_207P_AN].[SVB_AN_XLS](P_DATE_S =>'''||P_DATE_BEG||''', %PARAM%.P_DATE_E =>'''|| P_DATE_END||''', %PARAM%.P_FILIAL => '''||P_FILIAL||''') %>');


Простое присваивание

Код:

[SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR := V_ACC_ARR;


и поэкземплярная передача не работают...
Код:

i := V_ACC_ARR.first;
while i<=V_ACC_ARR.count loop
   [SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR(i).ACC := V_ACC_ARR(i).ACC;
   [SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR(i).BOOL := V_ACC_ARR(i).BOOL;
             i := i+1;
           end loop;


Дело не в присваивании, а в вызове.
Условимся в аналогиях: вызов операции с поднятием экранной формы - это как бы отправка письма твоему собеседнику.
Прямой вызов из кода по имени операции - аналогичен телефонному звонку.

То, что ты делаешь (stdio.put_line_buf('<% PLPCALL [SVB_...) ) - это ты отправил письмо. Причём бумажное.
Бессмысленно после этого немедленно звонить и спрашивать результаты.

вызови просто
Код:
::[SVB_207P_AN].[SVB_AN_XLS](P_DATE_S == P_DATE_BEG
, P_DATE_E == P_DATE_END
, P_FILIAL == P_FILIAL
);
[SVB_207P_AN].SVB_AN_XLS.V_ACC_ARR := V_ACC_ARR;

ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеВт Дек 20, 2011 13:44    Ответить с цитатой
Полезность: Нет оценки
Просто нельзя, там нужно экранную форму поднимать с клиент-скриптом.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеВт Дек 20, 2011 14:08    Ответить с цитатой
Полезность: Нет оценки
Что то не нашел у себя на схеме такого объекта [SVB_207P_AN] - локальная доработка ?

Мысль такая - поэкземплярная передача работает , но где то в операции происходит явная инициализация массива, которая "затирает" переданные значения. Если выложите код, можно подумать.
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеВт Дек 20, 2011 14:35    Ответить с цитатой
Полезность: Нет оценки
Должны работать и простое присваивание и поэлементная передача..
В противном случае, массив переинициализируется в валидаторе.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеЧт Дек 22, 2011 10:18    Ответить с цитатой
Полезность: Нет оценки
ssa774 пишет:
Просто нельзя, там нужно экранную форму поднимать с клиент-скриптом.


Так, я осёл.
Насколько я понял, ты пытаешься проинициализировать переменные операции, а потом её вызвать с поднятием экранной формы, да?

Так нельзя.
Переменные обналливаются при вызове.

Заведи в операции [SVB_207P_AN].SVB_AN_XLS глобальные переменные, и используй их для инициализации перемнных операции в секции валидации.

Или перенеси переменные в параметры.
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеЧт Дек 22, 2011 10:26    Ответить с цитатой
Полезность: Нет оценки
Random пишет:

Заведи в операции [SVB_207P_AN].SVB_AN_XLS глобальные переменные, и используй их для инициализации перемнных операции в секции валидации.

Или перенеси переменные в параметры.


Да, это я уже поняла. Операция поднимается с экранной формой, если нажать на ОК, все выполняется. Но пользователю так не нравится..., хочет автоматическое выполнение.
Вызываю без экранной формы, выполняется блок валидации, но клиент-скрипт не выполняется.
Вопрос: как вызвать операцию печати отчета Excel из другой операции без поднятия экранной формы, чтобы выполнялся клиент-скрипт вызываемой операции?
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеЧт Дек 22, 2011 10:51    Ответить с цитатой
Полезность: 1
ssa774 пишет:

Вопрос: как вызвать операцию печати отчета Excel из другой операции без поднятия экранной формы, чтобы выполнялся клиент-скрипт вызываемой операции?

После выполнения валидатора вызываемой операции, код VB-скрипта формирования XL можно считать из пакета [EXCEL] и выполнить в клиент-скрипте вызывающей операции.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Дек 22, 2011 11:01    Ответить с цитатой
Полезность: Нет оценки
PLPCALL-ом и вызывается и без формы. Только что проверил - все работает.
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеЧт Дек 22, 2011 11:05    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
PLPCALL-ом и вызывается и без формы. Только что проверил - все работает.

А в вызываемой операции не стоит ли флажок "Не отображать экранную форму"?
Если да, то вызывается.
Мне нужно вызывать операцию печати отчета из другой операции без отображения экранной формы. Но такой флажок ставить нельзя, т.к. операция нужна для самостоятельного вызова с отображением экранной формы.
Можно примерчик вызова по plpcall без отображения формы?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Дек 22, 2011 12:03    Ответить с цитатой
Полезность: 1
Как вариант -

Код:
If LastControl Is Nothing Then
   ....
   If что-то then
   call Form1.ScriptPostEvent(OK, "CLICK")
   End if
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеЧт Дек 22, 2011 12:06    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Как вариант -

Код:
If LastControl Is Nothing Then
   ....
   If что-то then
   call Form1.ScriptPostEvent(OK, "CLICK")
   End if


Не работает так, это событие происходит после выполнения скрипта. А в скрипт не заходит вообще.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Дек 22, 2011 12:08    Ответить с цитатой
Полезность: Нет оценки
Я перед ответом проверил - работает. Форма рисуется на экране - но по ОК переходит к выполнению.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Дек 22, 2011 12:32    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Не работает так, это событие происходит после выполнения скрипта. А в скрипт не заходит вообще.

в операции,
Дополнительные свойства - Проверки -

при загрузке формы операции:

при смене элемента управления:

что выставлено ?
ssa774
Профи


Вступление в Клуб: 30.11.2007
СообщениеЧт Дек 22, 2011 12:56    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Цитата:
Не работает так, это событие происходит после выполнения скрипта. А в скрипт не заходит вообще.

в операции,
Дополнительные свойства - Проверки -

при загрузке формы операции:

при смене элемента управления:

что выставлено ?


и в вызываемой и в вызывающей операции стоит Клиент-Сервер.
Вызываемая операция - это печать отчета в Excel, она бы иначе и не работала. Когда ее отдельно вызываю, печатает отчет с выполнением скрипта. Попробую прописать PostEvent.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru