[Home] [Help]
PACKAGE BODY: APPS.BOM_INV_COMPS1_PKG
Source
1 PACKAGE BODY BOM_INV_COMPS1_PKG as
2 /* $Header: bompic1b.pls 120.7 2010/09/02 21:02:52 umajumde ship $ */
3
4 PROCEDURE Check_Overlap(X_Rowid VARCHAR2,
5 X_Bill_Sequence_Id NUMBER,
6 X_Component_Item_Id NUMBER,
7 X_Operation_Seq_Num NUMBER,
8 X_Disable_Date DATE,
9 X_Effectivity_Date DATE) IS
10 dummy NUMBER;
11 BEGIN
12 SELECT 1 INTO dummy FROM sys.dual
13 WHERE NOT EXISTS
14 (SELECT 1 FROM bom_inventory_components
15 WHERE bill_sequence_id = X_Bill_Sequence_Id
16 AND component_item_id = X_Component_Item_Id
17 AND operation_seq_num = X_Operation_Seq_Num
18 AND (X_Disable_Date IS NULL
19 OR (to_char(X_Disable_Date,'YYYY/MM/DD HH24:MI:SS') > to_char(effectivity_date,'YYYY/MM/DD HH24:MI:SS')))
20 AND ((to_char(X_Effectivity_Date,'YYYY/MM/DD HH24:MI:SS') < to_char(disable_date,'YYYY/MM/DD HH24:MI:SS'))
21 OR disable_date IS NULL)
22 AND implementation_date IS NOT NULL
23 AND NVL(ECO_FOR_PRODUCTION,2) = 2
24 AND ((rowid <> X_Rowid) OR (X_Rowid IS NULL)));
25 EXCEPTION
26 WHEN NO_DATA_FOUND THEN
27 fnd_message.set_name('BOM','BOM_COMP_OP_COMBINATION');
28 app_exception.raise_exception;
29 END Check_Overlap;
30
31 PROCEDURE Check_Unit_Number_Overlap(X_Rowid VARCHAR2,
32 X_Bill_Sequence_Id NUMBER,
33 X_Component_Item_Id NUMBER,
34 X_Operation_Seq_Num NUMBER,
35 X_From_Unit_Number VARCHAR2,
36 X_To_Unit_Number VARCHAR2) IS
37 dummy NUMBER;
38 BEGIN
39 SELECT 1 INTO dummy FROM sys.dual
40 WHERE NOT EXISTS
41 (SELECT 1 FROM bom_inventory_components
42 WHERE bill_sequence_id = X_Bill_Sequence_Id
43 AND component_item_id = X_Component_Item_Id
44 AND operation_seq_num = X_Operation_Seq_Num
45 AND (X_To_Unit_Number IS NULL
46 OR (X_To_Unit_Number >= from_end_item_unit_number))
47 AND ((X_From_Unit_Number <= to_end_item_unit_number)
48 OR to_end_item_unit_number IS NULL)
49 AND implementation_date IS NOT NULL
50 AND NVL(ECO_FOR_PRODUCTION,2) = 2
51 AND disable_date is NULL
52 AND ((rowid <> X_Rowid) OR (X_Rowid IS NULL)));
53 EXCEPTION
54 WHEN NO_DATA_FOUND THEN
55 fnd_message.set_name('BOM','BOM_UNIT_OVERLAP');
56 app_exception.raise_exception;
57 END Check_Unit_Number_Overlap;
58
59 PROCEDURE Check_Commons(X_Bill_Sequence_Id NUMBER,
60 X_Organization_Id NUMBER,
61 X_Component_Item_Id NUMBER,
62 X_Bill_or_Eco NUMBER DEFAULT 2) IS --bug1517975
63 dummy NUMBER;
64 eng_items_allowed number := 1; -- bug 1517975
65 eng_items_for_mfg_ecos_flag varchar(3) := 'NO'; -- bug 1517975
66
67 BEGIN
68 -- Check if bill has cross-org commons
69 -- If so, make sure component exists in those other orgs
70 -- and the component does not violate the bill/comp matrix
71
72 -- bug 1517975
73 FND_PROFILE.GET('ENG:ALLOW_ENG_COMPS',eng_items_allowed);
74 if ((eng_items_allowed = 1) and (X_Bill_or_Eco = 2)) then
75 eng_items_for_mfg_ecos_flag := 'YES';
76 end if;
77
78 SELECT 1 INTO dummy
79 FROM bom_bill_of_materials bbom,
80 mtl_system_items msi1
81 WHERE bbom.source_bill_sequence_id = X_Bill_Sequence_Id
82 AND bbom.organization_id <> X_Organization_Id
83 AND msi1.inventory_item_id = bbom.assembly_item_id
84 AND msi1.organization_id = bbom.organization_id
85 AND NOT EXISTS (SELECT null
86 FROM mtl_system_items msi2
87 WHERE msi2.organization_id = bbom.organization_id
88 AND msi2.inventory_item_id = X_Component_Item_Id
89 --AND msi2.bom_enabled_flag = 'Y'
90 --Not a required condition.
91 AND ((bbom.assembly_type = 1 AND
92 msi2.eng_item_flag='N')
93 OR (bbom.assembly_type = 2)
94 OR (eng_items_for_mfg_ecos_flag = 'YES')) --bug1517975
95 AND msi2.inventory_item_id <> bbom.assembly_item_id
96 AND ((msi1.bom_item_type = 1
97 AND msi2.bom_item_type <> 3)
98 OR (msi1.bom_item_type = 2
99 AND msi2.bom_item_type <> 3)
100 OR (msi1.bom_item_type = 3)
101 OR (msi1.bom_item_type = 4
102 AND (msi2.bom_item_type = 4
103 OR (msi2.bom_item_type in (1,2)
104 AND msi2.replenish_to_order_flag = 'Y'
105 AND msi1.base_item_id is NOT NULL
106 AND msi1.replenish_to_order_flag = 'Y'
107 ))))
108 AND (msi1.bom_item_type = 3
109 OR msi1.pick_components_flag = 'Y'
110 OR msi2.pick_components_flag = 'N')
111 AND (msi1.bom_item_type = 3
112 OR nvl(msi2.bom_item_type, 4) <> 2
113 OR (msi2.bom_item_type = 2
114 AND ((msi1.pick_components_flag = 'Y'
115 AND msi2.pick_components_flag = 'Y')
116 OR (msi1.replenish_to_order_flag = 'Y'
117 AND msi2.replenish_to_order_flag = 'Y'
118 ))))
119 AND (
120 (
121 (nvl(fnd_profile.value('BOM:MANDATORY_ATO_IN_PTO'), 2) <> 1)
122 AND (NOT (msi1.bom_item_type = 4
123 AND msi1.pick_components_flag = 'Y'
124 AND msi2.bom_item_type = 4
125 AND msi2.replenish_to_order_flag = 'Y'
126 )
127 )
128 )
129 OR (nvl(fnd_profile.value('BOM:MANDATORY_ATO_IN_PTO'), 2) = 1)
130 ) /* bug 10082384 */
131 );
132 fnd_message.set_name('INV','INV_NOT_VALID');
133 fnd_message.set_token('ENTITY','Component item_CAP',TRUE);
134 fnd_message.set_name('BOM','BOM_COMMON_OTHER_ORGS');
135 app_exception.raise_exception;
136 EXCEPTION
137 WHEN NO_DATA_FOUND THEN
138 null;
139 WHEN TOO_MANY_ROWS THEN
140 fnd_message.set_name('INV','INV_NOT_VALID');
141 fnd_message.set_token('ENTITY','Component item_CAP',TRUE);
142 fnd_message.set_name('BOM','BOM_COMMON_OTHER_ORGS');
143 app_exception.raise_exception;
144 END Check_Commons;
145
146
147 PROCEDURE Check_ATP(X_Organization_Id NUMBER,
148 X_Component_Item_Id NUMBER,
149 X_ATP_Comps_Flag VARCHAR2,
150 X_WIP_Supply_Type NUMBER,
151 X_Replenish_To_Order_Flag VARCHAR2,
152 X_Pick_Components_Flag VARCHAR2) IS
153 dummy NUMBER;
154 l_atp_comps_flag VARCHAR2(1);
155 l_atp_flag VARCHAR2(1);
156 BEGIN
157
158 -- Starting with R11, the ATP_Flag can have additional values R and C
159 -- apart from Y and N
160
161 -- Starting with 11i, even ATP Components flag has additional values which are
162 -- similar to ATP flag. To incorporate these values for multi-level ATP we also
163 -- release the update allowed constraint on Check_ATP
164
165 -- ATP Components flag for an item indicates whether an item's child components should be
166 -- ATP checked. A component c1 (ATP Check = Material) can be on a subassembly that does not
167 -- need to do atp check for components and hence has ATP Components of subassy is set to No. In
168 -- current validation c1 cannot be added onto the subassy because we restrict that.
169
170 -- We will now release the restriction on the ATP Check and ATP Components flag. This will allow the
171 -- users to control what can and cannot be structured on a bill. If the item level attribute for a
172 -- component is ATP Check = Yes, BOM will allow the user to turn it off at the component level.
173 -- The default value will be copied from the item.
174
175 null;
176 /*
177 SELECT atp_components_flag,
178 atp_flag
179 INTO l_atp_comps_flag,
180 l_atp_flag
181 FROM mtl_system_items msi
182 WHERE inventory_item_id = X_Component_Item_Id
183 AND organization_id = X_Organization_Id;
184
185 IF(( X_Atp_Comps_Flag = 'N' AND
186 ( NVL(X_Wip_Supply_Type,1) = 6 OR
187 X_Replenish_To_Order_Flag = 'Y' OR
188 X_Pick_Components_Flag = 'Y'
189 )
190 ) AND
191 ( l_atp_comps_flag IN ('Y','C', 'R', 'N') OR l_atp_flag IN ('Y', 'R', 'C','N' )
192 )
193 ) OR
194 X_Atp_Comps_flag IN ('Y','R','C')
195 THEN
196 -- Do nothing since this is permitted
197 -- If the Assembly item is Phantom or an ATO or PTO and has ATP Components as 'N'
198 -- Even then we will allow ATP components
199 NULL;
200 ELSIF (x_atp_comps_flag = 'N' AND
201 ( l_atp_comps_flag = 'N' AND l_atp_flag = 'N')
202 )
203 THEN
204 -- Even in this case do nothing since both the flag are N and hence is
205 -- is a valid combination
206
207 NULL;
208 ELSE
209 fnd_message.set_name('BOM','BOM_INVALID_ATP');
210 app_exception.raise_exception;
211 END IF;
212 */
213
214 END Check_ATP;
215
216
217 PROCEDURE Check_Unique(X_Rowid VARCHAR2,
218 X_Bill_Sequence_Id NUMBER,
219 X_Component_Item_id NUMBER,
220 X_Operation_Seq_Num NUMBER,
221 X_Effectivity_Date DATE,
222 X_bill_or_eco NUMBER) IS
223 dummy NUMBER;
224 BEGIN
225 SELECT 1 INTO dummy FROM dual WHERE NOT EXISTS
226 (SELECT 1 from bom_inventory_components
227 WHERE bill_sequence_id = X_Bill_Sequence_Id
228 AND component_item_id = X_Component_Item_Id
229 AND operation_seq_num = X_Operation_Seq_Num
230 AND effectivity_date = X_Effectivity_Date
231 AND NVL(ECO_FOR_PRODUCTION,2) = 2
232 AND ((X_Rowid is null) OR (rowid <> X_Rowid))
233 );
234
235 EXCEPTION
236 WHEN NO_DATA_FOUND THEN
237 IF (X_bill_or_eco = 1) THEN
238 fnd_message.set_name('BOM','BOM_COMPONENT_DUPLICATE');
239 ELSE
240 fnd_message.set_name('ENG','ENG_HAS_BEEN_MODIFIED');
241 END IF;
242 app_exception.raise_exception;
243 END Check_Unique;
244
245
246 PROCEDURE Check_Unique_From_Unit_Number(X_Rowid VARCHAR2,
247 X_Bill_Sequence_Id NUMBER,
248 X_Component_Item_id NUMBER,
249 X_Operation_Seq_Num NUMBER,
250 X_From_Unit_Number VARCHAR2,
251 X_bill_or_eco NUMBER) IS
252 dummy NUMBER;
253 BEGIN
254 SELECT 1 INTO dummy FROM dual WHERE NOT EXISTS
255 (SELECT 1 from bom_inventory_components
256 WHERE bill_sequence_id = X_Bill_Sequence_Id
257 AND component_item_id = X_Component_Item_Id
258 AND operation_seq_num = X_Operation_Seq_Num
259 AND from_end_item_unit_number = X_From_Unit_Number
260 AND ((X_Rowid is null) OR (rowid <> X_Rowid))
261 AND disable_date is NULL
262 AND NVL(ECO_FOR_PRODUCTION,2) = 2
263 AND ((X_bill_or_eco = 1) OR (X_bill_or_eco <> 1
264 AND implementation_date is null))
265 );
266
267 EXCEPTION
268 WHEN NO_DATA_FOUND THEN
269 IF (X_bill_or_eco = 1) THEN
270 fnd_message.set_name('BOM','BOM_COMP_DUP_UNIT');
271 ELSE
272 fnd_message.set_name('ENG','ENG_UNIT_NUMBER_MODIFIED');
273 END IF;
274 app_exception.raise_exception;
275 END Check_Unique_From_Unit_Number;
276
277
278 PROCEDURE Insert_Row(X_Rowid IN OUT NOCOPY VARCHAR2,
279 X_Operation_Seq_Num NUMBER,
280 X_Component_Item_Id NUMBER,
281 X_Last_Update_Date DATE,
282 X_Last_Updated_By NUMBER,
283 X_Creation_Date DATE,
284 X_Created_By NUMBER,
285 X_Last_Update_Login NUMBER,
286 X_Item_Num NUMBER,
287 X_Component_Quantity NUMBER,
288 X_Component_Yield_Factor NUMBER,
289 X_Component_Remarks VARCHAR2,
290 X_Effectivity_Date DATE,
291 X_Change_Notice VARCHAR2,
292 X_Implementation_Date DATE,
293 X_Disable_Date DATE,
294 X_Attribute_Category VARCHAR2,
295 X_Attribute1 VARCHAR2,
296 X_Attribute2 VARCHAR2,
297 X_Attribute3 VARCHAR2,
298 X_Attribute4 VARCHAR2,
299 X_Attribute5 VARCHAR2,
300 X_Attribute6 VARCHAR2,
301 X_Attribute7 VARCHAR2,
302 X_Attribute8 VARCHAR2,
303 X_Attribute9 VARCHAR2,
304 X_Attribute10 VARCHAR2,
305 X_Attribute11 VARCHAR2,
306 X_Attribute12 VARCHAR2,
307 X_Attribute13 VARCHAR2,
308 X_Attribute14 VARCHAR2,
309 X_Attribute15 VARCHAR2,
310 X_Planning_Factor NUMBER,
311 X_Quantity_Related NUMBER,
312 X_So_Basis NUMBER,
313 X_Optional NUMBER,
314 X_Mutually_Exclusive_Options NUMBER,
315 X_Include_In_Cost_Rollup NUMBER,
316 X_Check_Atp NUMBER,
317 X_Required_To_Ship NUMBER,
318 X_Required_For_Revenue NUMBER,
319 X_Include_On_Ship_Docs NUMBER,
320 X_Include_On_Bill_Docs NUMBER,
321 X_Low_Quantity NUMBER,
322 X_High_Quantity NUMBER,
323 X_Acd_Type NUMBER,
324 X_Old_Component_Sequence_Id NUMBER,
325 X_Component_Sequence_Id IN OUT NOCOPY NUMBER,
326 X_Bill_Sequence_Id NUMBER,
327 X_Wip_Supply_Type NUMBER,
328 X_Pick_Components NUMBER,
329 X_Supply_Subinventory VARCHAR2,
330 X_Supply_Locator_Id NUMBER,
331 X_Operation_Lead_Time_Percent NUMBER,
332 X_Revised_Item_Sequence_Id NUMBER,
333 X_Cost_Factor NUMBER,
334 X_Bom_Item_Type NUMBER,
335 X_From_Unit_Number VARCHAR2,
336 X_To_Unit_Number VARCHAR2,
337 X_Enforce_Int_Requirements NUMBER DEFAULT NULL,
338 X_auto_Request_Material VARCHAR2 DEFAULT NULL
339 ,X_Suggested_Vendor_Name VARCHAR2 DEFAULT NULL
340 ,X_Vendor_Id NUMBER DEFAULT NULL
341 ,X_Unit_Price NUMBER DEFAULT NULL
342 , X_basis_type NUMBER
343 ) IS
344 CURSOR C IS SELECT rowid FROM BOM_INVENTORY_COMPONENTS
345 WHERE component_sequence_id = X_Component_Sequence_Id;
346 CURSOR C2 IS SELECT bom_inventory_components_s.nextval FROM sys.dual;
347
348 l_object_revision_id NUMBER;
349 l_minor_revision_id NUMBER;
350 l_comp_revision_id NUMBER;
351 l_comp_minor_revision_id NUMBER;
352 l_err_tbl Error_Handler.Mesg_Token_Tbl_Type;
353 l_return_status VARCHAR2(10);
354 org_id number; --4306013
355 alt_bom_code varchar2(240); --4306013
356 ass_item_id NUMBER; --4306013
357 s_ass_comment varchar2(240); --4306013
358 BEGIN
359 if (X_Component_Sequence_Id is NULL) then
360 OPEN C2;
361 FETCH C2 INTO X_Component_Sequence_Id;
362 CLOSE C2;
363 end if;
364
365
366 --
367 -- With the enhancement to BOM functionality for supporting various PLM
368 -- requirements, BOM/Structures can have revisions and the components
369 -- can maintain effectivity with respect to these revisions.
370 -- We therefore now stamp the component with from_bill_revision_id
371 -- and from_structure_revision_code values.
372 -- These values are crucial for the explosion of BOM to work correctly for
373 -- a particular structure revision.
374 --
375
376 --
377 -- 1. Based on Component's Effectivity, get the Item Revision
378 -- 2. Get the max structure revsion id/code for the current bill
379 -- object_revision_id is null or object is 'EGO_ITEM' and
380 -- object_revision_id = item_revsion_id
381 -- 3. Use the values returned in 2 as the From_Bill_Rev_Id and
382 -- From_Structure_Revision_Code values for the component.
383 --
384
385
386
387 BOM_GLOBALS.GET_DEF_REV_ATTRS
388 ( p_bill_sequence_id => x_bill_sequence_id
389 , p_comp_item_id => x_component_item_id
390 , p_effectivity_date => x_effectivity_date
391 , x_object_revision_id => l_object_revision_id
392 , x_minor_revision_id => l_minor_revision_id
393 , x_comp_revision_id => l_comp_revision_id
394 , x_comp_minor_revision_id => l_comp_minor_revision_id
395 );
396
397
398 INSERT INTO BOM_INVENTORY_COMPONENTS(
399 operation_seq_num,
400 component_item_id,
401 last_update_date,
402 last_updated_by,
403 creation_date,
404 created_by,
405 last_update_login,
406 item_num,
407 component_quantity,
408 component_yield_factor,
409 component_remarks,
410 effectivity_date,
411 change_notice,
412 implementation_date,
413 disable_date,
414 attribute_category,
415 attribute1,
416 attribute2,
417 attribute3,
418 attribute4,
419 attribute5,
420 attribute6,
421 attribute7,
422 attribute8,
423 attribute9,
424 attribute10,
425 attribute11,
426 attribute12,
427 attribute13,
428 attribute14,
429 attribute15,
430 planning_factor,
431 quantity_related,
432 so_basis,
433 optional,
434 mutually_exclusive_options,
435 include_in_cost_rollup,
436 check_atp,
437 required_to_ship,
438 required_for_revenue,
439 include_on_ship_docs,
440 include_on_bill_docs,
441 low_quantity,
442 high_quantity,
443 acd_type,
444 old_component_sequence_id,
445 component_sequence_id,
446 bill_sequence_id,
447 wip_supply_type,
448 pick_components,
449 supply_subinventory,
450 supply_locator_id,
451 operation_lead_time_percent,
452 revised_item_sequence_id,
453 cost_factor,
454 bom_item_type,
455 from_end_item_unit_number,
456 to_end_item_unit_number,
457 enforce_int_requirements,
458 auto_request_material
459 ,suggested_vendor_name
460 ,vendor_id
461 ,unit_price
462 ,FROM_OBJECT_REVISION_ID
463 ,FROM_MINOR_REVISION_ID
464 --,COMPONENT_ITEM_REVISION_ID
465 --,COMPONENT_MINOR_REVISION_ID
466 ,basis_type
467 ) VALUES (
468 X_Operation_Seq_Num,
469 X_Component_Item_Id,
470 X_Last_Update_Date,
471 X_Last_Updated_By,
472 X_Creation_Date,
473 X_Created_By,
474 X_Last_Update_Login,
475 X_Item_Num,
476 X_Component_Quantity,
477 X_Component_Yield_Factor,
478 X_Component_Remarks,
479 X_Effectivity_Date,
480 X_Change_Notice,
481 X_Implementation_Date,
482 X_Disable_Date,
483 X_Attribute_Category,
484 X_Attribute1,
485 X_Attribute2,
486 X_Attribute3,
487 X_Attribute4,
488 X_Attribute5,
489 X_Attribute6,
490 X_Attribute7,
491 X_Attribute8,
492 X_Attribute9,
493 X_Attribute10,
494 X_Attribute11,
495 X_Attribute12,
496 X_Attribute13,
497 X_Attribute14,
498 X_Attribute15,
499 X_Planning_Factor,
500 X_Quantity_Related,
501 X_So_Basis,
502 X_Optional,
503 X_Mutually_Exclusive_Options,
504 X_Include_In_Cost_Rollup,
505 X_Check_Atp,
506 X_Required_To_Ship,
507 X_Required_For_Revenue,
508 X_Include_On_Ship_Docs,
509 X_Include_On_Bill_Docs,
510 X_Low_Quantity,
511 X_High_Quantity,
512 X_Acd_Type,
513 X_Old_Component_Sequence_Id,
514 X_Component_Sequence_Id,
515 X_Bill_Sequence_Id,
516 X_Wip_Supply_Type,
517 X_Pick_Components,
518 X_Supply_Subinventory,
519 X_Supply_Locator_Id,
520 X_Operation_Lead_Time_Percent,
521 X_Revised_Item_Sequence_Id,
522 X_Cost_Factor,
523 X_Bom_Item_Type,
524 X_From_Unit_Number,
525 X_To_Unit_Number,
526 X_Enforce_Int_Requirements,
527 X_Auto_Request_Material
528 ,X_Suggested_Vendor_Name
529 ,X_Vendor_Id
530 ,X_Unit_Price
531 , l_object_revision_id
532 , l_minor_revision_id
533 --, l_comp_revision_id
534 --, l_comp_minor_revision_id
535 ,X_basis_type
536 );
537 --Update referencing bills
538 BOMPCMBM.Insert_Related_Components(p_src_bill_seq_id => X_Bill_Sequence_Id
539 , p_src_comp_seq_id => X_Component_Sequence_Id
540 , x_Mesg_Token_Tbl => l_err_tbl
541 , x_Return_Status => l_return_status);
542 IF l_return_status <> FND_API.G_RET_STS_SUCCESS
543 THEN
544 app_exception.raise_exception;
545 END IF;
546
547 OPEN C;
548 FETCH C INTO X_Rowid;
549 if (C%NOTFOUND) then
550 CLOSE C;
551 Raise NO_DATA_FOUND;
552 end if;
553 CLOSE C;
554
555
556 -- Raising Business event
557
558 SELECT bbm.Organization_Id, bbm.alternate_bom_designator, bbm.assembly_item_id, bbm.specific_assembly_comment
559 INTO org_id, alt_bom_code, ass_item_id, s_ass_comment
560 FROM Bom_Bill_Of_Materials bbm
561 WHERE bbm.Bill_Sequence_Id = X_Bill_Sequence_Id;
562
563
564 Bom_Business_Event_PKG.Raise_Bill_Event
565 (p_pk1_value => ass_item_id
566 , p_pk2_value => org_id
567 , p_obj_name => NULL
568 , p_structure_name => alt_bom_code
569 , p_organization_id => org_id
570 , p_structure_comment => s_ass_comment
571 , p_Event_Load_Type => 'Single'
572 , p_Event_Entity_Name => 'Component'
573 , p_Event_Entity_Parent_Id => X_Bill_Sequence_Id
574 , p_Event_Name => Bom_Business_Event_PKG.G_STRUCTURE_MODIFIED_EVENT
575 , p_last_update_date => X_Last_Update_Date
576 , p_last_updated_by => X_Last_Updated_By
577 , p_creation_date => X_Creation_Date
578 , p_created_by => X_Created_By
579 , p_last_update_login=> X_Last_Update_Login
580 , p_component_seq_id => X_Component_Sequence_Id
581 );
582 END Insert_Row;
583
584 END BOM_INV_COMPS1_PKG;