DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMI_PRE_MIGRATION

Source


1 PACKAGE BODY GMI_Pre_Migration AS
2 /* $Header: GMIPMIGB.pls 120.1 2005/07/05 09:14:27 jgogna noship $
3  +==========================================================================+
4  |                   Copyright (c) 1998 Oracle Corporation                  |
5  |                          Redwood Shores, CA, USA                         |
6  |                            All rights reserved.                          |
7  +==========================================================================+
8  | FILE NAME                                                                |
9  |    GMIPMIGB.pls                                                          |
10  |                                                                          |
11  | TYPE                                                                     |
12  |   Public                                                                 |
13  |                                                                          |
14  | PACKAGE NAME                                                             |
15  |    GMIPMIGB                                                              |
16  |                                                                          |
17  | DESCRIPTION                                                              |
18  |    This package contains the procedure used for pre-migration validation |
19  |    of the OPM convergence migration.                                     |
20  |                                                                          |
21  | Contents                                                                 |
22  |    validate                                                              |
23  |                                                                          |
24  | HISTORY                                                                  |
25  |    Created - Jatinder Gogna - 3/22/05                                    |
26  |                                                                          |
27  |                                                                          |
28  +==========================================================================+
29 */
30 
31 /*====================================================================
32 --  PROCEDURE:
33 --    validate_desc_flex_definition
34 --
35 --  DESCRIPTION:
36 --    This PL/SQL procedure is used to validate the conflict
37 --    in desc flexfield usage for discrete and OPM.
38 --
39 --  PARAMETERS:
40 --    p_opm_desc_flex_name - OPM desc flexfield name
41 --    p_odm_desc_flex_name - ODM desc flexfield name
42 --  SYNOPSIS:
43 --    validate_desc_flex_definition( 'ITEM_FLEX', 'MTL_SYSTEM_ITEMS');
44 --
45 --  HISTORY
46 --	Jatinder Gogna - Created - 03/25/05
47 --====================================================================*/
48 
49 PROCEDURE validate_desc_flex_definition
50 ( p_migration_run_id		IN	NUMBER,
51   p_opm_desc_flex_name		IN	VARCHAR2,
52   p_odm_desc_flex_name          IN      VARCHAR2)
53 IS
54 
55 CURSOR c_get_desc_flex_col_conflict IS
56 
57 SELECT col.descriptive_flex_context_code,
58 	col.application_column_name,
59 	col.end_user_column_name
60 FROM fnd_descr_flex_column_usages col,
61 	fnd_descr_flex_contexts cont
62 WHERE
63 	col.application_id = 551 and
64 	col.descriptive_flexfield_name = p_opm_desc_flex_name and
65 	col.enabled_flag = 'Y' and
66 	col.application_id = cont.application_id and
67 	col.descriptive_flexfield_name = cont.descriptive_flexfield_name and
68 	col.descriptive_flex_context_code = cont.descriptive_flex_context_code and
69 	cont.enabled_flag = 'Y' and
70 	col.application_column_name in (
71 		SELECT col2.application_column_name
72 		FROM fnd_descr_flex_column_usages col2,
73 			fnd_descr_flex_contexts cont2
74 		WHERE
75 			col2.application_id = 401 and
76 			col2.descriptive_flexfield_name = p_odm_desc_flex_name and
77 			col2.enabled_flag = 'Y' and
78 			col.application_id = cont2.application_id and
79 			col.descriptive_flexfield_name = cont2.descriptive_flexfield_name and
80 			col.descriptive_flex_context_code = cont2.descriptive_flex_context_code and
81 			cont2.enabled_flag = 'Y' );
82 
83 CURSOR c_get_opm_desc_flex_cols IS
84 
85 SELECT col.descriptive_flex_context_code,
86 	col.application_column_name,
87 	col.end_user_column_name
88 FROM fnd_descr_flex_column_usages col,
89 	fnd_descr_flex_contexts cont
90 WHERE
91 	col.application_id = 551 and
92 	col.descriptive_flexfield_name = p_opm_desc_flex_name and
93 	col.enabled_flag = 'Y' and
94 	col.application_id = cont.application_id and
95 	col.descriptive_flexfield_name = cont.descriptive_flexfield_name and
96 	col.descriptive_flex_context_code = cont.descriptive_flex_context_code and
97 	cont.enabled_flag = 'Y';
98 
99 l_opm_context		VARCHAR2(30);
100 l_odm_context		VARCHAR2(30);
101 l_table_name		VARCHAR2(50);
102 l_context		VARCHAR2(50);
103 BEGIN
104 	BEGIN
105 		IF p_opm_desc_flex_name = 'ITEM_FLEX' THEN
106 			l_table_name := 'IC_ITEM_MST_B';
107 			l_context := 'ITEMS';
108 		ELSIF p_opm_desc_flex_name = 'LOT_FLEX' THEN
109 			l_table_name := 'IC_LOTS_MST';
110 			l_context := 'LOTS';
111 		END IF;
112 		SELECT cont.descriptive_flex_context_code
113 		INTO l_opm_context
114 		FROM fnd_descr_flex_contexts cont
115 		WHERE cont.application_id = 551 and
116 			cont.descriptive_flexfield_name = p_opm_desc_flex_name and
117 			cont.enabled_flag = 'Y' and
118 			cont.global_flag = 'N' and
119 			rownum = 1;
120 	EXCEPTION
121 		WHEN NO_DATA_FOUND THEN
122 			NULL;
123 	END;
124 	BEGIN
125 		SELECT cont.descriptive_flex_context_code
126 		INTO l_odm_context
127 		FROM fnd_descr_flex_contexts cont
128 		WHERE cont.application_id = 401 and
129 			cont.descriptive_flexfield_name = p_odm_desc_flex_name and
130 			cont.enabled_flag = 'Y' and
131 			cont.global_flag = 'N' and
132 			rownum = 1;
133 	EXCEPTION
134 		WHEN NO_DATA_FOUND THEN
135 			NULL;
136 	END;
137 	IF (l_opm_context is not NULL and l_odm_context is not NULL) THEN
138 		-- Log Error
139 		-- dbms_output.put_line ('Desc flexfield conflict. OPM context: '|| l_opm_context ||', ODM context: '|| l_odm_context);
140 		GMA_COMMON_LOGGING.gma_migration_central_log (
141 			p_run_id          => p_migration_run_id,
142 			p_log_level       => FND_LOG.LEVEL_ERROR,
143 			p_message_token   => 'GMI_MIG_DFLEX_CONTEXT_CONFLICT',
144 			p_table_name      => 'IC_ITEM_MST_B',
145 			p_context         => 'ITEMS',
146 			p_param1          => l_opm_context,
147 			p_param2          => l_odm_context,
148 			p_param3          => NULL,
149 			p_param4          => NULL,
150 			p_param5          => NULL,
151 			p_db_error        => NULL,
152 			p_app_short_name  => 'GMI');
153 	END IF;
154 
155 	-- Check if any OPM item decsriptive flexfield column is used in
156 	-- Discrete item flexfield
157 
158 	FOR conflict_columns in c_get_desc_flex_col_conflict LOOP
159 		-- If we are here, that means we have a conflict
160 
161 		-- dbms_output.put_line ('Desc flexfield column conflict.' || conflict_columns.descriptive_flex_context_code ||', '||conflict_columns.end_user_column_name||', '||conflict_columns.application_column_name);
162 		GMA_COMMON_LOGGING.gma_migration_central_log (
163 			p_run_id          => p_migration_run_id,
164 			p_log_level       => FND_LOG.LEVEL_ERROR,
165 			p_message_token   => 'GMI_MIG_DFLEX_COL_CONFLICT',
166 			p_table_name      => 'IC_ITEM_MST_B',
167 			p_context         => 'ITEMS',
168 			p_param1          => conflict_columns.descriptive_flex_context_code,
169 			p_param2          => conflict_columns.end_user_column_name,
170 			p_param3          => conflict_columns.application_column_name,
171 			p_param4          => NULL,
172 			p_param5          => NULL,
173 			p_db_error        => NULL,
174 			p_app_short_name  => 'GMI');
175 	END LOOP;
176 
177 END;
178 
179 /*====================================================================
180 --  PROCEDURE:
181 --    validate
182 --
183 --  DESCRIPTION:
184 --    This package contains the procedure used for pre-migration validation
185 --    of the OPM convergence migration.
186 --
187 --  PARAMETERS:
188 --
189 --  SYNOPSIS:
190 --    validate;
191 --
192 --  HISTORY
193 --	Jatinder Gogna - Created - 03/25/05
194 --====================================================================*/
195 
196 PROCEDURE validate (
197 p_migration_run_id	IN	NUMBER) IS
198 
199 CURSOR c_autolot IS
200 SELECT count(*) item_count
201 FROM ic_item_mst_b
202 WHERE lot_ctl = 1 AND
203     autolot_active_indicator <> 1;
204 
205 CURSOR c_lot_status IS
206 SELECT i.item_no, l.lot_no, l.sublot_no, w.orgn_code, w.whse_code, inv.location, inv.lot_status
207 FROM ic_loct_inv inv, ic_item_mst_b i, ic_lots_mst l, ic_whse_mst w
208 WHERE
209     inv.whse_code = w.whse_code AND
210     inv.item_id = i.item_id AND
211     i.lot_ctl = 1 AND
212     inv.item_id = l.item_id AND
213     inv.lot_id = l.lot_id AND
214     inv.loct_onhand <> 0 AND
215     EXISTS (
216 	SELECT 1
217 	FROM ic_loct_inv inv2, ic_whse_mst w2
218 	WHERE
219 	    inv.whse_code = w2.whse_code AND
220 	    inv.item_id = inv2.item_id AND
221 	    inv.lot_id = inv2.lot_id AND
222 			-- Compare the balances within the mapped org
223 		DECODE(w.subinventory_ind_flag, 'Y', w.orgn_code, w.whse_code) =
224 		DECODE(w2.subinventory_ind_flag, 'Y', w2.orgn_code, w2.whse_code) AND
225 			-- Same locations for whse mapped as subinventory will be created as diff locators.
226 		inv.whse_code||inv.location <> inv2.whse_code||inv2.location AND
227 	    inv.lot_status <> inv2.lot_status AND
228 	    inv2.loct_onhand <> 0)
229 ORDER by i.item_no, l.lot_no, l.sublot_no, w.orgn_code, w.whse_code, inv.location;
230 
231 CURSOR c_lot_uniqeness IS
232 SELECT organization_code
233 FROM mtl_parameters
234 WHERE
235     (organization_id IN (
236         SELECT mtl_organization_id
237         FROM ic_whse_mst) OR
238     organization_id IN (
239         SELECT organization_id
240         FROM ic_whse_mst)) AND
241     lot_number_uniqueness <> 2;
242 
243 CURSOR c_org_locator_ctl1 IS
244 SELECT organization_code
245 FROM mtl_parameters
246 WHERE
247     (organization_id IN (
248         SELECT mtl_organization_id
249         FROM ic_whse_mst
250 	WHERE loct_ctl = 1) OR
251     organization_id IN (
252         SELECT organization_id
253         FROM ic_whse_mst
254 	WHERE loct_ctl = 1)) AND
255     stock_locator_control_code <> 4;
256 
257 CURSOR c_sub_locator_ctl IS
258 SELECT distinct p.organization_code, s.secondary_inventory_name
259 FROM mtl_parameters p,
260     mtl_secondary_inventories s,
261     mtl_item_locations l,
262     ic_loct_mst ol
263 WHERE
264     p.organization_id = s.organization_id AND
265     p.organization_id = l.organization_id AND
266     s.secondary_inventory_name = l.subinventory_code AND
267     l.inventory_location_id = ol.inventory_location_id AND
268     s.locator_type <> 5 AND
269     (p.organization_id IN (
270         SELECT mtl_organization_id
271         FROM ic_whse_mst
272         WHERE loct_ctl = 1) OR
273     p.organization_id IN (
274         SELECT organization_id
275         FROM ic_whse_mst
276         WHERE loct_ctl = 1));
277 
278 CURSOR c_org_locator_ctl2 IS
279 SELECT organization_code
280 FROM mtl_parameters
281 WHERE
282     (organization_id IN (
283         SELECT mtl_organization_id
284         FROM ic_whse_mst
285 	WHERE loct_ctl = 0) OR
286     organization_id IN (
287         SELECT organization_id
288         FROM ic_whse_mst
289 	WHERE loct_ctl = 0)) AND
290     stock_locator_control_code <> 1;
291 
292 CURSOR c_neg_balances IS
293 SELECT i.item_no, l.lot_no, l.sublot_no, inv.whse_code, inv.location,
294     inv.loct_onhand, inv.loct_onhand2
295 FROM ic_loct_inv inv,
296     ic_item_mst_b i,
297     ic_lots_mst l
298 WHERE
299     inv.item_id = i.item_id AND
300     inv.item_id = l.item_id AND
301     inv.lot_id = l.lot_id AND
302     ROUND(loct_onhand, 5) <> 0 AND
303     DECODE(i.dualum_ind, 0, 99999, ROUND(loct_onhand2, 5)) <> 0 AND
304     loct_onhand < 0 AND
305     DECODE(i.dualum_ind, 0, 99999, loct_onhand2) < 0;
306 
307 CURSOR c_mix_balances IS
308 SELECT i.item_no, l.lot_no, l.sublot_no, inv.whse_code, inv.location,
309     inv.loct_onhand, inv.loct_onhand2
310 FROM ic_loct_inv inv,
311     ic_item_mst_b i,
312     ic_lots_mst l
313 WHERE
314     inv.item_id = i.item_id AND
315     inv.item_id = l.item_id AND
316     inv.lot_id = l.lot_id AND
317     ROUND(loct_onhand, 5) <> 0 AND
318     ROUND(loct_onhand2, 5) <> 0 AND
319     i.dualum_ind <> 0 AND
320     loct_onhand/ABS(loct_onhand) <> loct_onhand2/ABS(loct_onhand2);
321 
322 CURSOR c_decimal_dust_balances IS
323 SELECT i.item_no, l.lot_no, l.sublot_no, inv.whse_code, inv.location,
324     inv.loct_onhand, inv.loct_onhand2
325 FROM ic_loct_inv inv,
326     ic_item_mst_b i,
327     ic_lots_mst l
328 WHERE
329     inv.item_id = i.item_id AND
330     inv.item_id = l.item_id AND
331     inv.lot_id = l.lot_id AND
332     ROUND(loct_onhand, 5) = 0 AND
333     DECODE(i.dualum_ind, 0, 99999, ROUND(loct_onhand2, 5)) = 0 AND
334     (loct_onhand <> 0 OR loct_onhand2 <> 0);
335 
336 CURSOR c_non_inv_balances IS
337 SELECT i.item_no, l.lot_no, l.sublot_no, inv.whse_code, inv.location,
338     inv.loct_onhand, inv.loct_onhand2
339 FROM ic_loct_inv inv,
340     ic_item_mst_b i,
341     ic_lots_mst l
342 WHERE
343     inv.item_id = i.item_id AND
344     i.noninv_ind = 1 AND
345     inv.item_id = l.item_id AND
346     inv.lot_id = l.lot_id AND
347     ROUND(loct_onhand, 5) <> 0 ;
348 
349 CURSOR c_in_transit_transfers IS
350 select orgn_code, transfer_no
351 from ic_xfer_mst
352 WHERE
353     transfer_status = 2 AND
354     delete_mark = 0;
355 
356 l_delimiter	VARCHAR2(1);
357 
358 BEGIN
359 	-- Check the items which do not have auto lot numbering setup
360 	FOR i IN c_autolot LOOP
361 		-- dbms_output.put_line ('Number of lot controlled items without autolot numbering setup : '|| to_char(i.item_count));
362 		GMA_COMMON_LOGGING.gma_migration_central_log (
363 			p_run_id          => p_migration_run_id,
364 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
365 			p_message_token   => 'GMI_MIG_ITEM_AUTOLOT',
366 			p_table_name      => 'IC_ITEM_MST_B',
367 			p_context         => 'ITEMS',
368 			p_param1          => to_char(i.item_count),
369 			p_param2          => NULL,
370 			p_param3          => NULL,
371 			p_param4          => NULL,
372 			p_param5          => NULL,
373 			p_db_error        => NULL,
374 			p_app_short_name  => 'GMI');
375 	END LOOP;
376 
377 	-- Validate the descriptive flexfield conflicts for items and lots.
378 	validate_desc_flex_definition (p_migration_run_id, 'ITEM_FLEX', 'MTL_SYSTEM_ITEMS');
379 	validate_desc_flex_definition (p_migration_run_id, 'LOTS_FLEX', 'MTL_LOT_NUMBERS');
380 
381 	-- Show any lots with multiple status in different locations.
382 	FOR ls IN c_lot_status LOOP
383 		l_delimiter := NULL;
384 		IF ls.sublot_no is not NULL THEN
385 			l_delimiter := '-';
386 		END IF;
387 		-- dbms_output.put_line ('Lot with multiple status. Item, Lot-Sublot, Whse, Location, Status : '|| ls.item_no||', '||ls.lot_no||l_delimiter||ls.sublot_no||', '||ls.whse_code||', '||ls.location||', '||ls.lot_status);
388 		GMA_COMMON_LOGGING.gma_migration_central_log (
389 			p_run_id          => p_migration_run_id,
390 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
391 			p_message_token   => 'GMI_MIG_MULTIPLE_STATUS_LOT',
392 			p_table_name      => 'IC_LOTS_MST',
393 			p_context         => 'LOTS',
394 			p_param1          => ls.item_no,
395 			p_param2          => ls.lot_no||l_delimiter||ls.sublot_no,
396 			p_param3          => ls.whse_code,
397 			p_param4          => ls.location,
398 			p_param5          => ls.lot_status,
399 			p_db_error        => NULL,
400 			p_app_short_name  => 'GMI');
401 	END LOOP;
402 
403 	-- Validate the lot uniqueness for the existing process enabled organizations.
404 	FOR lu IN c_lot_uniqeness LOOP
405 		-- dbms_output.put_line ('Lot uniqueness not set to NONE for the organization : '||lu.organization_code);
406 		GMA_COMMON_LOGGING.gma_migration_central_log (
407 			p_run_id          => p_migration_run_id,
408 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
409 			p_message_token   => 'GMI_MIG_INCORRECT_LOT_UNIQ',
410 			p_table_name      => 'IC_LOTS_MST',
411 			p_context         => 'LOTS',
412 			p_param1          => lu.organization_code,
413 			p_param2          => NULL,
414 			p_param3          => NULL,
415 			p_param4          => NULL,
416 			p_param5          => NULL,
417 			p_db_error        => NULL,
418 			p_app_short_name  => 'GMI');
419 	END LOOP;
420 
421 	-- Validate the discrete locator control
422 
423 	FOR dl1 IN c_org_locator_ctl1 LOOP
424 		-- dbms_output.put_line ('Locator control not set to Determine at Subinventory for organization corresponding to location controlled OPM warehouses : '||dl1.organization_code);
425 		GMA_COMMON_LOGGING.gma_migration_central_log (
426 			p_run_id          => p_migration_run_id,
427 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
428 			p_message_token   => 'GMI_MIG_INCORRECT_LOCT_CTL',
429 			p_table_name      => 'IC_LOCT_INV',
430 			p_context         => 'INVENTORY BALANCES',
431 			p_param1          => dl1.organization_code,
432 			p_param2          => NULL,
433 			p_param3          => NULL,
434 			p_param4          => NULL,
435 			p_param5          => NULL,
436 			p_db_error        => NULL,
437 			p_app_short_name  => 'GMI');
438 	END LOOP;
439 
440 	FOR dl1 IN c_sub_locator_ctl LOOP
441 		-- dbms_output.put_line ('Locator control not set to Item Level for subinventory corresponding to OPM warehouse locators : '||dl1.organization_code||', '||dl1.secondary_inventory_name);
442 		GMA_COMMON_LOGGING.gma_migration_central_log (
443 			p_run_id          => p_migration_run_id,
444 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
445 			p_message_token   => 'GMI_MIG_INCORRECT_SUB_LOCT_CTL',
446 			p_table_name      => 'IC_LOCT_INV',
447 			p_context         => 'INVENTORY BALANCES',
448 			p_param1          => dl1.organization_code,
449 			p_param2          => dl1.secondary_inventory_name,
450 			p_param3          => NULL,
451 			p_param4          => NULL,
452 			p_param5          => NULL,
453 			p_db_error        => NULL,
454 			p_app_short_name  => 'GMI');
455 	END LOOP;
456 
457 	FOR dl2 IN c_org_locator_ctl2 LOOP
458 		-- dbms_output.put_line ('Locator control not set to None for organization corresponding to non-location controlled OPM warehouses : '||dl2.organization_code);
459 		GMA_COMMON_LOGGING.gma_migration_central_log (
460 			p_run_id          => p_migration_run_id,
461 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
462 			p_message_token   => 'GMI_MIG_INCORRECT_NON_LOCT_CTL',
463 			p_table_name      => 'IC_LOCT_INV',
464 			p_context         => 'INVENTORY BALANCES',
465 			p_param1          => dl2.organization_code,
466 			p_param2          => NULL,
467 			p_param3          => NULL,
468 			p_param4          => NULL,
469 			p_param5          => NULL,
470 			p_db_error        => NULL,
471 			p_app_short_name  => 'GMI');
472 	END LOOP;
473 
474 	-- Show the negative OPM inventory balances.
475 
476 	FOR nb IN c_neg_balances LOOP
477 		-- dbms_output.put_line ('Negative balances exists for item, lot, sublot, whse, location : '||nb.item_no||', '||nb.lot_no||', '||nb.sublot_no||', '||nb.whse_code||', '||nb.location);
478 		GMA_COMMON_LOGGING.gma_migration_central_log (
479 			p_run_id          => p_migration_run_id,
480 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
481 			p_message_token   => 'GMI_MIG_NEG_BALANCES',
482 			p_table_name      => 'IC_LOCT_INV',
483 			p_context         => 'INVENTORY BALANCES',
484 			p_param1          => nb.item_no,
485 			p_param2          => nb.lot_no,
486 			p_param3          => nb.sublot_no,
487 			p_param4          => nb.whse_code,
488 			p_param5          => nb.location,
489 			p_db_error        => NULL,
490 			p_app_short_name  => 'GMI');
491 	END LOOP;
492 
493 	-- Show any OPM balances for dual controlled items which are positive for
494 	-- primary and negative for secondary or vice-versa.
495 
496 	FOR mb IN c_mix_balances LOOP
497 		-- dbms_output.put_line ('Mixed balances for dual quantity exists for item, lot, sublot, whse, location : '||mb.item_no||', '||mb.lot_no||', '||mb.sublot_no||', '||mb.whse_code||', '||mb.location);
498 		GMA_COMMON_LOGGING.gma_migration_central_log (
499 			p_run_id          => p_migration_run_id,
500 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
501 			p_message_token   => 'GMI_MIG_MIX_BALANCES',
502 			p_table_name      => 'IC_LOCT_INV',
503 			p_context         => 'INVENTORY BALANCES',
504 			p_param1          => mb.item_no,
505 			p_param2          => mb.lot_no,
506 			p_param3          => mb.sublot_no,
507 			p_param4          => mb.whse_code,
508 			p_param5          => mb.location,
509 			p_db_error        => NULL,
510 			p_app_short_name  => 'GMI');
511 
512 	END LOOP;
513 
514 	-- Show any decimal dust kind of balances that will not be migrated for convergence.
515 
516 	FOR db IN c_decimal_dust_balances LOOP
517 		-- dbms_output.put_line ('Decimal dust balances exists for item, lot, sublot, whse, location : '||db.item_no||', '||db.lot_no||', '||db.sublot_no||', '||db.whse_code||', '||db.location);
518 		GMA_COMMON_LOGGING.gma_migration_central_log (
519 			p_run_id          => p_migration_run_id,
520 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
521 			p_message_token   => 'GMI_MIG_DUST_BALANCES',
522 			p_table_name      => 'IC_LOCT_INV',
523 			p_context         => 'INVENTORY BALANCES',
524 			p_param1          => db.item_no,
525 			p_param2          => db.lot_no,
526 			p_param3          => db.sublot_no,
527 			p_param4          => db.whse_code,
528 			p_param5          => db.location,
529 			p_db_error        => NULL,
530 			p_app_short_name  => 'GMI');
531 	END LOOP;
532 
533 	-- Display balances for non-inv items
534 	FOR nb IN c_non_inv_balances LOOP
535 		-- dbms_output.put_line ('Inventory balances exists for non-inventory item, lot, sublot, whse, location : '||nb.item_no||', '||nb.lot_no||', '||nb.sublot_no||', '||nb.whse_code||', '||nb.location);
536 		GMA_COMMON_LOGGING.gma_migration_central_log (
537 			p_run_id          => p_migration_run_id,
538 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
539 			p_message_token   => 'GMI_MIG_NEG_BALANCES',
540 			p_table_name      => 'IC_LOCT_INV',
541 			p_context         => 'INVENTORY BALANCES',
542 			p_param1          => nb.item_no,
543 			p_param2          => nb.lot_no,
544 			p_param3          => nb.sublot_no,
545 			p_param4          => nb.whse_code,
546 			p_param5          => nb.location,
547 			p_db_error        => NULL,
548 			p_app_short_name  => 'GMI');
549 	END LOOP;
550 
551 	-- Display in-transit transfers
552 	FOR tb IN c_in_transit_transfers LOOP
553 		-- dbms_output.put_line ('In Transit transfer exists : ' || tb.orgn_code ||' '||tb.transfer_no);
554 		GMA_COMMON_LOGGING.gma_migration_central_log (
555 			p_run_id          => p_migration_run_id,
556 			p_log_level       => FND_LOG.LEVEL_PROCEDURE,
557 			p_message_token   => 'GMI_MIG_INTRANS_BALANCES',
558 			p_table_name      => 'IC_LOCT_INV',
559 			p_context         => 'INVENTORY BALANCES',
560 			p_param1          => tb.orgn_code ||' '||tb.transfer_no,
561 			p_param2          => NULL,
562 			p_param3          => NULL,
563 			p_param4          => NULL,
564 			p_param5          => NULL,
565 			p_db_error        => NULL,
566 			p_app_short_name  => 'GMI');
567 
568 	END LOOP;
569 
570 END;
571 
572 END GMI_Pre_Migration;