DBA Data[Home] [Help]

TRIGGER: APPS.MTL_SYSTEM_ITEMS_T3_BOM

Source

Description
MTL_SYSTEM_ITEMS_T3_BOM

/* $Header: BOMPFIT3.sql 115.2 99/07/16 05:15:16 porting sh $ */

BEFORE UPDATE
OF BOM_ITEM_TYPE, PRODUCT_FAMILY_ITEM_ID
ON MTL_SYSTEM_ITEMS_B
FOR EACH ROW

Type
BEFORE EACH ROW
Event
UPDATE
Column
When
Referencing
REFERENCING NEW AS NEW OLD AS OLD
Body
DECLARE
   l_return_sts		NUMBER		:=  0	 ;
   l_return_err		VARCHAR2(2000)  :=  NULL ;
   l_Org_Is_Master	BOOLEAN ;
BEGIN
   FND_MESSAGE.CLEAR;

   l_Org_Is_Master := BOM_PFI_PVT.Org_Is_Master( p_org_id => :new.ORGANIZATION_ID );

   -----------------------------------------------------------------------
   -- Product family category creation and deletion based on BOM Item Type
   -- attribute change.
   -- Store item id for category creation and deletion only if the item
   -- is master item.  However, assign/remove product family item to/from
   -- its own category for every given organization.
   -----------------------------------------------------------------------

   IF (:new.BOM_ITEM_TYPE = 5) and
      ( (:old.BOM_ITEM_TYPE <> 5) or (:old.BOM_ITEM_TYPE is NULL) )
   THEN

      BOM_PFI_PVT.Check_PF_Segs;

      IF ( BOM_PFI_PVT.PF_Segs_Status = BOM_PFI_PVT.G_PF_Segs_Status_OK )
      THEN

      IF l_Org_Is_Master THEN

      -------------------------------------------------------------------------
      -- Record each product family item for creation of a corresponding
      -- category.  Actual creation takes place in the statement-level trigger.
      -------------------------------------------------------------------------

      BOM_PFI_PVT.Store_Cat_Create
	( 	p_return_sts		=>	l_return_sts		,
		p_return_err		=>	l_return_err		,
		p_item_id		=>	:new.INVENTORY_ITEM_ID	,
		p_org_id		=>	:new.ORGANIZATION_ID	,
		p_Cat_Create_Num	=>	BOM_PFI_PVT.G_Cat_Create_Num ,
		p_Create_Cat_Tbl	=>	BOM_PFI_PVT.G_Create_Cat_Tbl
	);

      END IF; -- Org_Is_Master

      ----------------------------------------------------------------------
      -- Assign each product family item to its own category in a given org.
      ----------------------------------------------------------------------

      BOM_PFI_PVT.Store_Cat_Assign
		(  p_return_sts		=>  l_return_sts		,
		   p_return_err		=>  l_return_err		,
		   p_item_id		=>  :new.INVENTORY_ITEM_ID	,
	   	   p_org_id		=>  :new.ORGANIZATION_ID	,
	   	   p_pf_item_id		=>  :new.INVENTORY_ITEM_ID ,
		   p_Assign_Num		=>  BOM_PFI_PVT.G_Assign_Num	,
		   p_Cat_Assign_Tbl	=>  BOM_PFI_PVT.G_Cat_Assign_Tbl
		);

      END IF; -- PF_Segs_Status

   ELSIF (:old.BOM_ITEM_TYPE = 5) and
         ( (:new.BOM_ITEM_TYPE <> 5) or (:new.BOM_ITEM_TYPE is NULL) )
   THEN

      BOM_PFI_PVT.Check_PF_Segs;

      IF ( BOM_PFI_PVT.PF_Segs_Status = BOM_PFI_PVT.G_PF_Segs_Status_OK )
      THEN

      -------------------------------------------------------------------
      -- Remove product family item from its own category in a given org.
      -------------------------------------------------------------------

      BOM_PFI_PVT.Remove_From_Category
		(  p_return_sts		=>	l_return_sts		,
		   p_return_err		=>	l_return_err		,
		   p_item_id		=>	:old.INVENTORY_ITEM_ID	,
	   	   p_org_id		=>	:old.ORGANIZATION_ID
		);

      IF l_Org_Is_Master THEN

      ------------------------------------------------------------------------
      -- Record each product family item corresponding to a category to be
      -- deleted.  Actual deletion takes place in the statement-level trigger.
      ------------------------------------------------------------------------

       BOM_PFI_PVT.Store_Category
	( 	p_return_sts		=>	l_return_sts		,
		p_return_err		=>	l_return_err		,
		p_item_id		=>	:old.INVENTORY_ITEM_ID	,
		p_org_id		=>	:old.ORGANIZATION_ID	,
		p_Cat_Num		=>	BOM_PFI_PVT.G_Cat_Num	,
		p_Delete_Cat_Tbl	=>	BOM_PFI_PVT.G_Delete_Cat_Tbl
	);

      END IF; -- Org_Is_Master

      END IF; -- PF_Segs_Status

   END IF;

   -------------------------------------------------------------------------
   -- Assign or remove an item to/from category/category set based
   -- on PRODUCT_FAMILY_ITEM_ID column value.
   -- Configuration items need not be assigned to product family categories
   -- so make sure base item is null.
   -------------------------------------------------------------------------

   IF (:old.PRODUCT_FAMILY_ITEM_ID is not NULL) and
      ( (:new.PRODUCT_FAMILY_ITEM_ID <> :old.PRODUCT_FAMILY_ITEM_ID) or
        (:new.PRODUCT_FAMILY_ITEM_ID is NULL) )
      and (:old.BASE_ITEM_ID is NULL)
   THEN

      BOM_PFI_PVT.Check_PF_Segs;

      IF ( BOM_PFI_PVT.PF_Segs_Status = BOM_PFI_PVT.G_PF_Segs_Status_OK )
      THEN

      BOM_PFI_PVT.Remove_From_Category
		(  p_return_sts		=>	l_return_sts		,
		   p_return_err		=>	l_return_err		,
		   p_item_id		=>	:old.INVENTORY_ITEM_ID	,
	   	   p_org_id		=>	:old.ORGANIZATION_ID
		);

      END IF; -- PF_Segs_Status

   END IF;

   IF (:new.PRODUCT_FAMILY_ITEM_ID is not NULL) and
      ( (:new.PRODUCT_FAMILY_ITEM_ID <> :old.PRODUCT_FAMILY_ITEM_ID) or
        (:old.PRODUCT_FAMILY_ITEM_ID is NULL) )
      and (:new.BASE_ITEM_ID is NULL)
   THEN

      BOM_PFI_PVT.Check_PF_Segs;

      IF ( BOM_PFI_PVT.PF_Segs_Status = BOM_PFI_PVT.G_PF_Segs_Status_OK )
      THEN

      ---------------------------------------------------------------------
      -- Record each item assignment to category/category set in the
      -- G_Cat_Assign_Tbl PL/SQL table inside BOM_PFI_PVT package.
      -- Do not read item's corresponding product family item key flexfield
      -- segments from MTL_SYSTEM_ITEMS_B now to avoid mutating table error.
      -- Actual assignment takes place in the statement-level trigger.
      ---------------------------------------------------------------------

      BOM_PFI_PVT.Store_Cat_Assign
		(  p_return_sts		=>  l_return_sts		,
		   p_return_err		=>  l_return_err		,
		   p_item_id		=>  :new.INVENTORY_ITEM_ID	,
	   	   p_org_id		=>  :new.ORGANIZATION_ID	,
	   	   p_pf_item_id		=>  :new.PRODUCT_FAMILY_ITEM_ID ,
		   p_Assign_Num		=>  BOM_PFI_PVT.G_Assign_Num	,
		   p_Cat_Assign_Tbl	=>  BOM_PFI_PVT.G_Cat_Assign_Tbl
		);

      END IF; -- PF_Segs_Status

   END IF;

EXCEPTION
   WHEN OTHERS THEN
      IF ( SQLCODE = -20001 ) THEN
         APP_EXCEPTION.RAISE_EXCEPTION;
      ELSE
         RAISE;
      END IF;

END;