Сообщение отдельно
09.06.2016 14:15
akonev
 
очень странно, что не работает. стандартное почти решение.

если вернуться к исходной задаче... по хорошему, надо делать не триггер на базу, а проверку в супермаге.

1) найти свободный номер проверки. мы начинали с 900, чтобы не пересекаться со штатными проверками. пусть для примера будет 955

2) создать
процедуру проверки:

Код:
CREATE OR REPLACE PROCEDURE CUS_INSP_OR_CHECK_CO(
                INDOCTYPE IN SMDOCUMENTS.DOCTYPE%TYPE
              , INDOCID IN SMDOCUMENTS.ID%TYPE
              , INOLDSTATE IN SMDOCUMENTS.DOCSTATE%TYPE := NULL
              , INNEWSTATE IN SMDOCUMENTS.DOCSTATE%TYPE := NULL
              , INDUMMY IN CORE.SMBOOL := NULL)
IS
-- KAI 09.06.2016 запрет размещения заказов поставщику, для которых в основании нет контракта
BEGIN
  INSPECT.Onstarttrans;

  insert into TTINSPECTRESBUFFER (INSPECTID, ERRID, INSPECTNAME, ERRTEXT)
  select 955, 0, '955', 'Запрещено размещать заказ поставщику '||INDOCID||' без контракта в основании заказа.'
    from smdocuments d
    where d.doctype = INDOCTYPE and d.id = INDOCID -- тип документа и номер нашего заказа мы получили как входные параметры
      and not exists (select 1 
                        from smcommonbases b
                        where b.doctype = d.doctype and b.id=d.id and b.basedoctype = 'CO'
                     )
  ;

INSPECT.SETFUNCNAME(955);
END CUS_INSP_OR_CHECK_CO;

3) задать наименование проверки и режим срабатывания по умолчанию

0 - отключена
1 - предупреждение
2 - запрет
3 - всегда запрет

Код:
insert into ssinspectfunc (id,name,definspectmode) 
values (955, 'Запрет размещения заказа поставщику без контракта в основании заказа', 2)
4) задать для каких документов и в какой момент должна срабатывать

Код:
-- включаем запрет для заказов ('OR') при смене статуса с "черновик" (1) на "размещен" (2)
insert into ssinspectdoc (doctype, docstate, docstatebefore, inspectid, inspectoraname, dobefore)
values('OR', 2, 1, 955, 'CUS_INSP_OR_CHECK_CO', 1)