库存事务处理-物料批次导入
--系统批次表
SELECT * FROM MTL_LOT_NUMBERS T;
--API创建批次
inv_lot_api_pub.create_inv_lot(x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
x_row_id => l_row_id,
x_lot_rec => x_mtl_lot_numbers,
p_lot_rec => l_mtl_lot_numbers,
p_source => l_source,
p_api_version => l_api_version,
p_init_msg_list => l_init_msg_list,
p_commit => l_commit,
p_validation_level => l_validation_level,
p_origin_txn_id => l_origin_txn_id);
--API更新批次
inv_lot_api_pub.update_inv_lot(
x_return_status OUT NOCOPY VARCHAR2
, x_msg_count OUT NOCOPY NUMBER
, x_msg_data OUT NOCOPY VARCHAR2
, x_lot_rec OUT NOCOPY MTL_LOT_NUMBERS%ROWTYPE
, p_lot_rec IN MTL_LOT_NUMBERS%ROWTYPE
, p_source IN NUMBER
, p_api_version IN NUMBER
, p_init_msg_list IN VARCHAR2 := fnd_api.g_false
, p_commit IN VARCHAR2 := fnd_api.g_false);
--验证批次唯一性
inv_lot_api_pub.validate_unique_lot(
p_org_id IN NUMBER
, p_inventory_item_id IN NUMBER
, p_lot_uniqueness IN NUMBER
, p_auto_lot_number IN VARCHAR2
, p_check_same_item IN VARCHAR2
, x_is_unique OUT NOCOPY VARCHAR2
);
--物料批次数量验证
-----------------------------------------------------------------------
-- Name : validate_quantities
-- Desc : This procedure is used to validate transaction quantity2
--
-- I/P Params :
-- All the relevant transaction details :
-- - organization id
-- - item_id
-- - lot, revision, subinventory
-- - transaction quantities
-- O/P Params :
-- x_rerturn_status.
-- RETURN VALUE :
-- TRUE : IF the transaction is valid regarding Quantity2 and lot indivisible
-- FALSE : IF the transaction is NOT valid regarding Quantity2 and lot indivisible
--
-----------------------------------------------------------------------
inv_lot_api_pub.validate_quantities(
p_api_version IN NUMBER
, p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
, p_transaction_type_id IN NUMBER
, p_organization_id IN NUMBER
, p_inventory_item_id IN NUMBER
, p_revision IN VARCHAR2
, p_subinventory_code IN VARCHAR2
, p_locator_id IN NUMBER
, p_lot_number IN VARCHAR2
, p_transaction_quantity IN OUT NOCOPY NUMBER
, p_transaction_uom_code IN VARCHAR2
, p_primary_quantity IN OUT NOCOPY NUMBER
, p_primary_uom_code OUT NOCOPY VARCHAR2
, p_secondary_quantity IN OUT NOCOPY NUMBER
, p_secondary_uom_code IN OUT NOCOPY VARCHAR2
, x_return_status OUT NOCOPY VARCHAR2
, x_msg_count OUT NOCOPY NUMBER
, x_msg_data OUT NOCOPY VARCHAR2);
--简单参考例子
/**==================================================
Procedure Name :
create_inv_lot
Description:
This procedure is concurrent entry, perform:
库存事务处理批号生成 api
Argument:
p_inventory_item_id 库存物料id,
p_organization_id 组织id,
p_lot_number 批号:
History:
1.00 2013-10-29 cxy Creation
==================================================*/
PROCEDURE create_inv_lot(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false,
p_commit IN VARCHAR2 DEFAULT fnd_api.g_false,
x_return_status OUT NOCOPY VARCHAR2,
x_msg_count OUT NOCOPY NUMBER,
x_msg_data OUT NOCOPY VARCHAR2,
p_inventory_item_id IN NUMBER,
p_organization_id IN NUMBER,
p_lot_number VARCHAR2) IS
l_api_name CONSTANT VARCHAR2(30) := 'create_inv_lot';
l_count NUMBER;
x_mtl_lot_numbers mtl_lot_numbers%ROWTYPE;
l_mtl_lot_numbers mtl_lot_numbers%ROWTYPE;
/* Defined new variables for overloaded API call */
l_api_version NUMBER := 1.0;
l_init_msg_list VARCHAR2(100) := fnd_api.g_false; -- bug 7513308;
l_commit VARCHAR2(100) := fnd_api.g_false;
l_validation_level NUMBER := fnd_api.g_valid_level_full;
l_origin_txn_id NUMBER := NULL;
l_source NUMBER := 2;
l_return_status VARCHAR2(1);
l_msg_data VARCHAR2(3000);
l_msg_count NUMBER;
l_row_id ROWID;
BEGIN
SAVEPOINT inv_lot_1;
-- start activity to create savepoint, check compatibility
-- and initialize message list, include debug message hint to enter api
SELECT COUNT(1)
INTO l_count
FROM cux_inv_lot_number
WHERE lot_number = p_lot_number;
IF l_count = 0 THEN
fnd_message.set_name('INV',
'在系统中不存在此批号:CUX_INV_LOT_NUMBER.lot_number');
fnd_message.set_token('LOT_NUMBER', to_char(p_lot_number));
fnd_msg_pub.add;
RAISE fnd_api.g_exc_error;
END IF;
FOR rec_inv_lot IN cur_inv_lot LOOP
l_mtl_lot_numbers.inventory_item_id := p_inventory_item_id;
l_mtl_lot_numbers.organization_id := p_organization_id;
l_mtl_lot_numbers.lot_number := p_lot_number;
l_mtl_lot_numbers.last_update_date := SYSDATE;
l_mtl_lot_numbers.last_updated_by := g_user_id;
l_mtl_lot_numbers.creation_date := rec_inv_lot.lot_date;
l_mtl_lot_numbers.created_by := rec_inv_lot.created_by;
l_mtl_lot_numbers.last_update_login := g_login_id;
l_mtl_lot_numbers.program_application_id := g_prog_appl_id;
l_mtl_lot_numbers.program_id := g_conc_program_id;
l_mtl_lot_numbers.program_update_date := SYSDATE;
l_mtl_lot_numbers.expiration_date := NULL;
l_mtl_lot_numbers.disable_flag := NULL;
l_mtl_lot_numbers.attribute_category := NULL;
l_mtl_lot_numbers.attribute1 := NULL;
l_mtl_lot_numbers.attribute2 := NULL;
l_mtl_lot_numbers.attribute3 := NULL;
l_mtl_lot_numbers.attribute4 := NULL;
l_mtl_lot_numbers.attribute5 := NULL;
l_mtl_lot_numbers.attribute6 := NULL;
l_mtl_lot_numbers.attribute7 := NULL;
l_mtl_lot_numbers.attribute8 := NULL;
l_mtl_lot_numbers.attribute9 := NULL;
l_mtl_lot_numbers.attribute10 := NULL;
l_mtl_lot_numbers.attribute11 := NULL;
l_mtl_lot_numbers.attribute12 := NULL;
l_mtl_lot_numbers.attribute13 := NULL;
l_mtl_lot_numbers.attribute14 := NULL;
l_mtl_lot_numbers.attribute15 := NULL;
l_mtl_lot_numbers.request_id := NULL;
l_mtl_lot_numbers.gen_object_id := NULL;
l_mtl_lot_numbers.description := NULL;
l_mtl_lot_numbers.vendor_name := NULL;
l_mtl_lot_numbers.supplier_lot_number := NULL;
l_mtl_lot_numbers.country_of_origin := NULL;
l_mtl_lot_numbers.grade_code := NULL;
l_mtl_lot_numbers.origination_date := NULL;
l_mtl_lot_numbers.date_code := NULL;
l_mtl_lot_numbers.status_id := NULL;
l_mtl_lot_numbers.change_date := NULL;
l_mtl_lot_numbers.age := NULL;
l_mtl_lot_numbers.retest_date := NULL;
l_mtl_lot_numbers.maturity_date := NULL;
l_mtl_lot_numbers.lot_attribute_category := NULL;
l_mtl_lot_numbers.item_size := NULL;
l_mtl_lot_numbers.color := NULL;
l_mtl_lot_numbers.volume := NULL;
l_mtl_lot_numbers.volume_uom := NULL;
l_mtl_lot_numbers.place_of_origin := NULL;
l_mtl_lot_numbers.kill_date := NULL;
l_mtl_lot_numbers.best_by_date := NULL;
l_mtl_lot_numbers.length := NULL;
l_mtl_lot_numbers.length_uom := NULL;
l_mtl_lot_numbers.recycled_content := NULL;
l_mtl_lot_numbers.thickness := NULL;
l_mtl_lot_numbers.thickness_uom := NULL;
l_mtl_lot_numbers.width := NULL;
l_mtl_lot_numbers.width_uom := NULL;
l_mtl_lot_numbers.curl_wrinkle_fold := NULL;
l_mtl_lot_numbers.c_attribute1 := NULL;
l_mtl_lot_numbers.c_attribute2 := NULL;
l_mtl_lot_numbers.c_attribute3 := NULL;
l_mtl_lot_numbers.c_attribute4 := NULL;
l_mtl_lot_numbers.c_attribute5 := NULL;
l_mtl_lot_numbers.c_attribute6 := NULL;
l_mtl_lot_numbers.c_attribute7 := NULL;
l_mtl_lot_numbers.c_attribute8 := NULL;
l_mtl_lot_numbers.c_attribute9 := NULL;
l_mtl_lot_numbers.c_attribute10 := NULL;
l_mtl_lot_numbers.c_attribute11 := NULL;
l_mtl_lot_numbers.c_attribute12 := NULL;
l_mtl_lot_numbers.c_attribute13 := NULL;
l_mtl_lot_numbers.c_attribute14 := NULL;
l_mtl_lot_numbers.c_attribute15 := NULL;
l_mtl_lot_numbers.c_attribute16 := NULL;
l_mtl_lot_numbers.c_attribute17 := NULL;
l_mtl_lot_numbers.c_attribute18 := NULL;
l_mtl_lot_numbers.c_attribute19 := NULL;
l_mtl_lot_numbers.c_attribute20 := NULL;
l_mtl_lot_numbers.c_attribute21 := NULL;
l_mtl_lot_numbers.c_attribute22 := NULL;
l_mtl_lot_numbers.c_attribute23 := NULL;
l_mtl_lot_numbers.c_attribute24 := NULL;
l_mtl_lot_numbers.c_attribute25 := NULL;
l_mtl_lot_numbers.c_attribute26 := NULL;
l_mtl_lot_numbers.c_attribute27 := NULL;
l_mtl_lot_numbers.c_attribute28 := NULL;
l_mtl_lot_numbers.c_attribute29 := NULL;
l_mtl_lot_numbers.c_attribute30 := NULL;
l_mtl_lot_numbers.d_attribute1 := NULL;
l_mtl_lot_numbers.d_attribute2 := NULL;
l_mtl_lot_numbers.d_attribute3 := NULL;
l_mtl_lot_numbers.d_attribute4 := NULL;
l_mtl_lot_numbers.d_attribute5 := NULL;
l_mtl_lot_numbers.d_attribute6 := NULL;
l_mtl_lot_numbers.d_attribute7 := NULL;
l_mtl_lot_numbers.d_attribute8 := NULL;
l_mtl_lot_numbers.d_attribute9 := NULL;
l_mtl_lot_numbers.d_attribute10 := NULL;
l_mtl_lot_numbers.d_attribute11 := NULL;
l_mtl_lot_numbers.d_attribute12 := NULL;
l_mtl_lot_numbers.d_attribute13 := NULL;
l_mtl_lot_numbers.d_attribute14 := NULL;
l_mtl_lot_numbers.d_attribute15 := NULL;
l_mtl_lot_numbers.d_attribute16 := NULL;
l_mtl_lot_numbers.d_attribute17 := NULL;
l_mtl_lot_numbers.d_attribute18 := NULL;
l_mtl_lot_numbers.d_attribute19 := NULL;
l_mtl_lot_numbers.d_attribute20 := NULL;
l_mtl_lot_numbers.n_attribute1 := NULL;
l_mtl_lot_numbers.n_attribute2 := NULL;
l_mtl_lot_numbers.n_attribute3 := NULL;
l_mtl_lot_numbers.n_attribute4 := NULL;
l_mtl_lot_numbers.n_attribute5 := NULL;
l_mtl_lot_numbers.n_attribute6 := NULL;
l_mtl_lot_numbers.n_attribute7 := NULL;
l_mtl_lot_numbers.n_attribute8 := NULL;
l_mtl_lot_numbers.n_attribute9 := NULL;
l_mtl_lot_numbers.n_attribute10 := NULL;
l_mtl_lot_numbers.n_attribute11 := NULL;
l_mtl_lot_numbers.n_attribute12 := NULL;
l_mtl_lot_numbers.n_attribute13 := NULL;
l_mtl_lot_numbers.n_attribute14 := NULL;
l_mtl_lot_numbers.n_attribute15 := NULL;
l_mtl_lot_numbers.n_attribute16 := NULL;
l_mtl_lot_numbers.n_attribute17 := NULL;
l_mtl_lot_numbers.n_attribute18 := NULL;
l_mtl_lot_numbers.n_attribute19 := NULL;
l_mtl_lot_numbers.n_attribute20 := NULL;
l_mtl_lot_numbers.n_attribute21 := NULL;
l_mtl_lot_numbers.n_attribute22 := NULL;
l_mtl_lot_numbers.n_attribute23 := NULL;
l_mtl_lot_numbers.n_attribute24 := NULL;
l_mtl_lot_numbers.n_attribute25 := NULL;
l_mtl_lot_numbers.n_attribute26 := NULL;
l_mtl_lot_numbers.n_attribute27 := NULL;
l_mtl_lot_numbers.n_attribute28 := NULL;
l_mtl_lot_numbers.n_attribute29 := NULL;
l_mtl_lot_numbers.n_attribute30 := NULL;
l_mtl_lot_numbers.vendor_id := NULL;
l_mtl_lot_numbers.territory_code := NULL;
l_mtl_lot_numbers.parent_lot_number := NULL;
l_mtl_lot_numbers.origination_type := NULL;
l_mtl_lot_numbers.availability_type := NULL;
l_mtl_lot_numbers.expiration_action_code := NULL;
l_mtl_lot_numbers.expiration_action_date := NULL;
l_mtl_lot_numbers.hold_date := NULL;
l_mtl_lot_numbers.inventory_atp_code := NULL;
l_mtl_lot_numbers.reservable_type := NULL;
l_mtl_lot_numbers.sampling_event_id := NULL;
inv_lot_api_pub.create_inv_lot(x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
x_row_id => l_row_id,
x_lot_rec => x_mtl_lot_numbers,
p_lot_rec => l_mtl_lot_numbers,
p_source => l_source,
p_api_version => l_api_version,
p_init_msg_list => l_init_msg_list,
p_commit => l_commit,
p_validation_level => l_validation_level,
p_origin_txn_id => l_origin_txn_id);
IF l_return_status = g_ret_sts_success THEN
UPDATE cux_inv_lot_number h
SET h.process_status = 'COMPLETE',
h.process_date = SYSDATE,
h.process_message = NULL,
h.row_version_number = h.row_version_number + 1,
h.last_updated_by = g_user_id,
h.last_update_date = SYSDATE,
h.last_update_login = g_login_id
WHERE h.id = rec_inv_lot.id;
ELSE
UPDATE cux_inv_lot_number h
SET h.process_status = 'ERROR',
h.process_date = SYSDATE,
h.process_message = '创建批次失败-' || l_msg_data,
h.row_version_number = h.row_version_number + 1,
h.last_updated_by = g_user_id,
h.last_update_date = SYSDATE,
h.last_update_login = g_login_id
WHERE h.id = rec_inv_lot.id;
IF l_return_status = g_ret_sts_error THEN
RAISE g_exc_error;
ELSIF l_return_status = g_ret_sts_unexp_error THEN
fnd_message.set_name('INV', 'INV_PROGRAM_ERROR');
fnd_message.set_token('PROG_NAME',
'inv_lot_api_pub.Create_Inv_lot');
fnd_msg_pub.add;
RAISE g_exc_unexpected_error;
END IF;
END IF;
END LOOP;
-- API end body
-- end activity, include debug message hint to exit api
EXCEPTION
WHEN no_data_found THEN
x_return_status := g_ret_sts_error;
ROLLBACK TO inv_lot_1;
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => x_msg_count,
p_data => x_msg_data);
IF (x_msg_count > 1) THEN
x_msg_data := fnd_msg_pub.get(x_msg_count, fnd_api.g_false);
END IF;
-- print_debug('In No data found Create_Inv_Lot ' || SQLERRM, 9);
WHEN g_exc_error THEN
x_return_status := g_ret_sts_error;
ROLLBACK TO inv_lot_1;
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => x_msg_count,
p_data => x_msg_data);
IF (x_msg_count > 1) THEN
x_msg_data := fnd_msg_pub.get(x_msg_count, fnd_api.g_false);
END IF;
--print_debug('In g_exc_error Create_Inv_Lot ' || SQLERRM, 9);
WHEN g_exc_unexpected_error THEN
x_return_status := g_ret_sts_unexp_error;
ROLLBACK TO inv_lot_1;
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => x_msg_count,
p_data => x_msg_data);
IF (x_msg_count > 1) THEN
x_msg_data := fnd_msg_pub.get(x_msg_count, fnd_api.g_false);
END IF;
WHEN OTHERS THEN
x_return_status := g_ret_sts_unexp_error;
ROLLBACK TO inv_lot_1;
fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
p_count => x_msg_count,
p_data => x_msg_data);
IF (x_msg_count > 1) THEN
x_msg_data := fnd_msg_pub.get(x_msg_count, fnd_api.g_false);
END IF;
END create_inv_lot;