用接口开发采购入库程序在网上一搜就会有很多,但基本上都是一样的程序,在自己的系统中操作时很有可能不成功,下面就针对这种情况,将自己操作的全过程记录下来,供大家参考:
SQL代码(网上搜的):
/* Formatted on 2014-10-7 15:23:20 (QP5 v5.115.810.9015) */
/*采购接收接口开发
RCV_TRANSACTIONS_INTERFACE;
RCV_HEADERS_INTERFACE;
mtl_transaction_lots_interface; (物料属于批次控制)
**************************************************
*/
DECLARE
V_INTERFACE_TRANSACTION_ID NUMBER;
V_GROUP_ID NUMBER;
V_SHIPMENT_HEADER_ID NUMBER;
V_SHIPMENT_LINE_ID NUMBER;
V_LINE_LOCATION_ID NUMBER;
V_PO_DISTRIBUTION_ID NUMBER;
V_HEADER_INTERFACE_ID NUMBER;
V_DELIVER_TO_PERSON_ID NUMBER;
L_REQUEST_ID NUMBER;
L_REQUEST_ID2 NUMBER;
V_DESTINATION_TYPE_CODE VARCHAR2(100);
V_EXPECTED_RECEIPT_DATE DATE;
V_COUNTRY_OF_ORIGIN_CODE VARCHAR2(100);
V_LOT_CONTROL NUMBER;
V_USE_MTL_SERIAL NUMBER;
V_RCV_QTY NUMBER;
V_TRANS_QTY NUMBER;
L_PHASE VARCHAR2(10);
L_STATUS VARCHAR2(10);
L_DEV_PHASE VARCHAR2(10);
L_DEV_STATUS VARCHAR2(10);
L_MESSAGE VARCHAR2(10);
L_REQUEST_LAUCH1_STATUS BOOLEAN;
V_INTERFACE_ID NUMBER;
CURSOR CUR_PO_INFO
IS
SELECT PHA.SEGMENT1
,PHA.CURRENCY_CODE
,PHA.SHIP_TO_LOCATION_ID
,PHA.VENDOR_ID
,PHA.VENDOR_SITE_ID
,PLA.*
FROM PO_HEADERS_ALL PHA, PO_LINES_ALL PLA
WHERE PHA.PO_HEADER_ID = PLA.PO_HEADER_ID
AND PHA.ORG_ID = PLA.ORG_ID
AND PHA.ORG_ID = 85
AND PHA.AUTHORIZATION_STATUS = 'APPROVED'
AND PHA.TYPE_LOOKUP_CODE = 'STANDARD'
AND PHA.WF_ITEM_TYPE = 'POAPPRV'
AND PHA.SEGMENT1 = '123214060066' ;
BEGIN
FND_GLOBAL.APPS_INITIALIZE(USER_ID => 11236 --7137
,RESP_ID => 50623
,RESP_APPL_ID => 201 --Purchasing Super User , PO
);
MO_GLOBAL.SET_POLICY_CONTEXT('S', 85);
MO_GLOBAL.SET_ORG_CONTEXT(85, '', 'ONT');
MO_GLOBAL.INIT('ONT');
dbms_application_info.SET_CLIENT_INFO(85);
FOR C_PO_INFO IN CUR_PO_INFO LOOP
SELECT RCV_TRANSACTIONS_INTERFACE_S.NEXTVAL
INTO V_INTERFACE_TRANSACTION_ID
FROM DUAL;
SELECT RCV_INTERFACE_GROUPS_S.NEXTVAL INTO V_GROUP_ID FROM DUAL;
SELECT RCV_SHIPMENT_HEADERS_S.NEXTVAL
INTO V_SHIPMENT_HEADER_ID
FROM DUAL;
SELECT RCV_SHIPMENT_LINES_S.NEXTVAL INTO V_SHIPMENT_LINE_ID FROM DUAL;
SELECT RCV_HEADERS_INTERFACE_S.NEXTVAL
INTO V_HEADER_INTERFACE_ID
FROM DUAL;
SELECT MTL_MATERIAL_TRANSACTIONS_S.NEXTVAL
INTO V_INTERFACE_ID
FROM DUAL;
BEGIN
SELECT MSIB.LOT_CONTROL_CODE
INTO V_LOT_CONTROL
FROM MTL_SYSTEM_ITEMS_B MSIB
WHERE MSIB.INVENTORY_ITEM_ID = C_PO_INFO.ITEM_ID
AND MSIB.ORGANIZATION_ID = 104; --HUTS
EXCEPTION
WHEN OTHERS THEN
V_LOT_CONTROL := NULL;
END;
IF V_LOT_CONTROL IS NULL THEN
V_USE_MTL_SERIAL := NULL;
ELSE
V_USE_MTL_SERIAL := 1;
END IF;
--Get po line location informations
BEGIN
SELECT PLLA.LINE_LOCATION_ID
,PLLA.NEED_BY_DATE
,PLLA.COUNTRY_OF_ORIGIN_CODE
,(PLLA.QUANTITY - PLLA.QUANTITY_RECEIVED)
INTO V_LINE_LOCATION_ID
,V_EXPECTED_RECEIPT_DATE
,V_COUNTRY_OF_ORIGIN_CODE
,V_TRANS_QTY
FROM PO_LINE_LOCATIONS_ALL PLLA
WHERE PLLA.PO_HEADER_ID = C_PO_INFO.PO_HEADER_ID
AND PLLA.PO_LINE_ID = C_PO_INFO.PO_LINE_ID
AND ROWNUM = 1;
EXCEPTION
WHEN OTHERS THEN
V_LINE_LOCATION_ID := NULL;
V_EXPECTED_RECEIPT_DATE := NULL;
V_COUNTRY_OF_ORIGIN_CODE := NULL;
V_TRANS_QTY := 0;
END;
--Get po_distribution_id
BEGIN
SELECT PDA.PO_DISTRIBUTION_ID
,PDA.DESTINATION_TYPE_CODE
,PDA.DELIVER_TO_PERSON_ID
INTO V_PO_DISTRIBUTION_ID
,V_DESTINATION_TYPE_CODE
,V_DELIVER_TO_PERSON_ID
FROM PO_DISTRIBUTIONS_ALL PDA
WHERE PDA.PO_HEADER_ID = C_PO_INFO.PO_HEADER_ID
AND PDA.PO_LINE_ID = C_PO_INFO.PO_LINE_ID
AND ROWNUM = 1;
EXCEPTION
WHEN OTHERS THEN
V_PO_DISTRIBUTION_ID := NULL;
V_DESTINATION_TYPE_CODE := NULL;
END;
IF V_TRANS_QTY > 0 THEN
INSERT INTO RCV_TRANSACTIONS_INTERFACE(INTERFACE_TRANSACTION_ID
,GROUP_ID
,LAST_UPDATE_DATE
,LAST_UPDATED_BY
,CREATION_DATE
,CREATED_BY
,LAST_UPDATE_LOGIN
,TRANSACTION_TYPE
,TRANSACTION_DATE
,PROCESSING_STATUS_CODE
,PROCESSING_MODE_CODE
,TRANSACTION_STATUS_CODE
,QUANTITY
,UNIT_OF_MEASURE
,ITEM_ID
,EMPLOYEE_ID
,AUTO_TRANSACT_CODE
,SHIP_TO_LOCATION_ID
,RECEIPT_SOURCE_CODE
,VENDOR_ID
,SOURCE_DOCUMENT_CODE
,PO_HEADER_ID
,PO_LINE_ID
,PO_LINE_LOCATION_ID
,DESTINATION_TYPE_CODE
,DELIVER_TO_PERSON_ID
,LOCATION_ID
,DELIVER_TO_LOCATION_ID
,SUBINVENTORY
,LOCATOR_ID
,HEADER_INTERFACE_ID
,DOCUMENT_NUM
,TO_ORGANIZATION_ID
,VALIDATION_FLAG
)
VALUES (V_INTERFACE_TRANSACTION_ID
, --INTERFACE_TRANSACTION_ID,
V_GROUP_ID
, --GROUP_ID,
SYSDATE
, --LAST_UPDATE_DATE,
11236
, --LAST_UPDATED_BY,
SYSDATE
, --CREATION_DATE,
11236
, --CREATED_BY,
11236
, --LAST_UPDATE_LOGIN,
'RECEIVE'
, --TRANSACTION_TYPE,
SYSDATE
, --TRANSACTION_DATE,
'PENDING'
, --PROCESSING_STATUS_CODE,
'BATCH'--'IMMEDIATE'
, --PROCESSING_MODE_CODE,
'PENDING'
, --TRANSACTION_STATUS_CODE,
10
, --QUANTITY,
C_PO_INFO.UNIT_MEAS_LOOKUP_CODE
, --UNIT_OF_MEASURE,
C_PO_INFO.ITEM_ID
, --ITEM_ID,
37316
, --EMPLOYEE_ID,
'DELIVER'
, --AUTO_TRANSACT_CODE,
C_PO_INFO.SHIP_TO_LOCATION_ID
, --SHIP_TO_LOCATION_ID,
'VENDOR'
, --RECEIPT_SOURCE_CODE,
C_PO_INFO.VENDOR_ID
, --VENDOR_ID,
'PO'
, --SOURCE_DOCUMENT_CODE,
C_PO_INFO.PO_HEADER_ID
, --PO_HEADER_ID,
C_PO_INFO.PO_LINE_ID
, --PO_LINE_ID,
V_LINE_LOCATION_ID
, --PO_LINE_LOCATION_ID,
V_DESTINATION_TYPE_CODE
, --DESTINATION_TYPE_CODE,
V_DELIVER_TO_PERSON_ID
, --DELIVER_TO_PERSON_ID,
147
, --LOCATION_ID,
147
, --DELIVER_TO_LOCATION_ID,
'QBF-FL'
, --SUBINVENTORY,
347751
, --locator_id,
V_HEADER_INTERFACE_ID
, --HEADER_INTERFACE_ID,
C_PO_INFO.SEGMENT1
, --DOCUMENT_NUM,
104
, --TO_ORGANIZATION_ID,
'Y' --VALIDATION_FLAG
);
--Insert into header interface
INSERT INTO RCV_HEADERS_INTERFACE(HEADER_INTERFACE_ID
,GROUP_ID
,PROCESSING_STATUS_CODE
,RECEIPT_SOURCE_CODE
,TRANSACTION_TYPE
,AUTO_TRANSACT_CODE
,LAST_UPDATE_DATE
,LAST_UPDATED_BY
,LAST_UPDATE_LOGIN
,CREATION_DATE
,CREATED_BY
,VENDOR_ID
,SHIP_TO_ORGANIZATION_ID
,EXPECTED_RECEIPT_DATE
,VALIDATION_FLAG
)
VALUES (V_HEADER_INTERFACE_ID
, --Header_Interface_Id
V_GROUP_ID
, --Group_Id
'PENDING'
, --Processing_Status_Code
'VENDOR'
, --Receipt_Source_Code
'NEW'
, --Transaction_Type
'DELIVER'
, --Auto_Transact_Code
SYSDATE
, --Last_Update_Date
11236
, --Last_Updated_By
11236
, --Last_Update_Login
SYSDATE
, --Creation_Date
11236
, --Created_By
C_PO_INFO.VENDOR_ID
, --Vendor_Id
104
, --Ship_To_Organization_Id,
SYSDATE
, --Expected_Receipt_Date
'Y' --Validation_Flag
);
INSERT INTO MTL_TRANSACTION_LOTS_INTERFACE(TRANSACTION_INTERFACE_ID
,ORIGINATION_TYPE
,LAST_UPDATE_DATE
,LAST_UPDATED_BY
,CREATION_DATE
,CREATED_BY
,LAST_UPDATE_LOGIN
,LOT_NUMBER
,TRANSACTION_QUANTITY
,PRIMARY_QUANTITY
,--SERIAL_TRANSACTION_TEMP_ID,
PRODUCT_CODE
,PRODUCT_TRANSACTION_ID
)
VALUES (V_INTERFACE_ID
, --TRANSACTION_INTERFACE_ID
3
, --ORIGINATION_TYPE
SYSDATE
, --LAST_UPDATE_DATE
11236
, --LAST_UPDATED_BY
SYSDATE
, --CREATION_DATE
11236
, --CREATED_BY
11236
, --LAST_UPDATE_LOGIN
'QB1410070001'
, --LOT_NUMBER
10
, --TRANSACTION_QUANTITY
10
, --PRIMARY_QUANTITY
--0,--MTL_MATERIAL_TRANSACTIONS_S.NEXTVAL, --SERIAL_TRANSACTION_TEMP_ID
'RCV'
, --PRODUCT_CODE
V_INTERFACE_TRANSACTION_ID --PRODUCT_TRANSACTION_ID
);
END IF;
L_REQUEST_ID :=
FND_REQUEST.SUBMIT_REQUEST( 'PO', -- application
'RVCTP', -- program
NULL, --'接收事务处理处理器', description optional)
NULL, -- start_time (optional)
FALSE, -- sub_request
'BATCH',---人工提交
to_char(V_GROUP_ID), -- group id to process
chr(0)
);
/* L_REQUEST_ID2 :=
FND_REQUEST.SUBMIT_REQUEST('PO'
, --APPLICATIONI SHORT NAME;
'RCVDLPDT'
, --PROGRAME SHORT NAME;
''
,''
,FALSE
,'P_group_id=' || V_GROUP_ID
,'P_receipt_source_type=Supplier'
,'P_qty_precision=2'
,'P_org_id=85'
);
dbms_output.PUT_LINE( 'l_request_id: '
|| L_REQUEST_ID
|| ' l_request_id2: '
|| L_REQUEST_ID2);
*/
END LOOP;
COMMIT;
END;
用上面这段代码在toad中执行时查看interface表出现错误:
SELECT * FROM RCV_HEADERS_INTERFACE
WHERE GROUP_ID =1260538 -- 1260557
-- 1260538
SELECT * FROM RCV_TRANSACTIONS_INTERFACE
WHERE GROUP_ID =1260538
SELECT * FROM PO_INTERFACE_ERRORS
WHERE INTERFACE_HEADER_ID = 996012
在PO_INTERFACE_ERRORS表中报错的错误如下:
错误: derive_vendor_rcv_line_qty-098:1
原因:在 derive_vendor_rcv_line_qty 中出现 SQL 错误。SQL 错误为 User-Defined Exception。
措施:请记录此错误编号以及您尝试进行的活动。请与系统管理员联系以寻求更多帮助。
网上一搜,还真有不少人遇到,最有参考价值的是http://blog.csdn.net/yy5512/article/details/4463000 : 参照里面的方法,对接收事务处理处理器 这支报表进行Trace。
Trace过程:
1.设置profile: a. RCV: Debug Mode=Yes
b. FND: Debug Log Enabled=Yes
c. FND: Debug Log Level=Statement
d. FND: Debug Log Module=po%
----------------------------------------------
a. TP:INV Transaction processing mode=On-line
b. INV: Debug Trace=Yes
c. INV: Debug Level=11
d. INV: Debug file (Including the complete path)=
a. OM: Debug Level = 5
b. OM: Debug Log Directory =
2.更新 interface表的状态 ,因为第一次不成功时PROCESSING_STATUS_CODE 状态已是ERROR了,必须将状态修改过来再次执行的时候才会再重新从头运行。
UPDATE RCV_TRANSACTIONS_INTERFACE
SET PROCESSING_STATUS_CODE ='PENDING'
WHERE GROUP_ID = 1260538
UPDATE RCV_HEADERS_INTERFACE
SET PROCESSING_STATUS_CODE ='PENDING'
WHERE GROUP_ID = 1260538
3根据request id 查看 Trace信息
select to_char(timestamp, 'DD-MON-YY HH24:MI:SS'),
message_text,
module,
log_sequence
from fnd_log_messages
WHERE trunc(timestamp) = trunc(sysdate)
AND process_id = (SELECT os_process_id
FROM fnd_concurrent_requests
WHERE request_id =42574017)
AND module not like 'fnd%'
ORDER BY log_sequence;
错误信息如下: Match Option:RProfile value ALLOW_RATE_OVERRIDE_FOR_USER_RATE_TYPE:N |
po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.4896 |
No of Distributions:1:: Rate and Rate_date in po distributions6.318::06-06-14 | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.4922 |
Exception in derive_vendor_rcv_line_qty | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.5176 |
v--------Procedure Started-----------v | po.plsql.RCV_ERROR_PKG.RCV_ERROR_PKG.begin |
set error message token = PO_ALL_SQL_ERROR | po.plsql.RCV_ERROR_PKG.RCV_ERROR_PKG.214 |
error stack from call to set_error_message | po.plsql.RCV_ERROR_PKG.RCV_ERROR_PKG.215 |
^--------Implicit Procedure Exit-----^ | po.plsql.RCV_ERROR_PKG.RCV_ERROR_PKG.end_implicit |
1 | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.5216 |
User-Defined Exception | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.5217 |
error 098 | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.5218 |
^--------Implicit Procedure Exit-----^ | po.plsql.RCV_ROI_TRANSACTION.RCV_ROI_TRANSACTION.end_implicit |
Back from derive routine with 1 rows | po.plsql.RCV_ROI_PREPROCESSOR.RCV_ROI_PREPROCESSOR.1700 |
后来查看RCV_ROI_TRANSACTION包中查看,估计是税这块出了问题(如下图),之后查看PO,发现currency_code ,rate_type 都填的跟系统标准的不太一样(此po是导入的),于是针对标准PO进行了如下修改
UPDATE po_distributions_ALL
SET RATE_DATE =NULL, RATE =NULL
WHERE LINE_LOCATION_ID = 1654169
UPDATE po_headers_ALL
SET currency_code ='CNY',rate_type =NULL,RATE_DATE=NULL,RATE = NULL
WHERE po_header_id = 785071
之后再重新修正interface表的数据
UPDATE RCV_TRANSACTIONS_INTERFACE
SET PROCESSING_STATUS_CODE ='PENDING',CURRENCY_CODE='CNY',CURRENCY_CONVERSION_TYPE =NULL,CURRENCY_CONVERSION_RATE=NULL,CURRENCY_CONVERSION_DATE=NULL
WHERE GROUP_ID = 1260538
UPDATE RCV_HEADERS_INTERFACE
SET PROCESSING_STATUS_CODE ='PENDING'
WHERE GROUP_ID = 1260538
再次run 接收事务处理处理器 时,居然又报错:
Error: Please enter a GL date that is within an open purchasing accounting period.
期间没打开,INV和gl是确定打开了的,难道还有其他期间?
之后网上查找到 http://blog.csdn.net/pan_tian/article/details/8801120 这篇文章,采用了里面的解决办法,将采购超级用户-设置-控制采购期间 ,将当期的(2014-10)打开,之后再重新 跑接收事务处理处理器,这样接口表的数据就已经过去了。
解决方法:
确保GL,Purchasing,Inventory期间为打开的状态。
如何开各个期间,参考:Navigation to Open/Close INV/GL/AR/AP/PO Period
查询是否已经有采购接收入库的数据:
SELECT * FROM RCV_TRANSACTIONS
WHERE PO_HEADER_ID =785071