Forms. Open_form Session

monomakh
Дата: 08.08.2005 13:22:26
Доброе время суток!

Нужно, чтобы все формы работали в своей сессии причем не блокируя предыдущую форму (не Call_form). Также нужно передавать еще параметр предыдущей сессии. В общем все это работает грубо говря так

  Set_Parameter_Attr('p', 'SESSID', TEXT_PARAMETER, USERENV('SESSIONID'));
  
open_Form('D_SPIS', activate, session,  NO_SHARE_LIBRARY_DATA, 'p');    
 --Call_Form('D_SPIS', NO_HIDE, NO_REPLACE, NO_QUERY_ONLY, NO_SHARE_LIBRARY_DATA, 'p');

GO_BLOCK('LIST');
execute_query;
проблема в том, что так не выполняется следующие за open_form команды (в справке написано, что и не должно).
Как лучше всего их выполнить тогда? Ловить типа window-activate? или-или?
Tolmachov Dmitiry
Дата: 08.08.2005 15:37:22
Запускаешь форму в режиме no_activate. Выполняется код после запуска. Потом передаешь фокус в новую форму.

Open_Form('Child_Form', no_activate, no_session);
<Code Section>
NEXT_FORM;

no_session - формы будут работать в одной сессии. Если окна у форм не модальные и не диалог, то переключаться между ними можно будет свободно. Формы будут работать в одном окне.
monomakh
Дата: 08.08.2005 18:24:10
Наверное я неправильно выразился. Но мне нужно чтобы формы работали в разных сессиях. Форма A в сессии 1234 форма B в сессии 1235
Tolmachov Dmitiry
Дата: 09.08.2005 12:20:41
Ну тогда все тоже как я говорил, только с параметром session.
FRM-42100
Дата: 09.08.2005 13:24:26
monomakh
  Set_Parameter_Attr('p', 'SESSID', TEXT_PARAMETER, USERENV('SESSIONID'));
  
open_Form('D_SPIS', activate, session,  NO_SHARE_LIBRARY_DATA, 'p');    
 --Call_Form('D_SPIS', NO_HIDE, NO_REPLACE, NO_QUERY_ONLY, NO_SHARE_LIBRARY_DATA, 'p');

GO_BLOCK('LIST');
execute_query;
проблема в том, что так не выполняется следующие за open_form команды (в справке написано, что и не должно).
Как лучше всего их выполнить тогда? Ловить типа window-activate? или-или?
А что мешает завершить все дела до вызова новой формы, т.е. в приведенном пример поставить Open_Form после Execute_Query?
monomakh
Дата: 09.08.2005 20:38:47
FRM-42100
monomakh
  Set_Parameter_Attr('p', 'SESSID', TEXT_PARAMETER, USERENV('SESSIONID'));
  
open_Form('D_SPIS', activate, session,  NO_SHARE_LIBRARY_DATA, 'p');    
 --Call_Form('D_SPIS', NO_HIDE, NO_REPLACE, NO_QUERY_ONLY, NO_SHARE_LIBRARY_DATA, 'p');

GO_BLOCK('LIST');
execute_query;
проблема в том, что так не выполняется следующие за open_form команды (в справке написано, что и не должно).
Как лучше всего их выполнить тогда? Ловить типа window-activate? или-или?
А что мешает завершить все дела до вызова новой формы, т.е. в приведенном пример поставить Open_Form после Execute_Query?


суть этого execute_query, когда был Call_Form (в коде он заремлен) - обновить форму A, после того как закрыли форму B.

Еще более точно:
Форма A и Форма B базируются на одной таблице. Форма A является списком-журналом кратко характеризующим документ, который вызывается по кнопке изменить/новый в форме A и открывается выбранная запись в форме B.

Теперь хочется, чтобы если произошли какие-либо изменения в таблице, на которой базируются обе формы, после того как форма B закроется (по кнопке Сохранить и выйти) форма A обновила свой список (execute_query и вывела актуальную внесенным изменениям в форме B информацию)
Tolmachov Dmitiry
Дата: 10.08.2005 13:40:36
Тогда воспользуйся Call_Form. После закрытия дочерней формы выполнится текст после Call_Form. Правда, при работе дочерней формы родительская будет недоступна, и в работать формы будут в одной сессии, но судя по описанной тобой задаче, тебе и не надо никаких действий выполнять в родительской форме, пока открыта дочерняя.
monomakh
Дата: 10.08.2005 15:42:02
Tolmachov Dmitiry
Тогда воспользуйся Call_Form. После закрытия дочерней формы выполнится текст после Call_Form. Правда, при работе дочерней формы родительская будет недоступна, и в работать формы будут в одной сессии, но судя по описанной тобой задаче, тебе и не надо никаких действий выполнять в родительской форме, пока открыта дочерняя.


По описанию задачи как раз-таки я хочу заменить call-form из-за этих двух недостатков. Во первых родительская должна быть доступна - так как я хочу позволить открывать два разных документа из списка документов (родительская).
Разные сессии для того чтобы - разрешить делать post не боясь, что кто-то где-то сделает commit.
Легко проверять блокирование уже открытого документа.
Tolmachov Dmitiry
Дата: 10.08.2005 17:20:55
Ну тогда open_form с параметром session, а в родительской создаешь триггер WHEN-WINDOW-ACTIVATED, где анализируешь глобальную переменную :Global.Last_Form. Ее значение устанавиливаешь при закрытии дочерней формы. Если значение :Global.Last_Form is not null то обновляешь блок, иначе - Null. После обновления блока сбрасываем :Global.Last_Form в Null дабы избежать лишних телодвижений при сворачивании/разворачивании формы в system tray и при переключениях фокуса между открытыми формами.

Declare
 l_Current_Record PLS_integer;
Begin

 If :Global.Last_Form is not null then
    Go_Block('customer');
    l_Current_Record := :system.cursor_record;
    Execute_query;
    go_record(l_Current_Record);
    :Global.Last_Form := Null;
 end if;

end;
monomakh
Дата: 10.08.2005 17:32:33
Tolmachov Dmitiry
Ну тогда open_form с параметром session, а в родительской создаешь триггер WHEN-WINDOW-ACTIVATED, где анализируешь глобальную переменную :Global.Last_Form. Ее значение устанавиливаешь при закрытии дочерней формы. Если значение :Global.Last_Form is not null то обновляешь блок, иначе - Null. После обновления блока сбрасываем :Global.Last_Form в Null дабы избежать лишних телодвижений при сворачивании/разворачивании формы в system tray и при переключениях фокуса между открытыми формами.

Declare
 l_Current_Record PLS_integer;
Begin

 If :Global.Last_Form is not null then
    Go_Block('customer');
    l_Current_Record := :system.cursor_record;
    Execute_query;
    go_record(l_Current_Record);
    :Global.Last_Form := Null;
 end if;

end;


Это мне напоминает ответ индуса-ораклиста на этот же вопрос (я его дублировал на металинке).
К сожалению, глобальные переменные работают в рамках одной сессии. Так по крайней мере сказано в документации (стандартный хелп билдера).