Вставка триггера ТОЛЬКО, если значение столбца содержит XXXX - PullRequest
0 голосов
/ 25 мая 2020

Допустим, у нас есть таблица, в которой объединено множество уникальных кодов. Например: Номер счета:

  • XOUT12345
  • SOUT12345 et c.

Я хотел создать триггер, который гарантирует только те, у которых есть значение «XOUT%» используется в триггере и вставляется в другую таблицу. Это особенно похоже на работу (я думаю), однако, когда я создаю документ, в котором используется формат B, я получаю сообщение об ошибке при сохранении документа.

Таблицы выглядят следующим образом:

  1. 1 таблица с именем ICSTOCKBILL, в которой все входящие и исходящие доставки сохраняются в этой одной таблице с использованием форматов, описанных выше. .
  2. Один столбец = FBillNo, в котором зарегистрированы номера счетов.
  3. Один столбец = FStatus, где статус утверждения обновляется до 1, если это так.

1 Таблица с именем 3026, куда должны автоматически передаваться номера накладных из ICSTOCKBILL (FBillNo).

Мой код выглядит следующим образом :

create Trigger DVLP_T_InsertBillNoItemSALESDEL2 On ICStockBill
for UpDate
as
If UpDate(FStatus)  
Begin
    If not exists (Select 1 
                  From inserted a 
                  Inner Join t_Item b on b.FItemClassID=3026 AND b.FNumber=a.FBillNo where FBillNo like 'XOUT%')
    Begin
        INSERT INTO t_Item (FItemClassID,FParentID,FLevel,FName,FNumber,FShortNumber,FFullNumber,FFullName,FDetail,FDeleted) 
        Select 3026,0,1,FBillNo,FBillNo,FBillNo,FBillNo,FBillNo,1,0
        From inserted where FBillNo like 'XOUT%'

    End
End

Итак, конечная цель: все утвержденные документы (FStatus = updated) должны пройти через курок. Но ТОЛЬКО те, которые имеют формат XOUT, должны быть вставлены в таблицу 3026.

Пока что после того, как я применил этот триггер, он работает. Создаю новую коммерческую поставку, ее еще нет в новой таблице. Я одобряю это, и оно есть.

Однако другие документы, которые не имеют указанного формата, получают ошибку:

UPDATE ICSTOCKBILL SET FORDERAFFIRM = 0 WHERE FBILLNO = SEOUT1234 нарушение UNIQUE KEY contraint 'item2;.

Любые подсказки приветствуются.

1 Ответ

2 голосов
/ 25 мая 2020

Вы можете упростить весь триггер, используя правильную логику на основе набора c - вместо процедурной логики c.

Следующее должно выполнить sh то, что вы просите.

create trigger DVLP_T_InsertBillNoItemSALESDEL2 on ICStockBill
for update
as
begin
    set nocount on;

    -- Always use meaningful aliases - using a, b, c is asking for trouble
    insert into t_Item (FItemClassID, FParentID, FLevel, FName, FNumber, FShortNumber, FFullNumber, FFullName, FDetail, FDeleted) 
    select 3026, 0, 1, FBillNo, FBillNo, FBillNo, FBillNo, FBillNo, 1, 0
    from Inserted I
    where FBillNo like 'XOUT%'
    and FStatus = 1
    and not exists (
        select 1
        from t_Item IT
        where IT.FItemClassID = 3026
        and IT.FNumber = I.FBillNo
    );
end

Если вы все еще получаете сообщение об ошибке, то я очень сомневаюсь, что это как-то связано с триггером. Он сообщает, что уникальное ограничение для основной таблицы было нарушено, и триггер не касается этой таблицы. Я подозреваю, что ваши тестовые данные могут быть недостаточно уникальными.

...