库存事务处理-物料批次导入 --系统批次表 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;