Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Forms. Вопрос об исключениях.  [new]
Piggys
Member

Откуда:
Сообщений: 158
Есть такая конструкция:

Кнопка, триггер WHEN-BUTTON-PRESSED
begin	
  commit_form;
  if FORM_SUCCESS then
     --бла-бла-бла
  end if;
end;

на блоке
 Триггер ON-INSERT
declare
  v_alert number;
begin
/*--- вставка с проверкой на то, что такую запись уже вставили --*/
insert into udo_stat_delivery (rn, 
			 delivery_type, 
			period_type, 
			period_date, 
			supplier,
			info_source, 
			geo, 
			plan, 
			fact)
select :total.rn,:total.delivery_type,:total.period_type
        ,:total.period_date,:total.supplier,:total.info_source,:total.geo,nvl(:total.plan,0),nvl(:total.fact,0)
from dual where not exists (select rn 
                                     from udo_stat_delivery
			where delivery_type=:total.delivery_type 
                                          and period_type=:total.period_type
                                          and period_date=:total.period_date 
                                          and supplier=:total.supplier 
                                          and info_source=:total.info_source 
                                          and geo =:total.geo);
if sql%notfound then
/*-- Показываем предупреждение --*/
	 v_alert:=show_alert('CHANGED_ALERT');
              raise form_trigger_failure; -- вызываем исключение
end if;

Жмем кнопку, срабатывает COMMIT.
Триггер ON-INSERT делает вставку, проверяя, что такая запись не была введена из другой сессии.
Если не получается, показывает алерт и выкидывает form_trigger_failure.
Ожидал, что на этом выполнение процедуры закончится, но процедура на кнопке продолжает работу, FORM_SUCCESS = true.
Что делать? Как прекратить выполнение кода кнопки?
3 июл 07, 11:03    [4342340]     Ответить | Цитировать Сообщить модератору
 Re: Forms. Вопрос об исключениях.  [new]
Всегда!!!!!
Member

Откуда:
Сообщений: 296
Piggys
Есть такая конструкция:

Кнопка, триггер WHEN-BUTTON-PRESSED
begin	
  commit_form;
  if FORM_SUCCESS then
     --бла-бла-бла
  end if;
end;

Выдержка из online help к FORM_SUCCESS:

FORM_SUCCESS should not be used to test whether a COMMIT_FORM or POST built-in has succeeded. Because COMMIT_FORM may cause many other triggers to fire, when you evaluate FORM_SUCCESS it may not reflect the status of COMMIT_FORM but of some other, more recently executed built-in. A more accurate technique is to check that the SYSTEM.FORM_STATUS variable is set to 'QUERY' after the operation is done.

Это можно в фак по формсу заносить.
3 июл 07, 11:40    [4342648]     Ответить | Цитировать Сообщить модератору
 Re: Forms. Вопрос об исключениях.  [new]
Kovalchuk Vitaly V
Member

Откуда: ненька Україна
Сообщений: 463
Вобщето в доке написано
FORM HELP
FORM_SUCCESS should not be used to test whether a COMMIT_FORM or POST built-in has succeeded. Because COMMIT_FORM may cause many other triggers to fire, when you evaluate FORM_SUCCESS it may not reflect the status of COMMIT_FORM but of some other, more recently executed built-in. A more accurate technique is to check that the SYSTEM.FORM_STATUS variable is set to 'QUERY' after the operation is done.

Т.е. вы уверены что другие триггера не вызываются после ON-INSERT?
Ну а выполнение кода кнопки прекратить очень просто. Создаайте параметр (напр. SUCCESS) в триггере ON-INSERT выставляете статус а на кнопке проверяете.
--Кнопка, триггер WHEN-BUTTON-PRESSED
begin	
  :parameter.SUCCESS :='TRUE';
  commit_form;
  if FORM_SUCCESS AND   :parameter.SUCCESS = 'TRUE' then
     --бла-бла-бла
  end if;
end;
-- Триггер ON-INSERT
declare
  v_alert number;
begin
/*--- вставка с проверкой на то, что такую запись уже вставили --*/
insert into udo_stat_delivery (rn, 
			 delivery_type, 
			period_type, 
			period_date, 
			supplier,
			info_source, 
			geo, 
			plan, 
			fact)
select :total.rn,:total.delivery_type,:total.period_type
        ,:total.period_date,:total.supplier,:total.info_source,:total.geo,nvl(:total.plan,0),nvl(:total.fact,0)
from dual where not exists (select rn 
                                     from udo_stat_delivery
			where delivery_type=:total.delivery_type 
                                          and period_type=:total.period_type
                                          and period_date=:total.period_date 
                                          and supplier=:total.supplier 
                                          and info_source=:total.info_source 
                                          and geo =:total.geo);
if sql%notfound then
/*-- Показываем предупреждение --*/
  :parameter.SUCCESS :='FALSE';
  v_alert:=show_alert('CHANGED_ALERT');
   raise form_trigger_failure; -- вызываем исключение
end if;
3 июл 07, 11:44    [4342693]     Ответить | Цитировать Сообщить модератору
 Re: Forms. Вопрос об исключениях.  [new]
Piggys
Member

Откуда:
Сообщений: 158
Ага. спасибо, дошло наконец-то. После ON-INSERT выполняется PRE-RECORD блока, отсюда и FORM_SUCCESS...
3 июл 07, 11:57    [4342798]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить