On Hand Quantity Interface in Oracle apps-R12
Interface tables:
MTL_TRANSACTIONS_INTERFACE
Concurrent Program:
Launch the Transaction Manager through Interface Manager or explicitly call the API – INV_TXN_MANAGER_PUB. PROCESS_TRANSACTIONS () to launch a dedicated transaction worker to process them.
The Transaction Manager picks up the rows to process based on the LOCK_FLAG, TRANSACTION_MODE, and PROCESS_FLAG. Only records with TRANSACTION_MODE of 3, LOCK_FLAG of ‘2’, and PROCESS_FLAG of ‘1’ will be picked up by the Transaction Manager and assigned to a Transaction Worker. If a record fails to process completely, then PROCESS_FLAG will be set to ‘3’ and ERROR_CODE and ERROR_EXPLANATION will be populated with the cause for the error.
Base Tables:
mtl_onhand_quantities
Validations:
Validate organization_id
Check if item is assigned to organization
Validate organization_id, organization_code.
Validate inventory item id.
Transaction period must be open.
Some important columns that need to be populated in the interface tables:
MTL_TRANSACTIONS_INTERFACE:
TRANSACTION_SOURCE_NAME (ANY USER DEFINED VALUE),
TRANSACTION_HEADER_ID (MTL_MATERIAL_TRANSACTIONS_S. NEXTVAL)
TRANSACTION_INTERFACE_ID (MTL_MATERIAL_TRANSACTIONS_S. NEXTVAL ---If item is lot or serial controlled, use this field to link to mtl_transactions_interface otherwise leave it as NULL),
TRANSACTION_DATE,
TRANSACTION_TYPE_ID,
PROCESS_FLAG (1 = Yet to be processed, 2 = Processed, 3= Error)
TRANSACTION_MODE (2 = Concurrent – to launch a dedicated transaction worker
3 = Background – will be picked up by transaction manager
SOURCE_CODE,
SOURCE_HEADER_ID,
SOURCE_LINE_ID (Details about the source like Order Entry etc for tracking purposes)
TRANSACTION_SOURCE_ID
Source Type
|
Foreign Key Reference
|
Account
|
GL_CODE_COMBINATIONS
|
Account Alias
|
MTL_GENERIC_DISPOSITIONS
|
Job or schedule
|
WIP_ENTITIES
|
Sales Order
|
MTL_SALES_ORDERS
|
ITEM_SEGMENT1 TO 20,
TRANSACTION_QTY,
TRANSACTION_UOM,
SUBINVENTORY_CODE,
ORGANIZATION_ID,
Note:
ORGANIZATION_CODE
ITEM_NUMBER
SUBINVENTORY
TRANSACTION_DATE
TRANSACTION_TYPE
UOM_CODE
PRIMARY_QUANTITY
TRANSACTION_QUANTITY
ERROR_CODE
ERROR_MESSAGE
PROCESS_FLAG
Staging table :-
CREATE TABLE APPS. XX_INV_ONHAND_QTY_STG
(
ORGANIZATION_CODE VARCHAR2( 100 BYTE),
ITEM_NUMBER VARCHAR2( 100 BYTE),
SUBINVENTORY VARCHAR2( 100 BYTE),
TRANSACTION_DATE DATE,
TRANSACTION_TYPE VARCHAR2( 100 BYTE),
UOM_CODE VARCHAR2( 3 BYTE),
PRIMARY_QUANTITY NUMBER,
TRANSACTION_QUANTITY NUMBER,
ERROR_CODE VARCHAR2( 100 BYTE),
ERROR_MESSAGE VARCHAR2( 100 BYTE),
PROCESS_FLAG VARCHAR2( 1 BYTE)
)
Procedure :-
CREATE OR REPLACE PROCEDURE APPS. XX_INV_PROC_FOR_VALIDATION
IS
X_ORGANIZATION_ID NUMBER;
X_INV_ITEM_ID NUMBER;
X_PRIMARY_UOM_CODE VARCHAR2( 3);
X_TXN VARCHAR2( 1);
X_ERR_MSG VARCHAR2( 100);
X_SUBINVENTORY VARCHAR2( 100);
X_TRANSACTION_TYPE_ID NUMBER;
X_TXN_SOURCE_TYPE_ID NUMBER;
X_COUNT NUMBER;
X_err_code VARCHAR2( 100);
X_PROCESS_FLAG VARCHAR2( 1);
x_TRANSACTION_INTERFACE_ID NUMBER;
X_CODE_COMBINATION_ID NUMBER;
CURSOR C1 IS SELECT ORGANIZATION_CODE,
ITEM_NUMBER,
SUBINVENTORY,
TRANSACTION_DATE,
TRANSACTION_TYPE,
UOM_CODE,
PRIMARY_QUANTITY,
TRANSACTION_QUANTITY
FROM
XX_INV_ONHAND_QTY_STG;
CURSOR C2 IS SELECT ORGANIZATION_CODE,
ITEM_NUMBER,
SUBINVENTORY,
TRANSACTION_DATE,
TRANSACTION_TYPE,
UOM_CODE,
PRIMARY_QUANTITY,
TRANSACTION_QUANTITY
FROM
XX_INV_ONHAND_QTY_STG
WHERE PROCESS_FLAG = 'V';
BEGIN
X_err_code : = NULL;
X_COUNT : =0;
FOR ONHAND_LOOP IN C1
LOOP
X_COUNT : = X_COUNT+1;
---Validations:
---------------------------------------------------
--ORGANIZATION VALIDATION
----------------------------------------------------
BEGIN
SELECT MP. ORGANIZATION_ID,'V'
INTO X_ORGANIZATION_ID,
X_PROCESS_FLAG
FROM MTL_PARAMETERS MP
WHERE MP. ORGANIZATION_CODE = ONHAND_LOOP. ORGANIZATION_CODE;
DBMS_OUTPUT. PUT_LINE( 'ORGANIZATION IS VALID');
EXCEPTION
WHEN OTHERS THEN
-- X_err_code : = SQLCODE;
X_ERR_MSG : = SUBSTR( SQLERRM, 1, 200);
UPDATE XX_INV_ONHAND_QTY_STG SET ERROR_CODE='E', ERROR_MESSAGE = X_ERR_MSG;
COMMIT;
DBMS_OUTPUT. PUT_LINE( 'ORGANIZATION IS NOT VALID');
END;
-----------------------------------------------------------
---ITEM AND UOM VALIDATION
-----------------------------------------------------------
BEGIN
SELECT MSI. INVENTORY_ITEM_ID
,'V'
INTO X_INV_ITEM_ID
FROM MTL_SYSTEM_ITEMS MSI
WHERE MSI. ORGANIZATION_ID = X_ORGANIZATION_ID
AND MSI.SEGMENT1 = ONHAND_LOOP. ITEM_NUMBER;
DBMS_OUTPUT. PUT_LINE( 'ITEM IS VALID');
EXCEPTION
WHEN OTHERS THEN
-- X_err_code : = SQLCODE;
X_ERR_MSG : = SUBSTR( SQLERRM, 1, 200);
UPDATE XX_INV_ONHAND_QTY_STG SET ERROR_CODE='E', ERROR_MESSAGE = X_ERR_MSG;
COMMIT;
DBMS_OUTPUT. PUT_LINE( 'ITEM IS NOT VALID');
END;
------------------------------------------------------
---SUB INVENTORY VALIDATION
------------------------------------------------------
BEGIN
SELECT MSI. SECONDARY_INVENTORY_NAME,'V'
INTO X_SUBINVENTORY, X_PROCESS_FLAG
FROM MTL_SECONDARY_INVENTORIES MSI
WHERE MSI. ORGANIZATION_ID = X_ORGANIZATION_ID--(GET FROM ORG_CODE)
AND MSI. SECONDARY_INVENTORY_NAME = ONHAND_LOOP. SUBINVENTORY;
DBMS_OUTPUT. PUT_LINE( 'SUBINVENTORY IS VALID');
EXCEPTION
WHEN OTHERS THEN
-- X_err_code : = SQLCODE;
X_ERR_MSG : = SUBSTR( SQLERRM, 1, 200);
UPDATE XX_INV_ONHAND_QTY_STG SET ERROR_CODE='E', ERROR_MESSAGE = X_ERR_MSG;
COMMIT;
DBMS_OUTPUT. PUT_LINE( 'SUBINVENTORY IS NOT VALID');
END;
--------------------------------------------------------
---TRANSACTION TYPE VALIDATION
--------------------------------------------------------
BEGIN
SELECT MTT. TRANSACTION_TYPE_ID
, 'V'
INTO X_TRANSACTION_TYPE_ID
, X_TXN_SOURCE_TYPE_ID
, X_PROCESS_FLAG
FROM MTL_TRANSACTION_TYPES MTT
WHERE UPPER ( MTT. TRANSACTION_TYPE_NAME ) = UPPER (ONHAND_LOOP. TRANSACTION_TYPE )
AND NVL ( MTT. DISABLE_DATE, SYSDATE +1 ) > SYSDATE ;
DBMS_OUTPUT. PUT_LINE( 'TRANSACTION TYPE IS VALID');
EXCEPTION
WHEN OTHERS THEN
---X_err_code : = SQLCODE;
X_ERR_MSG : = SUBSTR( SQLERRM, 1, 200);
UPDATE XX_INV_ONHAND_QTY_STG SET ERROR_CODE='E', ERROR_MESSAGE = X_ERR_MSG;
COMMIT;
DBMS_OUTPUT. PUT_LINE( 'TRANSACTION TYPE IS NOT VALID');
END;
END LOOP;
BEGIN
IF X_PROCESS_FLAG='V' THEN
X_err_code : = NULL;
X_ERR_MSG : = NULL;
UPDATE XX_INV_ONHAND_QTY_STG
SET PROCESS_FLAG = X_PROCESS_FLAG,ERROR_CODE = X_err_code,ERROR_MESSAGE =X_ERR_MSG ;
COMMIT;
DBMS_OUTPUT. PUT_LINE( 'NUMBER OF RECORDS VALIDATED : '||X_COUNT);
ELSE
DBMS_OUTPUT. PUT_LINE( 'NUMBER OF RECORDS VALIDATED : '||X_COUNT);
END IF;
END;
-------------------------------------------------------------------------------------------
---FOR INSERTING RECORDS INTO INTERFACE TABLE
--------------------------------------------------------------------------------------------
BEGIN
FND_GLOBAL. Apps_Initialize( FND_GLOBAL. USER_ID,
FND_GLOBAL. RESP_ID,
FND_GLOBAL. RESP_APPL_ID);
IF X_PROCESS_FLAG='V' THEN
X_ORGANIZATION_ID : =NULL;
X_INV_ITEM_ID : =NULL;
X_PRIMARY_UOM_CODE : =NULL;
X_TXN : =NULL;
X_ERR_MSG : =NULL;
X_SUBINVENTORY : =NULL;
X_TRANSACTION_TYPE_ID : =NULL;
X_TXN_SOURCE_TYPE_ID : =NULL;
X_COUNT : =NULL;
X_err_code : =NULL;
X_PROCESS_FLAG : =NULL;
FOR X IN C2 LOOP
X_COUNT : = X_COUNT+1;
BEGIN
SELECT MP. ORGANIZATION_ID,'S'
INTO X_ORGANIZATION_ID,
X_PROCESS_FLAG
FROM MTL_PARAMETERS MP
WHERE MP. ORGANIZATION_CODE = X. ORGANIZATION_CODE;
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = X_PROCESS_FLAG;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = 'U';
COMMIT;
END;
---------------------------------------------
--INVENTORY--
---------------------------------------------
BEGIN
SELECT MSI. INVENTORY_ITEM_ID
,'S'
INTO X_INV_ITEM_ID
FROM MTL_SYSTEM_ITEMS MSI
WHERE MSI. ORGANIZATION_ID = X_ORGANIZATION_ID
AND MSI.SEGMENT1 = X. ITEM_NUMBER;
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = X_PROCESS_FLAG;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = 'U';
COMMIT;
END;
-----------------------------------------------------------------------
--TRANSACTION TYPE
-----------------------------------------------------------------------
BEGIN
SELECT MTT. TRANSACTION_TYPE_ID
, 'S'
INTO X_TRANSACTION_TYPE_ID
, X_TXN_SOURCE_TYPE_ID
, X_PROCESS_FLAG
FROM MTL_TRANSACTION_TYPES MTT
WHERE UPPER ( MTT. TRANSACTION_TYPE_NAME ) = UPPER (X. TRANSACTION_TYPE )
AND NVL ( MTT. DISABLE_DATE, SYSDATE +1 ) > SYSDATE ;
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = X_PROCESS_FLAG;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG = 'U';
COMMIT;
END;
BEGIN
SELECT CODE_COMBINATION_ID
INTO X_CODE_COMBINATION_ID
FROM
GL_CODE_COMBINATIONS_KFV GCC
WHERE CODE_COMBINATION_ID = 17021;
END;
SELECT mtl_material_transactions_s. nextval
INTO X_TRANSACTION_INTERFACE_ID
FROM DUAL;
--------------------------------------------------------------
----------------------------------------------------------------
BEGIN
INSERT INTO MTL_TRANSACTIONS_INTERFACE
, SOURCE_LINE_ID
, TRANSACTION_MODE
, SOURCE_CODE
, PROCESS_FLAG
, TRANSACTION_INTERFACE_ID
, TRANSACTION_DATE
, INVENTORY_ITEM_ID
, TRANSACTION_UOM
, ORGANIZATION_ID
, SUBINVENTORY_CODE
, TRANSACTION_QUANTITY
, TRANSACTION_TYPE_ID
, TRANSACTION_SOURCE_TYPE_ID
, DISTRIBUTION_ACCOUNT_ID
, CREATED_BY
, CREATION_DATE
, LAST_UPDATED_BY
, LAST_UPDATE_DATE
, LAST_UPDATE_LOGIN
)
VALUES
( 10
, -10
, 3
, 'On HAND Qty Load'
, 1
, X_TRANSACTION_INTERFACE_ID
, x. TRANSACTION_DATE
, X_INV_ITEM_ID
, X_PRIMARY_UOM_CODE
, X_ORGANIZATION_ID
, x. SUBINVENTORY
, x. TRANSACTION_QUANTITY
, X_TRANSACTION_TYPE_ID
, X_TXN_SOURCE_TYPE_ID
, X_CODE_COMBINATION_ID
, NVL( FND_GLOBAL. USER_ID, -1)
, SYSDATE
, NVL( FND_GLOBAL. USER_ID, -1)
, SYSDATE
, NVL( FND_GLOBAL. LOGIN_ID, -1)
);
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG='P';
DBMS_OUTPUT. PUT_LINE( 'NUMBER OF RECORDS INSERTED : '||X_COUNT);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT. PUT_LINE( 'RECORDS Insertion into MTL_TRANSACTION_INTERFACE failed');
DELETE
FROM MTL_TRANSACTIONS_INTERFACE
WHERE TRANSACTION_INTERFACE_ID = X_TRANSACTION_INTERFACE_ID;
UPDATE XX_INV_ONHAND_QTY_STG SET PROCESS_FLAG='U';
COMMIT;
END;
END LOOP;
END IF;
END;
END;
/
EXECUTE XX_INV_PROC_FOR_VALIDATION
---BELOW TO INSERT DATA FROM INTERFACE TO BASE TABLES---
---------------------------------------------------
Go to front-end,
Run Concurrent program : -
Note:
If error is occurring go to Transactions -> Transaction Open Interface -> Error -> See error
After correcting the error apply the below code
/* update mtl_transactions_interface
lock_flag = 2,
transaction_mode = 3,
validation_required = null,
error_code = null,
error_explanation = null
As you have mentioned in above heading idont know how can we increase onhand quantity using miscellaneous issue
ReplyDeleteok using miscellaneous receipt we can increase the onhand quantity and using miscellaneous issue we can decrease the on hand quantity , I will modify it don't worry about that one.
DeleteHi Venkat,
ReplyDeleteCan you please update how to increase onhand quantity for an existing item using interface or API.
Hi Venkat,
ReplyDeleteCan you please update the above query using miscellaneous receipt we can increase the onhand quantity and using miscellaneous issue we can decrease the on hand quantity