очень странно, что не работает. стандартное почти решение.
если вернуться к исходной задаче... по хорошему, надо делать не триггер на базу, а проверку в супермаге.
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)