DBA Data[Home] [Help]

PACKAGE BODY: APPS.FARX_MCR

Source


1 PACKAGE BODY FARX_MCR AS
2 /* $Header: FARXMCRB.pls 120.5 2009/04/09 05:55:06 deemitta ship $ */
3 
4 
5 -- Mass change record from fa_mass_changes table.
6 mc_rec     FA_MASS_CHG_UTILS_PKG.mass_change_rec_type;
7 
8 -- Table of asset records.
9 -- (Stores book_type_code as well, and thus one asset will appear multiple
10 --  times if the asset belongs to multiple books.)
11 a_tbl       FA_MASS_CHG_UTILS_PKG.asset_tbl_type;
12 
13 -- Index into the asset table, a_tbl.
14 a_index          NUMBER := 0;
15 
16 -- Number of assets(disregaring book_type_code) stored in a_tbl.
17 -- Reset at every 200 assets.
18 g_asset_count      NUMBER := 0;
19 
20 /* a_index <> g_asset_count if asset belongs to more than one book. */
21 
22 g_print_debug boolean := fa_cache_pkg.fa_print_debug;
23 
24 
25 /*============================================================================+
26 |   PROCEDURE Review_Change                                                   |
27 +=============================================================================*/
28 
29 PROCEDURE Review_Change(
30      X_Mass_Change_Id     IN     NUMBER,
31      X_RX_Flag            IN     VARCHAR2 := 'NO',
32      retcode              OUT NOCOPY NUMBER,
33      errbuf               OUT NOCOPY VARCHAR2) IS
34 
35     -- cursor to fetch the current and review status
36     CURSOR get_status IS
37         SELECT  lu_rev.meaning,
41         WHERE   lu_rev.lookup_type = 'MASS_TRX_STATUS'  AND
38                 lu_curr.meaning
39         FROM    fa_lookups lu_rev,
40                 fa_lookups lu_curr
42                 lu_rev.lookup_code = 'COMPLETED'
43         AND     lu_curr.lookup_type = 'MASS_TRX_STATUS' AND
44                 lu_curr.lookup_code = mc_rec.status;
45 
46     -- cursor to get category flexfield structure.
47     CURSOR get_cat_flex_struct IS
48      SELECT category_flex_structure
49        FROM fa_system_controls;
50 
51     -- cursor to fetch mass change record from fa_mass_change
52     CURSOR mass_change IS
53      SELECT mc.mass_change_id,
54             mc.book_type_code,
55             mc.transaction_date_entered,
56             mc.concurrent_request_id,
57             mc.status,
58             mc.asset_type,
59             mc.category_id,
60             mc.from_asset_number,
61             mc.to_asset_number,
62             mc.from_date_placed_in_service,
63             mc.to_date_placed_in_service,
64             mc.from_convention,
65             mc.to_convention,
66             mc.from_method_code,
67             mc.to_method_code,
68             mc.from_life_in_months,
69             mc.to_life_in_months,
70             mc.from_bonus_rule,
71             mc.to_bonus_rule,
72             mc.date_effective,
73             mc.from_basic_rate,
74             mc.to_basic_rate,
75             mc.from_adjusted_rate,
76             mc.to_adjusted_rate,
77             mc.from_production_capacity,
78             mc.to_production_capacity,
79             mc.from_uom,
80             mc.to_uom,
81             mc.from_group_association,
82             mc.to_group_association,
83             mc.from_group_asset_id,
84             mc.to_group_asset_id,
85             gad1.asset_number,
86             gad2.asset_number,
87             mc.change_fully_rsvd_assets,
88             mc.amortize_flag,
89             mc.created_by,
90             mc.creation_date,
91             mc.last_updated_by,
92             mc.last_update_login,
93             mc.last_update_date,
94             mc.from_salvage_type,
95             mc.to_salvage_type,
96             mc.from_percent_salvage_value,
97             mc.to_percent_salvage_value,
98             mc.from_salvage_value,
99             mc.to_salvage_value,
100             mc.from_deprn_limit_type,
101             mc.to_deprn_limit_type,
102             mc.from_deprn_limit,
103             mc.to_deprn_limit,
104             mc.from_deprn_limit_amount,
105             mc.to_deprn_limit_amount
106        FROM fa_mass_changes mc,
107             fa_additions_b gad1,
108             fa_additions_b gad2
109       WHERE mass_change_id = X_Mass_Change_Id
110         AND mc.from_group_asset_id = gad1.asset_id(+)
111         AND mc.to_group_asset_id   = gad2.asset_id(+);
112 
113     -- asset-book records that were changed by mass change
114 
115     CURSOR mass_change_assets IS
116      SELECT ad.asset_id,
117             ad.asset_number,
118             ad.description,
119             ad.asset_type,
120             bk1.book_type_code,
121             ad.asset_category_id,
122             NULL,
123             bk1.prorate_convention_code,
124             bk2.prorate_convention_code,
125             bk1.deprn_method_code,
126             bk2.deprn_method_code,
127             bk1.life_in_months,
128             bk2.life_in_months,
129             NULL,
130             NULL,
131             bk1.basic_rate,
132             bk2.basic_rate,
133             NULL,
134             NULL,
135             bk1.adjusted_rate,
136             bk2.adjusted_rate,
137             NULL,
138             NULL,
139             bk1.bonus_rule,
140             bk2.bonus_rule,
141             bk1.production_capacity,
142             bk2.production_capacity,
143             bk1.unit_of_measure,
144             bk2.unit_of_measure,
145             gad1.asset_number,
146             gad2.asset_number,
147             bk1.salvage_type,
148             bk2.salvage_type,
149             bk1.percent_salvage_value,
150             bk2.percent_salvage_value,
151             bk1.salvage_value,
152             bk2.salvage_value,
153             bk1.deprn_limit_type,
154             bk2.deprn_limit_type,
155             bk1.allowed_deprn_limit,
156             bk2.allowed_deprn_limit,
157             bk1.allowed_deprn_limit_amount,
158             bk2.allowed_deprn_limit_amount
159         FROM    fa_books                bk1,
160                 fa_books                bk2,
161                 fa_additions            ad,
162                 fa_additions_b          gad1,
163                 fa_additions_b          gad2,
164                 fa_transaction_headers  th
165         WHERE   th.mass_transaction_id = mc_rec.mass_change_id
166         AND     th.member_transaction_header_id is null  -- exclude the spawned adjustments on groups
167         AND     ad.asset_id = th.asset_id
168         AND     bk1.asset_id = th.asset_id
169         AND     bk2.asset_id = th.asset_id
170         AND     bk1.book_type_code = th.book_type_code
171         AND     bk2.book_type_code = th.book_type_code
172         AND     bk1.transaction_header_id_out = th.transaction_header_id
173         AND     bk2.transaction_header_id_in  = th.transaction_header_id
174         AND     bk1.group_asset_id = gad1.asset_id(+)
175         AND     bk2.group_asset_id = gad2.asset_id(+)
176         ORDER BY ad.asset_number;
177 
181     h_request_id         NUMBER;
178     -- to store th.transaction_header_id in the cursor above.
179     h_mch_thid           NUMBER(15);
180 
182     h_msg_count          NUMBER;
183     h_msg_data           VARCHAR2(2000) := NULL;
184     -- Bug#6870987 Resetting Variable size.
185     h_review_status_d    VARCHAR2(50);
186     h_current_status_d   VARCHAR2(50);
187     h_cat_flex_struct    NUMBER;
188     h_cat_segs           FA_RX_SHARED_PKG.Seg_Array;
189     h_category_id        NUMBER(15) := NULL;
190     h_concat_cat         VARCHAR2(1000);
191     h_debug_flag         VARCHAR2(20) := 'NO';
192 
193     -- to keep track of the last asset id that entered the mass_change_assets
194     -- cursor loop.
195     h_last_asset         NUMBER(15) := NULL;
196 
197     -- indicates whether the book information was found.  used only when
198     -- redefault option was set to YES.
199     h_bk_info_found      BOOLEAN;
200 
201     -- exception raised from this module and child modules.
202     mchg_failure         EXCEPTION;
203 
204     -- Commit results per every 200 assets.
205     h_commit_level       NUMBER := 200;
206     -- Bug#6870987 Resetting Variable size.
207     /* do not need these variables as per bug 8402286
208        need to remove large rollback segment
209     rbs_name             VARCHAR2(60);
210     sql_stmt             VARCHAR2(500);
211     */
212 
213 BEGIN
214 
215     -- Initialize message stacks.
216     FA_SRVR_MSG.Init_Server_Message;
217     FA_DEBUG_PKG.Initialize;
218 
219     /* Bug 8402286 removing LARGE ROLLBACK SEGMENT
220     -- Set large rollback segment.
221     fnd_profile.get('FA_LARGE_ROLLBACK_SEGMENT', rbs_name);
222     IF (rbs_name is not null) THEN
223         sql_stmt := 'Set Transaction Use Rollback Segment '|| rbs_name;
224         execute immediate sql_stmt;
225     END IF;
226     */
227     -- Initialize global variables.
228     -- (These are session specific variables, and thus values need to
229     --  be re-initialized.)
230     a_tbl.delete;
231     a_index := 0;
232     g_asset_count := 0;
233 
234     -- Get concurrent request id for the mass change review request.
235     -- h_request_id is used when request_id is inserted into the interface
236     -- table, fa_mass_changes_itf.
237     -- Need to fetch request id from fnd_global package instead of fa_mass_changes
238     -- table, since fa_mass_changes table stores the latest request id for
239     -- the Preview or Run requests only.
240     h_request_id := fnd_global.conc_request_id;
241 
242     -- Fetch mass changes record information.
243     OPEN mass_change;
244     FETCH mass_change INTO
245             mc_rec.mass_change_id,
246             mc_rec.book_type_code,
247             mc_rec.transaction_date_entered,
248             mc_rec.concurrent_request_id,
249             mc_rec.status,
250             mc_rec.asset_type,
251             mc_rec.category_id,
252             mc_rec.from_asset_number,
253             mc_rec.to_asset_number,
254             mc_rec.from_date_placed_in_service,
255             mc_rec.to_date_placed_in_service,
256             mc_rec.from_convention,
257             mc_rec.to_convention,
258             mc_rec.from_method_code,
259             mc_rec.to_method_code,
260             mc_rec.from_life_in_months,
261             mc_rec.to_life_in_months,
262             mc_rec.from_bonus_rule,
263             mc_rec.to_bonus_rule,
264             mc_rec.date_effective,
265             mc_rec.from_basic_rate,
266             mc_rec.to_basic_rate,
267             mc_rec.from_adjusted_rate,
268             mc_rec.to_adjusted_rate,
269             mc_rec.from_production_capacity,
270             mc_rec.to_production_capacity,
271             mc_rec.from_uom,
272             mc_rec.to_uom,
273             mc_rec.from_group_association,
274             mc_rec.to_group_association,
275             mc_rec.from_group_asset_id,
276             mc_rec.to_group_asset_id,
277             mc_rec.from_group_asset_number,
278             mc_rec.to_group_asset_number,
279             mc_rec.change_fully_rsvd_assets,
280             mc_rec.amortize_flag,
281             mc_rec.created_by,
282             mc_rec.creation_date,
283             mc_rec.last_updated_by,
284             mc_rec.last_update_login,
285             mc_rec.last_update_date,
286             mc_rec.from_salvage_type,
287             mc_rec.to_salvage_type,
288             mc_rec.from_percent_salvage_value,
289             mc_rec.to_percent_salvage_value,
290             mc_rec.from_salvage_value,
291             mc_rec.to_salvage_value,
292             mc_rec.from_deprn_limit_type,
293             mc_rec.to_deprn_limit_type,
294             mc_rec.from_deprn_limit,
295             mc_rec.to_deprn_limit,
296             mc_rec.from_deprn_limit_amount,
297             mc_rec.to_deprn_limit_amount;
298     CLOSE mass_change;
299 
300     if not(fa_cache_pkg.fazcbc(X_book => mc_rec.book_type_code)) then
301        raise mchg_failure;
302     end if;
303 
304     g_print_debug := fa_cache_pkg.fa_print_debug;
305 
306     -- Set debug flag.
307     IF (g_print_debug) THEN
308        h_debug_flag := 'YES';
309     END IF;
310 
311     /*===========================================================================
312       Delete rows previously inserted into the interface table with the same
313       request id, if there is any.
314      ===========================================================================*/
318 
315     DELETE FROM fa_mass_changes_itf
316     WHERE request_id = h_request_id;
317     COMMIT;
319     /*===========================================================================
320       Check to make sure current status is 'COMPLETED'
321      ===========================================================================*/
322     OPEN get_status;
323     FETCH get_status INTO h_review_status_d, h_current_status_d;
324     CLOSE get_status;
325 
326     if g_print_debug then
327       fa_debug_pkg.add('FARX_CR.Review_Change',
328                        'After fetching status',
329                        '');
330     end if;
331 
332     IF (h_review_status_d <> h_current_status_d) THEN
333         -- Re-using message for mass changes program.
334         FA_SRVR_MSG.Add_Message(
335                 CALLING_FN => 'FARX_RR.Review_Change',
336                 NAME => 'FA_MASSRCL_WRONG_STATUS',
337                 TOKEN1 => 'CURRENT',
338                 VALUE1 => h_current_status_d,
339                 TOKEN2 => 'RUNNING',
340                 VALUE2 => h_review_status_d);
341         -- Review will complete with error status.
342         RAISE mchg_failure;
343     END IF;
344 
345     /*===========================================================================
346       Insert review records into the interface table.
347      ===========================================================================*/
348 
349     if g_print_debug then
350       fa_debug_pkg.add('FARX_CR.Review_Change',
351                        'getting cat structure',
352                        '');
353     end if;
354 
355 
356     /* Get category flex structure. */
357     OPEN get_cat_flex_struct;
358     FETCH get_cat_flex_struct INTO h_cat_flex_struct;
359     CLOSE get_cat_flex_struct;
360 
361     OPEN mass_change_assets;
362 
363     LOOP
364 
365        if g_print_debug then
366          fa_debug_pkg.add('FARX_CR.Review_Change',
367                           'in loop',
368                           '');
369        end if;
370 
371        -- Fetch the asset-book pair into the pl/sql table.
372        a_index := a_index + 1;
373 
374        FETCH mass_change_assets INTO
375           a_tbl(a_index).asset_id,
376           a_tbl(a_index).asset_number,
377           a_tbl(a_index).description,
378           a_tbl(a_index).asset_type,
379           a_tbl(a_index).book_type_code,
380           a_tbl(a_index).category_id,
381           a_tbl(a_index).category,
382           a_tbl(a_index).from_convention,
383           a_tbl(a_index).to_convention,
384           a_tbl(a_index).from_method,
385           a_tbl(a_index).to_method,
386           a_tbl(a_index).from_life_in_months,
387           a_tbl(a_index).to_life_in_months,
388           a_tbl(a_index).from_life,
389           a_tbl(a_index).to_life,
390           a_tbl(a_index).from_basic_rate,
391           a_tbl(a_index).to_basic_rate,
392           a_tbl(a_index).from_basic_rate_pct,
393           a_tbl(a_index).to_basic_rate_pct,
394           a_tbl(a_index).from_adjusted_rate,
395           a_tbl(a_index).to_adjusted_rate,
396           a_tbl(a_index).from_adjusted_rate_pct,
397           a_tbl(a_index).to_adjusted_rate_pct,
398           a_tbl(a_index).from_bonus_rule,
399           a_tbl(a_index).to_bonus_rule,
400           a_tbl(a_index).from_capacity,
401           a_tbl(a_index).to_capacity,
402           a_tbl(a_index).from_unit_of_measure,
403           a_tbl(a_index).to_unit_of_measure,
404           a_tbl(a_index).from_group_asset_number,
405           a_tbl(a_index).to_group_asset_number,
406           a_tbl(a_index).from_salvage_type,
407           a_tbl(a_index).to_salvage_type,
408           a_tbl(a_index).from_percent_salvage_value,
409           a_tbl(a_index).to_percent_salvage_value,
410           a_tbl(a_index).from_salvage_value,
411           a_tbl(a_index).to_salvage_value,
412           a_tbl(a_index).from_deprn_limit_type,
413           a_tbl(a_index).to_deprn_limit_type,
414           a_tbl(a_index).from_deprn_limit,
415           a_tbl(a_index).to_deprn_limit,
416           a_tbl(a_index).from_deprn_limit_amount,
417           a_tbl(a_index).to_deprn_limit_amount;
418        EXIT WHEN mass_change_assets%NOTFOUND;
419 
420        -- Get category in concatenated string format.
421        FA_RX_SHARED_PKG.Concat_Category(
422                   struct_id       => h_cat_flex_struct,
423                   ccid            => a_tbl(a_index).category_id,
424                   concat_string   => a_tbl(a_index).category,
425                   segarray        => h_cat_segs);
426        h_concat_cat := a_tbl(a_index).category;
427 
428        -- Convert formats for certain fields.
429 
430        -- life...
431        -- Need to get the substring from the second position, since
432        -- to_char conversion with the format, always attaches extra space
433        -- at the beginning of the string.
434 
435        IF a_tbl(a_index).From_Life_In_Months IS NOT NULL THEN
436           a_tbl(a_index).From_Life := lpad(to_char(trunc(a_tbl(a_index).From_Life_In_Months/12)), 3)||'.'||
437              substr(to_char(mod(a_tbl(a_index).From_Life_In_Months, 12), '00'), 2, 2);
438        ELSE
439           a_tbl(a_index).From_Life := NULL;
440        END IF;
441 
442        IF a_tbl(a_index).To_Life_In_Months IS NOT NULL THEN
443           a_tbl(a_index).To_Life := lpad(to_char(trunc(a_tbl(a_index).To_Life_In_Months/12)), 3)||'.'||
444             substr(to_char(mod(a_tbl(a_index).To_Life_In_Months, 12), '00'), 2, 2);
445        ELSE
446           a_tbl(a_index).To_Life := NULL;
447        END IF;
448 
449        -- rates...
450        -- May use the following format in report output:
454        IF a_tbl(a_index).From_Basic_Rate IS NOT NULL THEN
451        -- substr(to_char(round(a_tbl(a_index).From_Basic_Rate*100, 2), '999.99'), 2, 6) or
452        -- lpad(to_char(round(a_tbl(a_index).From_Basic_Rate*100, 2)), 6)
453 
455           a_tbl(a_index).From_Basic_Rate_Pct := round(a_tbl(a_index).From_Basic_Rate*100, 2);
456        ELSE
457           a_tbl(a_index).From_Basic_Rate_Pct := NULL;
458        END IF;
459 
460        IF a_tbl(a_index).To_Basic_Rate IS NOT NULL THEN
461           a_tbl(a_index).To_Basic_Rate_Pct := round(a_tbl(a_index).To_Basic_Rate*100, 2);
462        ELSE
463           a_tbl(a_index).To_Basic_Rate_Pct := NULL;
464        END IF;
465 
466        IF a_tbl(a_index).From_Adjusted_Rate IS NOT NULL THEN
467           a_tbl(a_index).From_Adjusted_Rate_Pct := round(a_tbl(a_index).From_Adjusted_Rate*100, 2);
468        ELSE
469           a_tbl(a_index).From_Adjusted_Rate_Pct := NULL;
470        END IF;
471 
472        IF a_tbl(a_index).To_Adjusted_Rate IS NOT NULL THEN
473           a_tbl(a_index).To_Adjusted_Rate_Pct := round(a_tbl(a_index).To_Adjusted_Rate*100, 2);
474        ELSE
475           a_tbl(a_index).To_Adjusted_Rate_Pct := NULL;
476        END IF;
477 
478 
479 
480 
481        -- Update last asset processed and the asset count.
482        IF (a_tbl(a_index).asset_id <> h_last_asset OR
483           h_last_asset IS NULL) THEN
484           h_last_asset := a_tbl(a_index).asset_id;
485           g_asset_count := g_asset_count + 1;
486        END IF;
487 
488        /* Insert asset records into the interface table, FA_MASS_CHANGES_ITF,
489           at every 200 assets and re-initialize the counter and the asset table. */
490        -- If the 200th asset belongs to more than one book, only the information
491        -- for the first book of this asset will be inserted into the table.
492        -- The rest will be taken care of in the next insertion.
493 
494        IF (g_asset_count = h_commit_level) THEN
495           FOR i IN 1 .. a_index LOOP
496              FA_MASS_CHG_UTILS_PKG.Insert_Itf(
497                      X_Report_Type           => 'REVIEW',
498                      X_Request_Id            => h_request_id,
499                      X_Mass_Change_Id        => X_Mass_Change_Id,
500                      X_Asset_Rec             => a_tbl(i),
501                      X_Last_Update_Date      => mc_rec.last_update_date,
502                      X_Last_Updated_By       => mc_rec.last_updated_by,
503                      X_Created_By            => mc_rec.created_by,
504                      X_Creation_Date         => mc_rec.creation_date,
505                      X_Last_Update_Login     => mc_rec.last_update_login,
506                      p_log_level_rec         => null
507                      );
508           END LOOP;
509 
510           a_tbl.delete;
511           g_asset_count := 0;
512           a_index := 0;
513           -- Also re-initialize h_last_asset so that g_asset_count
514           -- is incremented to 1 at the next loop entry as in the former
515           -- insertion.
516           h_last_asset := NULL;
517           COMMIT WORK;
518 
519        END IF;
520 
521     END LOOP;
522 
523     CLOSE mass_change_assets;
524 
525     /* Insert the remaining asset records into the interface table. */
526     -- Up to a_index - 1, to account for the extra increment taken for a_index
527     -- when no more rows were found in the cursor loop.
528     FOR i IN 1 .. (a_index - 1) LOOP
529        FA_MASS_CHG_UTILS_PKG.Insert_Itf(
530              X_Report_Type           => 'REVIEW',
531              X_Request_Id            => h_request_id,
532              X_Mass_Change_Id        => X_Mass_Change_Id,
533              X_Asset_Rec             => a_tbl(i),
534              X_Last_Update_Date      => mc_rec.last_update_date,
535              X_Last_Updated_By       => mc_rec.last_updated_by,
536              X_Created_By            => mc_rec.created_by,
537              X_Creation_Date         => mc_rec.creation_date,
538              X_Last_Update_Login     => mc_rec.last_update_login,
539              p_log_level_rec         => null
540              );
541 
542     END LOOP;
543 
544     a_tbl.delete;
545     g_asset_count := 0;
546     a_index := 0;
547 
548     fa_rx_conc_mesg_pkg.log('');
549     fnd_message.set_name('OFA', 'FA_MASSRCL_CHG_RVW');
550     h_msg_data := fnd_message.get;
551     fa_rx_conc_mesg_pkg.log(h_msg_data);
552     fa_rx_conc_mesg_pkg.log('');
553     COMMIT WORK;
554 
555 
556            FND_MSG_PUB.Count_And_Get(
557                 p_count         => h_msg_count,
558                 p_data          => h_msg_data);
559             FA_SRVR_MSG.Write_Msg_Log(
560                 msg_count       => h_msg_count,
561                 msg_data        => h_msg_data);
562             IF (h_debug_flag = 'YES') THEN
563                 FA_DEBUG_PKG.Write_Debug_Log;
564             END IF;
565 
566     errbuf := ''; -- No error.
567     retcode := 0; -- Completed normally.
568 
569 EXCEPTION
570     WHEN mchg_failure THEN
571        retcode := 2;  -- Completed with error.
572 
573        -- Reset global variable values.
574        a_tbl.delete;
575        a_index := 0;
576        g_asset_count := 0;
577        /* A fatal error has occurred.  Rollback transaction. */
578        ROLLBACK WORK;
579        /* Delete rows inserted into the interface table. */
580        DELETE FROM fa_mass_changes_itf
581         WHERE request_id = h_request_id;
582        /* Commit changes. */
583        COMMIT WORK;
584        /* Retrieve message log and write result to log and output. */
585 
586        IF (X_RX_Flag = 'YES') THEN
587             FND_MSG_PUB.Count_And_Get(
588                 p_count         => h_msg_count,
589                 p_data          => h_msg_data);
590             FA_SRVR_MSG.Write_Msg_Log(
591                 msg_count       => h_msg_count,
592                 msg_data        => h_msg_data);
593             IF (h_debug_flag = 'YES') THEN
594                 FA_DEBUG_PKG.Write_Debug_Log;
595             END IF;
596        END IF;
597     WHEN OTHERS THEN
598        retcode := 2;  -- Completed with error.
599        IF SQLCODE <> 0 THEN
600           FA_SRVR_MSG.Add_SQL_Error(CALLING_FN => 'FARX_RP.Review_Change');
601        END IF;
602 
603        -- Reset global variable values.
604        a_tbl.delete;
605        a_index := 0;
606        g_asset_count := 0;
607        --g_total_assets := 0;
608        /* A fatal error has occurred.  Rollback transaction. */
609        ROLLBACK WORK;
610        /* Delete rows inserted into the interface table. */
611        DELETE FROM fa_mass_changes_itf
612         WHERE request_id = h_request_id;
613        /* Commit changes. */
614        COMMIT WORK;
615        /* Retrieve message log and write result to log and output. */
616        IF (X_RX_Flag = 'YES') THEN
617           FND_MSG_PUB.Count_And_Get(
618                 p_count         => h_msg_count,
619                 p_data          => h_msg_data);
620             FA_SRVR_MSG.Write_Msg_Log(
621                 msg_count       => h_msg_count,
622                 msg_data        => h_msg_data);
623             IF (h_debug_flag = 'YES') THEN
624                 FA_DEBUG_PKG.Write_Debug_Log;
625             END IF;
626        END IF;
627 
628 END Review_Change;
629 
630 END FARX_MCR;