DBA Data[Home] [Help]

PACKAGE BODY: APPS.QLTTRAWB

Source


1 PACKAGE BODY QLTTRAWB as
2 /* $Header: qlttrawb.plb 120.18.12010000.4 2008/10/17 08:02:38 pdube ship $ */
3 -- 1/23/96 - created
4 -- Paul Mishkin
5 
6     --
7     -- Standard who columns.
8     --
9     who_program_id                       number := fnd_global.conc_program_id;
10     who_program_application_id           number := fnd_global.prog_appl_id;
11     who_created_by			 number;
12     who_last_update_login                number;
13     who_user_id                          number;
14 
15     --
16     -- A rather unusual situation, we will use the request id of the
17     -- parent (import manager).  This will be set in the wrapper.
18     --
19     who_request_id                       number := fnd_global.conc_request_id;
20 
21 TYPE NUMBER_TABLE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
22 TYPE CHAR30_TABLE IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
23 TYPE CHAR150_TABLE IS TABLE OF VARCHAR2(150) INDEX BY BINARY_INTEGER;
24 TYPE CHAR1500_TABLE IS TABLE OF VARCHAR2(1500) INDEX BY BINARY_INTEGER;
25 TYPE CHAR2000_TABLE IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
26 
27   -- Bug 3785197. Update was failing if read only or sequence elements was set as matching element.
28   -- Declaring the following global variables.
29   -- --------------------------------------------------------------------------------------------------
30   --    Variable                     Description                 Intialised                  Used/Modified
31   -- ---------------------------------------------------------------------------------------------------
32   --(1) G_TYPE_OF_TXN         Holds 1 (Insert) or             QLTTRAWB.WRAPPER()          VALIDATE_STEPS ()
33   --                                2 (Update
34   --
35   --(2) G_MATCHING_CHAR_TABLE  Table of collection elements   VALIDATE_UPDATE              CHECK_IF_MATCHING_
36   --                           specified as matching element.            _TYPE_RECORDS()             ELEMENT()  --
37   --(3) G_TOTAL_MATCHES        Number of matching elements.    VALIDATE_UPDATE              CHECK_IF_MATCHING_
38   --                                                                  _TYPE_RECORDS()              ELEEMENT()
39   -- srhariha. Fri Jul 23 03:04:52 PDT 2004.
40 
41 G_TYPE_OF_TXN NUMBER;
42 G_MATCHING_CHAR_TABLE CHAR30_TABLE;
43 G_TOTAL_MATCHES NUMBER;
44 
45 
46 -- globals for translated error messages
47 
48 ERROR_REJECT VARCHAR2(2000);
49 ERROR_DISABLED VARCHAR2(2000);
50 ERROR_MANDATORY VARCHAR2(2000);
51 ERROR_NEED_PARENT VARCHAR2(2000);
52 ERROR_INVALID_VALUE VARCHAR2(2000);
53 ERROR_OUTSIDE_LIMITS VARCHAR2(2000);
54 ERROR_CRITICAL VARCHAR2(2000);
55 ERROR_INVALID_NUMBER VARCHAR2(2000);
56 ERROR_INVALID_DATE VARCHAR2(2000);
57 ERROR_NEED_REV VARCHAR2(2000);
58 ERROR_CANT_HAVE_REV VARCHAR2(2000);
59 ERROR_CANT_HAVE_LOC VARCHAR2(2000);
60 ERROR_BUSY VARCHAR2(2000);
61 ERROR_BAD_SQL VARCHAR2(2000);
62 
63 -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
64 G_SEQUENCE_DEFAULT  VARCHAR2(40);
65 
66 -- Tracking Bug : 3104827. Review Tracking Bug : 3148873
67 -- Global Error Message for READ ONLY FLAG Collection Plan Element
68 -- saugupta Wed Aug 27 07:25:51 PDT 2003.
69 ERROR_READ_ONLY VARCHAR2(2000);
70 
71 -- Bug 3069404 ksoh Tue Mar 16 10:43:36 PST 2004
72 -- Error message for importing sequence element
73 ERROR_SEQUENCE VARCHAR2(2000);
74 
75 -- Added for Timezone Compliance Date and Time elements.
76 -- kabalakr Mon Oct 27 04:33:49 PST 2003.
77 ERROR_INVALID_DATETIME VARCHAR2(2000);
78 
79 
80 -- Global exceptions
81 
82 g_col_name VARCHAR2(30);
83 g_sqlerrm varchar2(240);
84 
85 -- A constant to fool GSCC.  See bug 3554899
86 -- bso Wed Apr  7 22:27:11 PDT 2004
87 g_period CONSTANT VARCHAR2(1) := '.';
88 
89 user_sql_error EXCEPTION;
90 
91 resource_busy EXCEPTION;
92 PRAGMA EXCEPTION_INIT(resource_busy, -54);
93 
94  -- 3785197. Update was failing if read only or sequence elements was set as matching element.
95  -- Added new function CHECK_IF_MATCHING_ELEMENT which returns true if P_CHAR_NAME is mentioned
96  -- as matching element. Used in VALIDATE_SEQUENCE and VALIDATE_STEPS procedures.
97  -- srhariha. Fri Jul 23 03:04:52 PDT 2004.
98 
99 
100 FUNCTION CHECK_IF_MATCHING_ELEMENT (P_CHAR_NAME VARCHAR2) RETURN boolean IS
101 
102 BEGIN
103   IF (G_TOTAL_MATCHES IS NOT NULL) THEN
104 
105       FOR I IN 1..G_TOTAL_MATCHES LOOP
106           IF (upper(G_MATCHING_CHAR_TABLE(I)) = upper(P_CHAR_NAME)) THEN
107              RETURN TRUE;
108           END IF;
109       END LOOP;
110 
111   END IF;
112 
113   RETURN FALSE;
114 
115 END CHECK_IF_MATCHING_ELEMENT;
116 
117 
118 
119 PROCEDURE parse_error_columns(
120     p_cols IN VARCHAR2,
121     x_col1 OUT NOCOPY VARCHAR2,
122     x_col2 OUT NOCOPY VARCHAR2,
123     x_col3 OUT NOCOPY VARCHAR2,
124     x_col4 OUT NOCOPY VARCHAR2,
125     x_col5 OUT NOCOPY VARCHAR2) IS
126     --
127     -- SQL Bind Project for performance.
128     -- There is an IN operation in many places of the form:
129     -- IN ERR_COL_LIST.  This is a literal SQL.  The fact
130     -- that an err_col_list can contain at most 5 tokens can
131     -- be used to make this into a bind SQL.  (See validate_steps).
132     -- This procedure parses out the various columns from the list
133     -- into separate tokens.  'NULL' will be substituted if there
134     -- is no string in that position.
135     --
136 
137     -- Bug 3136107.Same as the fix done in Bug 3079312. suramasw.
138 
139     s VARCHAR2(2000) := p_cols;
140     p INTEGER;
141     i INTEGER := 1;
142     val dbms_sql.varchar2s;
143 
144 BEGIN
145     val(1) := '';
146     val(2) := '';
147     val(3) := '';
148     val(4) := '';
149     val(5) := '';
150 
151     --
152     -- Get rid of single-quotes
153     --
154     s := translate(s, '''', ' ');
155 
156     --
157     -- Loop until , is not found
158     --
159     p := instr(s, ',');
160 
161     WHILE p <> 0 LOOP
162         -- found a comma, splice everything in front
163         val(i) := rtrim(ltrim(substr(s, 1, p-1)));
164         s := substr(s, p+1);
165         p := instr(s, ',');
166         i := i + 1;
167     END LOOP;
168     val(i) := rtrim(ltrim(s));
169 
170     x_col1 := val(1);
171     x_col2 := val(2);
172     x_col3 := val(3);
173     x_col4 := val(4);
174     x_col5 := val(5);
175 
176 END parse_error_columns;
177 
178 FUNCTION despecial(s1 in varchar2) RETURN varchar2 IS
179 BEGIN
180     RETURN translate(s1, ' ''*{}', '_____');
181 END despecial;
182 
183 
184 FUNCTION dequote(s1 in varchar2) RETURN varchar2 IS
185 --
186 -- The string s1 may be used in a dynamically constructed SQL
187 -- statement.  If s1 contains a single quote, there will be syntax
188 -- error.  This function returns a string s2 that is same as s1
189 -- except each single quote is replaced with two single quotes.
190 -- Put in for NLS fix.  Previously if plan name or element name
191 -- contains a single quote, that will cause problem when creating
192 -- views.
193 -- bso
194 --
195 BEGIN
196     RETURN replace(s1, '''', '''''');
197 END dequote;
198 
199 
200 FUNCTION quote(s1 in varchar2) RETURN varchar2 IS
201 --
202 -- Add single quotes surrounding string s1 to be used in dynamic
203 -- SQL.  This means any single quote already in s1 must be changed
204 -- to two single quotes.
205 -- bso
206 --
207 BEGIN
208     RETURN '''' || replace(s1, '''', '''''') || '''';
209 END quote;
210 
211 
212 -- Bug 4270911. CU2 SQL Literal fix. TD #23
213 -- Helper procedures for validate_actions.
214 -- srhariha. Wed Apr 20 06:05:49 PDT 2005.
215 
216 PROCEDURE VALIDATE_ACTIONS_HELPER (ERROR_COL_NAME VARCHAR2, COL_NAME VARCHAR2,
217                                    X_DATATYPE NUMBER,
218                                    X_CHAR_ID NUMBER,
219                                    X_PLAN_ID NUMBER,
220                                    X_LV_LOOKUP_VALUE VARCHAR2,
221                                    X_LV_OTHER_VALUE VARCHAR2,
222                                    X_HV_LOOKUP_VALUE VARCHAR2,
223                                    X_HV_OTHER_VALUE VARCHAR2,
224                                    X_OP_CODE NUMBER) IS
225 
226 
227    LV1             VARCHAR2(250);
228    LV2             VARCHAR2(250);
229    HV1             VARCHAR2(250);
230    HV2             VARCHAR2(250);
231    TEMP            VARCHAR2(250);
232    OP              VARCHAR2(30);
233 
234 
235 BEGIN
236    qa_core_pkg.dsql_add_text('(');
237    qa_core_pkg.dsql_add_text(' SELECT 1 ' ||
238                              ' FROM QA_SPEC_CHARS_V QSC, QA_CHARS QC ' ||
239                              ' WHERE QSC.CHAR_ID (+) = QC.CHAR_ID ' ||
240                              ' AND QC.CHAR_ID = ');
241 
242    qa_core_pkg.dsql_add_bind(X_CHAR_ID);
243 
244    qa_core_pkg.dsql_add_text(' AND QSC.SPEC_ID (+) = NVL(QRI.SPEC_ID, -1) ' ||
245                              ' AND QSC.SPEC_CHAR_ENABLED (+) = 1 ' ||
246                              ' AND ');
247 
248 
249    IF x_datatype = 2 THEN
250       qa_core_pkg.dsql_add_text(' qltdate.any_to_number(QRI.' || COL_NAME || ') ');
251 
252    ELSIF x_datatype = 3 THEN
253       qa_core_pkg.dsql_add_text(' qltdate.any_to_date(QRI.' || COL_NAME || ') ');
254 
255    ELSIF x_datatype = 6 THEN
256        qa_core_pkg.dsql_add_text(' qltdate.any_to_datetime(QRI.' || COL_NAME || ') ');
257 
258    ELSE
259        qa_core_pkg.dsql_add_text(' QRI.' || COL_NAME || ' ');
260    END IF;
261 
262 
263    OP := QLTTRAFB.DECODE_OPERATOR(X_OP_CODE);
264 
265    -- Build the rhs.
266 
267    IF X_OP_CODE NOT IN (7,8) THEN
268 
269         -- LV
270         IF X_LV_LOOKUP_VALUE IS NOT NULL THEN
271              TEMP := QLTTRAFB.DECODE_ACTION_VALUE_LOOKUP(X_LV_LOOKUP_VALUE);
272              LV1 := 'QC.' || TEMP;
273              LV2 := 'QSC.' || TEMP;
274 
275              IF (X_DATATYPE = 2) THEN
276                   LV1 := 'qltdate.canon_to_number(' || LV1 || ')';
277                   LV2 := 'qltdate.canon_to_number(' || LV2 || ')';
278 
279              ELSIF (X_DATATYPE IN (3, 6)) THEN
280                   LV1 := 'qltdate.canon_to_date(' || LV1 || ')';
281                   LV2 := 'qltdate.canon_to_date(' || LV2 || ')';
282 
283              END IF;
284 
285              qa_core_pkg.dsql_add_text(' ' || OP || ' DECODE(QSC.CHAR_ID, NULL, ' ||
286                                                                        LV1 || ', ' || LV2 || ')');
287 
288 
289         ELSE -- binds required
290 
291              qa_core_pkg.dsql_add_text(' ' || OP || ' DECODE(QSC.CHAR_ID, NULL, ');
292 
293              IF (X_DATATYPE = 2) THEN
294                  qa_core_pkg.dsql_add_bind(qltdate.canon_to_number(X_LV_OTHER_VALUE));
295                  qa_core_pkg.dsql_add_text(' ,');
296                  qa_core_pkg.dsql_add_bind(qltdate.canon_to_number(X_LV_OTHER_VALUE));
297                  qa_core_pkg.dsql_add_text(' )');
298 
299              ELSIF (X_DATATYPE IN (3, 6)) THEN
300                  qa_core_pkg.dsql_add_bind(qltdate.canon_to_date(X_LV_OTHER_VALUE));
301                  qa_core_pkg.dsql_add_text(' ,');
302                  qa_core_pkg.dsql_add_bind(qltdate.canon_to_date(X_LV_OTHER_VALUE));
303                  qa_core_pkg.dsql_add_text(' )');
304 
305              ELSE
306                  qa_core_pkg.dsql_add_bind(X_LV_OTHER_VALUE);
307                  qa_core_pkg.dsql_add_text(' ,');
308                  qa_core_pkg.dsql_add_bind(X_LV_OTHER_VALUE);
309                  qa_core_pkg.dsql_add_text(' )');
310 
311              END IF;
312 
313         END IF; -- x_lv_lookup_value is null
314 
315 
316         -- between nd not between
317         IF X_OP_CODE IN (9,10) THEN
318 
319             IF X_HV_LOOKUP_VALUE IS NOT NULL THEN
320 
321                 TEMP := QLTTRAFB.DECODE_ACTION_VALUE_LOOKUP(X_HV_LOOKUP_VALUE);
322                 HV1 := 'QC.' || TEMP;
323                 HV2 := 'QSC.' || TEMP;
324 
325                 IF (X_DATATYPE = 2) THEN
326                      HV1 := 'qltdate.canon_to_number(' || HV1 || ')';
327                      HV2 := 'qltdate.canon_to_number(' || HV2 || ')';
328 
329                 ELSIF (X_DATATYPE IN (3, 6)) THEN
330                      HV1 := 'qltdate.canon_to_date(' || HV1 || ')';
331                      HV2 := 'qltdate.canon_to_date(' || HV2 || ')';
332 
333                 END IF;
334 
335                 qa_core_pkg.dsql_add_text(' AND ' || ' DECODE(QSC.CHAR_ID, NULL, ' ||
336                                                                        HV1 || ', ' || HV2 || ')');
337 
338 
339              ELSE -- binds required
340 
341                 qa_core_pkg.dsql_add_text(' AND ' || ' DECODE(QSC.CHAR_ID, NULL, ');
342 
343                 IF (X_DATATYPE = 2) THEN
344                    qa_core_pkg.dsql_add_bind(qltdate.canon_to_number(X_HV_OTHER_VALUE));
345                    qa_core_pkg.dsql_add_text(' ,');
346                    qa_core_pkg.dsql_add_bind(qltdate.canon_to_number(X_HV_OTHER_VALUE));
347                    qa_core_pkg.dsql_add_text(' )');
348 
349                 ELSIF (X_DATATYPE IN (3, 6)) THEN
350                    qa_core_pkg.dsql_add_bind(qltdate.canon_to_date(X_HV_OTHER_VALUE));
351                    qa_core_pkg.dsql_add_text(' ,');
352                    qa_core_pkg.dsql_add_bind(qltdate.canon_to_date(X_HV_OTHER_VALUE));
353                    qa_core_pkg.dsql_add_text(' )');
354 
355                 ELSE
356                    qa_core_pkg.dsql_add_bind(X_HV_OTHER_VALUE);
357                    qa_core_pkg.dsql_add_text(' ,');
358                    qa_core_pkg.dsql_add_bind(X_HV_OTHER_VALUE);
359                    qa_core_pkg.dsql_add_text(' )');
360 
361                 END IF;
362 
363              END IF; -- hv_lookup
364 
365         END IF; -- x_operator in 9,10
366 
367    -- is null or is not null
368    ELSE
369       qa_core_pkg.dsql_add_text(' ' || OP);
370 
371    END IF; -- not in (7,8)
372 
373   qa_core_pkg.dsql_add_text(' )');
374 
375 
376 END VALIDATE_ACTIONS_HELPER;
377 
378 
379 
380 
381 
382 
383 PROCEDURE UPDATE_MARKER          ( COL_NAME VARCHAR2,
384                                    ERROR_COL_NAME VARCHAR2,
385                                    X_DATATYPE NUMBER,
386                                    X_CHAR_ID NUMBER,
387                                    X_GROUP_ID NUMBER,
388                                    X_USER_ID NUMBER,
389                                    X_LAST_UPDATE_LOGIN NUMBER,
390                                    X_REQUEST_ID NUMBER,
391                                    X_PROGRAM_APPLICATION_ID NUMBER,
392                                    X_PROGRAM_ID NUMBER,
393                                    X_PLAN_ID NUMBER,
394                                    ERROR_COL_LIST VARCHAR2,
395                                    X_LV_LOOKUP_VALUE VARCHAR2,
396                                    X_LV_OTHER_VALUE VARCHAR2,
397                                    X_HV_LOOKUP_VALUE VARCHAR2,
398                                    X_HV_OTHER_VALUE VARCHAR2,
399                                    X_OP_CODE NUMBER,
400                                    X_PCAT_ID NUMBER ) IS
401 
402    l_col1          VARCHAR2(100);
403    l_col2          VARCHAR2(100);
404    l_col3          VARCHAR2(100);
405    l_col4          VARCHAR2(100);
406    l_col5          VARCHAR2(100);
407 
408 
409 BEGIN
410 
411 
412    parse_error_columns(ERROR_COL_LIST, l_col1, l_col2, l_col3, l_col4, l_col5);
413 
414    qa_core_pkg.dsql_init;
415    qa_core_pkg.dsql_add_text(' UPDATE QA_RESULTS_INTERFACE QRI ' ||
416                              'SET LAST_UPDATE_DATE = SYSDATE' ||
417                                 ', LAST_UPDATE_LOGIN = ');
418    qa_core_pkg.dsql_add_bind(X_LAST_UPDATE_LOGIN);
419    qa_core_pkg.dsql_add_text(' , REQUEST_ID = ');
420    qa_core_pkg.dsql_add_bind(X_REQUEST_ID);
421    qa_core_pkg.dsql_add_text(' , PROGRAM_APPLICATION_ID = ');
422    qa_core_pkg.dsql_add_bind(X_PROGRAM_APPLICATION_ID);
423    qa_core_pkg.dsql_add_text(' , PROGRAM_ID = ');
424    qa_core_pkg.dsql_add_bind(X_PROGRAM_ID);
425    qa_core_pkg.dsql_add_text(' , PROGRAM_UPDATE_DATE = SYSDATE ' ||
426                              ' , MARKER = ');
427 
428    qa_core_pkg.dsql_add_bind(X_PCAT_ID);
429    qa_core_pkg.dsql_add_text(' ');
430 
431    -- update_sql_two
432    qa_core_pkg.dsql_add_text(' WHERE  QRI.GROUP_ID = ');
433    qa_core_pkg.dsql_add_bind(X_GROUP_ID);
434    qa_core_pkg.dsql_add_text(' AND  QRI.PROCESS_STATUS = 2 ' ||
435                             ' AND  NOT EXISTS ' ||
436                                        ' (SELECT 1 ' ||
437                                        '  FROM   QA_INTERFACE_ERRORS QIE ' ||
438                                        '  WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
439                                                  ' QRI.TRANSACTION_INTERFACE_ID ' ||
440                                        '  AND  QIE.ERROR_COLUMN IN ( ' );
441    qa_core_pkg.dsql_add_bind(l_col1);
442    qa_core_pkg.dsql_add_text(' ,');
443    qa_core_pkg.dsql_add_bind(l_col2);
444    qa_core_pkg.dsql_add_text(' ,');
445    qa_core_pkg.dsql_add_bind(l_col3);
446    qa_core_pkg.dsql_add_text(' ,');
447    qa_core_pkg.dsql_add_bind(l_col4);
448    qa_core_pkg.dsql_add_text(' ,');
449    qa_core_pkg.dsql_add_bind(l_col5);
450    qa_core_pkg.dsql_add_text(' )');
451 
452    qa_core_pkg.dsql_add_text(') AND EXISTS ');
453 
454 
455    VALIDATE_ACTIONS_HELPER (ERROR_COL_NAME, COL_NAME,X_DATATYPE, X_CHAR_ID, X_PLAN_ID,
456                                    X_LV_LOOKUP_VALUE, X_LV_OTHER_VALUE,
457                                    X_HV_LOOKUP_VALUE, X_HV_OTHER_VALUE,
458                                    X_OP_CODE);
459 
460 
461   qa_core_pkg.dsql_execute;
462 
463 
464 
465 END UPDATE_MARKER;
466 
467 
468 
469 -- Bug 4270911. CU2 SQL Literal fix. TD #23
470 -- Helper procedures for reject input action
471 -- srhariha. Wed Apr 20 06:05:49 PDT 2005.
472 
473 PROCEDURE REJECT_INPUT   (  COL_NAME VARCHAR2,
474                                    ERROR_COL_NAME VARCHAR2,
475                                    X_DATATYPE NUMBER,
476                                    X_CHAR_ID NUMBER,
477                                    X_GROUP_ID NUMBER,
478                                    X_USER_ID NUMBER,
479                                    X_LAST_UPDATE_LOGIN NUMBER,
480                                    X_REQUEST_ID NUMBER,
481                                    X_PROGRAM_APPLICATION_ID NUMBER,
482                                    X_PROGRAM_ID NUMBER,
483                                    X_PLAN_ID NUMBER,
484                                    ERROR_COL_LIST VARCHAR2,
485                                    X_LV_LOOKUP_VALUE VARCHAR2,
486                                    X_LV_OTHER_VALUE VARCHAR2,
487                                    X_HV_LOOKUP_VALUE VARCHAR2,
488                                    X_HV_OTHER_VALUE VARCHAR2,
489                                    X_OP_CODE NUMBER,
490                                    X_PCAT_ID NUMBER ) IS
491 
492 
493    l_col1          VARCHAR2(100);
494    l_col2          VARCHAR2(100);
495    l_col3          VARCHAR2(100);
496    l_col4          VARCHAR2(100);
497    l_col5          VARCHAR2(100);
498 
499 
500 BEGIN
501    parse_error_columns(ERROR_COL_LIST, l_col1, l_col2, l_col3, l_col4, l_col5);
502    qa_core_pkg.dsql_init;
503 
504   qa_core_pkg.dsql_add_text(' INSERT INTO QA_INTERFACE_ERRORS ' ||
505                                       '( TRANSACTION_INTERFACE_ID, ' ||
506                                       '  ERROR_COLUMN, ' ||
507                                       '  ERROR_MESSAGE, ' ||
508                                       '  LAST_UPDATE_DATE,' ||
509                                       '  LAST_UPDATED_BY, ' ||
510                                       '  CREATION_DATE, ' ||
511                                       '  CREATED_BY, ' ||
512                                       '  LAST_UPDATE_LOGIN, ' ||
513                                       '  REQUEST_ID, ' ||
514                                       '  PROGRAM_APPLICATION_ID, ' ||
515                                       '  PROGRAM_ID, ' ||
516                                       '  PROGRAM_UPDATE_DATE ) ' );
517 
518   qa_core_pkg.dsql_add_text(' SELECT QRI.TRANSACTION_INTERFACE_ID, ');
519   qa_core_pkg.dsql_add_bind(ERROR_COL_NAME);
520   qa_core_pkg.dsql_add_text(' ,');
521   qa_core_pkg.dsql_add_bind(ERROR_REJECT);
522   qa_core_pkg.dsql_add_text(' ,');
523   qa_core_pkg.dsql_add_text(' SYSDATE, '); -- last_update_date
524   qa_core_pkg.dsql_add_bind(X_USER_ID); -- last_updated_by
525   qa_core_pkg.dsql_add_text(' , SYSDATE,'); -- creation_date
526   qa_core_pkg.dsql_add_bind(X_USER_ID); -- created by
527   qa_core_pkg.dsql_add_text(' , ');
528   qa_core_pkg.dsql_add_bind(X_LAST_UPDATE_LOGIN); -- last_update_login
529   qa_core_pkg.dsql_add_text(' ,');
530   qa_core_pkg.dsql_add_bind(X_REQUEST_ID);
531   qa_core_pkg.dsql_add_text(' ,');
532   qa_core_pkg.dsql_add_bind(X_PROGRAM_APPLICATION_ID);
533   qa_core_pkg.dsql_add_text(' ,');
534   qa_core_pkg.dsql_add_bind(X_PROGRAM_ID);
535   qa_core_pkg.dsql_add_text(' , SYSDATE ');
536 
537 
538   qa_core_pkg.dsql_add_text(' FROM   QA_RESULTS_INTERFACE QRI ' ||
539                               'WHERE  QRI.GROUP_ID = ' );
540 
541   qa_core_pkg.dsql_add_bind(X_GROUP_ID);
542   qa_core_pkg.dsql_add_text(' ');
543 
544   qa_core_pkg.dsql_add_text(' AND  QRI.PROCESS_STATUS = 2 ' ||
545                             ' AND  NVL(QRI.MARKER, 0) = 0 ' ||
546                             ' AND  NOT EXISTS ' ||
547                             '          (SELECT 1 ' ||
548                             '           FROM   QA_INTERFACE_ERRORS QIE ' ||
549                             '           WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
550                             '                     QRI.TRANSACTION_INTERFACE_ID ' ||
551                             '            AND  QIE.ERROR_COLUMN IN ( ');
552 
553    qa_core_pkg.dsql_add_bind(l_col1);
554    qa_core_pkg.dsql_add_text(' ,');
555    qa_core_pkg.dsql_add_bind(l_col2);
556    qa_core_pkg.dsql_add_text(' ,');
557    qa_core_pkg.dsql_add_bind(l_col3);
558    qa_core_pkg.dsql_add_text(' ,');
559    qa_core_pkg.dsql_add_bind(l_col4);
560    qa_core_pkg.dsql_add_text(' ,');
561    qa_core_pkg.dsql_add_bind(l_col5);
562    qa_core_pkg.dsql_add_text(' )');
563 
564    qa_core_pkg.dsql_add_text(') AND EXISTS ');
565 
566 
567   VALIDATE_ACTIONS_HELPER (ERROR_COL_NAME, COL_NAME,X_DATATYPE, X_CHAR_ID, X_PLAN_ID,
568                                    X_LV_LOOKUP_VALUE, X_LV_OTHER_VALUE,
569                                    X_HV_LOOKUP_VALUE, X_HV_OTHER_VALUE,
570                                    X_OP_CODE);
571 
572 
573   qa_core_pkg.dsql_execute;
574 
575 
576 END REJECT_INPUT;
577 
578 
579 
580 
581 
582 -- Bug 4270911. CU2 SQL Literal fix. TD #23
583 -- Modified the logic to use qa_core_pkg.dsql method.
584 -- srhariha. Wed Apr 20 06:05:49 PDT 2005.
585 
586 
587 PROCEDURE VALIDATE_ACTIONS (COL_NAME VARCHAR2,
588                             ERROR_COL_NAME VARCHAR2,
589                             X_DATATYPE NUMBER,
590                             X_CHAR_ID NUMBER,
591                             X_GROUP_ID NUMBER,
592                             X_USER_ID NUMBER,
593                             X_LAST_UPDATE_LOGIN NUMBER,
594                             X_REQUEST_ID NUMBER,
595                             X_PROGRAM_APPLICATION_ID NUMBER,
596                             X_PROGRAM_ID NUMBER,
597                             X_PLAN_ID NUMBER,
598                             ERROR_COL_LIST VARCHAR2) IS
599 
600    PCAT_ID_TABLE   NUMBER_TABLE;
601    ACTION_ID_TABLE NUMBER_TABLE;
602    OPERATOR_TABLE  NUMBER_TABLE;
603    LV_LOOKUP_TABLE NUMBER_TABLE;
604    LV_OTHER_TABLE  CHAR150_TABLE;
605    HV_LOOKUP_TABLE NUMBER_TABLE;
606    HV_OTHER_TABLE  CHAR150_TABLE;
607    I               NUMBER;
608    NUM_ACTIONS     NUMBER;
609    PCAT_ID_CURRENT NUMBER;
610    PCAT_ID_NEXT    NUMBER;
611 
612 BEGIN
613    I := 0;
614 
615    FOR ACTIONREC IN (SELECT
616       QPCAT.PLAN_CHAR_ACTION_TRIGGER_ID,
617       QPCA.ACTION_ID,
618       QPCAT.OPERATOR,
619       QPCAT.LOW_VALUE_LOOKUP,
620       QPCAT.LOW_VALUE_OTHER,
621       QPCAT.HIGH_VALUE_LOOKUP,
622       QPCAT.HIGH_VALUE_OTHER
623       FROM
624       QA_PLAN_CHAR_ACTION_TRIGGERS QPCAT,
625       QA_PLAN_CHAR_ACTIONS QPCA,
626       QA_ACTIONS QA
627       WHERE
628       QPCAT.PLAN_ID = X_PLAN_ID AND
629       QPCAT.CHAR_ID = X_CHAR_ID AND
630       QPCA.PLAN_CHAR_ACTION_TRIGGER_ID = QPCAT.PLAN_CHAR_ACTION_TRIGGER_ID AND
631       QA.ACTION_ID = QPCA.ACTION_ID AND
632       QA.ENABLED_FLAG = 1
633       ORDER BY
634       QPCAT.TRIGGER_SEQUENCE) LOOP
635          I := I + 1;
636          PCAT_ID_TABLE(I)   := ACTIONREC.PLAN_CHAR_ACTION_TRIGGER_ID;
637          ACTION_ID_TABLE(I) := ACTIONREC.ACTION_ID;
638          OPERATOR_TABLE(I)  := ACTIONREC.OPERATOR;
639          LV_LOOKUP_TABLE(I) := ACTIONREC.LOW_VALUE_LOOKUP;
640          LV_OTHER_TABLE(I)  := ACTIONREC.LOW_VALUE_OTHER;
641          HV_LOOKUP_TABLE(I) := ACTIONREC.HIGH_VALUE_LOOKUP;
642          HV_OTHER_TABLE(I)  := ACTIONREC.HIGH_VALUE_OTHER;
643    END LOOP;
644    NUM_ACTIONS := I;
645 
646 
647   IF (NUM_ACTIONS > 0) THEN
648       UPDATE QA_RESULTS_INTERFACE QRI
649          SET LAST_UPDATE_DATE = SYSDATE,
650              LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
651              REQUEST_ID = X_REQUEST_ID,
652              PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
653              PROGRAM_ID = X_PROGRAM_ID,
654              PROGRAM_UPDATE_DATE = SYSDATE,
655              MARKER = 0
656           WHERE QRI.GROUP_ID = X_GROUP_ID
657             AND QRI.PROCESS_STATUS = 2
658             AND MARKER IS NOT NULL;
659    END IF;
660 
661 
662    FOR I IN 1..NUM_ACTIONS LOOP
663           -- Build and execute the sql.
664            IF ACTION_ID_TABLE(I) = 2 THEN
665 
666                      REJECT_INPUT (COL_NAME ,ERROR_COL_NAME, X_DATATYPE,
667                                    X_CHAR_ID, X_GROUP_ID, X_USER_ID,
668                                    X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
669                                    X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
670                                    X_PLAN_ID , ERROR_COL_LIST , LV_LOOKUP_TABLE(I),
671                                    LV_OTHER_TABLE(I), HV_LOOKUP_TABLE(I) ,
672                                    HV_OTHER_TABLE(I), OPERATOR_TABLE(I),
673                                    PCAT_ID_CURRENT);
674            END IF;
675 
676    END LOOP;
677 
678 
679 
680    FOR I IN 1..NUM_ACTIONS LOOP
681 
682       -- keep track of current and next pcat_id.
683 
684       PCAT_ID_CURRENT := PCAT_ID_TABLE(I);
685       IF (I = NUM_ACTIONS) THEN
686          PCAT_ID_NEXT := NULL;
687       ELSE
688          PCAT_ID_NEXT := PCAT_ID_TABLE(I + 1);
689       END IF;
690 
691       -- if this is the last action for the current action trigger, update
692       -- the interface table's marker to the current pcat_id for those
693       -- rows that caused actions to fire.  in this way, we are able to
694       -- keep track of which rows had values that satisfied previous
695       -- action triggers.  when we are moving down the list of action
696       -- triggers, we will ignore rows that caused a trigger higher up in
697       -- the list to fire.
698 
699       IF (NVL(PCAT_ID_NEXT, -1) <> PCAT_ID_CURRENT) THEN
700 
701           -- Build and execute the sql.
702           UPDATE_MARKER (COL_NAME ,ERROR_COL_NAME, X_DATATYPE,
703                                    X_CHAR_ID, X_GROUP_ID, X_USER_ID,
704                                    X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
705                                    X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
706                                    X_PLAN_ID , ERROR_COL_LIST , LV_LOOKUP_TABLE(I),
707                                    LV_OTHER_TABLE(I), HV_LOOKUP_TABLE(I) ,
708                                    HV_OTHER_TABLE(I), OPERATOR_TABLE(I),
709                                    PCAT_ID_CURRENT);
710 
711       END IF;
712 
713    END LOOP;
714 
715 END VALIDATE_ACTIONS;
716 
717 
718 
719 
720 /* validate_revision
721  *
722  * special routine for validating item revisions.  called instead of
723  * validate_mandatory.  inserts an error into the errors table when a
724  * revision is not entered for an item under revision control.  also
725  * inserts an errors when a revision is entered for an item not under
726  * revision control.
727  */
728 
729 PROCEDURE VALIDATE_REVISION(COL_NAME VARCHAR2,
730                             ERROR_COL_NAME VARCHAR2,
731                             X_GROUP_ID NUMBER,
732                             X_USER_ID NUMBER,
733                             X_LAST_UPDATE_LOGIN NUMBER,
734                             X_REQUEST_ID NUMBER,
735                             X_PROGRAM_APPLICATION_ID NUMBER,
736                             X_PROGRAM_ID NUMBER,
737                             PARENT_COL_NAME VARCHAR2,
738                             ERROR_COL_LIST VARCHAR2,
739                             X_MANDATORY NUMBER) IS
740    SQL_STATEMENT VARCHAR2(2000);
741    REV_COLUMN VARCHAR2(30);
742 
743    l_col1          VARCHAR2(100);
744    l_col2          VARCHAR2(100);
745    l_col3          VARCHAR2(100);
746    l_col4          VARCHAR2(100);
747    l_col5          VARCHAR2(100);
748 
749 BEGIN
750    -- Bug 3136107.SQL Bind project.
751    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
752 
753    IF (COL_NAME = 'REVISION') THEN
754       REV_COLUMN := 'REVISION_QTY_CONTROL_CODE';
755    ELSE
756       REV_COLUMN := 'COMP_REVISION_QTY_CONTROL_CODE';
757    END IF;
758 
759    -- first, give errors for cases where an item is under revision
760    -- control and revision is mandatory, but no revision is entered.
761    -- note that for revision control, a code of 1 means that it is
762    -- turned off, and 2 means that it is on.
763 
764    -- Bug 3136107.
765    -- SQL Bind project. Code modified to use bind variables instead of literals
766    -- Same as the fix done for Bug 3079312.suramasw.
767    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
768 
769    IF (X_MANDATORY = 1) THEN
770       SQL_STATEMENT :=
771          'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
772          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
773          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
774          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
775          'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
776          ':ERROR_NEED_REV, SYSDATE, ' ||
777          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
778          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
779         'FROM   QA_RESULTS_INTERFACE QRI ' ||
780         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
781          ' AND  QRI.PROCESS_STATUS = 2 ' ||
782          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
783          ' AND  NOT EXISTS
784                 (SELECT ''X'' ' ||
785                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
786                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
787                              'QRI.TRANSACTION_INTERFACE_ID ' ||
788                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
789           ' AND  EXISTS ' ||
790                 '(SELECT ''X'' FROM QA_RESULTS_INTERFACE ' ||
791                  'WHERE QRI.' || COL_NAME || ' IS NULL ' ||
792                  ' AND  QRI.' || REV_COLUMN || ' = 2)';
793 
794       -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
795 
796       -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
797       -- in order to bind the value of ERROR_COL_NAME. kabalakr
798 
799       -- Added the other columns added as a part of Bug 3136107 to
800       -- EXECUTE IMMEDIATE. suramasw
801 
802       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
803           ERROR_NEED_REV, X_USER_ID, X_USER_ID,
804           X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
805           X_PROGRAM_ID, X_GROUP_ID,
806           l_col1, l_col2, l_col3, l_col4, l_col5;
807 
808    END IF;
809 
810    -- second, give errors for cases where a revision is entered for an
811    -- item that is not under revision control
812 
813    -- Bug 3136107.
814    -- SQL Bind project. Code modified to use bind variables instead of literals
815    -- Same as the fix done for Bug 3079312.suramasw.
816    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
817 
818    SQL_STATEMENT :=
819       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
820          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
821          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
822          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
823       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
824          ':ERROR_CANT_HAVE_REV, SYSDATE, ' ||
825          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
826          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
827         'FROM   QA_RESULTS_INTERFACE QRI ' ||
828         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
829          ' AND  QRI.PROCESS_STATUS = 2 ' ||
830          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
831          ' AND  NOT EXISTS
832                 (SELECT ''X'' ' ||
833                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
834                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
835                              'QRI.TRANSACTION_INTERFACE_ID ' ||
836                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
837           ' AND  EXISTS ' ||
838                 '(SELECT ''X'' FROM QA_RESULTS_INTERFACE ' ||
839                  'WHERE QRI.' || COL_NAME || ' IS NOT NULL ' ||
840                  ' AND  QRI.' || REV_COLUMN || ' = 1)';
841 
842       -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
843 
844       -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
845       -- in order to bind the value of ERROR_COL_NAME. kabalakr
846 
847       -- Added the other columns added as a part of Bug 3136107 to
848       -- EXECUTE IMMEDIATE. suramasw
849 
850       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
851           ERROR_CANT_HAVE_REV, X_USER_ID,
852           X_USER_ID,      X_LAST_UPDATE_LOGIN,
853           X_REQUEST_ID,   X_PROGRAM_APPLICATION_ID,
854           X_PROGRAM_ID,   X_GROUP_ID,
855           l_col1, l_col2, l_col3, l_col4, l_col5;
856 
857 END VALIDATE_REVISION;
858 
859 -- Bug 3775614. Component lot and serial numbers were not validated properly.
860 -- Added two new procedures to validate lot/serial number.
861 -- Essentially it inserts error message into QA_INTERFACE_ERRORS for the following
862 -- situations
863 -- (1) Lot/Serial number is mandatory and user has entered null value to lot/serial number.
864 -- (2) Item is not lot/serial controlled and user has entered some value to lot/serial number.
865 -- (3) Item is lot/serial controlled and user entered invalid value to lot/serial number.
866 --
867 -- So if code flow escapes this procedure without any insertion into QIE, it
868 -- means user has entered valid value to lot/serial number.
869 -- We are using seperate procedure to validate lot/serial number instead of using
870 -- 'FROM_CLAUSE' and 'WHERE_CLAUSE' parameters in validate_steps() because
871 -- later introduces perfomance issues due to literal usage.
872 -- srhariha. Mon Aug  2 22:48:30 PDT 2004.
873 
874 PROCEDURE VALIDATE_LOT_NUMBER(COL_NAME VARCHAR2,
875                               ERROR_COL_NAME VARCHAR2,
876                               X_GROUP_ID NUMBER,
877                               X_USER_ID NUMBER,
878                               X_LAST_UPDATE_LOGIN NUMBER,
879                               X_REQUEST_ID NUMBER,
880                               X_PROGRAM_APPLICATION_ID NUMBER,
881                               X_PROGRAM_ID NUMBER,
882                               PARENT_COL_NAME VARCHAR2,
883                               ERROR_COL_LIST VARCHAR2,
884                               X_MANDATORY NUMBER) IS
885    SQL_STATEMENT VARCHAR2(2000);
886 
887    l_col1          VARCHAR2(100);
888    l_col2          VARCHAR2(100);
889    l_col3          VARCHAR2(100);
890    l_col4          VARCHAR2(100);
891    l_col5          VARCHAR2(100);
892 
893    ITEM_ID_COL        VARCHAR2(30);
894 BEGIN
895    -- Resolve item_id column.
896 
897    IF (COL_NAME = 'COMP_LOT_NUMBER') THEN
898       ITEM_ID_COL := 'COMP_ITEM_ID';
899    ELSE
900       ITEM_ID_COL := 'ITEM_ID';
901    END IF;
902 
903    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
904 
905 
906    -- first, give errors for cases where an item is under lot
907    -- control and it is mandatory, but no lot is entered.
908    -- note that for lot control, a code of 1 means that it is
909    -- no lot control, and 2 means that it is full control.
910 
911    IF (X_MANDATORY = 1) THEN
912       SQL_STATEMENT :=
913          'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
914          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
915          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
916          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
917          'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
918          ':ERROR_MANDATORY, SYSDATE, ' ||
919          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
920          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
921         'FROM   QA_RESULTS_INTERFACE QRI ' ||
922         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
923          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
924          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
925          ' AND  NOT EXISTS
926                 (SELECT ''X'' ' ||
927                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
928                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
929                              'QRI.TRANSACTION_INTERFACE_ID ' ||
930                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
931          ' AND QRI.' || COL_NAME || ' IS NULL ' ||
932          ' AND :LOT_CNTRL_CODE = (SELECT MSI.LOT_CONTROL_CODE ' ||
933                                  ' FROM MTL_SYSTEM_ITEMS MSI ' ||
934                                  ' WHERE MSI.INVENTORY_ITEM_ID = QRI.' || ITEM_ID_COL ||
935                                  ' AND MSI.ORGANIZATION_ID = QRI.ORGANIZATION_ID)';
936 
937 
938 
939       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
940           ERROR_MANDATORY, X_USER_ID, X_USER_ID,
941           X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
942           X_PROGRAM_ID, X_GROUP_ID,2,
943           l_col1, l_col2, l_col3, l_col4, l_col5,2;
944 
945    END IF;
946 
947    -- second, give errors for cases where lot is entered for an
948    -- item that is not under lot control
949 
950    SQL_STATEMENT :=
951       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
952          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
953          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
954          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
955       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
956          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
957          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
958          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
959         'FROM   QA_RESULTS_INTERFACE QRI ' ||
960         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
961          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
962          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
963          ' AND  NOT EXISTS
964                 (SELECT ''X'' ' ||
965                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
966                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
967                              'QRI.TRANSACTION_INTERFACE_ID ' ||
968                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
969          ' AND QRI.'|| COL_NAME || ' IS NOT NULL '||
970          ' AND :LOT_CNTRL_CODE = (SELECT MSI.LOT_CONTROL_CODE ' ||
971                                  ' FROM MTL_SYSTEM_ITEMS MSI ' ||
972                                  ' WHERE MSI.INVENTORY_ITEM_ID = QRI.'|| ITEM_ID_COL  ||
973                                  ' AND MSI.ORGANIZATION_ID = QRI.ORGANIZATION_ID)';
974 
975 
976 
977 
978       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
979           ERROR_INVALID_VALUE, X_USER_ID,
980           X_USER_ID,      X_LAST_UPDATE_LOGIN,
981           X_REQUEST_ID,   X_PROGRAM_APPLICATION_ID,
982           X_PROGRAM_ID,   X_GROUP_ID,2,
983           l_col1, l_col2, l_col3, l_col4, l_col5,1;
984 
985    -- If item is lot controlled and lot is entered validate the value entered.
986 
987 
988    SQL_STATEMENT :=
989       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
990          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
991          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
992          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
993       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
994          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
995          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
996          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
997         'FROM   QA_RESULTS_INTERFACE QRI ' ||
998         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
999          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
1000          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
1001          ' AND  NOT EXISTS
1002                 (SELECT ''X'' ' ||
1003                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1004                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1005                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1006                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
1007          ' AND QRI.'|| COL_NAME || ' IS NOT NULL '||
1008          ' AND NOT EXISTS (SELECT MLN.LOT_NUMBER ' ||
1009                            ' FROM MTL_LOT_NUMBERS MLN ' ||
1010                            ' WHERE MLN.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
1011                            ' AND MLN.INVENTORY_ITEM_ID = QRI.' || ITEM_ID_COL ||
1012                            ' AND MLN.LOT_NUMBER = QRI.' || COL_NAME ||
1013                            ' AND (MLN.DISABLE_FLAG = :DB OR MLN.DISABLE_FLAG IS NULL))';
1014 
1015 
1016       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
1017           ERROR_INVALID_VALUE, X_USER_ID,
1018           X_USER_ID,      X_LAST_UPDATE_LOGIN,
1019           X_REQUEST_ID,   X_PROGRAM_APPLICATION_ID,
1020           X_PROGRAM_ID,   X_GROUP_ID,2,
1021           l_col1, l_col2, l_col3, l_col4, l_col5,2;
1022 
1023 
1024 END VALIDATE_LOT_NUMBER;
1025 
1026 
1027 PROCEDURE VALIDATE_SERIAL_NUMBER(COL_NAME VARCHAR2,
1028                                 ERROR_COL_NAME VARCHAR2,
1029                                 X_GROUP_ID NUMBER,
1030                                 X_USER_ID NUMBER,
1031                                 X_LAST_UPDATE_LOGIN NUMBER,
1032                                 X_REQUEST_ID NUMBER,
1033                                 X_PROGRAM_APPLICATION_ID NUMBER,
1034                                 X_PROGRAM_ID NUMBER,
1035                                 PARENT_COL_NAME VARCHAR2,
1036                                 ERROR_COL_LIST VARCHAR2,
1037                                 X_MANDATORY NUMBER) IS
1038    SQL_STATEMENT VARCHAR2(2000);
1039    LOT_COL VARCHAR2(30);
1040    ITEM_ID_COL VARCHAR2(30);
1041    REV_COL VARCHAR2(30);
1042    l_col1          VARCHAR2(100);
1043    l_col2          VARCHAR2(100);
1044    l_col3          VARCHAR2(100);
1045    l_col4          VARCHAR2(100);
1046    l_col5          VARCHAR2(100);
1047 
1048 BEGIN
1049    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
1050 
1051  -- Resolve item_id, lot number and revision columns.
1052 
1053  IF (COL_NAME = 'COMP_SERIAL_NUMBER') THEN
1054       ITEM_ID_COL := 'COMP_ITEM_ID';
1055       LOT_COL     := 'COMP_LOT_NUMBER';
1056       REV_COL     := 'COMP_REVISION';
1057  ELSE
1058       ITEM_ID_COL := 'ITEM_ID';
1059       LOT_COL     := 'LOT_NUMBER';
1060       REV_COL     := 'REVISION';
1061  END IF;
1062 
1063 
1064    -- first, give errors for cases where an item is under serial
1065    -- control and it is mandatory, but no serial is entered.
1066    -- note that for serial control, a code of 1 means that it is
1067    -- no serial control, and all other values means that it is turned on.
1068 
1069 
1070    IF (X_MANDATORY = 1) THEN
1071       SQL_STATEMENT :=
1072          'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
1073          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
1074          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
1075          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
1076          'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
1077          ':ERROR_MANDATORY, SYSDATE, ' ||
1078          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
1079          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
1080         'FROM   QA_RESULTS_INTERFACE QRI ' ||
1081         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
1082          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
1083          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
1084          ' AND  NOT EXISTS
1085                 (SELECT ''X'' ' ||
1086                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1087                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1088                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1089                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
1090          ' AND QRI.' || COL_NAME || ' IS NULL ' ||
1091          ' AND :SERIAL_CNTRL_CODE <> (SELECT MSI.SERIAL_NUMBER_CONTROL_CODE ' ||
1092                                     '  FROM MTL_SYSTEM_ITEMS MSI ' ||
1093                                     '  WHERE MSI.INVENTORY_ITEM_ID = QRI.' || ITEM_ID_COL ||
1094                                     '  AND MSI.ORGANIZATION_ID = QRI.ORGANIZATION_ID)';
1095 
1096 
1097       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
1098           ERROR_MANDATORY, X_USER_ID, X_USER_ID,
1099           X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
1100           X_PROGRAM_ID, X_GROUP_ID,2,
1101           l_col1, l_col2, l_col3, l_col4, l_col5,1;
1102 
1103    END IF;
1104 
1105    -- second, give errors for cases where SERIAL is entered for an
1106    -- item that is not under SERIAL control
1107 
1108 
1109    SQL_STATEMENT :=
1110       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
1111          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
1112          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
1113          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
1114       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
1115          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
1116          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
1117          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
1118         'FROM   QA_RESULTS_INTERFACE QRI ' ||
1119         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
1120          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
1121          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
1122          ' AND  NOT EXISTS
1123                 (SELECT ''X'' ' ||
1124                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1125                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1126                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1127                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
1128          ' AND QRI.'|| COL_NAME || ' IS NOT NULL '||
1129          ' AND :SERIAL_CNTRL_CODE = (SELECT MSI.SERIAL_NUMBER_CONTROL_CODE ' ||
1130                               ' FROM MTL_SYSTEM_ITEMS MSI ' ||
1131                               ' WHERE MSI.INVENTORY_ITEM_ID = QRI.' || ITEM_ID_COL ||
1132                               ' AND MSI.ORGANIZATION_ID = QRI.ORGANIZATION_ID)';
1133 
1134 
1135 
1136 
1137       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
1138           ERROR_INVALID_VALUE, X_USER_ID,
1139           X_USER_ID,      X_LAST_UPDATE_LOGIN,
1140           X_REQUEST_ID,   X_PROGRAM_APPLICATION_ID,
1141           X_PROGRAM_ID,   X_GROUP_ID,2,
1142           l_col1, l_col2, l_col3, l_col4, l_col5,1;
1143 
1144    -- If item is SERIAL controlled and SERIAL is entered, validate the value entered.
1145    -- We should not have Serial Number validation restricted to those having
1146    -- current_status = 3 (Resides in Stores).Hence commenting out that line.
1147    -- Please see bugdb of 37723928 for more details.
1148    -- srhariha. Thu Aug  5 21:05:05 PDT 2004.
1149 
1150    --
1151    -- Bug 5407761
1152    -- Removed the filter on the column group_mark_id
1153    -- since it is used for internal parallelism control
1154    -- and is not applicable during a read only validation
1155    -- SHKALYAN 25-JUL-2006
1156    --
1157    -- Bug 6269522.
1158    -- Fixed validation of Serial Number and Item Revision validation
1159    -- If Lot Number and item are not passed
1160    -- saugupta Tue, 09 Oct 2007 07:11:47 -0700 PDT
1161 
1162    SQL_STATEMENT :=
1163       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
1164          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
1165          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
1166          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
1167       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
1168          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
1169          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
1170          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
1171         'FROM   QA_RESULTS_INTERFACE QRI ' ||
1172         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
1173          ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
1174          ' AND  QRI.' || PARENT_COL_NAME || ' IS NOT NULL' ||
1175          ' AND  NOT EXISTS
1176                 (SELECT ''X'' ' ||
1177                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1178                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1179                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1180                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
1181          ' AND QRI.'|| COL_NAME || ' IS NOT NULL '||
1182          ' AND NOT EXISTS (SELECT MSN.SERIAL_NUMBER ' ||
1183                           ' FROM MTL_SERIAL_NUMBERS MSN ' ||
1184                           '  WHERE MSN.SERIAL_NUMBER = QRI.' || COL_NAME ||
1185                           ' AND MSN.CURRENT_ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
1186                           ' AND MSN.INVENTORY_ITEM_ID = QRI.' || ITEM_ID_COL ||
1187                           ' AND (QRI.'||LOT_COL||' IS NULL OR MSN.LOT_NUMBER = QRI.'||LOT_COL||')' ||
1188                           ' AND (QRI.'||REV_COL||' IS NULL OR MSN.REVISION = QRI.'||REV_COL||'))';
1189 
1190                         -- ' AND NVL(MSN.LOT_NUMBER,''@@@'') = NVL(QRI.'||LOT_COL||',''@@@'')' ||
1191                         --  ' AND NVL(MSN.REVISION,''@@@'') = NVL(QRI.' || REV_COL||',''@@@''))';
1192                         --  ' AND MSN.CURRENT_STATUS = :CS '||
1193                         --  ' AND (MSN.GROUP_MARK_ID IS NULL OR MSN.GROUP_MARK_ID = :GM))';
1194 
1195       --
1196       -- Bug 5407761
1197       -- Removed the value bound for the
1198       -- group_mark_id column as the filter is
1199       -- not applicable
1200       -- SHKALYAN 25-JUL-2006
1201       --
1202       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
1203           ERROR_INVALID_VALUE, X_USER_ID,
1204           X_USER_ID,      X_LAST_UPDATE_LOGIN,
1205           X_REQUEST_ID,   X_PROGRAM_APPLICATION_ID,
1206           X_PROGRAM_ID,   X_GROUP_ID,2,
1207           l_col1, l_col2, l_col3, l_col4, l_col5;
1208           --,-1;
1209 
1210 
1211 END VALIDATE_SERIAL_NUMBER;
1212 
1213 
1214 PROCEDURE VALIDATE_DATATYPES(COL_NAME VARCHAR2,
1215                             ERROR_COL_NAME VARCHAR2,
1216                             X_GROUP_ID NUMBER,
1217                             X_USER_ID NUMBER,
1218                             X_LAST_UPDATE_LOGIN NUMBER,
1219                             X_REQUEST_ID NUMBER,
1220                             X_PROGRAM_APPLICATION_ID NUMBER,
1221                             X_PROGRAM_ID NUMBER,
1222                             X_DATATYPE NUMBER) IS
1223    SQL_STATEMENT VARCHAR2(2000);
1224    I NUMBER;
1225    NUM_ROWS NUMBER;
1226    X_INTERFACE_ID NUMBER;
1227    X_CHARACTERX VARCHAR2(150);
1228    INTERFACE_ID_TABLE NUMBER_TABLE;
1229    VALUE_TABLE CHAR150_TABLE;
1230    SOURCE_CURSOR INTEGER;
1231    IGNORE INTEGER;
1232    ERRMSG VARCHAR2(30);
1233 BEGIN
1234    I := 0;
1235 
1236    -- Bug 2941809. Need to use bind variables instead of literal values when
1237    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
1238    -- kabalakr
1239 
1240    -- Bug 3136107.suramasw
1241    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
1242 
1243    SQL_STATEMENT :=
1244       'SELECT TRANSACTION_INTERFACE_ID, ' || COL_NAME ||
1245       ' FROM QA_RESULTS_INTERFACE QRI ' ||
1246       ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1247       '   AND QRI.PROCESS_STATUS = 2 ' ||
1248       '   AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
1249       '   AND NOT EXISTS
1250                 (SELECT ''X'' ' ||
1251                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1252                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1253                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1254                   'AND  QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL))';
1255 
1256    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
1257    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
1258 
1259    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
1260    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
1261 
1262    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1263    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_CHARACTERX, 150);
1264 
1265    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
1266 
1267    LOOP
1268       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
1269          I := I + 1;
1270          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1271          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_CHARACTERX);
1272          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
1273          VALUE_TABLE(I) := X_CHARACTERX;
1274       ELSE
1275          EXIT;
1276       END IF;
1277    END LOOP;
1278 
1279    NUM_ROWS := I;
1280    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
1281 
1282    IF (X_DATATYPE = 2) THEN
1283       ERRMSG := ERROR_INVALID_NUMBER;
1284    ELSIF (X_DATATYPE = 3) THEN
1285       ERRMSG := ERROR_INVALID_DATE;
1286 
1287    -- For Timezone Compliance bug 3179845.
1288    -- Validate the datetime and elements and give error in case of failure.
1289    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
1290 
1291    ELSIF (X_DATATYPE = 6) THEN
1292       ERRMSG := ERROR_INVALID_DATETIME;
1293    END IF;
1294 
1295 
1296    FOR I IN 1..NUM_ROWS LOOP
1297       IF (QLTTRAFB.VALIDATE_TYPE(VALUE_TABLE(I), X_DATATYPE) = FALSE) THEN
1298          INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
1299                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1300                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
1301                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
1302          (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERRMSG,
1303           SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
1304           X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
1305       END IF;
1306    END LOOP;
1307 
1308 END VALIDATE_DATATYPES;
1309 
1310 
1311 PROCEDURE FORMAT_DATATYPES(COL_NAME VARCHAR2,
1312                            ERROR_COL_NAME VARCHAR2,
1313                            X_GROUP_ID NUMBER,
1314                            X_USER_ID NUMBER,
1315                            X_LAST_UPDATE_LOGIN NUMBER,
1316                            X_REQUEST_ID NUMBER,
1317                            X_PROGRAM_APPLICATION_ID NUMBER,
1318                            X_PROGRAM_ID NUMBER,
1319                            X_DATATYPE NUMBER,
1320                            X_DECIMAL_PRECISION NUMBER,
1321                            ERROR_COL_LIST VARCHAR2) IS
1322    SQL_STATEMENT VARCHAR2(2000);
1323 
1324    l_col1 varchar2(100);
1325    l_col2 varchar2(100);
1326    l_col3 varchar2(100);
1327    l_col4 varchar2(100);
1328    l_col5 varchar2(100);
1329 
1330 BEGIN
1331 
1332    -- Bug 3136107.SQL Bind project.
1333    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
1334 
1335    --
1336    -- Don't do anything for hardcoded date columns
1337    -- bso
1338    --
1339 
1340    -- For Timezone Compliance bug 3179845. Added datetime elements in the below IF condn.
1341    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
1342 
1343    IF x_datatype IN (3, 6) AND NOT (col_name LIKE 'CHARACTER%') THEN
1344        RETURN;
1345    END IF;
1346 
1347    -- Bug 3136107.
1348    -- SQL Bind project. Code modified to use bind variables instead of literals
1349    -- Same as the fix done for Bug 3079312.suramasw.
1350 
1351    SQL_STATEMENT :=
1352       'UPDATE QA_RESULTS_INTERFACE QRI ' ||
1353       'SET LAST_UPDATE_DATE = SYSDATE, ' ||
1354           'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
1355         ', REQUEST_ID = :REQUEST_ID ' ||
1356         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
1357         ', PROGRAM_ID = :PROGRAM_ID ' ||
1358         ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
1359         COL_NAME || ' = ';
1360 
1361    IF (X_DATATYPE = 2) THEN
1362       --
1363       -- For number type, there are two cases, if it is hardcoded, then
1364       -- use a simple ROUND function:
1365       --
1366       IF NOT col_name LIKE 'CHARACTER%' THEN     -- hardcoded
1367 	  SQL_STATEMENT := SQL_STATEMENT ||
1368             'TO_CHAR(ROUND(' || COL_NAME || ', ' ||
1369             TO_CHAR(NVL(X_DECIMAL_PRECISION, 240)) || ')) ';
1370       ELSE
1371       --
1372       -- If it is not hardcoded, then convert number to a Number first.
1373       -- Then convert it back to canonical format.
1374       --
1375 	  SQL_STATEMENT := SQL_STATEMENT ||
1376               'qltdate.number_to_canon(round(qltdate.any_to_number(' ||
1377 	      COL_NAME || '), ' || to_char(nvl(X_DECIMAL_PRECISION, 240)) ||
1378 	      ')) ';
1379       END IF;
1380 
1381    -- For Timezone Compliance bug 3179845. Convert the datetime value to canonical format.
1382    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
1383 
1384    ELSIF (X_DATATYPE IN (3,6)) THEN
1385       SQL_STATEMENT := SQL_STATEMENT ||
1386           'qltdate.any_to_canon(' || COL_NAME || ') ';
1387    END IF;
1388 
1389    SQL_STATEMENT := SQL_STATEMENT ||
1390          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1391          ' AND  QRI.PROCESS_STATUS = 2 ' ||
1392           'AND  NOT EXISTS
1393                 (SELECT ''X'' ' ||
1394                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
1395                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1396                              'QRI.TRANSACTION_INTERFACE_ID ' ||
1397                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
1398 
1399    EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
1400                                          X_REQUEST_ID,
1401                                          X_PROGRAM_APPLICATION_ID,
1402                                          X_PROGRAM_ID,
1403                                          X_GROUP_ID,
1404           l_col1, l_col2, l_col3, l_col4, l_col5;
1405 
1406    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
1407 END FORMAT_DATATYPES;
1408 
1409 
1410 PROCEDURE VALIDATE_LOCATOR(COL_NAME VARCHAR2,
1411                         ERROR_COL_NAME VARCHAR2,
1412                         X_GROUP_ID NUMBER,
1413                         X_USER_ID NUMBER,
1414                         X_LAST_UPDATE_LOGIN NUMBER,
1415                         X_REQUEST_ID NUMBER,
1416                         X_PROGRAM_APPLICATION_ID NUMBER,
1417                         X_PROGRAM_ID NUMBER,
1418                         ERROR_COL_LIST VARCHAR2) IS
1419    SQL_STATEMENT VARCHAR2(2000);
1420    I NUMBER := 0;
1421    V BOOLEAN;
1422    CID NUMBER;
1423    NUM_ROWS NUMBER;
1424    X_INTERFACE_ID NUMBER;
1425    X_SEGS VARCHAR2(2000);
1426    X_ORG_ID NUMBER;
1427    X_SUB_LOC_TYPE NUMBER;
1428    X_LOC_CTRL_CODE NUMBER;
1429    X_RESTRICT_LOC_CODE NUMBER;
1430    X_SUBINV VARCHAR2(10);
1431    X_ORG_LOC_CTRL NUMBER;
1432    X_NEG_INV NUMBER;
1433    X_ITEM_ID NUMBER;
1434    INTERFACE_ID_TABLE NUMBER_TABLE;
1435    SEGS_TABLE CHAR2000_TABLE;
1436    ORG_ID_TABLE NUMBER_TABLE;
1437    SUB_LOC_TYPE_TABLE NUMBER_TABLE;
1438    LOC_CTRL_CODE_TABLE NUMBER_TABLE;
1439    RESTRICT_LOC_CODE_TABLE NUMBER_TABLE;
1440    SUBINV_TABLE CHAR30_TABLE;
1441    ORG_LOC_CTRL_TABLE NUMBER_TABLE;
1442    NEG_INV_TABLE NUMBER_TABLE;
1443    ITEM_ID_TABLE NUMBER_TABLE;
1444    GEN_LOC_CTRL_TABLE NUMBER_TABLE;
1445    SOURCE_CURSOR INTEGER;
1446    IGNORE INTEGER;
1447    ID_FIELD VARCHAR2(30);
1448    COMP_TEXT VARCHAR2(6);
1449    X_WHERE_CLAUSE VARCHAR2(250);
1450 
1451    l_col1 varchar2(100);
1452    l_col2 varchar2(100);
1453    l_col3 varchar2(100);
1454    l_col4 varchar2(100);
1455    l_col5 varchar2(100);
1456 
1457 BEGIN
1458    -- Bug 3136107.SQL Bind project.
1459    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
1460 
1461    IF (COL_NAME = 'COMP_LOCATOR') THEN
1462       COMP_TEXT := 'COMP_';
1463       ID_FIELD := 'COMP_LOCATOR_ID';
1464    ELSIF (COL_NAME = 'LOCATOR') THEN
1465       COMP_TEXT := '';
1466       ID_FIELD := 'LOCATOR_ID';
1467    END IF;
1468 
1469    -- Bug 2941809. Need to use bind variables instead of literal values when
1470    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
1471    -- kabalakr
1472 
1473    -- Bug 3136107.suramasw.
1474    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
1475 
1476    SQL_STATEMENT :=
1477          'SELECT QRI.TRANSACTION_INTERFACE_ID, ' ||
1478          'QRI.' || COL_NAME || ', ' ||
1479          'QRI.ORGANIZATION_ID, ' ||
1480          'QRI.' || COMP_TEXT || 'SUB_LOCATOR_TYPE, ' ||
1481          'QRI.' || COMP_TEXT || 'LOCATION_CONTROL_CODE, ' ||
1482          'QRI.' || COMP_TEXT || 'RESTRICT_LOCATORS_CODE, ' ||
1483          'QRI.' || COMP_TEXT || 'SUBINVENTORY, ' ||
1484          'MP.STOCK_LOCATOR_CONTROL_CODE, ' ||
1485          'MP.NEGATIVE_INV_RECEIPT_CODE, ' ||
1486          'QRI.' || COMP_TEXT || 'ITEM_ID ' ||
1487          'FROM QA_RESULTS_INTERFACE QRI, ' ||
1488          '     MTL_PARAMETERS MP ' ||
1489          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1490          ' AND QRI.PROCESS_STATUS = 2 ' ||
1491          ' AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
1492          ' AND NOT EXISTS
1493                (SELECT ''X'' ' ||
1494                'FROM QA_INTERFACE_ERRORS QIE ' ||
1495                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
1496                   'QRI.TRANSACTION_INTERFACE_ID ' ||
1497                'AND QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL)) '||
1498          ' AND QRI.ORGANIZATION_ID = MP.ORGANIZATION_ID';
1499 
1500    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
1501    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
1502 
1503    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
1504    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
1505 
1506    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1507    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_SEGS, 2000);
1508    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 3, X_ORG_ID);
1509    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 4, X_SUB_LOC_TYPE);
1510    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 5, X_LOC_CTRL_CODE);
1511    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 6, X_RESTRICT_LOC_CODE);
1512    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 7, X_SUBINV, 10);
1513    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 8, X_ORG_LOC_CTRL);
1514    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 9, X_NEG_INV);
1515    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 10, X_ITEM_ID);
1516 
1517    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
1518 
1519    LOOP
1520       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
1521          I := I + 1;
1522          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1523          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_SEGS);
1524          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 3, X_ORG_ID);
1525          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 4, X_SUB_LOC_TYPE);
1526          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 5, X_LOC_CTRL_CODE);
1527          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 6, X_RESTRICT_LOC_CODE);
1528          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 7, X_SUBINV);
1529          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 8, X_ORG_LOC_CTRL);
1530          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 9, X_NEG_INV);
1531          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 10, X_ITEM_ID);
1532 
1533          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
1534          SEGS_TABLE(I) := X_SEGS;
1535          ORG_ID_TABLE(I) := X_ORG_ID;
1536          SUB_LOC_TYPE_TABLE(I) := X_SUB_LOC_TYPE;
1537          LOC_CTRL_CODE_TABLE(I) := X_LOC_CTRL_CODE;
1538          RESTRICT_LOC_CODE_TABLE(I) := X_RESTRICT_LOC_CODE;
1539          SUBINV_TABLE(I) := X_SUBINV;
1540          ORG_LOC_CTRL_TABLE(I) := X_ORG_LOC_CTRL;
1541          NEG_INV_TABLE(I) := X_NEG_INV;
1542          ITEM_ID_TABLE(I) := X_ITEM_ID;
1543       ELSE
1544          EXIT;
1545       END IF;
1546    END LOOP;
1547 
1548 
1549    NUM_ROWS := I;
1550    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
1551 
1552    FOR I IN 1..NUM_ROWS LOOP
1553       GEN_LOC_CTRL_TABLE(I) := QLTINVCB.CONTROL(
1554             ORG_CONTROL=>ORG_LOC_CTRL_TABLE(I),
1555             SUB_CONTROL=>SUB_LOC_TYPE_TABLE(I),
1556             ITEM_CONTROL=>LOC_CTRL_CODE_TABLE(I),
1557             RESTRICT_FLAG=>RESTRICT_LOC_CODE_TABLE(I),
1558             NEG_FLAG=>NEG_INV_TABLE(I));
1559 
1560 
1561       IF (GEN_LOC_CTRL_TABLE(I) = 1) THEN
1562          -- not under locator control.  locator must be null
1563 
1564          IF (SEGS_TABLE(I) IS NOT NULL) THEN
1565             INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
1566                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1567                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
1568                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
1569                (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_CANT_HAVE_LOC,
1570                SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
1571                X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
1572          END IF;
1573 
1574          -- update interface table with gen loc ctrl value
1575 
1576          SQL_STATEMENT :=
1577                'UPDATE QA_RESULTS_INTERFACE QRI ' ||
1578                'SET LAST_UPDATE_DATE = SYSDATE, ' ||
1579                   'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
1580                  ', REQUEST_ID = :REQUEST_ID ' ||
1581                  ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
1582                  ', PROGRAM_ID = :PROGRAM_ID ' ||
1583                  ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
1584                  COMP_TEXT || 'GEN_LOC_CTRL_CODE = :GEN_LOC_CTRL_TABLE ' ||
1585                  ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1586                   ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
1587                   ' AND  QRI.PROCESS_STATUS = 2 ' ||
1588                    'AND  NOT EXISTS
1589                          (SELECT ''X'' ' ||
1590                          'FROM   QA_INTERFACE_ERRORS QIE ' ||
1591                          'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1592                                       'QRI.TRANSACTION_INTERFACE_ID ' ||
1593                         'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
1594 
1595          EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
1596                                                X_REQUEST_ID,
1597                                                X_PROGRAM_APPLICATION_ID,
1598                                                X_PROGRAM_ID,
1599                                                GEN_LOC_CTRL_TABLE(I),
1600                                                X_GROUP_ID,
1601                                                INTERFACE_ID_TABLE(I),
1602           l_col1, l_col2, l_col3, l_col4, l_col5;
1603 
1604          -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
1605 
1606       ELSIF (GEN_LOC_CTRL_TABLE(I) IN (2, 3)) THEN
1607 -- !! maybe should validate mandatory here
1608 
1609          IF (GEN_LOC_CTRL_TABLE(I) = 2) THEN
1610 
1611             IF (RESTRICT_LOC_CODE_TABLE(I) = 1) THEN
1612                X_WHERE_CLAUSE := '(DISABLE_DATE > SYSDATE OR ' ||
1613                   'DISABLE_DATE IS NULL) AND SUBINVENTORY_CODE = ' ||
1614                   SUBINV_TABLE(I) || ' AND INVENTORY_LOCATION_ID IN ' ||
1615                   '(SELECT SECONDARY_LOCATOR FROM MTL_SECONDARY_LOCATORS ' ||
1616                   'WHERE INVENTORY_ITEM_ID = ' || TO_CHAR(ITEM_ID_TABLE(I)) ||
1617                   ' AND ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ||
1618                   ' AND SUBINVENTORY_CODE = ' || SUBINV_TABLE(I) || ')';
1619             ELSIF (RESTRICT_LOC_CODE_TABLE(I) = 2) THEN
1620                X_WHERE_CLAUSE := '(DISABLE_DATE > SYSDATE OR ' ||
1621                'DISABLE_DATE IS NULL) AND (NVL(SUBINVENTORY_CODE, ''Z'')) ' ||
1622                '= ' || '''' || SUBINV_TABLE(I) || '''';
1623             END IF;
1624 
1625             -- By mistake i had removed the following piece of code when
1626             -- arcsing in the file in version 115.49. Included it when
1627             -- fixing bug 2649257.suramasw.
1628 
1629             V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CHECK_COMBINATION',
1630                   'INV', 'MTLL', 101, SEGS_TABLE(I), 'V', NULL, 'ALL',
1631                   ORG_ID_TABLE(I), NULL, X_WHERE_CLAUSE);
1632 
1633             -- End of inclusions for bug 2649257.
1634 
1635          ELSIF (GEN_LOC_CTRL_TABLE(I) = 3) THEN
1636 
1637             V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CREATE_COMBINATION',
1638                   'INV', 'MTLL', 101, SEGS_TABLE(I), 'V', NULL, 'ALL',
1639                   ORG_ID_TABLE(I));
1640 
1641          END IF;
1642 
1643          IF (V) THEN
1644 
1645           -- get the flex combination id and update the interface table.
1646           -- set cid and x_org_id, which are used by the cursor.
1647 
1648           CID := FND_FLEX_KEYVAL.COMBINATION_ID;
1649 
1650           -- Added the following IF condition. Before the fix when the locator
1651           -- control is 'Predefined' and the user passes a wrong value for locator
1652           -- then the collection import will complete normal but the combination_id
1653           -- (CID) generated above will be -1 because the combination will not be
1654           -- available in the system.So after import the user opens UQR or VQR an
1655           -- error is thrown saying the combination doesn't exist and the locator
1656           -- field is blank. After this fix,if CID is valid(>0) then only imported
1657           -- records will be validated as successful and moved to qa_results table
1658           -- else it will error out in the interface table as 'Invalid Value'.
1659           -- Bug 2649257.suramasw.
1660 
1661           IF CID > 0 THEN
1662 
1663             X_ORG_ID := ORG_ID_TABLE(I);
1664 
1665             -- update interface table with locator id and gen loc ctrl value
1666 
1667             -- Bug 3136107.
1668             -- SQL Bind project. Code modified to use bind variables instead of literals
1669             -- Same as the fix done for Bug 3079312.suramasw.
1670 
1671             SQL_STATEMENT :=
1672                'UPDATE QA_RESULTS_INTERFACE QRI ' ||
1673                'SET LAST_UPDATE_DATE = SYSDATE, ' ||
1674                    'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
1675                  ', REQUEST_ID = :REQUEST_ID ' ||
1676                  ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
1677                  ', PROGRAM_ID = :PROGRAM_ID ' ||
1678                  ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
1679                  ID_FIELD || ' = :CID ' ||
1680                  ', ' || COMP_TEXT || 'GEN_LOC_CTRL_CODE = :GEN_LOC_CTRL_TABLE ' ||
1681                  ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1682                   ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
1683                   ' AND  QRI.PROCESS_STATUS = 2 ' ||
1684                    'AND  NOT EXISTS
1685                          (SELECT ''X'' ' ||
1686                          'FROM   QA_INTERFACE_ERRORS QIE ' ||
1687                          'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1688                                       'QRI.TRANSACTION_INTERFACE_ID ' ||
1689                         'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
1690 
1691               EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
1692                                                     X_REQUEST_ID,
1693                                                     X_PROGRAM_APPLICATION_ID,
1694                                                     X_PROGRAM_ID,
1695                                                     CID,
1696                                                     GEN_LOC_CTRL_TABLE(I),
1697                                                     X_GROUP_ID,
1698                                                     INTERFACE_ID_TABLE(I),
1699                                                     l_col1, l_col2, l_col3, l_col4, l_col5;
1700 
1701             -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
1702 
1703          ELSE
1704             INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
1705                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1706                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
1707                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
1708             (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
1709              SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
1710              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
1711 
1712          END IF; -- CID > 0
1713        --Bug 3766000
1714        -- While Importing Results, no error is being thrown even when we
1715        -- are specifying an existent locator but from different subinventory
1716        -- This happens as VALIDATE_SEGS Returns false for a wrong locator value
1717        -- but returns true for non exixtent locator value. Due to this behaviour
1718        -- we are checking the value of CID(combination ID) to test if the locator
1719        -- is correct or not.
1720        -- Below introducing a new if condition to handle if validate_segs returns
1721        -- false value in V
1722        -- saugupta Fri, 30 Jul 2004 03:10:01 -0700 PDT
1723        ELSE
1724           INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
1725              ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1726              CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
1727              PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
1728           (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
1729            SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
1730            X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
1731 
1732        END IF; -- (V) THEN
1733       END IF;
1734    END LOOP;
1735 
1736 END VALIDATE_LOCATOR;
1737 
1738 
1739 -- Start of inclusions for NCM Hardcode Elements.
1740 -- suramasw Thu Oct 31 10:48:59 PST 2002.
1741 -- Bug 2449067.
1742 
1743 
1744 PROCEDURE VALIDATE_TO_LOCATOR(COL_NAME VARCHAR2,
1745                         ERROR_COL_NAME VARCHAR2,
1746                         X_GROUP_ID NUMBER,
1747                         X_USER_ID NUMBER,
1748                         X_LAST_UPDATE_LOGIN NUMBER,
1749                         X_REQUEST_ID NUMBER,
1750                         X_PROGRAM_APPLICATION_ID NUMBER,
1751                         X_PROGRAM_ID NUMBER,
1752                         ERROR_COL_LIST VARCHAR2) IS
1753    SQL_STATEMENT VARCHAR2(2000);
1754    I NUMBER := 0;
1755    V BOOLEAN;
1756    CID NUMBER;
1757    NUM_ROWS NUMBER;
1758    X_INTERFACE_ID NUMBER;
1759    X_SEGS VARCHAR2(2000);
1760    X_ORG_ID NUMBER;
1761    X_TO_SUB_LOC_TYPE NUMBER;
1762    X_LOC_CTRL_CODE NUMBER;
1763    X_RESTRICT_LOC_CODE NUMBER;
1764    X_TO_SUBINV VARCHAR2(10);
1765    X_ORG_LOC_CTRL NUMBER;
1766    X_NEG_INV NUMBER;
1767    X_ITEM_ID NUMBER;
1768    INTERFACE_ID_TABLE NUMBER_TABLE;
1769    SEGS_TABLE CHAR2000_TABLE;
1770    ORG_ID_TABLE NUMBER_TABLE;
1771    TO_SUB_LOC_TYPE_TABLE NUMBER_TABLE;
1772    LOC_CTRL_CODE_TABLE NUMBER_TABLE;
1773    RESTRICT_LOC_CODE_TABLE NUMBER_TABLE;
1774    TO_SUBINV_TABLE CHAR30_TABLE;
1775    ORG_LOC_CTRL_TABLE NUMBER_TABLE;
1776    NEG_INV_TABLE NUMBER_TABLE;
1777    ITEM_ID_TABLE NUMBER_TABLE;
1778    GEN_LOC_CTRL_TABLE NUMBER_TABLE;
1779    SOURCE_CURSOR INTEGER;
1780    IGNORE INTEGER;
1781    ID_FIELD VARCHAR2(30) := 'TO_LOCATOR_ID';
1782    X_WHERE_CLAUSE VARCHAR2(250);
1783 
1784    l_col1 varchar2(100);
1785    l_col2 varchar2(100);
1786    l_col3 varchar2(100);
1787    l_col4 varchar2(100);
1788    l_col5 varchar2(100);
1789 
1790 BEGIN
1791    -- Bug 3136107.SQL Bind project.
1792    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
1793 
1794    -- Bug 2941809. Need to use bind variables instead of literal values when
1795    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
1796    -- kabalakr
1797 
1798    -- Bug 3136107.suramasw.
1799    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
1800 
1801    SQL_STATEMENT :=
1802          'SELECT QRI.TRANSACTION_INTERFACE_ID, ' ||
1803          'QRI.' || COL_NAME || ', ' ||
1804          'QRI.ORGANIZATION_ID, ' ||
1805          'QRI.TO_SUB_LOCATOR_TYPE, ' ||
1806          'QRI.LOCATION_CONTROL_CODE, ' ||
1807          'QRI.RESTRICT_LOCATORS_CODE, ' ||
1808          'QRI.TO_SUBINVENTORY, ' ||
1809          'MP.STOCK_LOCATOR_CONTROL_CODE, ' ||
1810          'MP.NEGATIVE_INV_RECEIPT_CODE, ' ||
1811          'QRI.ITEM_ID ' ||
1812          'FROM QA_RESULTS_INTERFACE QRI, ' ||
1813          '     MTL_PARAMETERS MP ' ||
1814          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1815          ' AND QRI.PROCESS_STATUS = 2 ' ||
1816          ' AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
1817          ' AND NOT EXISTS
1818                (SELECT ''X'' ' ||
1819                'FROM QA_INTERFACE_ERRORS QIE ' ||
1820                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
1821                   'QRI.TRANSACTION_INTERFACE_ID ' ||
1822                'AND QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL))' ||
1823          ' AND QRI.ORGANIZATION_ID = MP.ORGANIZATION_ID';
1824 
1825 
1826    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
1827    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
1828 
1829    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
1830    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
1831 
1832    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1833    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_SEGS, 2000);
1834    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 3, X_ORG_ID);
1835    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 4, X_TO_SUB_LOC_TYPE);
1836    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 5, X_LOC_CTRL_CODE);
1837    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 6, X_RESTRICT_LOC_CODE);
1838    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 7, X_TO_SUBINV, 10);
1839    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 8, X_ORG_LOC_CTRL);
1840    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 9, X_NEG_INV);
1841    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 10, X_ITEM_ID);
1842 
1843    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
1844 
1845    LOOP
1846       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
1847          I := I + 1;
1848          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
1849          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_SEGS);
1850          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 3, X_ORG_ID);
1851          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 4, X_TO_SUB_LOC_TYPE);
1852          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 5, X_LOC_CTRL_CODE);
1853          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 6, X_RESTRICT_LOC_CODE);
1854          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 7, X_TO_SUBINV);
1855          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 8, X_ORG_LOC_CTRL);
1856          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 9, X_NEG_INV);
1857          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 10, X_ITEM_ID);
1858 
1859          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
1860          SEGS_TABLE(I) := X_SEGS;
1861          ORG_ID_TABLE(I) := X_ORG_ID;
1862          TO_SUB_LOC_TYPE_TABLE(I) := X_TO_SUB_LOC_TYPE;
1863          LOC_CTRL_CODE_TABLE(I) := X_LOC_CTRL_CODE;
1864          RESTRICT_LOC_CODE_TABLE(I) := X_RESTRICT_LOC_CODE;
1865          TO_SUBINV_TABLE(I) := X_TO_SUBINV;
1866          ORG_LOC_CTRL_TABLE(I) := X_ORG_LOC_CTRL;
1867          NEG_INV_TABLE(I) := X_NEG_INV;
1868          ITEM_ID_TABLE(I) := X_ITEM_ID;
1869       ELSE
1870          EXIT;
1871       END IF;
1872    END LOOP;
1873    NUM_ROWS := I;
1874    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
1875 
1876    FOR I IN 1..NUM_ROWS LOOP
1877       GEN_LOC_CTRL_TABLE(I) := QLTINVCB.CONTROL(
1878             ORG_CONTROL=>ORG_LOC_CTRL_TABLE(I),
1879             SUB_CONTROL=>TO_SUB_LOC_TYPE_TABLE(I),
1880             ITEM_CONTROL=>LOC_CTRL_CODE_TABLE(I),
1881             RESTRICT_FLAG=>RESTRICT_LOC_CODE_TABLE(I),
1882             NEG_FLAG=>NEG_INV_TABLE(I));
1883 
1884       IF (GEN_LOC_CTRL_TABLE(I) = 1) THEN
1885 
1886          -- not under locator control.  locator must be null
1887 
1888          IF (SEGS_TABLE(I) IS NOT NULL) THEN
1889             INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
1890                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1891                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
1892                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
1893                (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_CANT_HAVE_LOC,
1894                SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
1895                X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
1896          END IF;
1897          -- update interface table with gen loc ctrl value
1898 
1899          SQL_STATEMENT :=
1900                'UPDATE QA_RESULTS_INTERFACE QRI ' ||
1901                'SET LAST_UPDATE_DATE = SYSDATE, ' ||
1902                   'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
1903                  ', REQUEST_ID = :REQUEST_ID ' ||
1904                  ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
1905                  ', PROGRAM_ID = :PROGRAM_ID ' ||
1906                  ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
1907                  'GEN_LOC_CTRL_CODE = :GEN_LOC_CTRL_TABLE ' ||
1908                  ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1909                   ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
1910                   ' AND  QRI.PROCESS_STATUS = 2 ' ||
1911                    'AND  NOT EXISTS
1912                          (SELECT ''X'' ' ||
1913                          'FROM   QA_INTERFACE_ERRORS QIE ' ||
1914                          'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
1915                                       'QRI.TRANSACTION_INTERFACE_ID ' ||
1916                         'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
1917 
1918          EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
1919                                                X_REQUEST_ID,
1920                                                X_PROGRAM_APPLICATION_ID,
1921                                                X_PROGRAM_ID,
1922                                                GEN_LOC_CTRL_TABLE(I),
1923                                                X_GROUP_ID,
1924                                                INTERFACE_ID_TABLE(I),
1925                                                l_col1, l_col2, l_col3, l_col4, l_col5;
1926 
1927          -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
1928 
1929       ELSIF (GEN_LOC_CTRL_TABLE(I) IN (2, 3)) THEN
1930 -- !! maybe should validate mandatory here
1931 
1932          IF (GEN_LOC_CTRL_TABLE(I) = 2) THEN
1933 
1934             IF (RESTRICT_LOC_CODE_TABLE(I) = 1) THEN
1935                X_WHERE_CLAUSE := '(DISABLE_DATE > SYSDATE OR ' ||
1936                   'DISABLE_DATE IS NULL) AND SUBINVENTORY_CODE = ' ||
1937                   TO_SUBINV_TABLE(I) || ' AND INVENTORY_LOCATION_ID IN ' ||
1938                   '(SELECT SECONDARY_LOCATOR FROM MTL_SECONDARY_LOCATORS ' ||
1939                   'WHERE INVENTORY_ITEM_ID = ' || TO_CHAR(ITEM_ID_TABLE(I)) ||
1940                   ' AND ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ||
1941                   ' AND SUBINVENTORY_CODE = ' || TO_SUBINV_TABLE(I) || ')';
1942             ELSIF (RESTRICT_LOC_CODE_TABLE(I) = 2) THEN
1943                X_WHERE_CLAUSE := '(DISABLE_DATE > SYSDATE OR ' ||
1944                'DISABLE_DATE IS NULL) AND (NVL(SUBINVENTORY_CODE, ''Z'')) ' ||
1945                '= ' || '''' || TO_SUBINV_TABLE(I) || '''';
1946             END IF;
1947 
1948             V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CHECK_COMBINATION',
1949                   'INV', 'MTLL', 101, SEGS_TABLE(I), 'V', NULL, 'ALL',
1950                   ORG_ID_TABLE(I), NULL, X_WHERE_CLAUSE);
1951 
1952          ELSIF (GEN_LOC_CTRL_TABLE(I) = 3) THEN
1953 
1954             V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CREATE_COMBINATION',
1955                   'INV', 'MTLL', 101, SEGS_TABLE(I), 'V', NULL, 'ALL',
1956                   ORG_ID_TABLE(I));
1957          END IF;
1958          IF (V) THEN
1959 
1960           -- get the flex combination id and update the interface table.
1961           -- set cid and x_org_id, which are used by the cursor.
1962 
1963           CID := FND_FLEX_KEYVAL.COMBINATION_ID;
1964 
1965           -- Added the following IF condition. Before the fix when the locator
1966           -- control is 'Predefined' and the user passes a wrong value for to_locator
1967           -- then the collection import will complete normal but the combination_id
1968           -- (CID) generated above will be -1 because the combination will not be
1969           -- available in the system.So after import the user opens UQR or VQR an
1970           -- error is thrown saying the combination doesn't exist and the to_locator
1971           -- field is blank. After this fix,if CID is valid(>0) then only imported
1972           -- records will be validated as successful and moved to qa_results table
1973           -- else it will error out in the interface table as 'Invalid Value'.
1974           -- Bug 2649257.suramasw.
1975 
1976           IF CID > 0 THEN
1977 
1978             X_ORG_ID := ORG_ID_TABLE(I);
1979 
1980             -- update interface table with to_locator id and gen loc ctrl value
1981 
1982             -- Bug 3136107.
1983             -- SQL Bind project. Code modified to use bind variables instead of literals
1984             -- Same as the fix done for Bug 3079312.suramasw.
1985 
1986             SQL_STATEMENT :=
1987                'UPDATE QA_RESULTS_INTERFACE QRI ' ||
1988                'SET LAST_UPDATE_DATE = SYSDATE, ' ||
1989                   'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
1990                  ', REQUEST_ID = :REQUEST_ID ' ||
1991                  ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
1992                  ', PROGRAM_ID = :PROGRAM_ID ' ||
1993                  ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
1994                  ID_FIELD || ' = :CID ' ||
1995                  ', GEN_LOC_CTRL_CODE = :GEN_LOC_CTRL_TABLE ' ||
1996                  ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
1997                   ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
1998                   ' AND  QRI.PROCESS_STATUS = 2 ' ||
1999                    'AND  NOT EXISTS
2000                          (SELECT ''X'' ' ||
2001                          'FROM   QA_INTERFACE_ERRORS QIE ' ||
2002                          'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2003                                       'QRI.TRANSACTION_INTERFACE_ID ' ||
2004                         'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
2005 
2006               EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
2007                                                     X_REQUEST_ID,
2008                                                     X_PROGRAM_APPLICATION_ID,
2009                                                     X_PROGRAM_ID,
2010                                                     CID,
2011                                                     GEN_LOC_CTRL_TABLE(I),
2012                                                     X_GROUP_ID,
2013                                                     INTERFACE_ID_TABLE(I),
2014                                                     l_col1, l_col2, l_col3, l_col4, l_col5;
2015 
2016             -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2017          ELSE
2018             INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
2019                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
2020                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
2021                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
2022             (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
2023              SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
2024              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
2025 
2026          END IF; -- CID > 0
2027 
2028        --Bug 3766000
2029        -- While Importing Results, no error is being thrown even when we
2030        -- are specifying an existent locator but from different subinventory
2031        -- This happens as VALIDATE_SEGS Returns false for a wrong locator value
2032        -- but returns true for non exixtent locator value. Due to this behaviour
2033        -- we are checking the value of CID(combination ID) to test if the locator
2034        -- is correct or not.
2035        -- Below introducing a new if condition to handle if validate_segs returns
2036        -- false value in V
2037        -- saugupta Fri, 30 Jul 2004 03:10:01 -0700 PDT
2038        ELSE
2039           INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
2040              ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
2041              CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
2042              PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
2043           (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
2044            SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
2045            X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
2046 
2047        END IF; -- (V) THEN
2048       END IF;
2049    END LOOP;
2050 
2051 END VALIDATE_TO_LOCATOR;
2052 
2053 -- End of inclusions for NCM Hardcode Elements.
2054 
2055 
2056 -- This procedure validate ITEM and COMP_ITEM segs
2057 -- It takes care of valiadtion of COMP_ITEM if it
2058 -- is dependent on ITEM.
2059 -- saugupta Fri, 16 Jul 2004 00:09:54 -0700 PDT
2060 
2061 PROCEDURE VALIDATE_ITEM(COL_NAME VARCHAR2,
2062                            ERROR_COL_NAME VARCHAR2,
2063                            X_GROUP_ID NUMBER,
2064                            X_USER_ID NUMBER,
2065                            X_LAST_UPDATE_LOGIN NUMBER,
2066                            X_REQUEST_ID NUMBER,
2067                            X_PROGRAM_APPLICATION_ID NUMBER,
2068                            X_PROGRAM_ID NUMBER,
2069                            ERROR_COL_LIST VARCHAR2) IS
2070    SQL_STATEMENT VARCHAR2(2000);
2071    I NUMBER := 0;
2072    V BOOLEAN;
2073    CID NUMBER;
2074    NUM_ROWS NUMBER;
2075    X_INTERFACE_ID NUMBER;
2076    X_SEGS VARCHAR2(2000);
2077    X_ORG_ID NUMBER;
2078    X_LINE_ID NUMBER;
2079    INTERFACE_ID_TABLE NUMBER_TABLE;
2080    SEGS_TABLE CHAR2000_TABLE;
2081    ORG_ID_TABLE NUMBER_TABLE;
2082    LINE_ID_TABLE NUMBER_TABLE;
2083    SOURCE_CURSOR INTEGER;
2084    IGNORE INTEGER;
2085    ERRMSG VARCHAR2(30);
2086    ID_FIELD VARCHAR2(30);
2087    CURSOR C IS SELECT RESTRICT_SUBINVENTORIES_CODE,
2088                       RESTRICT_LOCATORS_CODE,
2089                       LOCATION_CONTROL_CODE,
2090                       REVISION_QTY_CONTROL_CODE
2091                FROM   MTL_SYSTEM_ITEMS
2092                WHERE  INVENTORY_ITEM_ID = CID
2093                  AND  ORGANIZATION_ID = X_ORG_ID;
2094 
2095    ITM_RST_SINV NUMBER;
2096    ITM_RST_LOC NUMBER;
2097    ITM_LOC_CTRL NUMBER;
2098    REV_CTRL_CODE NUMBER;
2099 
2100    COMP_TEXT VARCHAR2(6);
2101 
2102    -- Bug 3765678. COMP_ITEM is not getting validated along
2103    -- with ITEM if it is dependent on ITEM. Search for Bug#
2104    -- to get the complete code changes. Below increasing the
2105    -- length of String to accomodate new X_WHERE_CLAUSE
2106    -- built to validate COMP_ITEM.
2107    -- saugupta Fri, 16 Jul 2004 03:11:44 -0700 PDT
2108    --  X_WHERE_CLAUSE VARCHAR2(250);
2109    X_WHERE_CLAUSE VARCHAR2(1000);
2110 
2111    l_col1 varchar2(100);
2112    l_col2 varchar2(100);
2113    l_col3 varchar2(100);
2114    l_col4 varchar2(100);
2115    l_col5 varchar2(100);
2116 
2117 BEGIN
2118    -- Bug 3136107.SQL Bind project.
2119    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
2120 
2121    IF (COL_NAME = 'COMP_ITEM') THEN
2122       ID_FIELD := 'COMP_ITEM_ID';
2123       COMP_TEXT := 'COMP_';
2124    ELSIF (COL_NAME = 'ITEM') THEN
2125       ID_FIELD := 'ITEM_ID';
2126       COMP_TEXT := '';
2127 
2128       -- Bug 3765678. COMP_ITEM is not getting validated along
2129       -- with ITEM if it is dependent on ITEM.
2130       -- Introduced a new global variable G_ITEM_ID
2131       -- to store ITEM_ID so COMP_ITEM can be verified
2132       -- against it. Initializing it to NULL for ITEM.
2133       -- saugupta Fri, 16 Jul 2004 02:58:10 -0700 PDT
2134 
2135 
2136       -- Bug 3807782. COMP_ITEM was not getting properly validated for
2137       -- bulk insert. G_ITEM_ID is not used in the new logic.
2138       -- So commenting out the line below.
2139       -- srhariha. Wed Aug  4 23:33:07 PDT 2004.
2140       -- G_ITEM_ID := NULL;
2141 
2142    END IF;
2143 
2144    -- Bug 2941809. Need to use bind variables instead of literal values when
2145    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
2146    -- kabalakr
2147 
2148    -- Bug 3136107.suramasw.
2149    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
2150 
2151    SQL_STATEMENT :=
2152          'SELECT TRANSACTION_INTERFACE_ID, ' || COL_NAME ||
2153          ', ORGANIZATION_ID, LINE_ID ' ||
2154          'FROM QA_RESULTS_INTERFACE QRI ' ||
2155          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2156          ' AND QRI.PROCESS_STATUS = 2 ' ||
2157          ' AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
2158          ' AND NOT EXISTS
2159                (SELECT ''X'' ' ||
2160                'FROM QA_INTERFACE_ERRORS QIE ' ||
2161                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
2162                   'QRI.TRANSACTION_INTERFACE_ID ' ||
2163                'AND QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL))';
2164 
2165    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
2166    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
2167 
2168    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
2169    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
2170 
2171    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2172    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_SEGS, 2000);
2173    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 3, X_ORG_ID);
2174    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 4, X_LINE_ID);
2175 
2176    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
2177 
2178    LOOP
2179       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
2180          I := I + 1;
2181          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2182          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_SEGS);
2183          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 3, X_ORG_ID);
2184          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 4, X_LINE_ID);
2185          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
2186          SEGS_TABLE(I) := X_SEGS;
2187          ORG_ID_TABLE(I) := X_ORG_ID;
2188          LINE_ID_TABLE(I) := X_LINE_ID;
2189       ELSE
2190          EXIT;
2191       END IF;
2192    END LOOP;
2193 
2194    NUM_ROWS := I;
2195    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
2196 
2197    -- Added the UNION condition in the X_WHERE_CLAUSE below to
2198    -- validate Flow Items associated with Production Line.
2199    -- Bug 2791447.suramasw.Tue Feb 11 00:06:05 PST 2003
2200 
2201    FOR I IN 1..NUM_ROWS LOOP
2202       IF ((COL_NAME = 'ITEM') AND (LINE_ID_TABLE(I) IS NOT NULL)) THEN
2203          X_WHERE_CLAUSE := 'INVENTORY_ITEM_ID IN ' ||
2204                '((SELECT PRIMARY_ITEM_ID FROM WIP_REP_ASSY_VAL_V ' ||
2205                'WHERE ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ||
2206                ' AND LINE_ID = ' || TO_CHAR(LINE_ID_TABLE(I)) || ')' ||
2207                'UNION' ||
2208                '(SELECT ASSEMBLY_ITEM_ID FROM BOM_OPERATIONAL_ROUTINGS ' ||
2209                'WHERE ORGANIZATION_ID =  ' || TO_CHAR(ORG_ID_TABLE(I)) ||
2210                'AND LINE_ID = ' || TO_CHAR(LINE_ID_TABLE(I)) || '))';
2211 
2212 
2213       -- Bug 3765678. COMP_ITEM is not getiing validated if it is
2214       -- dependent on ITEM. forming X_WHERE_CLAUSE below for passing it
2215       -- to VALIDATE_SEGS() to make sure that COMP_ITEM
2216       -- gets properly validated if dependent on ITEM.
2217       -- We used G_ITEM_ID in the clause to check for COMP_ITEM
2218       -- included for ITEM. Before coming here ITEM is already validated
2219       -- and G_ITEM_ID contains value of ITEM.
2220       -- saugupta Fri, 16 Jul 2004 03:05:15 -0700 PDT
2221 
2222       -- Bug 3807782. COMP_ITEM was not getting properly validated for
2223       -- bulk insert. G_ITEM_ID is not used in the new logic. Dependency is
2224       -- not validated using the WHERE clause parameter to FND call.
2225       -- So commenting out the logic below.
2226       -- srhariha. Wed Aug  4 23:33:07 PDT 2004.
2227       /*ELSIF ((COL_NAME = 'COMP_ITEM') AND (G_ITEM_ID IS NOT NULL)) THEN
2228              X_WHERE_CLAUSE := 'INVENTORY_ITEM_ID IN ' ||
2229                ' ( SELECT COMPONENT_ITEM_ID ' ||
2230                ' FROM BOM_INVENTORY_COMPONENTS BIC, BOM_BILL_OF_MATERIALS BOM ' ||
2231                ' WHERE BOM.ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ||
2232                ' AND BOM.ASSEMBLY_ITEM_ID = ' || TO_CHAR(G_ITEM_ID) ||
2233                ' AND BIC.BILL_SEQUENCE_ID = BOM.BILL_SEQUENCE_ID ' ||
2234                ' AND BIC.EFFECTIVITY_DATE <=  SYSDATE ' ||
2235                ' AND NVL(BIC.DISABLE_DATE, SYSDATE+1) > SYSDATE )';*/
2236 
2237       ELSE
2238          X_WHERE_CLAUSE := NULL;
2239       END IF;
2240 
2241       V := FND_FLEX_KEYVAL.VALIDATE_SEGS(
2242             'CHECK_COMBINATION',
2243             'INV', 'MSTK', 101, SEGS_TABLE(I), 'V',
2244             NULL, 'ALL', ORG_ID_TABLE(I), NULL, X_WHERE_CLAUSE);
2245 
2246       IF (V) THEN
2247 
2248          -- get the flex combination id and update the interface table.
2249          -- set cid and x_org_id, which are used by the cursor.
2250 
2251          CID := FND_FLEX_KEYVAL.COMBINATION_ID;
2252          X_ORG_ID := ORG_ID_TABLE(I);
2253 
2254          -- Bug 3765678. COMP_ITEM is not getting validated along
2255          -- with ITEM if it is dependent on ITEM. Storing the value
2256          -- ITEM used in above ELSIF for validation of COMP_ITEM
2257          -- saugupta Fri, 16 Jul 2004 03:13:52 -0700 PDT
2258 
2259          -- Bug 3807782. COMP_ITEM was not getting properly validated for
2260          -- bulk insert. G_ITEM_ID is not used in the new logic.
2261          -- So commenting out the line below.
2262          -- srhariha. Wed Aug  4 23:33:07 PDT 2004.
2263 
2264          /*IF (COL_NAME = 'ITEM') THEN
2265              G_ITEM_ID := CID;
2266            END IF;*/
2267 
2268 
2269          -- bring in other columns from the items table.  we'll need these
2270          -- values later when validating revision, subinventory, and locator
2271 
2272          OPEN C;
2273          FETCH C INTO ITM_RST_SINV, ITM_RST_LOC, ITM_LOC_CTRL, REV_CTRL_CODE;
2274          CLOSE C;
2275 
2276          -- Bug 3136107.
2277          -- SQL Bind project. Code modified to use bind variables instead of literals
2278          -- Same as the fix done for Bug 3079312.suramasw.
2279 
2280          -- Bug 4270911. CU2 SQL Literal fix. TD #24
2281          -- Use bind variables for inventory_code, locator_code etc.
2282          -- srhariha. Fri Apr 15 05:05:29 PDT 2005.
2283 
2284 
2285          SQL_STATEMENT :=
2286             'UPDATE QA_RESULTS_INTERFACE QRI ' ||
2287             'SET LAST_UPDATE_DATE = SYSDATE, ' ||
2288                'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
2289               ', REQUEST_ID = :REQUEST_ID ' ||
2290               ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
2291               ', PROGRAM_ID = :PROGRAM_ID ' ||
2292               ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
2293               ID_FIELD || ' = :CID ' ||
2294               ', ' || COMP_TEXT || 'RESTRICT_SUBINV_CODE = :BIND_RST_SINV ' ||
2295               ', ' || COMP_TEXT || 'RESTRICT_LOCATORS_CODE = :BIND_RST_LOC ' ||
2296               ', ' || COMP_TEXT || 'LOCATION_CONTROL_CODE = :BIND_LOC_CTRL ' ||
2297               ', ' || COMP_TEXT || 'REVISION_QTY_CONTROL_CODE = :BIND_REV_CTRL ' ||
2298               ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2299                ' AND QRI.TRANSACTION_INTERFACE_ID =  :INTERFACE_ID_TABLE ' ||
2300                ' AND  QRI.PROCESS_STATUS = 2 ' ||
2301                 'AND  NOT EXISTS
2302                       (SELECT ''X'' ' ||
2303                       'FROM   QA_INTERFACE_ERRORS QIE ' ||
2304                       'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2305                                    'QRI.TRANSACTION_INTERFACE_ID ' ||
2306                         'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
2307 
2308           ITM_RST_SINV  :=  TO_CHAR(NVL(ITM_RST_SINV, 2));
2309           ITM_RST_LOC   :=  TO_CHAR(NVL(ITM_RST_LOC, 1));
2310           ITM_LOC_CTRL  :=  TO_CHAR(NVL(ITM_LOC_CTRL, 1));
2311           REV_CTRL_CODE :=  TO_CHAR(NVL(REV_CTRL_CODE, 1));
2312 
2313           EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
2314                                                  X_REQUEST_ID,
2315                                                  X_PROGRAM_APPLICATION_ID,
2316                                                  X_PROGRAM_ID,
2317                                                  CID,
2318                                                  ITM_RST_SINV,
2319                                                  ITM_RST_LOC,
2320                                                  ITM_LOC_CTRL,
2321                                                  REV_CTRL_CODE,
2322                                                  X_GROUP_ID,
2323                                                  INTERFACE_ID_TABLE(I),
2324                                                  l_col1, l_col2, l_col3, l_col4, l_col5;
2325 
2326 
2327          -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2328       ELSE
2329          INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
2330                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
2331                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
2332                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
2333          (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
2334           SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
2335           X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
2336       END IF;
2337    END LOOP;
2338 
2339 
2340     -- Bug 3807782. COMP_ITEM was not getting properly validated for  bulk insert.
2341     -- Import design discourages procedural approach to validate, which we were using before.
2342     -- New logic implemented here.
2343     -- Check dependeny between ITEM and COMP_ITEM after
2344     --  (1) Validating ITEM. (ITEM_ID is populated)
2345     --  (2) Validating COMP_ITEM. (COMP_ITEM_ID is populated)
2346     -- "ID_FIELD(COMP_ITEM_ID) IS NOT NULL and QRI.ITEM_ID IS NOT NULL" part takes care
2347     -- the logic explained above.
2348     -- If (1) and (2) evaluates to true check the dependency using BOM tables, carried out
2349     -- in final NOT EXISTS part.
2350     -- Though explained procedurally, implemented in non-procedural fashion.
2351     -- srhariha. Wed Aug  4 23:33:07 PDT 2004.
2352 
2353    IF ( COL_NAME = 'COMP_ITEM') THEN
2354      SQL_STATEMENT :=
2355            'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
2356            'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
2357            'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
2358            'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
2359            'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
2360            ':ERROR_MANDATORY, SYSDATE, ' ||
2361            ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
2362            ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
2363            'FROM   QA_RESULTS_INTERFACE QRI ' ||
2364            'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
2365            ' AND  QRI.PROCESS_STATUS = :PROCESS_STATUS ' ||
2366            ' AND  NOT EXISTS ' ||
2367                              '(SELECT ''X'' ' ||
2368                              'FROM   QA_INTERFACE_ERRORS QIE ' ||
2369                              'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2370                              'QRI.TRANSACTION_INTERFACE_ID ' ||
2371                              'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
2372          ' AND QRI.' || ID_FIELD || ' IS NOT NULL ' ||
2373          ' AND QRI.ITEM_ID IS NOT NULL' ||
2374          ' AND NOT EXISTS '||
2375                             '(SELECT COMPONENT_ITEM_ID ' ||
2376                             ' FROM BOM_INVENTORY_COMPONENTS BIC, BOM_BILL_OF_MATERIALS BOM ' ||
2377                             ' WHERE BOM.ORGANIZATION_ID = QRI.ORGANIZATION_ID' ||
2378                             ' AND BOM.ASSEMBLY_ITEM_ID =  QRI.ITEM_ID ' ||
2379                             ' AND BIC.COMPONENT_ITEM_ID = QRI.COMP_ITEM_ID' ||
2380                             ' AND BIC.BILL_SEQUENCE_ID =  BOM.BILL_SEQUENCE_ID ' ||
2381                             ' AND BIC.EFFECTIVITY_DATE <=  SYSDATE ' ||
2382                             ' AND NVL(BIC.DISABLE_DATE, SYSDATE+1) > SYSDATE )';
2383 
2384 
2385 
2386 
2387       EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
2388           ERROR_INVALID_VALUE, X_USER_ID, X_USER_ID,
2389           X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
2390           X_PROGRAM_ID, X_GROUP_ID,2,
2391           l_col1, l_col2, l_col3, l_col4, l_col5;
2392 
2393    END IF;
2394 
2395 END VALIDATE_ITEM;
2396 
2397 -- Added the procedure below to enable the validation of
2398 -- ASSET_GROUP while collection data importing.
2399 -- See Bug #2368381
2400 -- This procedure will be called from VALIDATE_STEPS only
2401 -- Procdure added by suramasw
2402 -- Comments added by rkunchal Tue May 28 00:22:11 PDT 2002
2403 
2404 -- To fix the reopened bug 2368381
2405 -- Renamed this procedure from VALIDATE_AG to VALIDATE_EAM_ITEMS.
2406 -- This is the place where Asset Groups and Asset Activites are
2407 -- validated while importing.
2408 -- Asset Groups and Asset Activities are same from the Quality
2409 -- perspective. Only difference is ID column.
2410 -- rkunchal Thu Jul 18 07:23:13 PDT 2002
2411 
2412 --dgupta: Start R12 EAM Integration. Bug 4345492
2413 PROCEDURE VALIDATE_EAM_ITEMS(COL_NAME VARCHAR2,
2414                              ERROR_COL_NAME VARCHAR2,
2415                              X_GROUP_ID NUMBER,
2416                              X_USER_ID NUMBER,
2417                              X_LAST_UPDATE_LOGIN NUMBER,
2418                              X_REQUEST_ID NUMBER,
2419                              X_PROGRAM_APPLICATION_ID NUMBER,
2420                              X_PROGRAM_ID NUMBER,
2421                              ERROR_COL_LIST VARCHAR2) IS
2422    SQL_STATEMENT VARCHAR2(2000);
2423    I NUMBER := 0;
2424    V BOOLEAN;
2425    CID NUMBER;
2426    NUM_ROWS NUMBER;
2427    X_INTERFACE_ID NUMBER;
2428    X_SEGS VARCHAR2(2000);
2429    X_ORG_ID NUMBER;
2430    X_LINE_ID NUMBER;
2431    INTERFACE_ID_TABLE NUMBER_TABLE;
2432    SEGS_TABLE CHAR2000_TABLE;
2433    ORG_ID_TABLE NUMBER_TABLE;
2434    LINE_ID_TABLE NUMBER_TABLE;
2435    SOURCE_CURSOR INTEGER;
2436    IGNORE INTEGER;
2437    ERRMSG VARCHAR2(30);
2438    ID_FIELD VARCHAR2(30);
2439    COMP_TEXT VARCHAR2(6);
2440    X_WHERE_CLAUSE VARCHAR2(250);
2441 
2442    l_col1 varchar2(100);
2443    l_col2 varchar2(100);
2444    l_col3 varchar2(100);
2445    l_col4 varchar2(100);
2446    l_col5 varchar2(100);
2447 
2448 BEGIN
2449    -- Bug 3136107.SQL Bind project.
2450    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
2451 
2452    IF (COL_NAME = 'ASSET_ACTIVITY') THEN
2453       ID_FIELD := 'ASSET_ACTIVITY_ID';
2454 
2455 -- added the following to include new hardcoded element followup activity
2456 -- saugupta
2457 
2458    ELSIF (COL_NAME = 'FOLLOWUP_ACTIVITY') THEN
2459       ID_FIELD := 'FOLLOWUP_ACTIVITY_ID';
2460    END IF;
2461 
2462    -- Bug 2941809. Need to use bind variables instead of literal values when
2463    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
2464    -- kabalakr
2465 
2466    -- Bug 3136107.suramasw.
2467    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
2468 
2469    SQL_STATEMENT :=
2470          'SELECT TRANSACTION_INTERFACE_ID, ' || COL_NAME ||
2471          ', ORGANIZATION_ID ' ||
2472          'FROM QA_RESULTS_INTERFACE QRI ' ||
2473          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2474          ' AND QRI.PROCESS_STATUS = 2 ' ||
2475          ' AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
2476          ' AND NOT EXISTS
2477                (SELECT ''X'' ' ||
2478                'FROM QA_INTERFACE_ERRORS QIE ' ||
2479                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
2480                'QRI.TRANSACTION_INTERFACE_ID ' ||
2481                'AND QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL)) ';
2482 
2483    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
2484 
2485    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
2486 
2487    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
2488    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
2489 
2490    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2491    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_SEGS, 2000);
2492    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 3, X_ORG_ID);
2493 
2494    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
2495 
2496    LOOP
2497       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
2498          I := I + 1;
2499          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2500          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_SEGS);
2501          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 3, X_ORG_ID);
2502          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
2503          SEGS_TABLE(I) := X_SEGS;
2504          ORG_ID_TABLE(I) := X_ORG_ID;
2505       ELSE
2506          EXIT;
2507      END IF;
2508    END LOOP;
2509 
2510    NUM_ROWS := I;
2511    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
2512 
2513    FOR I IN 1..NUM_ROWS LOOP
2514       -- For Asset Activities, EAM_ITEM_TYPE is 2
2515       IF (COL_NAME LIKE 'ASSET_ACTIVITY') THEN
2516          X_WHERE_CLAUSE := ' EAM_ITEM_TYPE = ' || 2 ||
2517 				    ' AND ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ;
2518 
2519 -- added the following to include new hardcoded element followup activity
2520 -- saugupta
2521 
2522       ELSIF (COL_NAME LIKE 'FOLLOWUP_ACTIVITY') THEN
2523          X_WHERE_CLAUSE := ' EAM_ITEM_TYPE = ' || 2 ||
2524 				    ' AND ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ;
2525 
2526       ELSE
2527          X_WHERE_CLAUSE := NULL;
2528       END IF;
2529 
2530       V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CHECK_COMBINATION',
2531 					 'INV',
2532 					 'MSTK',
2533 					 101,
2534 					 SEGS_TABLE(I),
2535 					 'V',
2536 					 NULL,
2537 					 'ALL',
2538 					 ORG_ID_TABLE(I),
2539 					 NULL,
2540 					 X_WHERE_CLAUSE);
2541 
2542       IF (V) THEN
2543          -- get the flex combination id and update the interface table.
2544          -- set cid and x_org_id, which are used by the cursor.
2545 
2546          CID := FND_FLEX_KEYVAL.COMBINATION_ID;
2547          X_ORG_ID := ORG_ID_TABLE(I);
2548 
2549          SQL_STATEMENT :=
2550             'UPDATE QA_RESULTS_INTERFACE QRI ' ||
2551             'SET LAST_UPDATE_DATE = SYSDATE, ' ||
2552             'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
2553             ', REQUEST_ID = :REQUEST_ID ' ||
2554             ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
2555             ', PROGRAM_ID = :PROGRAM_ID ' ||
2556             ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
2557             ID_FIELD || ' = :CID ' ||
2558             ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2559             ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
2560             ' AND  QRI.PROCESS_STATUS = 2 ' ||
2561             'AND  NOT EXISTS
2562             	(SELECT ''X'' ' ||
2563                  'FROM   QA_INTERFACE_ERRORS QIE ' ||
2564                  'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2565                  'QRI.TRANSACTION_INTERFACE_ID ' ||
2566                  'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
2567           EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
2568                                                 X_REQUEST_ID,
2569                                                 X_PROGRAM_APPLICATION_ID,
2570                                                 X_PROGRAM_ID,
2571                                                 CID,
2572                                                 X_GROUP_ID,
2573                                                 INTERFACE_ID_TABLE(I),
2574                                                 l_col1, l_col2, l_col3, l_col4, l_col5;
2575 
2576          -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2577       ELSE
2578          INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
2579                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
2580                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
2581                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
2582                (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
2583                 SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
2584                 X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
2585       END IF;
2586    END LOOP;
2587 
2588 END VALIDATE_EAM_ITEMS;
2589 --dgupta: End R12 EAM Integration. Bug 4345492
2590 
2591 -- Start of inclusions for NCM Hardcode Elements.
2592 -- suramasw Thu Oct 31 10:48:59 PST 2002.
2593 -- Bug 2449067.
2594 
2595 
2596 PROCEDURE VALIDATE_REFERENCE(COL_NAME VARCHAR2,
2597                              ERROR_COL_NAME VARCHAR2,
2598                              X_GROUP_ID NUMBER,
2599                              X_USER_ID NUMBER,
2600                              X_LAST_UPDATE_LOGIN NUMBER,
2601                              X_REQUEST_ID NUMBER,
2602                              X_PROGRAM_APPLICATION_ID NUMBER,
2603                              X_PROGRAM_ID NUMBER,
2604                              ERROR_COL_LIST VARCHAR2) IS
2605    SQL_STATEMENT VARCHAR2(2000);
2606 
2607    I NUMBER := 0;
2608    V BOOLEAN;
2609    CID NUMBER;
2610    NUM_ROWS NUMBER;
2611    X_INTERFACE_ID NUMBER;
2612    X_SEGS VARCHAR2(2000);
2613    X_ORG_ID NUMBER;
2614    X_LINE_ID NUMBER;
2615    INTERFACE_ID_TABLE NUMBER_TABLE;
2616    SEGS_TABLE CHAR2000_TABLE;
2617    ORG_ID_TABLE NUMBER_TABLE;
2618    LINE_ID_TABLE NUMBER_TABLE;
2619    SOURCE_CURSOR INTEGER;
2620    IGNORE INTEGER;
2621    ERRMSG VARCHAR2(30);
2622    ID_FIELD VARCHAR2(30);
2623    X_WHERE_CLAUSE VARCHAR2(250);
2624 
2625    l_col1 varchar2(100);
2626    l_col2 varchar2(100);
2627    l_col3 varchar2(100);
2628    l_col4 varchar2(100);
2629    l_col5 varchar2(100);
2630 
2631 BEGIN
2632    -- Bug 3136107.SQL Bind project.
2633    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
2634 
2635    IF (COL_NAME = 'BILL_REFERENCE') THEN
2636       ID_FIELD := 'BILL_REFERENCE_ID';
2637    ELSIF (COL_NAME = 'ROUTING_REFERENCE') THEN
2638       ID_FIELD := 'ROUTING_REFERENCE_ID';
2639    END IF;
2640 
2641    -- Bug 2941809. Need to use bind variables instead of literal values when
2642    -- using DBMS_SQL.EXECUTE. This is for the SQL Bind Compliance Project.
2643    -- kabalakr
2644 
2645    -- Bug 3136107.suramasw.
2646    -- Replaced :ERR_COL introduced in the version 115.63 by :ERROR_COL_NAME
2647 
2648    SQL_STATEMENT :=
2649          'SELECT TRANSACTION_INTERFACE_ID, ' || COL_NAME ||
2650          ', ORGANIZATION_ID, LINE_ID ' ||
2651          'FROM QA_RESULTS_INTERFACE QRI ' ||
2652          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2653          ' AND QRI.PROCESS_STATUS = 2 ' ||
2654          ' AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
2655          ' AND NOT EXISTS
2656                (SELECT ''X'' ' ||
2657                'FROM QA_INTERFACE_ERRORS QIE ' ||
2658                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
2659                'QRI.TRANSACTION_INTERFACE_ID ' ||
2660                'AND QIE.ERROR_COLUMN IN ( :ERROR_COL_NAME, NULL))';
2661 
2662    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
2663 
2664    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
2665 
2666    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
2667    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':ERROR_COL_NAME', ERROR_COL_NAME);
2668 
2669    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2670    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 2, X_SEGS, 2000);
2671    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 3, X_ORG_ID);
2672    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 4, X_LINE_ID);
2673 
2674    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
2675 
2676    LOOP
2677       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
2678          I := I + 1;
2679          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
2680          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 2, X_SEGS);
2681          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 3, X_ORG_ID);
2682          DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 4, X_LINE_ID);
2683          INTERFACE_ID_TABLE(I) := X_INTERFACE_ID;
2684          SEGS_TABLE(I) := X_SEGS;
2685          ORG_ID_TABLE(I) := X_ORG_ID;
2686          LINE_ID_TABLE(I) := X_LINE_ID;
2687       ELSE
2688          EXIT;
2689      END IF;
2690    END LOOP;
2691 
2692    NUM_ROWS := I;
2693    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
2694 
2695    FOR I IN 1..NUM_ROWS LOOP
2696 
2697       --IF (COL_NAME LIKE 'BILL_REFERENCE') OR (COL_NAME  LIKE 'ROUTING_REFERENCE') THEN
2698       IF (COL_NAME IN ('BILL_REFERENCE','ROUTING_REFERENCE') AND (LINE_ID_TABLE(I) IS NOT NULL))
2699 THEN
2700          X_WHERE_CLAUSE := 'INVENTORY_ITEM_ID IN ' ||
2701                '(SELECT PRIMARY_ITEM_ID FROM WIP_REP_ASSY_VAL_V ' ||
2702                'WHERE ORGANIZATION_ID = ' || TO_CHAR(ORG_ID_TABLE(I)) ||
2703                ' AND LINE_ID = ' || TO_CHAR(LINE_ID_TABLE(I)) || ')';
2704 
2705       ELSE
2706          X_WHERE_CLAUSE := NULL;
2707       END IF;
2708 
2709       V := FND_FLEX_KEYVAL.VALIDATE_SEGS('CHECK_COMBINATION',
2710                                          'INV',
2711                                          'MSTK',
2712                                          101,
2713                                          SEGS_TABLE(I),
2714                                          'V',
2715                                          NULL,
2716                                          'ALL',
2717                                          ORG_ID_TABLE(I),
2718                                          NULL,
2719                                          X_WHERE_CLAUSE);
2720 
2721       IF (V) THEN
2722          -- get the flex combination id and update the interface table.
2723          -- set cid and x_org_id, which are used by the cursor.
2724 
2725          CID := FND_FLEX_KEYVAL.COMBINATION_ID;
2726          X_ORG_ID := ORG_ID_TABLE(I);
2727 
2728          -- Bug 3136107.
2729          -- SQL Bind project. Code modified to use bind variables instead of literals
2730          -- Same as the fix done for Bug 3079312.suramasw.
2731 
2732          SQL_STATEMENT :=
2733             'UPDATE QA_RESULTS_INTERFACE QRI ' ||
2734             'SET LAST_UPDATE_DATE = SYSDATE, ' ||
2735             'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
2736             ', REQUEST_ID = :REQUEST_ID ' ||
2737             ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
2738             ', PROGRAM_ID = :PROGRAM_ID ' ||
2739             ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
2740             ID_FIELD || ' = :CID '||
2741             ' WHERE QRI.GROUP_ID = :GROUP_ID '||
2742             ' AND QRI.TRANSACTION_INTERFACE_ID = :INTERFACE_ID_TABLE ' ||
2743             ' AND  QRI.PROCESS_STATUS = 2 ' ||
2744             'AND  NOT EXISTS
2745                 (SELECT ''X'' ' ||
2746                  'FROM   QA_INTERFACE_ERRORS QIE ' ||
2747                  'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2748                 'QRI.TRANSACTION_INTERFACE_ID ' ||
2749                  'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
2750 
2751            EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
2752                                                  X_REQUEST_ID,
2753                                                  X_PROGRAM_APPLICATION_ID,
2754                                                  X_PROGRAM_ID,
2755                                                  CID,
2756                                                  X_GROUP_ID,
2757                                                  INTERFACE_ID_TABLE(I),
2758                                                  l_col1, l_col2, l_col3, l_col4, l_col5;
2759 
2760          -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2761       ELSE
2762          INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID,
2763                ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
2764                CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
2765                PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) VALUES
2766                (INTERFACE_ID_TABLE(I), ERROR_COL_NAME, ERROR_INVALID_VALUE,
2767                 SYSDATE, X_USER_ID, SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
2768                 X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, SYSDATE);
2769       END IF;
2770    END LOOP;
2771 
2772 END VALIDATE_REFERENCE;
2773 
2774 -- End of inclusions for NCM Hardcode Elements.
2775 
2776 
2777 PROCEDURE VALIDATE_VALUES(COL_NAME VARCHAR2,
2778                           ERROR_COL_NAME VARCHAR2,
2779                           X_GROUP_ID NUMBER,
2780                           X_USER_ID NUMBER,
2781                           X_LAST_UPDATE_LOGIN NUMBER,
2782                           X_REQUEST_ID NUMBER,
2783                           X_PROGRAM_APPLICATION_ID NUMBER,
2784                           X_PROGRAM_ID NUMBER,
2785                           FROM_CLAUSE VARCHAR2,
2786                           WHERE_CLAUSE VARCHAR2,
2787                           ERROR_COL_LIST VARCHAR2) IS
2788    SQL_STATEMENT VARCHAR2(2000);
2789 
2790    l_col1 varchar2(100);
2791    l_col2 varchar2(100);
2792    l_col3 varchar2(100);
2793    l_col4 varchar2(100);
2794    l_col5 varchar2(100);
2795 
2796 BEGIN
2797    -- Bug 3136107.SQL Bind project.
2798    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
2799 
2800    -- Bug 3136107.
2801    -- SQL Bind project. Code modified to use bind variables instead of literals
2802    -- Same as the fix done for Bug 3079312.suramasw.
2803    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
2804 
2805    SQL_STATEMENT :=
2806       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
2807          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
2808          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
2809          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
2810       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
2811          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
2812          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, :REQUEST_ID, ' ||
2813          ':PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
2814         'FROM   QA_RESULTS_INTERFACE QRI ' ||
2815         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
2816          ' AND  QRI.PROCESS_STATUS = 2 ' ||
2817           'AND  NOT EXISTS
2818                 (SELECT ''X'' ' ||
2819                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
2820                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2821                              'QRI.TRANSACTION_INTERFACE_ID ' ||
2822                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
2823           'AND  QRI.' || COL_NAME || ' IS NOT NULL ' ||
2824           'AND  NOT EXISTS ' ||
2825                '(SELECT ''X'' ' ||
2826                 'FROM ' || FROM_CLAUSE ||
2827                ' WHERE (' || WHERE_CLAUSE || '))';
2828 
2829      -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2830 
2831      -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
2832      -- in order to bind the value of ERROR_COL_NAME. kabalakr
2833 
2834      -- Added the other columns added as a part of Bug 3136107 to
2835      -- EXECUTE IMMEDIATE. suramasw
2836      EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
2837           ERROR_INVALID_VALUE, X_USER_ID, X_USER_ID,
2838                                            X_LAST_UPDATE_LOGIN,
2839                                            X_REQUEST_ID,
2840                                            X_PROGRAM_APPLICATION_ID,
2841                                            X_PROGRAM_ID,
2842                                            X_GROUP_ID,
2843           l_col1, l_col2, l_col3, l_col4, l_col5;
2844 
2845 END VALIDATE_VALUES;
2846 
2847 PROCEDURE VALIDATE_SUBINVENTORY(COL_NAME VARCHAR2,
2848                           ERROR_COL_NAME VARCHAR2,
2849                           X_GROUP_ID NUMBER,
2850                           X_USER_ID NUMBER,
2851                           X_LAST_UPDATE_LOGIN NUMBER,
2852                           X_REQUEST_ID NUMBER,
2853                           X_PROGRAM_APPLICATION_ID NUMBER,
2854                           X_PROGRAM_ID NUMBER,
2855                           ERROR_COL_LIST VARCHAR2) IS
2856    SQL_STATEMENT VARCHAR2(2000);
2857    COMP_STRING VARCHAR2(6) := '';
2858 
2859    l_col1 varchar2(100);
2860    l_col2 varchar2(100);
2861    l_col3 varchar2(100);
2862    l_col4 varchar2(100);
2863    l_col5 varchar2(100);
2864 
2865 BEGIN
2866    -- Bug 3136107.SQL Bind project.
2867    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
2868 
2869    IF (COL_NAME LIKE 'COMP%') THEN
2870       COMP_STRING := 'COMP_';
2871    END IF;
2872 
2873    -- note that 1 means yes, 2 means no for restrict_subinv_code
2874 
2875    -- Bug 3136107.
2876    -- SQL Bind project. Code modified to use bind variables instead of literals
2877    -- Same as the fix done for Bug 3079312.suramasw.
2878 
2879    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
2880 
2881    SQL_STATEMENT :=
2882       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
2883          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
2884          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
2885          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
2886       'SELECT QRI.TRANSACTION_INTERFACE_ID,  :ERROR_COL_NAME, ' ||
2887          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
2888          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, :REQUEST_ID, ' ||
2889          ':PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
2890         'FROM   QA_RESULTS_INTERFACE QRI ' ||
2891         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
2892          ' AND  QRI.PROCESS_STATUS = 2 ' ||
2893           'AND  NOT EXISTS
2894                 (SELECT ''X'' ' ||
2895                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
2896                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2897                              'QRI.TRANSACTION_INTERFACE_ID ' ||
2898                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
2899           'AND  QRI.' || COL_NAME || ' IS NOT NULL ' ||
2900           'AND  NOT EXISTS ' ||
2901               '(SELECT ''X'' ' ||
2902               'FROM MTL_SUBINVENTORIES_VAL_V MSVV ' ||
2903               'WHERE MSVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
2904               '  AND QRI.' || COMP_STRING || 'RESTRICT_SUBINV_CODE = 2 ' ||
2905               '  AND MSVV.SECONDARY_INVENTORY_NAME = QRI.' || COL_NAME ||
2906               ' UNION ' ||
2907               'SELECT ''X'' ' ||
2908               'FROM MTL_ITEM_SUB_VAL_V MISVV ' ||
2909               'WHERE MISVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
2910               '  AND QRI.' || COMP_STRING || 'RESTRICT_SUBINV_CODE = 1 ' ||
2911               '  AND MISVV.INVENTORY_ITEM_ID = ' ||
2912                          'QRI.' || COMP_STRING || 'ITEM_ID ' ||
2913               '  AND MISVV.SECONDARY_INVENTORY_NAME = QRI.' || COL_NAME || ')';
2914 
2915    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2916 
2917    -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
2918    -- in order to bind the value of ERROR_COL_NAME. kabalakr
2919 
2920    -- Added the other columns added as a part of Bug 3136107 to
2921    -- EXECUTE IMMEDIATE. suramasw
2922 
2923    EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
2924                                             ERROR_INVALID_VALUE,
2925                                             X_USER_ID,
2926                                             X_USER_ID,
2927                                             X_LAST_UPDATE_LOGIN,
2928                                             X_REQUEST_ID,
2929                                             X_PROGRAM_APPLICATION_ID,
2930                                             X_PROGRAM_ID,
2931                                             X_GROUP_ID,
2932           l_col1, l_col2, l_col3, l_col4, l_col5;
2933 
2934 
2935    -- Bug 3136107.
2936    -- SQL Bind project. Code modified to use bind variables instead of literals
2937    -- Same as the fix done for Bug 3079312.suramasw.
2938 
2939    SQL_STATEMENT :=
2940       'UPDATE QA_RESULTS_INTERFACE QRI ' ||
2941       'SET LAST_UPDATE_DATE = SYSDATE, ' ||
2942          'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
2943         ', REQUEST_ID = :REQUEST_ID ' ||
2944         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
2945         ', PROGRAM_ID = :PROGRAM_ID ' ||
2946         ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
2947         COMP_STRING || 'SUB_LOCATOR_TYPE = ' ||
2948         '(SELECT LOCATOR_TYPE ' ||
2949         '   FROM MTL_SUBINVENTORIES_VAL_V ' ||
2950         '  WHERE SECONDARY_INVENTORY_NAME = QRI.' || COMP_STRING ||
2951               'SUBINVENTORY ' ||
2952         '    AND ORGANIZATION_ID = QRI.ORGANIZATION_ID) ' ||
2953         'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
2954          ' AND  QRI.PROCESS_STATUS = 2 ' ||
2955           'AND  NOT EXISTS
2956                 (SELECT ''X'' ' ||
2957                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
2958                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
2959                              'QRI.TRANSACTION_INTERFACE_ID ' ||
2960                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
2961 
2962      EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
2963                                            X_REQUEST_ID,
2964                                            X_PROGRAM_APPLICATION_ID,
2965                                            X_PROGRAM_ID,
2966                                            X_GROUP_ID,
2967           l_col1, l_col2, l_col3, l_col4, l_col5;
2968 
2969    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
2970 
2971 END VALIDATE_SUBINVENTORY;
2972 
2973 -- Start of inclusions for NCM Hardcode Elements.
2974 -- suramasw Thu Oct 31 10:48:59 PST 2002.
2975 -- Bug 2449067.
2976 
2977 
2978 PROCEDURE VALIDATE_TO_SUBINVENTORY(COL_NAME VARCHAR2,
2979                           ERROR_COL_NAME VARCHAR2,
2980                           X_GROUP_ID NUMBER,
2981                           X_USER_ID NUMBER,
2982                           X_LAST_UPDATE_LOGIN NUMBER,
2983                           X_REQUEST_ID NUMBER,
2984                           X_PROGRAM_APPLICATION_ID NUMBER,
2985                           X_PROGRAM_ID NUMBER,
2986                           ERROR_COL_LIST VARCHAR2) IS
2987    SQL_STATEMENT VARCHAR2(2000);
2988 
2989    l_col1 varchar2(100);
2990    l_col2 varchar2(100);
2991    l_col3 varchar2(100);
2992    l_col4 varchar2(100);
2993    l_col5 varchar2(100);
2994 
2995 BEGIN
2996    -- note that 1 means yes, 2 means no for restrict_subinv_code
2997 
2998    -- Bug 3136107.SQL Bind project.
2999    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
3000 
3001    -- Bug 3136107.
3002    -- SQL Bind project. Code modified to use bind variables instead of literals
3003    -- Same as the fix done for Bug 3079312.suramasw.
3004    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
3005 
3006    SQL_STATEMENT :=
3007       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
3008          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
3009          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
3010          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
3011       'SELECT QRI.TRANSACTION_INTERFACE_ID,  :ERROR_COL_NAME, ' ||
3012          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
3013          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, :REQUEST_ID, ' ||
3014          ':PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
3015         'FROM   QA_RESULTS_INTERFACE QRI ' ||
3016         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
3017          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3018           'AND  NOT EXISTS
3019                 (SELECT ''X'' ' ||
3020                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3021                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3022                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3023                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
3024           'AND  QRI.' || COL_NAME || ' IS NOT NULL ' ||
3025           'AND  NOT EXISTS ' ||
3026               '(SELECT ''X'' ' ||
3027               'FROM MTL_SUBINVENTORIES_VAL_V MSVV ' ||
3028               'WHERE MSVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
3029               '  AND QRI.RESTRICT_SUBINV_CODE = 2 ' ||
3030               '  AND MSVV.SECONDARY_INVENTORY_NAME = QRI.' || COL_NAME ||
3031               ' UNION ' ||
3032               'SELECT ''X'' ' ||
3033               'FROM MTL_ITEM_SUB_VAL_V MISVV ' ||
3034               'WHERE MISVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
3035               '  AND QRI.RESTRICT_SUBINV_CODE = 1 ' ||
3036               '  AND MISVV.INVENTORY_ITEM_ID = ' ||
3037                          'QRI.ITEM_ID ' ||
3038               '  AND MISVV.SECONDARY_INVENTORY_NAME = QRI.' || COL_NAME || ')';
3039 
3040     -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3041 
3042     -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
3043     -- in order to bind the value of ERROR_COL_NAME. kabalakr
3044 
3045     -- Added the other columns added as a part of Bug 3136107 to
3046     -- EXECUTE IMMEDIATE. suramasw
3047 
3048     EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
3049                                             ERROR_INVALID_VALUE,
3050                                             X_USER_ID,
3051                                             X_USER_ID,
3052                                             X_LAST_UPDATE_LOGIN,
3053                                             X_REQUEST_ID,
3054                                             X_PROGRAM_APPLICATION_ID,
3055                                             X_PROGRAM_ID,
3056                                             X_GROUP_ID,
3057           l_col1, l_col2, l_col3, l_col4, l_col5;
3058 
3059    -- Bug 3136107.
3060    -- SQL Bind project. Code modified to use bind variables instead of literals
3061    -- Same as the fix done for Bug 3079312.suramasw.
3062 
3063    SQL_STATEMENT :=
3064       'UPDATE QA_RESULTS_INTERFACE QRI ' ||
3065       'SET LAST_UPDATE_DATE = SYSDATE, ' ||
3066           'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
3067         ', REQUEST_ID = :REQUEST_ID ' ||
3068         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
3069         ', PROGRAM_ID = :PROGRAM_ID ' ||
3070         ', PROGRAM_UPDATE_DATE = SYSDATE, TO_SUB_LOCATOR_TYPE = ' ||
3071         '(SELECT LOCATOR_TYPE ' ||
3072         '   FROM MTL_SUBINVENTORIES_VAL_V ' ||
3073         '  WHERE SECONDARY_INVENTORY_NAME = QRI.TO_SUBINVENTORY ' ||
3074         '    AND ORGANIZATION_ID = QRI.ORGANIZATION_ID) ' ||
3075         'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
3076          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3077           'AND  NOT EXISTS
3078                 (SELECT ''X'' ' ||
3079                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3080                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3081                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3082                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
3083 
3084      EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
3085                                            X_REQUEST_ID,
3086                                            X_PROGRAM_APPLICATION_ID,
3087                                            X_PROGRAM_ID,
3088                                            X_GROUP_ID,
3089           l_col1, l_col2, l_col3, l_col4, l_col5;
3090 
3091    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3092 
3093 END VALIDATE_TO_SUBINVENTORY;
3094 
3095 -- End of inclusions for NCM Hardcode Elements.
3096 
3097 
3098 FUNCTION get_errored_column_name (p_group_id IN NUMBER,
3099     p_col_name IN VARCHAR2) RETURN VARCHAR2 IS
3100 
3101     CURSOR c IS
3102         SELECT name
3103         FROM qa_chars qc, qa_plan_chars qpc, qa_results_interface qri
3104         WHERE qc.char_id = qpc.char_id
3105         AND qpc.plan_id = qri.plan_id
3106         AND qpc.result_column_name = p_col_name
3107         AND qri.group_id = p_group_id;
3108 
3109      l_name VARCHAR2(30);
3110 
3111 BEGIN
3112     OPEN c;
3113     FETCH c into l_name;
3114     CLOSE c;
3115 
3116     RETURN l_name;
3117 
3118 END get_errored_column_name;
3119 
3120 
3121 PROCEDURE VALIDATE_VALUES_WITH_SQL(COL_NAME VARCHAR2,
3122                           ERROR_COL_NAME VARCHAR2,
3123                           X_GROUP_ID NUMBER,
3124                           X_USER_ID NUMBER,
3125                           X_LAST_UPDATE_LOGIN NUMBER,
3126                           X_REQUEST_ID NUMBER,
3127                           X_PROGRAM_APPLICATION_ID NUMBER,
3128                           X_PROGRAM_ID NUMBER,
3129                           X_SQL_VALIDATION_STRING VARCHAR2,
3130                           ERROR_COL_LIST VARCHAR2) IS
3131 
3132    SQL_STATEMENT         VARCHAR2(2000);
3133    FORMATTED_SQL_STRING  VARCHAR2(2500);
3134 
3135    l_col1 varchar2(100);
3136    l_col2 varchar2(100);
3137    l_col3 varchar2(100);
3138    l_col4 varchar2(100);
3139    l_col5 varchar2(100);
3140 
3141 BEGIN
3142    -- Bug 3136107.SQL Bind project.
3143    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
3144 
3145    FORMATTED_SQL_STRING := QLTTRAFB.FORMAT_SQL_VALIDATION_STRING(
3146          X_SQL_VALIDATION_STRING);
3147 
3148    -- Bug 3136107.
3149    -- SQL Bind project. Code modified to use bind variables instead of literals
3150    -- Same as the fix done for Bug 3079312.suramasw.
3151    -- Also replaced :1 introduced in the version 115.63 by :ERROR_COL_NAME
3152 
3153    SQL_STATEMENT :=
3154       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
3155          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
3156          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
3157          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
3158       'SELECT QRI.TRANSACTION_INTERFACE_ID,  :ERROR_COL_NAME, ' ||
3159          ':ERROR_INVALID_VALUE, SYSDATE, ' ||
3160          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, :REQUEST_ID, ' ||
3161          ':PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
3162         'FROM   QA_RESULTS_INTERFACE QRI ' ||
3163         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
3164          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3165           'AND  NOT EXISTS
3166                 (SELECT ''X'' ' ||
3167                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3168                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3169                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3170                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5)) ' ||
3171 	  'AND QRI.' || COL_NAME || ' IS NOT NULL ' ||
3172           'AND NOT EXISTS (SELECT ''x'' FROM DUAL WHERE QRI.' ||
3173            COL_NAME || ' IN ' || '(' || FORMATTED_SQL_STRING || ') )';
3174 
3175    BEGIN
3176 
3177        -- user_sql_error exception was added for better diagnosis of import
3178        -- problems, which most often is limited to user defined sql validation
3179        -- string.  Please see bug # 1680481 for details.
3180        --
3181        -- ORASHID
3182 
3183        -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3184 
3185        -- Bug 2976810. Using EXECUTE IMMEDIATE instead of QLTTRAFB.EXEC_SQL
3186        -- in order to bind the value of ERROR_COL_NAME. kabalakr
3187 
3188        -- Added the other columns added as a part of Bug 3136107 to
3189        -- EXECUTE IMMEDIATE. suramasw
3190 
3191        EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
3192                                              ERROR_INVALID_VALUE,
3193                                              X_USER_ID,
3194                                              X_USER_ID,
3195                                              X_LAST_UPDATE_LOGIN,
3196                                              X_REQUEST_ID,
3197                                              X_PROGRAM_APPLICATION_ID,
3198                                              X_PROGRAM_ID,
3199                                              X_GROUP_ID,
3200           l_col1, l_col2, l_col3, l_col4, l_col5;
3201 
3202 
3203        EXCEPTION WHEN OTHERS THEN
3204            g_sqlerrm := sqlerrm;
3205            g_col_name := get_errored_column_name(x_group_id, col_name);
3206            RAISE user_sql_error;
3207    END;
3208 
3209 END VALIDATE_VALUES_WITH_SQL;
3210 
3211 
3212 PROCEDURE DERIVE_IDS(COL_NAME VARCHAR2,
3213                      ERROR_COL_NAME VARCHAR2,
3214                      X_GROUP_ID NUMBER,
3215                      X_USER_ID NUMBER,
3216                      X_LAST_UPDATE_LOGIN NUMBER,
3217                      X_REQUEST_ID NUMBER,
3218                      X_PROGRAM_APPLICATION_ID NUMBER,
3219                      X_PROGRAM_ID NUMBER,
3220                      ID_ASSIGNMENT VARCHAR2,
3221                      ERROR_COL_LIST VARCHAR2) IS
3222    SQL_STATEMENT VARCHAR2(2000);
3223 
3224    l_col1 varchar2(100);
3225    l_col2 varchar2(100);
3226    l_col3 varchar2(100);
3227    l_col4 varchar2(100);
3228    l_col5 varchar2(100);
3229 
3230 BEGIN
3231    -- Bug 3136107.SQL Bind project.
3232    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
3233 
3234    -- Bug 3136107.
3235    -- SQL Bind project. Code modified to use bind variables instead of literals
3236    -- Same as the fix done for Bug 3079312.suramasw.
3237 
3238    SQL_STATEMENT :=
3239       'UPDATE QA_RESULTS_INTERFACE QRI ' ||
3240       'SET LAST_UPDATE_DATE = SYSDATE, ' ||
3241           'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
3242         ', REQUEST_ID = :REQUEST_ID ' ||
3243         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
3244         ', PROGRAM_ID =  :PROGRAM_ID ' ||
3245         ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
3246         ID_ASSIGNMENT || '
3247         WHERE QRI.GROUP_ID = :GROUP_ID ' ||
3248          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3249           'AND  NOT EXISTS
3250                 (SELECT ''X'' ' ||
3251                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3252                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3253                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3254                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
3255 
3256      EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
3257                                            X_REQUEST_ID,
3258                                            X_PROGRAM_APPLICATION_ID,
3259                                            X_PROGRAM_ID,
3260                                            X_GROUP_ID,
3261           l_col1, l_col2, l_col3, l_col4, l_col5;
3262 
3263    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3264 
3265 END DERIVE_IDS;
3266 
3267 /* derive_job
3268  *
3269  * when the plan contains both production_line and item, we need to derive
3270  * wip_entity_id.
3271  */
3272 
3273 PROCEDURE DERIVE_JOB(X_GROUP_ID NUMBER,
3274                      X_USER_ID NUMBER,
3275                      X_LAST_UPDATE_LOGIN NUMBER,
3276                      X_REQUEST_ID NUMBER,
3277                      X_PROGRAM_APPLICATION_ID NUMBER,
3278                      X_PROGRAM_ID NUMBER,
3279                      ERROR_COL_LIST VARCHAR2) IS
3280    SQL_STATEMENT VARCHAR2(2000);
3281 
3282    l_col1 varchar2(100);
3283    l_col2 varchar2(100);
3284    l_col3 varchar2(100);
3285    l_col4 varchar2(100);
3286    l_col5 varchar2(100);
3287 
3288 BEGIN
3289    -- Bug 3079312.SQL Bind project.
3290    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
3291 
3292    -- Bug 3136107.
3293    -- SQL Bind project. Code modified to use bind variables instead of literals
3294    -- Same as the fix done for Bug 3079312.suramasw.
3295 
3296    SQL_STATEMENT :=
3297       'UPDATE QA_RESULTS_INTERFACE QRI ' ||
3298       'SET LAST_UPDATE_DATE = SYSDATE, ' ||
3299           'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
3300         ', REQUEST_ID = :REQUEST_ID ' ||
3301         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
3302         ', PROGRAM_ID = :PROGRAM_ID ' ||
3303         ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
3304         'WIP_ENTITY_ID = (SELECT WIP_ENTITY_ID FROM ' ||
3305               'WIP_REPETITIVE_ENTITIES_V WREV ' ||
3306               'WHERE WREV.PRIMARY_ITEM_ID = QRI.ITEM_ID ' ||
3307               '  AND WREV.ORGANIZATION_ID = QRI.ORGANIZATION_ID) ' ||
3308         'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
3309          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3310           'AND  NOT EXISTS
3311                 (SELECT ''X'' ' ||
3312                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3313                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3314                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3315                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))';
3316 
3317      EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
3318                                            X_REQUEST_ID,
3319                                            X_PROGRAM_APPLICATION_ID,
3320                                            X_PROGRAM_ID,
3321                                            X_GROUP_ID,
3322           l_col1, l_col2, l_col3, l_col4, l_col5;
3323 
3324    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3325 END DERIVE_JOB;
3326 
3327 
3328 -- given a developer_name, finds its location in the developer name table
3329 -- could actually work for any char30 table
3330 
3331 FUNCTION POSITION_IN_TABLE(SEARCH_VAL VARCHAR2,
3332                            X_TABLE CHAR30_TABLE,
3333                            NUM_ROWS NUMBER) RETURN NUMBER IS
3334 BEGIN
3335 
3336    FOR I IN 1..NUM_ROWS LOOP
3337       IF (X_TABLE(I) = SEARCH_VAL) THEN
3338 
3339          RETURN I;
3340       END IF;
3341    END LOOP;
3342 
3343    RETURN -1;
3344 
3345 END POSITION_IN_TABLE;
3346 
3347 
3348 PROCEDURE SET_ERROR_STATUS(X_GROUP_ID NUMBER, X_USER_ID NUMBER,
3349                 X_REQUEST_ID NUMBER, X_PROGRAM_APPLICATION_ID NUMBER,
3350                 X_PROGRAM_ID NUMBER, X_LAST_UPDATE_LOGIN NUMBER,
3351                 X_COLUMN_NAME VARCHAR2 DEFAULT NULL) IS
3352 BEGIN
3353    IF (X_COLUMN_NAME IS NULL) THEN
3354       UPDATE QA_RESULTS_INTERFACE qri
3355          SET PROCESS_STATUS = 3,
3356              LAST_UPDATE_DATE = SYSDATE,
3357              LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
3358              REQUEST_ID = X_REQUEST_ID,
3359              PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
3360              PROGRAM_ID = X_PROGRAM_ID,
3361              PROGRAM_UPDATE_DATE = SYSDATE
3362        WHERE qri.GROUP_ID = X_GROUP_ID AND EXISTS
3363             (SELECT 1
3364              FROM  qa_interface_errors qie
3365              WHERE qie.transaction_interface_id = qri.transaction_interface_id);
3366 
3367          -- Bug 1558445, slow performance.
3368          -- AND TRANSACTION_INTERFACE_ID IN
3369          -- (SELECT TRANSACTION_INTERFACE_ID
3370          -- FROM   QA_INTERFACE_ERRORS);
3371    ELSE
3372       UPDATE QA_RESULTS_INTERFACE QRI
3373          SET PROCESS_STATUS = 3,
3374              LAST_UPDATE_DATE = SYSDATE,
3375              LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
3376              REQUEST_ID = X_REQUEST_ID,
3377              PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
3378              PROGRAM_ID = X_PROGRAM_ID,
3379              PROGRAM_UPDATE_DATE = SYSDATE
3380        WHERE GROUP_ID = X_GROUP_ID
3381          AND EXISTS
3382              (SELECT TRANSACTION_INTERFACE_ID, ERROR_COLUMN
3383               FROM   QA_INTERFACE_ERRORS QIE
3384               WHERE  QIE.TRANSACTION_INTERFACE_ID =
3385                            QRI.TRANSACTION_INTERFACE_ID
3386                 AND  QIE.ERROR_COLUMN = X_COLUMN_NAME);
3387    END IF;
3388 
3389 END SET_ERROR_STATUS;
3390 
3391 /* validate_reasonable_limits
3392  *
3393  * builds a dynamic sql statement to check that values are within
3394  * lower and upper reasonable limits.  will use limits from a spec if
3395  * one is specified.  if no spec is specified, or if the element is not
3396  * on the spec, will use limits from the collection element.  will also
3397  * default to collection element limits if the element is on the spec
3398  * but is disabled.  note that this procedure does not need to check
3399  * whether or not the spec itself is disabled, since this check occurs
3400  * when the spec_name column is being processed.
3401  */
3402 
3403 PROCEDURE VALIDATE_REASONABLE_LIMITS (COL_NAME VARCHAR2,
3404                            ERROR_COL_NAME VARCHAR2,
3405                            X_DATATYPE NUMBER,
3406                            X_CHAR_ID NUMBER,
3407                            X_GROUP_ID NUMBER,
3408                            X_USER_ID NUMBER,
3409                            X_LAST_UPDATE_LOGIN NUMBER,
3410                            X_REQUEST_ID NUMBER,
3411                            X_PROGRAM_APPLICATION_ID NUMBER,
3412                            X_PROGRAM_ID NUMBER,
3413                            ERROR_COL_LIST VARCHAR2) IS
3414    SQL_STATEMENT VARCHAR2(2000);
3415    TEMP VARCHAR2(1000);
3416 
3417    l_col1 varchar2(100);
3418    l_col2 varchar2(100);
3419    l_col3 varchar2(100);
3420    l_col4 varchar2(100);
3421    l_col5 varchar2(100);
3422 
3423 BEGIN
3424    -- Bug 3136107.SQL Bind project.
3425    parse_error_columns(error_col_list, l_col1, l_col2, l_col3, l_col4, l_col5);
3426 
3427    -- Bug 3136107.
3428    -- SQL Bind project. Code modified to use bind variables instead of literals
3429    -- Same as the fix done for Bug 3079312.suramasw.
3430 
3431    SQL_STATEMENT :=
3432       'INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ' ||
3433          'ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY, ' ||
3434          'CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID, ' ||
3435          'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE) ' ||
3436       'SELECT QRI.TRANSACTION_INTERFACE_ID, :ERROR_COL_NAME, ' ||
3437          ':ERROR_OUTSIDE_LIMITS, SYSDATE, ' ||
3438          ':USER_ID, SYSDATE, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
3439          ':REQUEST_ID, :PROGRAM_APPLICATION_ID, :PROGRAM_ID, SYSDATE ' ||
3440         'FROM   QA_RESULTS_INTERFACE QRI ' ||
3441         'WHERE  QRI.GROUP_ID = :GROUP_ID ' ||
3442          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3443           'AND  NOT EXISTS
3444                 (SELECT ''X'' ' ||
3445                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3446                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3447                              'QRI.TRANSACTION_INTERFACE_ID ' ||
3448                   'AND  QIE.ERROR_COLUMN IN (:c1,:c2,:c3,:c4,:c5))
3449            AND  NOT EXISTS ' ||
3450                '(SELECT ''X'' ' ||
3451                 'FROM   QA_SPEC_CHARS_V QSC, ' ||
3452                        'QA_CHARS QC ' ||
3453                 'WHERE  ((QRI.' || COL_NAME || ' IS NULL) ' ||
3454                    'OR  (((DECODE(QSC.CHAR_ID, NULL, ' ||
3455                                  'QC.LOWER_REASONABLE_LIMIT, ' ||
3456                                  'QSC.LOWER_REASONABLE_LIMIT) IS NULL) ' ||
3457                          'OR ';
3458 
3459    IF X_DATATYPE = 2 THEN
3460        sql_statement := sql_statement || '(qltdate.any_to_number(QRI.' ||
3461            COL_NAME || ') >= ';
3462 
3463 
3464    -- For Timezone Compliance bug 3179845. Convert the datetime elements to real dates.
3465    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
3466 
3467    ELSIF x_datatype = 6 THEN
3468        sql_statement := sql_statement || '(qltdate.any_to_datetime(QRI.' ||
3469            COL_NAME || ') >= ';
3470 
3471    ELSIF x_datatype = 3 THEN
3472        sql_statement := sql_statement || '(qltdate.any_to_date(QRI.' ||
3473            COL_NAME || ') >= ';
3474 
3475    ELSE
3476        sql_statement := sql_statement || '(QRI.' || COL_NAME || ' >= ';
3477    END IF;
3478 
3479    TEMP := 'DECODE(QSC.CHAR_ID, NULL, QC.LOWER_REASONABLE_LIMIT, ' ||
3480            'QSC.LOWER_REASONABLE_LIMIT)';
3481    IF (X_DATATYPE = 2) THEN
3482       TEMP := 'qltdate.any_to_number(' || TEMP || ')';
3483    ELSIF (X_DATATYPE = 3) THEN
3484       TEMP := 'qltdate.any_to_date(' || TEMP || ')';
3485 
3486    -- For Timezone Compliance bug 3179845.
3487    -- Convert the datetime elements to real dates.
3488    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
3489 
3490    ELSIF (X_DATATYPE = 6) THEN
3491       TEMP := 'qltdate.canon_to_date(' || TEMP || ')';
3492    END IF;
3493 
3494 
3495    SQL_STATEMENT := SQL_STATEMENT || TEMP || ')) ' ||
3496                       'AND
3497                          ((DECODE(QSC.CHAR_ID, NULL, ' ||
3498                                  'QC.UPPER_REASONABLE_LIMIT, ' ||
3499                                  'QSC.UPPER_REASONABLE_LIMIT) IS NULL) ' ||
3500                          'OR ';
3501 
3502    IF X_DATATYPE = 2 THEN
3503        sql_statement := sql_statement || '(qltdate.any_to_number(QRI.' ||
3504            COL_NAME || ') <= ';
3505 
3506    -- For Timezone Compliance bug 3179845. Convert the datetime elements to real dates.
3507    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
3508 
3509    ELSIF x_datatype = 6 THEN
3510        sql_statement := sql_statement || '(qltdate.any_to_datetime(QRI.' ||
3511            COL_NAME || ') <= ';
3512 
3513    ELSIF x_datatype = 3 THEN
3514        sql_statement := sql_statement || '(qltdate.any_to_date(QRI.' ||
3515            COL_NAME || ') <= ';
3516 
3517    ELSE
3518        sql_statement := sql_statement || '(QRI.' || COL_NAME || ' <= ';
3519    END IF;
3520 
3521    TEMP := 'DECODE(QSC.CHAR_ID, NULL, QC.UPPER_REASONABLE_LIMIT, ' ||
3522            'QSC.UPPER_REASONABLE_LIMIT)';
3523    IF (X_DATATYPE = 2) THEN
3524       TEMP := 'qltdate.any_to_number(' || TEMP || ')';
3525    ELSIF (X_DATATYPE = 3) THEN
3526       TEMP := 'qltdate.any_to_date(' || TEMP || ')';
3527 
3528    -- For Timezone Compliance bug 3179845. Convert the datetime elements to real dates.
3529    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
3530 
3531    ELSIF (X_DATATYPE = 6) THEN
3532       TEMP := 'qltdate.canon_to_date(' || TEMP || ')';
3533    END IF;
3534 
3535 
3536    SQL_STATEMENT := SQL_STATEMENT || TEMP || ')))) ' ||
3537                  ' AND  QSC.CHAR_ID (+) = QC.CHAR_ID' ||
3538                  ' AND  QC.CHAR_ID = :CHAR_ID ' ||
3539                  ' AND  QSC.SPEC_ID (+) = NVL(QRI.SPEC_ID, -1) ' ||
3540                  ' AND  QSC.SPEC_CHAR_ENABLED (+) = 1)';
3541 
3542    -- Bug 3136107.
3543    -- SQL Bind project. Code modified to use bind variables instead of literals
3544    -- Same as the fix done for Bug 3079312.suramasw.
3545 
3546    EXECUTE IMMEDIATE SQL_STATEMENT USING ERROR_COL_NAME,
3547                                          ERROR_OUTSIDE_LIMITS,
3548                                          X_USER_ID,
3549                                          X_USER_ID,
3550                                          X_LAST_UPDATE_LOGIN,
3551                                          X_REQUEST_ID,
3552                                          X_PROGRAM_APPLICATION_ID,
3553                                          X_PROGRAM_ID,
3554                                          X_GROUP_ID,
3555                      l_col1, l_col2, l_col3, l_col4, l_col5,
3556                                          X_CHAR_ID;
3557 
3558    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
3559 END VALIDATE_REASONABLE_LIMITS;
3560 
3561 
3562 PROCEDURE VALIDATE_STEPS (X_ENABLED_FLAG NUMBER, X_MANDATORY_FLAG NUMBER,
3563       COL_NAME VARCHAR2, X_GROUP_ID NUMBER, X_USER_ID NUMBER,
3564       X_LAST_UPDATE_LOGIN NUMBER, X_REQUEST_ID NUMBER,
3565       X_PROGRAM_APPLICATION_ID NUMBER, X_PROGRAM_ID NUMBER,
3566       FROM_CLAUSE VARCHAR2, WHERE_CLAUSE VARCHAR2,
3567       ID_ASSIGN VARCHAR2, X_CHAR_ID NUMBER,
3568       X_CHAR_NAME VARCHAR2, X_DATATYPE NUMBER, X_DECIMAL_PRECISION NUMBER,
3569       X_PLAN_ID NUMBER, X_VALUES_EXIST_FLAG NUMBER,
3570       X_READ_ONLY_FLAG NUMBER,
3571       X_SQL_VALIDATION_STRING VARCHAR2 DEFAULT NULL,
3572       PARENT_COL VARCHAR2 DEFAULT NULL, GRANDPARENT_COL VARCHAR2 DEFAULT NULL,
3573       GREAT_GRANDPARENT_COL VARCHAR2 DEFAULT NULL) IS
3574    ERROR_COL_LIST VARCHAR2(200);
3575    ERROR_COL_NAME VARCHAR2(80);
3576 
3577 
3578      -- Bug 3755824.Read only elements was not working as Matching elements.Must validate
3579      -- read-only element only if they are not matching element.Added the following variable
3580      -- srhariha.Fri Jul  9 07:25:27 PDT 2004
3581 
3582      -- L_MATCHING_ELEMENTS		VARCHAR2(1000);
3583 
3584 
3585      -- Bug 3785197.Added new variable.Also commenting out above declaration of
3586      -- L_MATCHING_ELEMENTS, which is no longer used.
3587      -- srhariha. Fri Jul 23 03:04:52 PDT 2004.
3588 
3589     RO_MUST_BE_NULL BOOLEAN;
3590 
3591 
3592 
3593 BEGIN
3594    -- construct error column name, which is just the column name, unless
3595    -- it's a characterx column in which case it's char_name (characterx).
3596 
3597    IF (COL_NAME LIKE 'CHARACTER%') THEN
3598       ERROR_COL_NAME := dequote(X_CHAR_NAME) || ' (' || COL_NAME || ')';
3599    ELSE
3600       ERROR_COL_NAME := COL_NAME;
3601    END IF;
3602 
3603    -- construct error columns list
3604 
3605    ERROR_COL_LIST := 'NULL, ' || '''' || ERROR_COL_NAME || '''';
3606    IF (PARENT_COL IS NOT NULL) THEN
3607       ERROR_COL_LIST := ERROR_COL_LIST || ', ''' || PARENT_COL || '''';
3608       IF (GRANDPARENT_COL IS NOT NULL) THEN
3609          ERROR_COL_LIST := ERROR_COL_LIST || ', ''' || GRANDPARENT_COL || '''';
3610          IF (GREAT_GRANDPARENT_COL IS NOT NULL) THEN
3611             ERROR_COL_LIST := ERROR_COL_LIST || ', ''' ||
3612                   GREAT_GRANDPARENT_COL || '''';
3613          END IF;
3614       END IF;
3615    END IF;
3616 
3617    -- if disabled, validate that all values are null
3618 
3619    IF (X_ENABLED_FLAG = 2) THEN
3620       QLTTRAFB.VALIDATE_DISABLED(COL_NAME, ERROR_COL_NAME, ERROR_DISABLED,
3621             X_GROUP_ID, X_USER_ID,
3622             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3623             X_PROGRAM_ID);
3624    ELSE
3625 
3626       -- validate that non-null values have non-null parent (for child only)
3627 
3628       IF (PARENT_COL IS NOT NULL) THEN
3629          QLTTRAFB.VALIDATE_PARENT_ENTERED(COL_NAME, ERROR_COL_NAME,
3630             ERROR_NEED_PARENT, X_GROUP_ID,
3631             X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3632             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST);
3633       END IF;
3634 
3635       -- Tracking Bug : 3104827. Review Tracking Bug : 3148873
3636       -- Check whether the Collection element is flagged to be 'Read Only'.
3637       -- If yes, error out if a value is entered in QRI.
3638       -- Below IF condition added for read only collection plan element project.
3639       -- saugupta Wed Aug 27 06:15:32 PDT 2003.
3640 
3641      -- Bug 3755824.Read only elements was not working as Matching elements.Must validate
3642      -- read-only element only if they are not matching element and txn_type is Insert.For
3643      -- Insert type l_matching_elements will be null.
3644      -- srhariha.Fri Jul  9 07:25:27 PDT 2004
3645 
3646      -- Bug 3785197. Update was failing if read only or sequence elements was set as matching element.
3647      -- Removed logic used in 3755824 which was throwing exception for bulk insert.
3648      -- New logic added, which checks if X_CHAR_NAME is matching element or not only if txn_type
3649      -- is Update (2).
3650      -- srhariha. Fri Jul 23 03:04:52 PDT 2004
3651 
3652 
3653       RO_MUST_BE_NULL := TRUE;
3654 
3655       IF (G_TYPE_OF_TXN = 2) AND (X_READ_ONLY_FLAG = 1) THEN
3656 
3657           IF CHECK_IF_MATCHING_ELEMENT(X_CHAR_NAME) THEN
3658               RO_MUST_BE_NULL := FALSE;
3659           END IF;
3660 
3661       END IF; -- G_TYPE_OF_TXN
3662 
3663 
3664       IF (X_READ_ONLY_FLAG = 1) AND (RO_MUST_BE_NULL = TRUE) THEN
3665         QLTTRAFB.VALIDATE_READ_ONLY(COL_NAME, ERROR_COL_NAME, ERROR_READ_ONLY,
3666               X_GROUP_ID, X_USER_ID,
3667               X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3668               X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST);
3669       END IF;
3670 
3671       -- do special mandatory validation for revision
3672       IF (COL_NAME IN ('REVISION', 'COMP_REVISION')) THEN
3673          VALIDATE_REVISION(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3674             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3675             X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST, X_MANDATORY_FLAG);
3676 
3677       -- do special mandatory validation for locator
3678       ELSIF (COL_NAME IN ('LOCATOR', 'COMP_LOCATOR')) THEN
3679          VALIDATE_LOCATOR(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3680                X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3681                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3682 
3683 -- Start of inclusions for NCM Hardcode Elements.
3684 -- suramasw Thu Oct 31 10:48:59 PST 2002.
3685 -- Bug 2449067.
3686 
3687       ELSIF (COL_NAME IN ('TO_LOCATOR'))THEN
3688          VALIDATE_TO_LOCATOR(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3689                X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3690                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3691 
3692 -- End of inclusions for NCM Hardcode Elements.
3693 
3694      -- Bug 3775614. Component lot number and serial number are not validated properly.
3695      -- If column is lot number or serial number we have special check before issuing
3696      -- mandatory message, similar to revision. Hence do conventional mandatory check
3697      -- only if column doesnt belongs to those mentioned in the elsif list.
3698      -- srhariha. Mon Aug  2 22:48:30 PDT 2004.
3699 
3700      -- Added LOT_NUMBER and SERIAL_NUMBER in the following ELSIF conditions to
3701      -- validate lot number and serial number in collection import.
3702      -- Bug 3736481.suramasw.
3703 
3704      ELSIF (COL_NAME IN ('LOT_NUMBER','COMP_LOT_NUMBER')) THEN
3705          VALIDATE_LOT_NUMBER(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3706             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3707             X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST, X_MANDATORY_FLAG);
3708 
3709      ELSIF (COL_NAME IN ('SERIAL_NUMBER','COMP_SERIAL_NUMBER')) THEN
3710          VALIDATE_SERIAL_NUMBER(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3711             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3712             X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST, X_MANDATORY_FLAG);
3713 
3714 
3715 
3716       -- if not revision and it's mandatory, validate no null values
3717 
3718       ELSIF (X_MANDATORY_FLAG = 1) THEN
3719          QLTTRAFB.VALIDATE_MANDATORY(COL_NAME, ERROR_COL_NAME, ERROR_MANDATORY,
3720             X_GROUP_ID, X_USER_ID,
3721             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3722             X_PROGRAM_ID, PARENT_COL, ERROR_COL_LIST);
3723       END IF; -- mandatory test
3724 
3725       -- if it's a numeric or date characterx column, validate datatypes
3726 
3727       IF ((COL_NAME LIKE 'CHARACTER%') AND (X_DATATYPE <> 1)) THEN
3728          VALIDATE_DATATYPES(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3729                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3730                X_PROGRAM_ID, X_DATATYPE);
3731       END IF;
3732 
3733       -- if it's a numeric or date column, correct values so that they are
3734       -- in the right format.  for numbers, fix the decimal precision.  for
3735       -- dates, put them in canonical format.
3736 
3737       IF (X_DATATYPE <> 1) THEN
3738          FORMAT_DATATYPES(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3739                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3740                X_PROGRAM_ID, X_DATATYPE, X_DECIMAL_PRECISION, ERROR_COL_LIST);
3741       END IF;
3742 
3743       -- if it's a characterx column and values exist, validate against
3744       -- the value lookups.  if no values exist, check whether there's a
3745       -- sql validation string.  if so, validate against it.
3746 
3747       --
3748       -- Commented out the exisiting IF condition and
3749       -- implemented new IF to accommodate the need
3750       -- for ASO project
3751       -- rkunchal Thu Jul 25 01:43:48 PDT 2002
3752       --
3753       -- IF (COL_NAME LIKE 'CHARACTER%') THEN
3754 
3755       -- Inclusions for NCM Hardcode Elements.
3756       -- suramasw Thu Oct 31 10:48:59 PST 2002.
3757       -- Bug 2449067.
3758 
3759       -- anagarwa Thu Nov 14 13:31:42 PST 2002
3760       --  Inclusions for CAR Hardcode Elements.
3761 
3762       -- Added RCV_TRANSACTION_ID since validation was not required.
3763       -- Bug 2670602.suramasw Sat Nov 16 03:44:35 PST 2002.
3764       --
3765       -- Bug 4425863
3766       -- Added the check for the element Nonconformance_code
3767       -- So that if the lookup values are present then they
3768       -- are accounted for
3769       -- ntungare Fri Dec 16 02:58:39 PST 2005
3770       --
3771 
3772       IF (COL_NAME LIKE 'CHARACTER%') OR
3773          (COL_NAME IN ('DISPOSITION',
3774                        'DISPOSITION_SOURCE',
3775                        'DISPOSITION_ACTION',
3776                        'DISPOSITION_STATUS')) OR
3777           (COL_NAME IN ('NONCONFORMANCE_SOURCE',
3778                         'NONCONFORM_SEVERITY',
3779                         'NONCONFORM_PRIORITY',
3780                         'NONCONFORMANCE_TYPE',
3781                         'NONCONFORMANCE_STATUS',
3782                         'NONCONFORMANCE_CODE',
3783                         'CONCURRENT_REQUEST_ID',
3784                         'DAYS_TO_CLOSE',
3785                         'RCV_TRANSACTION_ID')) OR
3786           (COL_NAME IN ('REQUEST_SOURCE',
3787                         'REQUEST_PRIORITY',
3788                         'REQUEST_SEVERITY',
3789                         'REQUEST_STATUS',
3790                         'ECO_NAME')) THEN
3791 
3792          IF (X_VALUES_EXIST_FLAG = 1) THEN
3793             QLTTRAFB.VALIDATE_LOOKUPS(COL_NAME, ERROR_COL_NAME,
3794                   ERROR_INVALID_VALUE, X_GROUP_ID,
3795                   X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3796                   X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
3797                   X_CHAR_ID, X_PLAN_ID, ERROR_COL_LIST);
3798          ELSIF (X_SQL_VALIDATION_STRING IS NOT NULL) THEN
3799             VALIDATE_VALUES_WITH_SQL(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3800                   X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3801                   X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
3802                   X_SQL_VALIDATION_STRING, ERROR_COL_LIST);
3803          END IF;
3804       END IF;
3805 
3806       -- special cases for item, subinv. locator, rev handled above
3807 
3808       IF (COL_NAME IN ('ITEM', 'COMP_ITEM')) THEN
3809          VALIDATE_ITEM(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3810                X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3811                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3812       ELSIF (COL_NAME IN ('SUBINVENTORY', 'COMP_SUBINVENTORY')) THEN
3813          VALIDATE_SUBINVENTORY(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3814                X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3815                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3816 
3817 -- Start of inclusions for NCM Hardcode Elements.
3818 -- suramasw Thu Oct 31 10:48:59 PST 2002.
3819 -- Bug 2449067.
3820 
3821       ELSIF (COL_NAME IN ('TO_SUBINVENTORY')) THEN
3822          VALIDATE_TO_SUBINVENTORY(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3823                X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3824                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3825 
3826  -- End of inclusions for NCM Hardcode Elements.
3827 
3828       END IF;
3829 
3830       -- The following validation code has been added for
3831       -- bug #2368381. More comments at the procedure itself.
3832       -- Code added by suramasw
3833       -- Comment added by rkunchal Tue May 28 00:22:11 PDT 2002
3834 
3835       -- To fix the reopened bug 2368381
3836       -- Modified the IF condition and the name
3837       -- to suit the change made in the procedure
3838       -- rkunchal Thu Jul 18 07:23:13 PDT 2002
3839 
3840 -- added the following to include new hardcoded element followup activity
3841 -- saugupta
3842 
3843       IF (COL_NAME IN ('ASSET_ACTIVITY', 'FOLLOWUP_ACTIVITY' )) THEN
3844          VALIDATE_EAM_ITEMS(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3845                             X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3846                             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3847       END IF;
3848       -- End of code additions for bug #2368381
3849 
3850 -- Start of inclusions for NCM Hardcode Elements.
3851 -- suramasw Thu Oct 31 10:48:59 PST 2002.
3852 -- Bug 2449067.
3853 
3854       IF (COL_NAME IN ('BILL_REFERENCE', 'ROUTING_REFERENCE')) THEN
3855          VALIDATE_REFERENCE(COL_NAME, ERROR_COL_NAME, X_GROUP_ID,
3856                             X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3857                             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3858       END IF;
3859 
3860 -- End of inclusions for NCM Hardcode Elements.
3861 
3862       -- the following validation and derivation steps will be skipped for
3863       -- the special cases item, subinv, and locator, since from_clause and
3864       -- where_clause are passed in as null in these cases.
3865 
3866       -- validate all non-null values (if they need to be validated)
3867       IF (FROM_CLAUSE IS NOT NULL) THEN
3868 
3869          VALIDATE_VALUES(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3870                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3871                X_PROGRAM_ID, FROM_CLAUSE, WHERE_CLAUSE, ERROR_COL_LIST);
3872       END IF;
3873 
3874       -- derive ids (if there are ids to be derived)
3875 
3876       IF (ID_ASSIGN IS NOT NULL) THEN
3877 
3878          DERIVE_IDS(COL_NAME, ERROR_COL_NAME, X_GROUP_ID, X_USER_ID,
3879                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
3880                X_PROGRAM_ID, ID_ASSIGN, ERROR_COL_LIST);
3881       END IF;
3882 
3883       -- validate reasonable limits
3884 
3885       VALIDATE_REASONABLE_LIMITS(COL_NAME, ERROR_COL_NAME,
3886             X_DATATYPE, X_CHAR_ID, X_GROUP_ID, X_USER_ID,
3887             X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3888             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3889 
3890       -- validate actions
3891 
3892       VALIDATE_ACTIONS(COL_NAME, ERROR_COL_NAME,
3893             X_DATATYPE, X_CHAR_ID, X_GROUP_ID, X_USER_ID,
3894             X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3895             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
3896             X_PLAN_ID, ERROR_COL_LIST);
3897 
3898       -- for the special case where both item and production line are on
3899       -- the plan, we need to derive wip entity id
3900 
3901       IF ((COL_NAME = 'ITEM') AND (PARENT_COL = 'PRODUCTION_LINE')) THEN
3902          DERIVE_JOB(X_GROUP_ID, X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
3903                X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, ERROR_COL_LIST);
3904       END IF;
3905 
3906    END IF; -- disabled test
3907 
3908 END VALIDATE_STEPS;
3909 
3910 -- For Sequence Project. The following Procedure dervies the new sequence
3911 -- that needs to automatically inserted.
3912 -- kabalakr 15 JAN 2002.
3913 
3914 PROCEDURE DERIVE_SEQUENCE(X_GROUP_ID NUMBER,
3915                           X_USER_ID NUMBER,
3916                           X_LAST_UPDATE_LOGIN NUMBER,
3917                           X_REQUEST_ID NUMBER,
3918                           X_PROGRAM_APPLICATION_ID NUMBER,
3919                           X_PROGRAM_ID NUMBER,
3920                           X_COL_NAME VARCHAR2,
3921                           X_CHAR_ID NUMBER,
3922 			  X_TXN_TYPE NUMBER
3923                           ) IS
3924 
3925   SQL_STATEMENT VARCHAR2(2000);
3926   NEW_SEQUENCE  VARCHAR2(100);
3927 
3928   NUM_ROWS NUMBER;
3929 
3930 BEGIN
3931   -- This procedure is rewritten for bug 2548710.
3932   -- Get the count of transaction records. We need to derive sequence
3933   -- for all the records and populate into G_SEQ_TABxx variables
3934   -- We'll update this into QA_RESULTS_INTERFACE
3935   -- in TRANSFER_VALID_ROWS() and UPDATE_VALID_ROWS(). See bug 2548710 for
3936   -- more details. kabalakr.
3937 
3938   -- Optimized the code for bug 2548710. rponnusa Mon Nov 18 03:49:15 PST 2002
3939 
3940   -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
3941   -- deleted unwanted code. Here assign default seq value. Latter
3942   -- seq. api will generate the original values
3943 
3944     IF (X_TXN_TYPE <> 2 )
3945     THEN
3946         NEW_SEQUENCE := G_SEQUENCE_DEFAULT;
3947     ELSE
3948         NEW_SEQUENCE := 'NULL';
3949     END IF;
3950 
3951    -- Bug 3136107.
3952    -- SQL Bind project. Code modified to use bind variables instead of literals
3953    -- Same as the fix done for Bug 3079312.suramasw.
3954 
3955     SQL_STATEMENT :=
3956       'UPDATE QA_RESULTS_INTERFACE QRI ' || 'SET LAST_UPDATE_DATE = SYSDATE, ' ||
3957         'LAST_UPDATE_LOGIN = :LAST_UPDATE_LOGIN ' ||
3958         ', REQUEST_ID = :REQUEST_ID ' ||
3959         ', PROGRAM_APPLICATION_ID = :PROGRAM_APPLICATION_ID ' ||
3960         ', PROGRAM_ID = :PROGRAM_ID ' ||
3961         ', PROGRAM_UPDATE_DATE = SYSDATE, ' ||
3962            X_COL_NAME || ' = :NEW_SEQUENCE ' ||
3963         ' WHERE QRI.GROUP_ID = :GROUP_ID ' ||
3964          ' AND  QRI.PROCESS_STATUS = 2 ' ||
3965           'AND  NOT EXISTS (SELECT ''X'' ' ||
3966                 'FROM   QA_INTERFACE_ERRORS QIE ' ||
3967                 'WHERE  QIE.TRANSACTION_INTERFACE_ID = ' ||
3968             'QRI.TRANSACTION_INTERFACE_ID )';
3969 
3970 
3971      EXECUTE IMMEDIATE SQL_STATEMENT USING X_LAST_UPDATE_LOGIN,
3972                                            X_REQUEST_ID,
3973                                            X_PROGRAM_APPLICATION_ID,
3974                                            X_PROGRAM_ID,
3975                                            NEW_SEQUENCE,
3976                                            X_GROUP_ID;
3977 
3978 END DERIVE_SEQUENCE;
3979 
3980 -- Bug 3069404 ksoh Tue Mar 16 10:43:36 PST 2004
3981 -- sequence element is really read-only
3982 -- should check if the user is trying to import into or update it
3983 
3984 -- 3785197.Update was failing if read only or sequence elements was set as matching element.
3985 -- To check whether sequence is matching element or not using the function CHECK_IF_MATCHING_ELEMENT.
3986 -- Commented out the old logic.
3987 -- srhariha.Fri Jul 23 03:04:52 PDT 2004.
3988 
3989 
3990 PROCEDURE VALIDATE_SEQUENCE(P_COL_NAME VARCHAR2,
3991         P_GROUP_ID NUMBER,
3992         P_USER_ID NUMBER,
3993         P_LAST_UPDATE_LOGIN NUMBER,
3994         P_REQUEST_ID NUMBER,
3995         P_PROGRAM_APPLICATION_ID NUMBER,
3996         P_PROGRAM_ID NUMBER,
3997         P_CHAR_NAME VARCHAR2,
3998 	    P_TXN_TYPE NUMBER
3999                           ) IS
4000 
4001     --L_MATCHING_ELEMENTS		VARCHAR2(1000);
4002     MUST_BE_NULL BOOLEAN := FALSE;
4003     ERROR_COL_LIST VARCHAR2(200);
4004     ERROR_COL_NAME VARCHAR2(80);
4005 BEGIN
4006     IF (P_TXN_TYPE <> 2 )
4007     THEN -- this is insert, the element must be null
4008         MUST_BE_NULL := TRUE;
4009     ELSE -- this is update, the element must be null unless it is a matching element
4010         --SELECT MATCHING_ELEMENTS
4011         --INTO L_MATCHING_ELEMENTS
4012         --FROM QA_RESULTS_INTERFACE
4013         --WHERE GROUP_ID = P_GROUP_ID;
4014 
4015         --L_MATCHING_ELEMENTS := UPPER(L_MATCHING_ELEMENTS);
4016 
4017         IF CHECK_IF_MATCHING_ELEMENT(P_CHAR_NAME) = FALSE THEN
4018             MUST_BE_NULL := TRUE;
4019         END IF;
4020     END IF;
4021 
4022     IF MUST_BE_NULL THEN
4023         ERROR_COL_NAME := dequote(P_CHAR_NAME) || ' (' || P_COL_NAME || ')';
4024         ERROR_COL_LIST := 'NULL, ' || '''' || ERROR_COL_NAME || '''';
4025 
4026         QLTTRAFB.VALIDATE_READ_ONLY(P_COL_NAME => P_COL_NAME,
4027                             P_ERROR_COL_NAME => ERROR_COL_NAME,
4028                             P_ERROR_MESSAGE => ERROR_SEQUENCE,
4029                             P_GROUP_ID => P_GROUP_ID,
4030                             P_USER_ID => P_USER_ID,
4031                             P_LAST_UPDATE_LOGIN => P_LAST_UPDATE_LOGIN,
4032                             P_REQUEST_ID => P_REQUEST_ID,
4033                             P_PROGRAM_APPLICATION_ID => P_PROGRAM_APPLICATION_ID,
4034                             P_PROGRAM_ID => P_PROGRAM_ID,
4035                             P_PARENT_COL_NAME => NULL,
4036                             P_ERROR_COL_LIST => ERROR_COL_LIST);
4037     END IF; -- MUST_BE_NULL
4038 END VALIDATE_SEQUENCE;
4039 
4040 -- End Of Sequence Project changes.
4041 
4042 
4043 -- Adding update capabilites.  (1)  Parse matching elements list.  (2)  Validate
4044 -- all matching elements are elements of the plan.  (3)  Get rowids for rows in
4045 -- QA_RESULTS that will be updated.
4046 
4047 --
4048 -- Bug 4254876. Added param hardcoded_column_table
4049 -- bso
4050 --
4051 FUNCTION VALIDATE_UPDATE_TYPE_RECORDS (X_GROUP_ID NUMBER,
4052 				       X_PLAN_ID NUMBER,
4053 				       CHAR_NAME_TABLE CHAR30_TABLE,
4054 				       DEVELOPER_NAME_TABLE CHAR30_TABLE,
4055                                        HARDCODED_COLUMN_TABLE CHAR30_TABLE,
4056 				       DATATYPE_TABLE NUMBER_TABLE,
4057 			    	       NUM_ELEMS BINARY_INTEGER,
4058 				       X_USER_ID NUMBER,
4059 				       X_LAST_UPDATE_LOGIN NUMBER,
4060 				       X_REQUEST_ID NUMBER,
4061 				       X_PROGRAM_APPLICATION_ID NUMBER,
4062 				       X_PROGRAM_ID NUMBER) RETURN VARCHAR2 IS
4063 
4064   SELECT_STMT			VARCHAR2(10000);
4065   X_MATCHING_ELEMENTS		VARCHAR2(1000);
4066   X_TRANSACTION_INTERFACE_ID 	NUMBER;
4067   I					BINARY_INTEGER;
4068   J					BINARY_INTEGER;
4069   DONE BOOLEAN;
4070   TMP VARCHAR2(1000);
4071   TOTAL_MATCHES		NUMBER;
4072   CONDITIONS_TABLE		CHAR30_TABLE;
4073   DEVELOPER_TABLE   	CHAR30_TABLE;
4074   DATA_TABLE		NUMBER_TABLE;
4075   QARES_ROW			ROWID;
4076   STMT_OF_ROWIDS		VARCHAR2(10000);
4077   MATCH_ERROR			BOOLEAN;
4078   CURSOR_HANDLE		INTEGER := DBMS_SQL.OPEN_CURSOR;
4079   IGNORE				NUMBER;
4080   X_PLAN_NAME			QA_PLANS.NAME%TYPE;
4081   MATCHING_ERROR		EXCEPTION;
4082   NO_ROWIDS_ERROR 		EXCEPTION;
4083   MORE_THAN_ONE_ROWID_ERROR EXCEPTION;
4084 
4085   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4086   l_viewname       VARCHAR2(100);
4087   l_importviewname VARCHAR2(100);
4088 
4089 BEGIN
4090 
4091   SELECT MATCHING_ELEMENTS, TRANSACTION_INTERFACE_ID
4092   INTO X_MATCHING_ELEMENTS, X_TRANSACTION_INTERFACE_ID
4093   FROM QA_RESULTS_INTERFACE
4094   WHERE GROUP_ID = X_GROUP_ID;
4095 
4096   X_MATCHING_ELEMENTS := UPPER(X_MATCHING_ELEMENTS);
4097 
4098   -- get rid of commas and white spaces at either end.
4099   X_MATCHING_ELEMENTS := LTRIM(X_MATCHING_ELEMENTS, ' ,');
4100   X_MATCHING_ELEMENTS := RTRIM(X_MATCHING_ELEMENTS, ' ,');
4101 
4102   I := 0;
4103   DONE := (X_MATCHING_ELEMENTS IS NULL);
4104   WHILE (NOT DONE) LOOP
4105     I := I + 1;  -- now we know there is at least one element.
4106 
4107     -- if there is no more commas, this is the last element, return.
4108     J := INSTR(X_MATCHING_ELEMENTS, ',');
4109     IF J = 0 THEN
4110         TMP := X_MATCHING_ELEMENTS;
4111         DONE := TRUE;
4112     ELSE
4113     -- there happens to be at least a comma.  Extract the first
4114     -- element by finding the comma and taking everything in front.
4115         TMP := SUBSTR(X_MATCHING_ELEMENTS, 1, J-1);
4116         X_MATCHING_ELEMENTS := SUBSTR(X_MATCHING_ELEMENTS, J);
4117         X_MATCHING_ELEMENTS := LTRIM(X_MATCHING_ELEMENTS, ' ,');
4118     END IF;
4119 
4120     -- clean up the extracted element by getting rid of any right-most
4121     -- spaces and convert inner spaces to underscores.
4122     CONDITIONS_TABLE(I) := REPLACE(RTRIM(TMP,' '), ' ', '_');
4123   END LOOP;
4124 
4125   TOTAL_MATCHES := I;
4126 
4127   -- Bug 3785197.  Update was failing if read only or sequence elements was set as matching element.
4128   -- Intialising global variables G_TOTAL_MATCHES and G_MATCHING_CHAR_TABLE, which will
4129   -- be used in the CHECK_IF_MATCHING_ELEMENT () procedure. G_TOTAL_MATCHES will hold number of
4130   -- matching elements and G_MATCHING_CHAR_TABLE contains processed CHAR_NAME of matching elements.
4131   -- Both are used to check if read only element or sequence is a matching element or not.
4132   -- srhariha.Fri Jul 23 03:04:52 PDT 2004
4133 
4134   G_TOTAL_MATCHES := TOTAL_MATCHES;
4135 
4136   FOR K IN 1..TOTAL_MATCHES LOOP
4137     G_MATCHING_CHAR_TABLE(K) := CONDITIONS_TABLE(K);
4138   END LOOP;
4139   -- now insure that all the columns will match column names in the plan.
4140   -- this is done without making SQL calls for performance reasons.
4141   MATCH_ERROR := FALSE;
4142   FOR I IN 1..TOTAL_MATCHES LOOP
4143     MATCH_ERROR := TRUE;
4144     FOR J IN 1..NUM_ELEMS LOOP
4145       IF CONDITIONS_TABLE(I) = CHAR_NAME_TABLE(J)
4146 	   THEN MATCH_ERROR := FALSE;
4147 	       -- DEVELOPER_TABLE(I) := DEVELOPER_NAME_TABLE(J);
4148 
4149                --
4150                -- Bug 4254876
4151                -- We now define DEVELOPER_TABLE(I) to be the _IV column name.
4152                -- Here we match the same algorithm as in qltvcreb, namely
4153                -- if hardcoded column is null then
4154                --     same as CHAR_NAME
4155                -- else
4156                --     same as DEVELOPER_NAME
4157                --
4158                -- bso Tue Mar 29 15:57:35 PST 2005
4159                --
4160 
4161                IF hardcoded_column_table(J) IS NULL THEN
4162                    developer_table(i) := char_name_table(j);
4163                ELSE
4164                    developer_table(i) := developer_name_table(j);
4165                END IF;
4166 		   DATA_TABLE(I) := DATATYPE_TABLE(J);
4167 	        EXIT;
4168 	 ELSIF CONDITIONS_TABLE(I) = 'COLLECTION_ID'
4169 	   THEN MATCH_ERROR := FALSE;
4170 		   DEVELOPER_TABLE(I) := 'COLLECTION_ID';
4171 		   DATA_TABLE(I) := 2;
4172 		   EXIT;
4173       END IF;
4174     END LOOP;
4175     IF MATCH_ERROR = TRUE
4176       THEN RAISE MATCHING_ERROR;
4177     END IF;
4178 
4179     --
4180     -- Because of Discoverer limitation, dynamic view columns do
4181     -- not match collection element names exactly.  All special
4182     -- characters are converted to underscores.  Do this now.
4183     -- bso
4184     --
4185     conditions_table(i) := despecial(conditions_table(i));
4186 
4187   END LOOP;
4188 
4189   -- Now get the view name of the plan you want to compare to.  We need to
4190   -- do this because we must compare against user_friendly columns, not
4191   -- "_id" columns (e.g. CUSTOMER column, not CUSTOMER_ID column)
4192   SELECT NAME
4193   INTO X_PLAN_NAME
4194   FROM QA_PLANS
4195   WHERE PLAN_ID = X_PLAN_ID;
4196 
4197   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4198 
4199   SELECT import_view_name
4200   INTO l_importviewname
4201   FROM  QA_PLANS
4202   WHERE PLAN_ID = X_PLAN_ID;
4203 
4204   SELECT view_name
4205   INTO l_viewname
4206   FROM  QA_PLANS
4207   WHERE PLAN_ID = X_PLAN_ID;
4208 
4209   -- Now select the QA_RESULTS rowids that needs to be updated.
4210 
4211   -- Changed the SELECT_STMT as below so that the import_view_name
4212   -- and view_name which are queried up from qa_plans are used rather
4213   -- than simply using the plan_name.Commented out the existing code.
4214   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4215 
4216   SELECT_STMT := 'SELECT V.ROW_ID ' ||
4217                  'FROM "'|| l_importviewname ||'" QI,' ||
4218                  '    "'|| l_viewname ||'" V ' ||
4219                  'WHERE QI.PROCESS_STATUS = 2 ';
4220 
4221 /*
4222   SELECT_STMT := 'SELECT V.ROW_ID ' ||
4223 		 'FROM "Q_'||translate(X_PLAN_NAME, ' ''', '__')||'_IV" QI,' ||
4224 		 '     "Q_'||translate(X_PLAN_NAME, ' ''', '__')||'_V" V ' ||
4225 		 'WHERE QI.PROCESS_STATUS = 2 ';
4226 */
4227 
4228   FOR I IN 1..TOTAL_MATCHES LOOP
4229       IF DATA_TABLE(I) = 3 THEN
4230 	  -- IF CONDITIONS_TABLE(I) IN ('TRANSACTION_DATE') THEN
4231           --
4232 	  -- Date and hardcoded date.  Normally, the ELSE code will work
4233 	  -- for both user date and hardcoded date.  Unfortunately there
4234 	  -- is a bug in PL/SQL to_date function that causes any_to_date
4235 	  -- to return incorrect value when applied to hardcoded date.
4236 	  --
4237 	  -- E.g.
4238 	  --     create table date_test(d Date);
4239 	  --     insert into date_test(d) values('2-JAN-2001');
4240 	  --     select to_char(to_date(d, 'DD-MON-YYYY'), 'YYYY/MM/DD')
4241 	  --         from date_test;
4242 	  --
4243 	  -- will return a date in year 0001.  (This will even generate an
4244 	  -- error "year cannot be 0" if the year is 2000).  So, we have
4245 	  -- to do things differently.
4246 	  --
4247 	  -- bso Fri Aug 28 11:55:52 PDT 1998
4248 	  --
4249 	  -- The above problem is solved by adding an overloaded
4250 	  -- any_to_date that takes Date as parameter.
4251 	  --
4252 	  -- bso Mon Jan  4 15:33:38 PST 1999
4253 	  --
4254 	  --    SELECT_STMT :=  SELECT_STMT ||
4255           --	  ' AND V.' || CONDITIONS_TABLE(I) ||
4256           --	  ' = QI.' || NVL(DEVELOPER_TABLE(I),CONDITIONS_TABLE(I));
4257 	  -- ELSE
4258           --
4259 	  --
4260 
4261           -- Removed the DEVELOPER_TABLE(I) from the below dynamic sql(s) and used
4262           -- CONDITIONS_TABLE(I) directly.DEVELOPER_TABLE(I) holds the developer_name
4263           -- of the collection element and CONDITIONS_TABLE(I) holds the Matching
4264           -- Element Name which is the collection element name.This was done because
4265           -- nearly 25 softcoded elements have the Developer_Name different from the
4266           -- collection element name and this causes the issue reported in bug 3860762.
4267           -- Changing the Developer_Name column of all those collection elements in
4268           -- qa_chars would resolve the issue,but this is the easy and efficient way.
4269           -- Commented out the existing code.
4270           -- Bug 3860762.suramasw.
4271 
4272               /*
4273 	      SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4274 	          || ' = qltdate.any_to_date(QI.' || CONDITIONS_TABLE(I) ||')';
4275               */
4276 
4277               /*
4278 	      SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4279 	          || ' = qltdate.any_to_date(QI.' ||
4280 		  NVL(DEVELOPER_TABLE(I),CONDITIONS_TABLE(I)) ||')';
4281               */
4282 
4283           -- Bug 4254876.  Above construction (3860762) is still incorrect.
4284           -- Now use a cleverly constructed developer_table.
4285           -- bso.
4286 
4287              SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4288                  || ' = qltdate.any_to_date(QI.' || DEVELOPER_TABLE(I) ||')';
4289 
4290           -- END IF;
4291 
4292       -- For Timezone Compliance bug 3179845. Convert the datetime elements to real dates.
4293       -- kabalakr Mon Oct 27 04:33:49 PST 2003.
4294 
4295       ELSIF DATA_TABLE(I) = 6 THEN
4296 
4297               /*
4298               -- Bug 3860762.suramasw.
4299 
4300               SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4301                   || ' = qltdate.any_to_datetime(QI.' || CONDITIONS_TABLE(I) ||')';
4302               */
4303 
4304               /*
4305               SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4306                   || ' = qltdate.any_to_datetime(QI.' ||
4307                   NVL(DEVELOPER_TABLE(I),CONDITIONS_TABLE(I)) ||')';
4308               */
4309 
4310           -- Bug 4254876.  Above construction (3860762) is still incorrect.
4311           -- Now use a cleverly constructed developer_table.
4312           -- bso.
4313 
4314               SELECT_STMT :=  SELECT_STMT || ' AND V.' || CONDITIONS_TABLE(I)
4315                   || ' = qltdate.any_to_datetime(QI.' || DEVELOPER_TABLE(I) ||')';
4316 
4317       ELSE
4318 
4319 
4320           /*
4321           -- Bug 3860762.suramasw.
4322 
4323 	  SELECT_STMT :=  SELECT_STMT ||
4324               ' AND V."' || CONDITIONS_TABLE(I) ||
4325               '" = QI."' || CONDITIONS_TABLE(I) || '"';
4326           */
4327 
4328           /*
4329 	  SELECT_STMT :=  SELECT_STMT ||
4330               ' AND V."' || CONDITIONS_TABLE(I) ||
4331               '" = QI."' || NVL(DEVELOPER_TABLE(I),CONDITIONS_TABLE(I)) || '"';
4332           */
4333 
4334           -- Bug 4254876.  Above construction (3860762) is still incorrect.
4335           -- Now use a cleverly constructed developer_table.
4336           -- bso.
4337 
4338           SELECT_STMT :=  SELECT_STMT ||
4339               ' AND V."' || CONDITIONS_TABLE(I) ||
4340               '" = QI."' || DEVELOPER_TABLE(I) || '"';
4341 
4342 	  -- The following line was added to resolve the bug 894858
4343           -- This line is needed, otherwise when rows are updated
4344           -- by mutiple workers it will raise MORE_THAN_ONE_ROW_MATCHED
4345           -- exception.  Transaction_interface_id makes the sql retrieve
4346           -- one rows only.
4347           --
4348           -- orashid
4349 
4350           -- Bug 4270911. CU2 SQL Literal fix.TD #25
4351           -- Use bind variable for transaction interface id.
4352           -- srhariha. Fri Apr 15 04:37:42 PDT 2005.
4353 	  SELECT_STMT := SELECT_STMT || ' and QI.TRANSACTION_INTERFACE_ID = :X_INTERFACE_ID';
4354           -- || to_char(X_TRANSACTION_INTERFACE_ID);
4355 
4356       END IF;
4357   END LOOP;
4358 
4359   DBMS_SQL.PARSE(CURSOR_HANDLE, SELECT_STMT, DBMS_SQL.NATIVE);
4360   DBMS_SQL.DEFINE_COLUMN_ROWID(CURSOR_HANDLE, 1, QARES_ROW);
4361   DBMS_SQL.BIND_VARIABLE(CURSOR_HANDLE,'X_INTERFACE_ID',X_TRANSACTION_INTERFACE_ID);
4362   IGNORE := DBMS_SQL.EXECUTE(CURSOR_HANDLE);
4363   STMT_OF_ROWIDS := '(''';
4364   I := 0;
4365   WHILE DBMS_SQL.FETCH_ROWS(CURSOR_HANDLE) > 0 LOOP
4366     IF I > 0
4367       THEN STMT_OF_ROWIDS := STMT_OF_ROWIDS ||''''||','||'''';
4368     END IF;
4369     I := I + 1;
4370     DBMS_SQL.COLUMN_VALUE_ROWID(CURSOR_HANDLE, 1, QARES_ROW);
4371     STMT_OF_ROWIDS := STMT_OF_ROWIDS || QARES_ROW;
4372   END LOOP;
4373   STMT_OF_ROWIDS := STMT_OF_ROWIDS || ''')';
4374   DBMS_SQL.CLOSE_CURSOR(CURSOR_HANDLE);
4375 
4376   IF I = 0
4377     THEN RAISE NO_ROWIDS_ERROR;
4378   ELSIF I > 1
4379     THEN RAISE MORE_THAN_ONE_ROWID_ERROR;
4380   END IF;
4381 
4382   RETURN STMT_OF_ROWIDS;
4383 
4384 EXCEPTION
4385   WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN
4386 
4387     INSERT INTO QA_INTERFACE_ERRORS
4388     (TRANSACTION_INTERFACE_ID,
4389      ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4390      CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
4391      PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE)
4392     SELECT QRI.TRANSACTION_INTERFACE_ID, 'GROUP_ID',
4393            FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_INVALID_VALUE'),
4394  	   	 SYSDATE, X_USER_ID,
4395            SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4396            X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4397            SYSDATE
4398     FROM   QA_RESULTS_INTERFACE QRI
4399     WHERE  QRI.GROUP_ID = X_GROUP_ID
4400     AND  QRI.PROCESS_STATUS = 2;
4401     SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
4402 		     X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4403 		     X_LAST_UPDATE_LOGIN, 'GROUP_ID');
4404     RETURN '';
4405 
4406   WHEN MATCHING_ERROR THEN
4407 
4408     INSERT INTO QA_INTERFACE_ERRORS
4409     (TRANSACTION_INTERFACE_ID,
4410      ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4411      CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
4412      PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE)
4413     SELECT QRI.TRANSACTION_INTERFACE_ID, 'MATCHING_ELEMENTS',
4414            FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_INVALID_VALUE'),
4415            SYSDATE, X_USER_ID,
4416            SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4417            X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4418            SYSDATE
4419     FROM   QA_RESULTS_INTERFACE QRI
4420     WHERE  QRI.GROUP_ID = X_GROUP_ID
4421     AND  QRI.PROCESS_STATUS = 2;
4422     SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
4423                      X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4424                      X_LAST_UPDATE_LOGIN, 'MATCHING_ELEMENTS');
4425     RETURN '';
4426 
4427   WHEN NO_ROWIDS_ERROR THEN
4428 
4429     INSERT INTO QA_INTERFACE_ERRORS
4430     (TRANSACTION_INTERFACE_ID,
4431      ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4432      CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
4433      PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE)
4434     SELECT QRI.TRANSACTION_INTERFACE_ID, 'MATCHING_ELEMENTS',
4435            FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_NO_MATCH'),
4436            SYSDATE, X_USER_ID,
4437            SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4438            X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4439            SYSDATE
4440     FROM   QA_RESULTS_INTERFACE QRI
4441     WHERE  QRI.GROUP_ID = X_GROUP_ID
4442     AND  QRI.PROCESS_STATUS = 2;
4443     SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
4444                      X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4445                      X_LAST_UPDATE_LOGIN, 'MATCHING_ELEMENTS');
4446     RETURN '';
4447 
4448   WHEN MORE_THAN_ONE_ROWID_ERROR THEN
4449 
4450     INSERT INTO QA_INTERFACE_ERRORS
4451     (TRANSACTION_INTERFACE_ID,
4452 	ERROR_COLUMN, ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4453 	CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, REQUEST_ID,
4454 	PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE)
4455     SELECT QRI.TRANSACTION_INTERFACE_ID, 'MATCHING_ELEMENTS',
4456 		 FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_MANY_MATCHES'),
4457 		 SYSDATE, X_USER_ID,
4458 		 SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4459 		 X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4460 		 SYSDATE
4461     FROM   QA_RESULTS_INTERFACE QRI
4462     WHERE  QRI.GROUP_ID = X_GROUP_ID
4463     AND  QRI.PROCESS_STATUS = 2;
4464     SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
4465     X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4466     X_LAST_UPDATE_LOGIN, 'MATCHING_ELEMENTS');
4467 
4468     RETURN '';
4469 
4470 END VALIDATE_UPDATE_TYPE_RECORDS;
4471 
4472    -- Bug 3759926.Update transaction was failing if plan has read only or disabled elements.
4473    -- Retrieve update records was not considering this scenario.
4474    -- As part of fix, added read only and enabled flag table as parameters to the procedure.
4475    -- srhariha. Wed Jul 14 02:15:41 PDT 2004.
4476 
4477 
4478 -- Adding update capabilites.
4479 PROCEDURE RETRIEVE_UPDATE_RECORDS(X_GROUP_ID NUMBER,
4480 			 	  STMT_OF_ROWIDS VARCHAR2,
4481 				  DEVELOPER_NAME CHAR30_TABLE,
4482 				  RESULT_COLUMN_NAME CHAR30_TABLE,
4483 				  DATATYPE_TABLE NUMBER_TABLE,
4484 				  CHAR_NAME_TABLE CHAR30_TABLE,
4485 				  NUM_ELEMS NUMBER,
4486 				  X_PLAN_ID NUMBER,
4487                                   READ_ONLY_FLAG_TABLE NUMBER_TABLE,
4488                                   ENABLED_FLAG_TABLE NUMBER_TABLE) IS
4489   UPDATE_STMT	VARCHAR2(10000);
4490   X_PLAN_NAME 	QA_PLANS.NAME%TYPE;
4491 
4492   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4493   l_viewname       VARCHAR2(100);
4494 
4495    -- Bug 3759926. Added the following variable.
4496    -- srhariha. Wed Jul 14 02:15:41 PDT 2004.
4497 
4498   VALUE_STRING VARCHAR2(256);
4499 
4500   -- Bug 4270911. Added the following variable.
4501   -- srhariha. Fri Apr 15 04:19:55 PDT 2005.
4502   L_ROWID ROWID;
4503 
4504 BEGIN
4505   SELECT NAME INTO X_PLAN_NAME
4506   FROM QA_PLANS
4507   WHERE PLAN_ID = X_PLAN_ID;
4508 
4509   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4510 
4511   SELECT view_name
4512   INTO l_viewname
4513   FROM  QA_PLANS
4514   WHERE PLAN_ID = X_PLAN_ID;
4515 
4516 
4517   -- now that the record is stored in the PL/SQL table, populate all columns
4518   -- that are null with values from the corresponding QA_RESULTS record.
4519   -- This is so that we can use the VALIDATE_STEPS function as it was designed
4520   -- for insert-type records (e.g. if just the item revision column is
4521   -- populated in the interface record, we don't want it to error out when
4522   -- VALIDATE_STEPS sees that that column's parent column, item, is not
4523   -- populated.)
4524 
4525   -- For Sequence Project. Included IF conditions to consider Sequence columns.
4526   -- kabalakr 15 JAN 2002.
4527 
4528   -- Included ELSIF condition to consider Comment columns.
4529   -- suramasw.Bug 2917335.Thu Apr 24 21:24:56 PDT 2003.
4530 
4531   UPDATE_STMT := 'UPDATE QA_RESULTS_INTERFACE QRI ' || 'SET (';
4532   FOR I IN 1..NUM_ELEMS LOOP
4533     IF RESULT_COLUMN_NAME(I) LIKE 'CHARACTER%' THEN
4534         UPDATE_STMT := UPDATE_STMT || RESULT_COLUMN_NAME(I);
4535     ELSIF RESULT_COLUMN_NAME(I) LIKE 'SEQUENCE%' THEN
4536         UPDATE_STMT := UPDATE_STMT || RESULT_COLUMN_NAME(I);
4537     ELSIF RESULT_COLUMN_NAME(I) LIKE 'COMMENT%' THEN
4538         UPDATE_STMT := UPDATE_STMT || RESULT_COLUMN_NAME(I);
4539     ELSE
4540         UPDATE_STMT := UPDATE_STMT || DEVELOPER_NAME(I);
4541     END IF;
4542     IF I < NUM_ELEMS THEN
4543         UPDATE_STMT := UPDATE_STMT || ',';
4544     END IF;
4545   END LOOP;
4546 
4547   UPDATE_STMT := UPDATE_STMT || ') = (SELECT';
4548 
4549   -- date fix by Peter Chow (pchow)
4550 
4551   -- For Sequence Project. Included ELSIF condition to consider Sequence columns.
4552   -- kabalakr 15 JAN 2002.
4553 
4554   -- Included ELSIF condition to consider Comment columns.
4555   -- suramasw.Bug 2917335.Thu Apr 24 21:24:56 PDT 2003.
4556 
4557   FOR I IN 1..NUM_ELEMS LOOP
4558 
4559        -- Bug 3759926.Update transaction was failing if plan has read only or disabled elements.
4560        -- Retrieve update records was not considering this scenario.
4561        -- We check for whether element is either read only or disabled,if evaluates true
4562        -- dont retrieve data from QA_RESULTS (Value_String is null) ,else fetch the value.
4563        -- srhariha. Wed Jul 14 02:15:41 PDT 2004.
4564 
4565     IF (READ_ONLY_FLAG_TABLE(I) = 1) OR
4566                           (ENABLED_FLAG_TABLE(I) = 2) THEN
4567       VALUE_STRING := 'null)';
4568     ELSE
4569       VALUE_STRING := 'V."' || despecial(CHAR_NAME_TABLE(I)) || '")';
4570     END IF;
4571 
4572 
4573 
4574 
4575       IF RESULT_COLUMN_NAME(I) LIKE 'CHARACTER%' THEN
4576           IF DATATYPE_TABLE(I) NOT IN (3, 6) THEN
4577       	      UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||RESULT_COLUMN_NAME(I)||
4578 		  ',' || VALUE_STRING;
4579 	  ELSIF DATATYPE_TABLE(I) = 3 THEN
4580               UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||RESULT_COLUMN_NAME(I)||
4581                   ',qltdate.date_to_canon(' || VALUE_STRING || ')';
4582 
4583           -- For Timezone Compliance bug 3179845. Convert the datetime elements to real dates.
4584           -- kabalakr Mon Oct 27 04:33:49 PST 2003.
4585 
4586 	  ELSIF DATATYPE_TABLE(I) = 6 THEN
4587               UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||RESULT_COLUMN_NAME(I)||
4588                   ',qltdate.date_to_canon_dt(' || VALUE_STRING || ')';
4589 	  END IF;
4590 
4591         -- Bug 3755745.Update of result was erroring out if the plan has sequence elements.
4592         -- We were updating QA_RESULTS_INTERFACE wih values from QA_RESULTS for corresponding
4593         -- rows.But VALIDATE_SEQUENCE issues errror if a value exist for SEQUENCEXX.
4594         -- Hence we shouldnt retrieve value of sequence from QA_RESULTS if sequence col
4595         -- has null value.SEQUENCEXX can have other values than NULL.(1)User tries to
4596         -- update it manually or(2) it is a matching element.Both these cases are handled
4597         -- in VALIDATE_SEQUENCE procedures.
4598         -- srhariha. Fri Jul  9 05:33:30 PDT 2004.
4599 
4600       ELSIF RESULT_COLUMN_NAME(I) LIKE 'SEQUENCE%' THEN
4601               UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||RESULT_COLUMN_NAME(I)||
4602                  ',null)';
4603       ELSIF RESULT_COLUMN_NAME(I) LIKE 'COMMENT%' THEN
4604               UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||RESULT_COLUMN_NAME(I)||
4605                   ',' || VALUE_STRING;
4606       ELSE
4607           UPDATE_STMT := UPDATE_STMT||' NVL(QRI.'||DEVELOPER_NAME(I)||
4608               ',' || VALUE_STRING;
4609       END IF;
4610       IF I < NUM_ELEMS THEN
4611           UPDATE_STMT := UPDATE_STMT || ',';
4612       END IF;
4613   END LOOP;
4614 
4615   -- Changed the UPDATE_STMT as below so that the view_name which is
4616   -- queried up from qa_plans is used rather than simply using the
4617   -- plan_name.Commented out the existing code.
4618   -- Bug 2943732.suramasw.Tue May 27 07:56:48 PDT 2003.
4619 
4620   -- Bug 3136107.
4621   -- SQL Bind project. Code modified to use bind variables instead of literals
4622   -- Same as the fix done for Bug 3079312.suramasw.
4623 
4624   -- Bug 4270911. CU2 SQL Literal fix. TD #26
4625   -- Using bind variable for rowid under the assumption that
4626   -- Quality open interface dont support multi row update.
4627   -- srhariha. Fri Apr 15 04:19:55 PDT 2005.
4628 
4629   UPDATE_STMT := UPDATE_STMT || ' FROM "'|| l_viewname ||
4630                  '" V ' || 'WHERE V.ROW_ID = :BIND_ROWID ' ||
4631                  ') WHERE QRI.GROUP_ID = :GROUP_ID ';
4632 
4633   L_ROWID := substr(stmt_of_rowids,3,length(stmt_of_rowids)-4);
4634 
4635   EXECUTE IMMEDIATE UPDATE_STMT USING L_ROWID,X_GROUP_ID;
4636 
4637 /*
4638   UPDATE_STMT := UPDATE_STMT || ' FROM "Q_'||
4639 		 translate(X_PLAN_NAME, ' ''', '__') ||
4640 		 '_V" V ' || 'WHERE V.ROW_ID IN ' || STMT_OF_ROWIDS ||
4641 		 ') WHERE QRI.GROUP_ID = '||X_GROUP_ID;
4642 */
4643 
4644   -- QLTTRAFB.EXEC_SQL(UPDATE_STMT);
4645 
4646 END RETRIEVE_UPDATE_RECORDS;
4647 
4648 
4649 -- Parts of this function were modified to add update capabilities.  They were
4650 -- declaration, new local variable, and code additions for 'stage 3'.
4651 FUNCTION VALIDATE(X_GROUP_ID IN NUMBER,
4652 		  TYPE_OF_TXN IN NUMBER,
4653 		  STMT_OF_ROWIDS OUT NOCOPY VARCHAR2) RETURN BOOLEAN IS
4654 
4655    X_USER_ID                   NUMBER;
4656    X_USER_NAME                 VARCHAR2(100);
4657    X_REQUEST_ID                NUMBER;
4658    X_PROGRAM_APPLICATION_ID    NUMBER;
4659    X_PROGRAM_ID                NUMBER;
4660    X_LAST_UPDATE_LOGIN         NUMBER;
4661 
4662    X_PLAN_ID                   NUMBER;
4663    X_CHAR_ID                   NUMBER;
4664    X_DATATYPE                  NUMBER;
4665    RL_LOWER_BOUND              NUMBER;
4666    RL_UPPER_BOUND              NUMBER;
4667 
4668    CHAR_ID_TABLE               NUMBER_TABLE;
4669    ENABLED_FLAG_TABLE          NUMBER_TABLE;
4670    MANDATORY_FLAG_TABLE        NUMBER_TABLE;
4671    DATATYPE_TABLE              NUMBER_TABLE;
4672    DECIMAL_PRECISION_TABLE     NUMBER_TABLE;
4673    VALUES_EXIST_FLAG_TABLE     NUMBER_TABLE;
4674    CHAR_NAME_TABLE             CHAR30_TABLE;
4675    DEVELOPER_NAME_TABLE        CHAR30_TABLE;
4676    RESULT_COLUMN_NAME_TABLE    CHAR30_TABLE;
4677    SQL_VALIDATION_STRING_TABLE CHAR1500_TABLE;
4678 
4679    -- Bug 4254876
4680    -- Need hardcoded column to properly find _IV column name.
4681    -- This affects Update transactions.
4682    -- bso Tue Mar 29 15:11:39 PST 2005
4683    HARDCODED_COLUMN_TABLE      CHAR30_TABLE;
4684 
4685    ITEM_PARENT                 VARCHAR2(30) := NULL;
4686 
4687    CURRENT_ROW                 BINARY_INTEGER;
4688    NUM_ROWS                    BINARY_INTEGER;
4689    I                           BINARY_INTEGER;
4690    J                           BINARY_INTEGER;
4691    NUM_ELEMS                   BINARY_INTEGER;
4692 
4693    SQL_STATEMENT               VARCHAR2(2000);
4694 
4695    COPY_STMT_OF_ROWIDS	       VARCHAR2(10000);  -- For update capabilities
4696 
4697    RESULT_COLUMN_ID_TABLE      NUMBER_TABLE;
4698    COL_VAL                     VARCHAR2(100);
4699 
4700     -- Tracking Bug : 3104827. Review Tracking Bug : 3148873
4701     -- Added for Read Only for Flag Collection Plan Elements
4702     -- saugupta Thu Aug 28 10:34:14 PDT 2003
4703    READ_ONLY_FLAG_TABLE NUMBER_TABLE;
4704 
4705     -- Bug 4162206
4706     -- R12 Eanbled MOAC for Quality
4707     -- New variable for Inventory Org
4708     x_org_id NUMBER;
4709     dummy    BOOLEAN;
4710 
4711     -- MOAC: define a new cursor for getting gruop organization_id
4712     CURSOR inv_org_id(p_group_id NUMBER) IS
4713         SELECT organization_id
4714         FROM qa_results_interface qri
4715         WHERE qri.group_id = p_group_id
4716         AND qri.process_status = 2;
4717 
4718 
4719 
4720 BEGIN
4721    -- get info for who columns
4722 
4723    X_USER_ID := who_user_id;
4724    X_REQUEST_ID := who_request_id;
4725    X_PROGRAM_APPLICATION_ID := who_program_application_id;
4726    X_PROGRAM_ID := who_program_id;
4727    X_LAST_UPDATE_LOGIN := who_last_update_login;
4728 
4729    -- stage 1 -----------------------------------------------------------------
4730    --
4731    -- validate qa_created_by_name, qa_last_updated_by_name,
4732    -- organization_code
4733    ----------------------------------------------------------------------------
4734 
4735    -- get the current user name.  we will use this for qa_created_by_name
4736    -- and qa_last_updated_by_name if they are null.
4737 
4738    SELECT USER_NAME
4739    INTO   X_USER_NAME
4740    FROM   FND_USER_VIEW
4741    WHERE  USER_ID = X_USER_ID;
4742 
4743    -- set qa_created_by_name and _id to the current user if they are null
4744 
4745    UPDATE QA_RESULTS_INTERFACE
4746    SET    QA_CREATED_BY = X_USER_ID,
4747           QA_CREATED_BY_NAME = X_USER_NAME,
4748           QA_LAST_UPDATED_BY = X_USER_ID,
4749           QA_LAST_UPDATED_BY_NAME = X_USER_NAME,
4750           LAST_UPDATE_DATE = SYSDATE,
4751           LAST_UPDATED_BY = X_USER_ID,
4752           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
4753           REQUEST_ID = X_REQUEST_ID,
4754           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
4755           PROGRAM_ID = X_PROGRAM_ID,
4756           PROGRAM_UPDATE_DATE = SYSDATE
4757    WHERE  GROUP_ID = X_GROUP_ID
4758      AND  PROCESS_STATUS = 2
4759      AND  QA_CREATED_BY_NAME IS NULL;
4760 
4761    --
4762    -- From now on no validation is need for name because user id is
4763    -- passed directly from Form as a param to qlttramb.
4764    -- bso Fri Jul 23 11:16:04 PDT 1999
4765    --
4766 
4767    -- uncommented the following piece of code for bug 3663648.suramasw.
4768 
4769    -- group validation for qa_created_by_name
4770 
4771    -- Added the condition INSERT_TYPE <> 2 as QA_CREATED_BY_NAME should be validated
4772    -- only during Insert transaction.
4773    -- Bug 3663648.suramasw.
4774 
4775    INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ERROR_COLUMN,
4776                   ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4777                   CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
4778                   REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
4779                   PROGRAM_UPDATE_DATE)
4780       SELECT QRI.TRANSACTION_INTERFACE_ID, 'QA_CREATED_BY_NAME',
4781              ERROR_INVALID_VALUE, SYSDATE, X_USER_ID,
4782              SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4783              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4784              SYSDATE
4785       FROM   QA_RESULTS_INTERFACE QRI
4786       WHERE  QRI.GROUP_ID = X_GROUP_ID
4787         AND  QRI.PROCESS_STATUS = 2
4788         AND  QRI.INSERT_TYPE <> 2 -- added for 3663648
4789         AND  NOT EXISTS
4790              (SELECT 'X'
4791               FROM   QA_INTERFACE_ERRORS QIE
4792               WHERE  QIE.TRANSACTION_INTERFACE_ID =
4793                            QRI.TRANSACTION_INTERFACE_ID
4794                 AND  QIE.ERROR_COLUMN IN ('QA_CREATED_BY_NAME', NULL))
4795         AND  NOT EXISTS
4796              (SELECT 'X'
4797               FROM   FND_USER_VIEW FU2
4798               WHERE  QRI.QA_CREATED_BY_NAME = FU2.USER_NAME);
4799 
4800               -- in the above where, we should really be checking start_
4801               -- and end_date to make sure it is a current user.  the
4802               -- problem with this is that user anonymous (-1) has an
4803               -- end date of 07-apr-88.
4804 
4805    -- group derivation for qa_created_by
4806 
4807    -- Added the condition INSERT_TYPE <> 2 as QA_CREATED_BY should be inserted
4808    -- only during Insert transaction.The value of QA_CREATED_BY should be
4809    -- inserted for QA_LAST_UPDATED_BY also during insert transaction, so included
4810    -- the code to insert value for QA_LAST_UPDATED_BY.
4811    -- Bug 3663648.suramasw.
4812 
4813    UPDATE QA_RESULTS_INTERFACE QRI
4814       SET LAST_UPDATE_DATE = SYSDATE,
4815           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
4816           REQUEST_ID = X_REQUEST_ID,
4817           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
4818           PROGRAM_ID = X_PROGRAM_ID,
4819           PROGRAM_UPDATE_DATE = SYSDATE,
4820           QA_CREATED_BY =
4821                 (SELECT MIN(FU2.USER_ID)
4822                  FROM   FND_USER_VIEW FU2
4823                  WHERE  FU2.USER_NAME = QRI.QA_CREATED_BY_NAME),
4824           QA_LAST_UPDATED_BY =
4825                 (SELECT MIN(FU2.USER_ID)
4826                  FROM   FND_USER_VIEW FU2
4827                  WHERE  FU2.USER_NAME = QRI.QA_CREATED_BY_NAME)
4828     WHERE QRI.GROUP_ID = X_GROUP_ID
4829       AND QRI.PROCESS_STATUS = 2
4830       AND QRI.INSERT_TYPE <> 2  -- added for 3663648
4831       AND NOT EXISTS
4832           (SELECT 'X'
4833            FROM   QA_INTERFACE_ERRORS QIE
4834            WHERE  QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID
4835              AND  QIE.ERROR_COLUMN IN ('QA_CREATED_BY_NAME', NULL));
4836 
4837    -- set qa_last_updated_by_name and _id to the current user if they are null
4838 
4839    -- The following piece of code was commented in version 115.76. But the code
4840    -- should be present to figure out qa_last_updated_by_name and qa_last_updated_by
4841    -- when the user doesnot provide the value for qa_last_updated_by_name when
4842    -- updating the record.Hence uncommented the code.
4843    -- Bug 3663648.suramasw.
4844 
4845    UPDATE QA_RESULTS_INTERFACE
4846    SET    QA_LAST_UPDATED_BY = X_USER_ID,
4847           QA_LAST_UPDATED_BY_NAME = X_USER_NAME
4848    WHERE  GROUP_ID = X_GROUP_ID
4849      AND  PROCESS_STATUS = 2
4850      AND  QA_LAST_UPDATED_BY_NAME IS NULL;
4851 
4852    -- group validation for qa_last_updated_by_name
4853 
4854    -- Added the condition INSERT_TYPE = 2 because QA_LAST_UPDATED_BY_NAME
4855    -- should be validated only during update transaction.
4856    -- Bug 3663648.suramasw.
4857 
4858    INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ERROR_COLUMN,
4859                   ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4860                   CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
4861                   REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
4862                   PROGRAM_UPDATE_DATE)
4863       SELECT QRI.TRANSACTION_INTERFACE_ID, 'QA_LAST_UPDATED_BY_NAME',
4864              ERROR_INVALID_VALUE, SYSDATE, X_USER_ID,
4865              SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4866              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4867              SYSDATE
4868       FROM   QA_RESULTS_INTERFACE QRI
4869       WHERE  QRI.GROUP_ID = X_GROUP_ID
4870         AND  QRI.PROCESS_STATUS = 2
4871         AND  QRI.INSERT_TYPE = 2 -- added for 3663648
4872         AND  NOT EXISTS
4873              (SELECT 'X'
4874               FROM   QA_INTERFACE_ERRORS QIE
4875               WHERE  QIE.TRANSACTION_INTERFACE_ID =
4876                            QRI.TRANSACTION_INTERFACE_ID
4877                 AND  QIE.ERROR_COLUMN IN ('QA_LAST_UPDATED_BY_NAME', NULL))
4878         AND  NOT EXISTS
4879              (SELECT 'X'
4880               FROM   FND_USER_VIEW FU2
4881               WHERE  QRI.QA_LAST_UPDATED_BY_NAME = FU2.USER_NAME);
4882 
4883               -- in the above where, we should really be checking start_
4884               -- and end_date to make sure it is a current user.  the
4885               -- problem with this is that user anonymous (-1) has an
4886               -- end date of 07-apr-88.
4887 
4888    -- group derivation for qa_last_updated_by
4889 
4890    -- Added the condition INSERT_TYPE = 2 because QA_LAST_UPDATED_BY_NAME
4891    -- should be updated only during update transaction.Also modified
4892    -- QA_CREATED_BY to QA_LAST_UPDATED_BY as we need to update only
4893    -- QA_LAST_UPDATED_BY during update transaction.
4894    -- Bug 3663648.suramasw.
4895 
4896    UPDATE QA_RESULTS_INTERFACE QRI
4897       SET LAST_UPDATE_DATE = SYSDATE,
4898           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
4899           REQUEST_ID = X_REQUEST_ID,
4900           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
4901           PROGRAM_ID = X_PROGRAM_ID,
4902           PROGRAM_UPDATE_DATE = SYSDATE,
4903           QA_LAST_UPDATED_BY=
4904                 (SELECT MIN(FU2.USER_ID)
4905                  FROM   FND_USER_VIEW FU2
4906                  WHERE  FU2.USER_NAME = QRI.QA_LAST_UPDATED_BY_NAME)
4907     WHERE QRI.GROUP_ID = X_GROUP_ID
4908       AND QRI.PROCESS_STATUS = 2
4909       AND QRI.INSERT_TYPE = 2 -- added for 3663648
4910       AND NOT EXISTS
4911           (SELECT 'X'
4912            FROM   QA_INTERFACE_ERRORS QIE
4913            WHERE  QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID
4914              AND  QIE.ERROR_COLUMN IN ('QA_LAST_UPDATED_BY_NAME', NULL));
4915 
4916 
4917    -- group validation for organization_code
4918    -- Bug 4958776. SQL Repository Fix SQL ID: 15009159
4919    -- replaced ORG_ORGANIZATION_DEFINITIONS with MTL_PARAMETERS
4920    INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ERROR_COLUMN,
4921                   ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
4922                   CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
4923                   REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
4924                   PROGRAM_UPDATE_DATE)
4925       SELECT QRI.TRANSACTION_INTERFACE_ID, 'ORGANIZATION_CODE',
4926              ERROR_INVALID_VALUE, SYSDATE, X_USER_ID,
4927              SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
4928              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
4929              SYSDATE
4930       FROM   QA_RESULTS_INTERFACE QRI
4931       WHERE  QRI.GROUP_ID = X_GROUP_ID
4932         AND  QRI.PROCESS_STATUS = 2
4933         AND  NOT EXISTS
4934              (SELECT 'X'
4935               FROM   QA_INTERFACE_ERRORS QIE
4936               WHERE  QIE.TRANSACTION_INTERFACE_ID =
4937                            QRI.TRANSACTION_INTERFACE_ID
4938                 AND  QIE.ERROR_COLUMN IN ('ORGANIZATION_CODE', NULL))
4939         AND  NOT EXISTS
4940              (SELECT 'X'
4941               FROM   MTL_PARAMETERS OOD
4942               WHERE  QRI.ORGANIZATION_CODE = OOD.ORGANIZATION_CODE);
4943               --  AND  NVL(OOD.DISABLE_DATE, SYSDATE) >= SYSDATE);
4944 
4945    -- group derivation for organization_id
4946    -- Bug 4958776. SQL Repository Fix SQL ID: 15009164
4947    -- replaced ORG_ORGANIZATION_DEFINITIONS with MTL_PARAMETERS
4948    UPDATE QA_RESULTS_INTERFACE QRI
4949       SET LAST_UPDATE_DATE = SYSDATE,
4950           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
4951           REQUEST_ID = X_REQUEST_ID,
4952           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
4953           PROGRAM_ID = X_PROGRAM_ID,
4954           PROGRAM_UPDATE_DATE = SYSDATE,
4955           ORGANIZATION_ID =
4956                 (SELECT MIN(OOD.ORGANIZATION_ID)
4957                  FROM   MTL_PARAMETERS OOD
4958                  WHERE  OOD.ORGANIZATION_CODE = QRI.ORGANIZATION_CODE)
4959     WHERE QRI.GROUP_ID = X_GROUP_ID
4960       AND QRI.PROCESS_STATUS = 2
4961       AND NOT EXISTS
4962           (SELECT 'X'
4963            FROM   QA_INTERFACE_ERRORS QIE
4964            WHERE  QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID
4965              AND  QIE.ERROR_COLUMN IN ('ORGANIZATION_CODE', NULL));
4966 
4967    -- set process_status to 3 for all rows where org_code had an error.
4968    -- this prevents these rows from being looked at in the remaining
4969    -- validation steps.
4970 
4971    SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
4972          X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, X_LAST_UPDATE_LOGIN,
4973          'ORGANIZATION_CODE');
4974 
4975    -- Bug 4162206
4976    -- R12 Enabled MOAC for Quality
4977    -- get the inventory org and set the corresponding profile
4978    -- saugupta Mon, 09 May 2005 06:34:11 -0700 PDT
4979 
4980    -- Bug 4498976. Moved query for getting group inv org to cursor
4981    -- saugupta Tue, 02 Aug 2005 02:14:21 -0700 PDT
4982    open inv_org_id(X_GROUP_ID);
4983    fetch inv_org_id into x_org_id;
4984    close inv_org_id;
4985 
4986    --
4987    -- Bug 5604471
4988    -- Replaced the call to the fnd_profile.save_user API
4989    -- with fnd_profile.put
4990    -- ntungare Tue Oct 17 04:27:44 PDT 2006
4991    --
4992 
4993    -- R12 Project MOAC 4637896.  MOAC entities now initialized
4994    -- in procedure wrapper.  Here the inventory org_id is known,
4995    -- we will initialize the mfg_organization_id profile as
4996    -- needed by PJM entities which are not OU-based but
4997    -- Inv organization based.
4998    -- bso Sun Oct  2 11:51:33 PDT 2005
4999 
5000    --dummy := fnd_profile.save_user('MFG_ORGANIZATION_ID', x_org_id);
5001    fnd_profile.put('MFG_ORGANIZATION_ID', x_org_id);
5002 
5003    -- R12 Project MOAC 4637896.
5004    -- Group validation of operating unit field, which is an
5005    -- optional field.  This algorithm is slightly improved
5006    -- on the other validation algorithms such as the org code
5007    -- validation above.  This is a more direct algorithm to
5008    -- perform the validation first and then set the error
5009    -- table if validation failed.  The previous algorithm
5010    -- performs in the opposite order and is probably more
5011    -- efficient if there is a lot of errors.  This hits the
5012    -- referenced entity only once and should be more efficient
5013    -- assuming normally there is only a few errors.
5014    -- bso Sun Oct  2 16:29:30 PDT 2005
5015 
5016    UPDATE qa_results_interface qri
5017    SET    last_update_date = sysdate,
5018           last_update_login = x_last_update_login,
5019           request_id = x_request_id,
5020           program_application_id = x_program_application_id,
5021           program_id = x_program_id,
5022           program_update_date = sysdate,
5023           operating_unit_id =
5024               (SELECT ou.organization_id
5025                FROM   hr_operating_units ou
5026                WHERE  ou.name = qri.operating_unit AND
5027                       (ou.date_from IS NULL OR ou.date_from <= sysdate) AND
5028                       (ou.date_to IS NULL OR ou.date_to >= sysdate))
5029    WHERE  qri.group_id = x_group_id AND
5030           qri.process_status = 2 AND
5031           qri.operating_unit IS NOT NULL AND
5032           qri.operating_unit_id IS NULL;
5033 
5034    INSERT INTO qa_interface_errors(
5035           transaction_interface_id,
5036           error_column,
5037           error_message,
5038           last_update_date,
5039           last_updated_by,
5040           creation_date,
5041           created_by,
5042           last_update_login,
5043           request_id,
5044           program_application_id,
5045           program_id,
5046           program_update_date)
5047        SELECT qri.transaction_interface_id,
5048               'OPERATING_UNIT',
5049               ERROR_INVALID_VALUE,
5050               sysdate,
5051               x_user_id,
5052               sysdate,
5053               x_user_id,
5054               x_last_update_login,
5055               x_request_id,
5056               x_program_application_id,
5057               x_program_id,
5058               sysdate
5059        FROM   qa_results_interface qri
5060        WHERE  qri.group_id = x_group_id AND
5061               qri.process_status = 2 AND
5062               qri.operating_unit IS NOT NULL AND
5063               qri.operating_unit_id IS NULL;
5064 
5065 
5066    -- stage 2 -----------------------------------------------------------------
5067    --
5068    -- validate plan_name, spec_name
5069    ----------------------------------------------------------------------------
5070 
5071    -- group validation for plan_name
5072 
5073    INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ERROR_COLUMN,
5074                   ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
5075                   CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
5076                   REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
5077                   PROGRAM_UPDATE_DATE)
5078       SELECT QRI.TRANSACTION_INTERFACE_ID, 'PLAN_NAME',
5079              ERROR_INVALID_VALUE, SYSDATE, X_USER_ID,
5080              SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
5081              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
5082              SYSDATE
5083       FROM   QA_RESULTS_INTERFACE QRI
5084       WHERE  QRI.GROUP_ID = X_GROUP_ID
5085         AND  QRI.PROCESS_STATUS = 2
5086         AND  NOT EXISTS
5087              (SELECT 'X'
5088               FROM   QA_INTERFACE_ERRORS QIE
5089               WHERE  QIE.TRANSACTION_INTERFACE_ID =
5090                            QRI.TRANSACTION_INTERFACE_ID
5091                 AND  QIE.ERROR_COLUMN IN ('PLAN_NAME', NULL))
5092         AND  NOT EXISTS
5093              (SELECT 'X'
5094               FROM   QA_PLANS_VAL_V QPVV
5095               WHERE  QRI.PLAN_NAME = QPVV.NAME
5096                 AND  QRI.ORGANIZATION_ID = QPVV.ORGANIZATION_ID);
5097 
5098    -- group derivation for plan_id
5099 
5100    UPDATE QA_RESULTS_INTERFACE QRI
5101       SET LAST_UPDATE_DATE = SYSDATE,
5102           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
5103           REQUEST_ID = X_REQUEST_ID,
5104           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
5105           PROGRAM_ID = X_PROGRAM_ID,
5106           PROGRAM_UPDATE_DATE = SYSDATE,
5107           PLAN_ID =
5108                 (SELECT MIN(QPVV.PLAN_ID)
5109                  FROM   QA_PLANS_VAL_V QPVV
5110                  WHERE  QPVV.NAME = QRI.PLAN_NAME
5111                    AND  QPVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID)
5112     WHERE QRI.GROUP_ID = X_GROUP_ID
5113       AND QRI.PROCESS_STATUS = 2
5114       AND NOT EXISTS
5115           (SELECT 'X'
5116            FROM   QA_INTERFACE_ERRORS QIE
5117            WHERE  QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID
5118              AND  QIE.ERROR_COLUMN IN ('PLAN_NAME', NULL));
5119 
5120    -- group validation for spec_name
5121 
5122    --
5123    -- Bug 2672408.  This SQL used to have QA_SPECS_VAL_V in the
5124    -- subquery.  It uses too much shared memory.  Replaced with
5125    -- QA_SPECS and appended the effective date validation.
5126    -- bso Mon Nov 25 18:15:12 PST 2002
5127    --
5128    INSERT INTO QA_INTERFACE_ERRORS (TRANSACTION_INTERFACE_ID, ERROR_COLUMN,
5129                   ERROR_MESSAGE, LAST_UPDATE_DATE, LAST_UPDATED_BY,
5130                   CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
5131                   REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
5132                   PROGRAM_UPDATE_DATE)
5133       SELECT QRI.TRANSACTION_INTERFACE_ID, 'SPEC_NAME',
5134              ERROR_INVALID_VALUE, SYSDATE, X_USER_ID,
5135              SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
5136              X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
5137              SYSDATE
5138       FROM   QA_RESULTS_INTERFACE QRI
5139       WHERE  QRI.GROUP_ID = X_GROUP_ID
5140         AND  QRI.PROCESS_STATUS = 2
5141         AND  NOT EXISTS
5142              (SELECT 'X'
5143               FROM   QA_INTERFACE_ERRORS QIE
5144               WHERE  QIE.TRANSACTION_INTERFACE_ID =
5145                            QRI.TRANSACTION_INTERFACE_ID
5146                 AND  QIE.ERROR_COLUMN IN ('SPEC_NAME', NULL))
5147         AND  (QRI.SPEC_NAME IS NOT NULL
5148               AND NOT EXISTS
5149               (SELECT 'X'
5150                FROM   QA_SPECS QSVV
5151                WHERE  QRI.SPEC_NAME = QSVV.SPEC_NAME
5152                      AND  QRI.ORGANIZATION_ID = QSVV.ORGANIZATION_ID
5153                      AND  trunc(sysdate) BETWEEN
5154                           nvl(trunc(qsvv.effective_from), trunc(sysdate)) AND
5155                           nvl(trunc(qsvv.effective_to), trunc(sysdate))));
5156 
5157    -- group derivation for spec_id
5158 
5159    --
5160    -- Bug 2672408.  This SQL used to have QA_SPECS_VAL_V in the
5161    -- subquery.  It uses too much shared memory.  Replaced with
5162    -- QA_SPECS and appended the effective date validation.
5163    -- bso Mon Nov 25 18:15:12 PST 2002
5164    --
5165    UPDATE QA_RESULTS_INTERFACE QRI
5166       SET LAST_UPDATE_DATE = SYSDATE,
5167           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
5168           REQUEST_ID = X_REQUEST_ID,
5169           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
5170           PROGRAM_ID = X_PROGRAM_ID,
5171           PROGRAM_UPDATE_DATE = SYSDATE,
5172           SPEC_ID =
5173                 (SELECT MIN(QSVV.SPEC_ID)
5174                  FROM   QA_SPECS QSVV
5175                  WHERE  QSVV.SPEC_NAME = QRI.SPEC_NAME
5176                    AND  QSVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID
5177                      AND  trunc(sysdate) BETWEEN
5178                           nvl(trunc(qsvv.effective_from), trunc(sysdate)) AND
5179                           nvl(trunc(qsvv.effective_to), trunc(sysdate)))
5180     WHERE QRI.GROUP_ID = X_GROUP_ID
5181       AND QRI.PROCESS_STATUS = 2
5182       AND NOT EXISTS
5183           (SELECT 'X'
5184            FROM   QA_INTERFACE_ERRORS QIE
5185            WHERE  QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID
5186              AND  QIE.ERROR_COLUMN IN ('SPEC_NAME', NULL));
5187 
5188    -- set process_status to 3 for all rows where plan_name or spec_name
5189    -- had an error.  this prevents these rows from being looked at in
5190    -- the remaining validation steps.
5191 
5192    SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
5193          X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, X_LAST_UPDATE_LOGIN,
5194          'PLAN_NAME');
5195    SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
5196          X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, X_LAST_UPDATE_LOGIN,
5197          'SPEC_NAME');
5198 
5199    -- for the remaining stages, we'll need plan_id.  while we're at it,
5200    -- we can check for free to see if there are any rows left that haven't
5201    -- failed.
5202 
5203    SELECT MAX(PLAN_ID)
5204    INTO   X_PLAN_ID
5205    FROM   QA_RESULTS_INTERFACE QRI
5206    WHERE  QRI.GROUP_ID = X_GROUP_ID
5207      AND  NOT EXISTS
5208           (SELECT 'X'
5209            FROM   QA_INTERFACE_ERRORS QIE
5210            WHERE  QIE.TRANSACTION_INTERFACE_ID =
5211                         QRI.TRANSACTION_INTERFACE_ID
5212              AND  QIE.ERROR_COLUMN IN ('ORGANIZATION_CODE', 'PLAN_NAME',
5213                                        'SPEC_NAME', NULL));
5214 
5215    -- when x_plan_id is null, it indicates that every row has failed
5216    -- validation.  if this is the case, it's pointless to go through all
5217    -- the remaining validation steps.  to save time, we exit here.
5218 
5219    IF (X_PLAN_ID IS NULL) THEN
5220       SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
5221             X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, X_LAST_UPDATE_LOGIN);
5222       RETURN TRUE;
5223    END IF;
5224 
5225    -- stage 3 -----------------------------------------------------------------
5226    --
5227    -- validate line_id, comp_item_id, department_id, resource_id, quantity,
5228    -- wip_entity_id, vendor_id, receipt_num, po_header_id, customer_id,
5229    -- so_header_id, rma_header_id.
5230    -- asset_group, asset_activity - rkunchal Thu Jul 18 07:23:13 PDT 2002
5231    ----------------------------------------------------------------------------
5232 
5233    -- load in reference info for each collection element on the plan
5234 
5235 --
5236 -- See Bug 2624112
5237 -- The decimal precision for a number type collection
5238 -- element is to be configured at plan level. Hence,
5239 -- validation should also be based on plan setup.
5240 -- rkunchal Wed Oct 16 05:32:33 PDT 2002
5241 --
5242 -- Before this change, DECIMAL_PRECISION was selected from QC
5243 -- Now, DECIMAL_PRECISION is selected from QPCV
5244 --
5245 -- Tracking Bug : 3104827. Review Tracking Bug : 3148873
5246 -- Modifying to include Read Only Flag for Collection Plan Elements
5247 -- saugupta Thu Aug 28 08:59:59 PDT 2003
5248 
5249 /*
5250    I := 0;
5251    FOR CHARREC IN (SELECT QPCV.CHAR_ID, QC.DEVELOPER_NAME,
5252                    QPCV.RESULT_COLUMN_NAME, QPCV.ENABLED_FLAG,
5253                    QPCV.MANDATORY_FLAG, QC.DATATYPE, QPCV.DECIMAL_PRECISION,
5254                    QC.SQL_VALIDATION_STRING, QPCV.VALUES_EXIST_FLAG,
5255                    UPPER(REPLACE(QC.NAME, ' ', '_')) CHAR_NAME, READ_ONLY_FLAG
5256                    FROM QA_CHARS QC, QA_PLAN_CHARS_V QPCV
5257                    WHERE QPCV.PLAN_ID = X_PLAN_ID
5258                      AND QPCV.CHAR_ID = QC.CHAR_ID) LOOP
5259       I := I + 1;
5260       CHAR_ID_TABLE(I)               := CHARREC.CHAR_ID;
5261       CHAR_NAME_TABLE(I)             := CHARREC.CHAR_NAME;
5262       DEVELOPER_NAME_TABLE(I)        := CHARREC.DEVELOPER_NAME;
5263       RESULT_COLUMN_NAME_TABLE(I)    := CHARREC.RESULT_COLUMN_NAME;
5264       ENABLED_FLAG_TABLE(I)          := CHARREC.ENABLED_FLAG;
5265       MANDATORY_FLAG_TABLE(I)        := CHARREC.MANDATORY_FLAG;
5266       DATATYPE_TABLE(I)              := CHARREC.DATATYPE;
5267       DECIMAL_PRECISION_TABLE(I)     := CHARREC.DECIMAL_PRECISION;
5268       SQL_VALIDATION_STRING_TABLE(I) := CHARREC.SQL_VALIDATION_STRING;
5269       VALUES_EXIST_FLAG_TABLE(I)     := CHARREC.VALUES_EXIST_FLAG;
5270       READ_ONLY_FLAG_TABLE(I)        := CHARREC.READ_ONLY_FLAG;
5271 
5272    END LOOP;
5273    NUM_ELEMS := I;
5274 */
5275    --
5276    -- Bug 4254876
5277    -- Changed above to fetch hardcoded column.
5278    -- Also changed qpcv to qpc and make into an efficient BULK op.
5279    -- Finally, use the same replace/translate function as used in qltvcreb
5280    -- bso Tue Mar 29 15:18:00 PST 2005
5281    --
5282 
5283    -- Just added the nvl condition for decimal_precision column.
5284    -- This was done to have the select statement similar to the
5285    -- definition of qa_plan_chars_v which was used before this fix.
5286    -- Bug 4254876.suramasw
5287 
5288    SELECT
5289        qpc.char_id,
5290        upper(replace(qc.name, ' ', '_')),
5291        qc.hardcoded_column,
5292        qc.developer_name,
5293        qpc.result_column_name,
5294        qpc.enabled_flag,
5295        qpc.mandatory_flag,
5296        qc.datatype,
5297        nvl(qpc.decimal_precision,qc.decimal_precision),
5298        qc.sql_validation_string,
5299        qpc.values_exist_flag,
5300        qpc.read_only_flag
5301    BULK COLLECT INTO
5302        char_id_table,
5303        char_name_table,
5304        hardcoded_column_table,
5305        developer_name_table,
5306        result_column_name_table,
5307        enabled_flag_table,
5308        mandatory_flag_table,
5309        datatype_table,
5310        decimal_precision_table,
5311        sql_validation_string_table,
5312        values_exist_flag_table,
5313        read_only_flag_table
5314    FROM
5315        qa_chars qc,
5316        qa_plan_chars qpc
5317    WHERE
5318        qpc.plan_id = x_plan_id AND
5319        qpc.char_id = qc.char_id;
5320 
5321    NUM_ELEMS := char_id_table.count;
5322 
5323 
5324    -- Adding update capabilities.  1 = 'INSERT' and 2 = 'UPDATE';
5325    -- also everything else will be interpreted as 'INSERT'
5326    IF TYPE_OF_TXN = 2 THEN
5327         COPY_STMT_OF_ROWIDS := VALIDATE_UPDATE_TYPE_RECORDS(X_GROUP_ID,
5328 						 X_PLAN_ID,
5329 						 CHAR_NAME_TABLE,
5330 						 DEVELOPER_NAME_TABLE,
5331                                                  HARDCODED_COLUMN_TABLE,  -- Bug 4254876
5332 						 DATATYPE_TABLE,
5333 						 NUM_ELEMS,
5334 						 X_USER_ID,
5335 						 X_LAST_UPDATE_LOGIN,
5336 						 X_REQUEST_ID,
5337 						 X_PROGRAM_APPLICATION_ID,
5338 						 X_PROGRAM_ID);
5339 	STMT_OF_ROWIDS := COPY_STMT_OF_ROWIDS;
5340 
5341           -- Bug 3759926.Update transaction was failing if plan has read only or disabled elements.
5342           -- Retrieve update records was not considering this scenario.
5343           -- As part of fix, passing read only and enabled flag table as arguments to the procedure.
5344           -- srhariha. Wed Jul 14 02:15:41 PDT 2004.
5345 
5346 	IF COPY_STMT_OF_ROWIDS IS NOT NULL THEN
5347 	    RETRIEVE_UPDATE_RECORDS(X_GROUP_ID,
5348 				  COPY_STMT_OF_ROWIDS,
5349 				  DEVELOPER_NAME_TABLE,
5350 				  RESULT_COLUMN_NAME_TABLE,
5351 				  DATATYPE_TABLE,
5352 				  CHAR_NAME_TABLE,
5353 				  NUM_ELEMS,
5354 				  X_PLAN_ID,
5355                                   READ_ONLY_FLAG_TABLE,
5356                                   ENABLED_FLAG_TABLE);
5357 	ELSE
5358 	    RETURN TRUE;
5359 	END IF;
5360    END IF;
5361 
5362    -- locate each element in the collection element reference tables
5363    -- and if it is on the plan, go through the validation steps
5364 
5365    I := POSITION_IN_TABLE('PRODUCTION_LINE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5366    IF (I <> -1) THEN
5367       -- set production line to be a parent of item (used later on)
5368 
5369       -- rkaza. 02/03/2003. Bug 2777401.
5370       -- ITEM_PARENT being production_line is only used to check if production
5371       -- line is entered, if present in the plan, during the validation of item.
5372       -- This is causing the bug. We removed this dependency in forms too.
5373 
5374       -- ITEM_PARENT := 'PRODUCTION_LINE';
5375 
5376       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5377             'PRODUCTION_LINE', X_GROUP_ID, X_USER_ID,
5378             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5379             X_PROGRAM_ID, 'WIP_LINES_VAL_V WL',
5380             'QRI.PRODUCTION_LINE = WL.LINE_CODE AND ' ||
5381                   'QRI.ORGANIZATION_ID = WL.ORGANIZATION_ID',
5382             'LINE_ID = (SELECT MIN(WL.LINE_ID) ' ||
5383                   'FROM WIP_LINES_VAL_V WL ' ||
5384                   'WHERE WL.LINE_CODE = QRI.PRODUCTION_LINE ' ||
5385                   'AND WL.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5386             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5387             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5388             READ_ONLY_FLAG_TABLE(I));
5389    END IF;
5390 
5391    I := POSITION_IN_TABLE('DEPARTMENT', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5392    IF (I <> -1) THEN
5393       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5394             'DEPARTMENT', X_GROUP_ID, X_USER_ID,
5395             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5396             X_PROGRAM_ID, 'BOM_DEPARTMENTS_VAL_V BD',
5397             'QRI.DEPARTMENT = BD.DEPARTMENT_CODE AND ' ||
5398                   'QRI.ORGANIZATION_ID = BD.ORGANIZATION_ID',
5399             'DEPARTMENT_ID = (SELECT MIN(BD.DEPARTMENT_ID) ' ||
5400                   'FROM BOM_DEPARTMENTS_VAL_V BD ' ||
5401                   'WHERE BD.DEPARTMENT_CODE = QRI.DEPARTMENT ' ||
5402                   'AND BD.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5403             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5404             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5405             READ_ONLY_FLAG_TABLE(I));
5406    END IF;
5407 
5408    I := POSITION_IN_TABLE('TO_DEPARTMENT', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5409    IF (I <> -1) THEN
5410       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5411             'TO_DEPARTMENT', X_GROUP_ID, X_USER_ID,
5412             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5413             X_PROGRAM_ID, 'BOM_DEPARTMENTS_VAL_V BD',
5414             'QRI.TO_DEPARTMENT = BD.DEPARTMENT_CODE AND ' ||
5415                   'QRI.ORGANIZATION_ID = BD.ORGANIZATION_ID',
5416             'TO_DEPARTMENT_ID = (SELECT MIN(BD.DEPARTMENT_ID) ' ||
5417                   'FROM BOM_DEPARTMENTS_VAL_V BD ' ||
5418                   'WHERE BD.DEPARTMENT_CODE = QRI.TO_DEPARTMENT ' ||
5419                   'AND BD.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5420             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5421             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5422             READ_ONLY_FLAG_TABLE(I));
5423    END IF;
5424 
5425 
5426    I := POSITION_IN_TABLE('RESOURCE_CODE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5427    IF (I <> -1) THEN
5428       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5429             'RESOURCE_CODE', X_GROUP_ID, X_USER_ID,
5430             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5431             X_PROGRAM_ID, 'BOM_RESOURCES_VAL_V BR',
5432             'QRI.RESOURCE_CODE = BR.RESOURCE_CODE AND ' ||
5433                   'QRI.ORGANIZATION_ID = BR.ORGANIZATION_ID',
5434             'RESOURCE_ID = (SELECT MIN(BR.RESOURCE_ID) ' ||
5435                   'FROM BOM_RESOURCES_VAL_V BR ' ||
5436                   'WHERE BR.RESOURCE_CODE = QRI.RESOURCE_CODE ' ||
5437                   'AND BR.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5438             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5439             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5440             READ_ONLY_FLAG_TABLE(I));
5441    END IF;
5442 
5443    I := POSITION_IN_TABLE('JOB_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5444    IF (I <> -1) THEN
5445       -- Changed the below procedure call to use different FROM clause
5446       -- WIP_OPEN_DISCRETE_JOBS_VAL_V is changed to WIP_DISCRETE_JOBS_ALL_V
5447       -- See bug #2382432
5448       -- rkunchal Wed Jun  5 02:03:28 PDT 2002
5449       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5450             'JOB_NAME', X_GROUP_ID, X_USER_ID,
5451             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5452             X_PROGRAM_ID, ' WIP_DISCRETE_JOBS_ALL_V WE ',
5453             'QRI.JOB_NAME = WE.WIP_ENTITY_NAME AND ' ||
5454                   'QRI.ORGANIZATION_ID = WE.ORGANIZATION_ID',
5455             'WIP_ENTITY_ID = (SELECT MIN(WE.WIP_ENTITY_ID) ' ||
5456                   'FROM WIP_DISCRETE_JOBS_ALL_V WE ' ||
5457                   'WHERE WE.WIP_ENTITY_NAME = QRI.JOB_NAME ' ||
5458                   'AND WE.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5459             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5460             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5461             READ_ONLY_FLAG_TABLE(I));
5462    END IF;
5463 
5464    -- To fix the reopened bug 2368381
5465    -- To make importing validate Maintenance Workorders also
5466    -- rkunchal Thu Jul 18 07:23:13 PDT 2002
5467 
5468    I := POSITION_IN_TABLE('WORK_ORDER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5469    IF (I <> -1) THEN
5470       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
5471                      MANDATORY_FLAG_TABLE(I),
5472 		     'WORK_ORDER',
5473 		     X_GROUP_ID,
5474 		     X_USER_ID,
5475 		     X_LAST_UPDATE_LOGIN,
5476 		     X_REQUEST_ID,
5477 		     X_PROGRAM_APPLICATION_ID,
5478 		     X_PROGRAM_ID,
5479 		     'WIP_ENTITIES WO',
5480 		     'QRI.WORK_ORDER = WO.WIP_ENTITY_NAME AND ' || 'QRI.ORGANIZATION_ID = WO.ORGANIZATION_ID',
5481 		     'WORK_ORDER_ID = (SELECT WE.WIP_ENTITY_ID ' || 'FROM WIP_ENTITIES WE ' ||
5482 		        'WHERE WE.WIP_ENTITY_NAME = QRI.WORK_ORDER ' ||
5483 			'AND WE.ORGANIZATION_ID = QRI.ORGANIZATION_ID AND WE.ENTITY_TYPE IN (6, 7))',
5484 		     CHAR_ID_TABLE(I),
5485 		     CHAR_NAME_TABLE(I),
5486 		     DATATYPE_TABLE(I),
5487 		     DECIMAL_PRECISION_TABLE(I),
5488 		     X_PLAN_ID,
5489 		     VALUES_EXIST_FLAG_TABLE(I),
5490                      READ_ONLY_FLAG_TABLE(I));
5491    END IF;
5492 
5493    -- End of additions for Workorder part of bug 2368381
5494 
5495    I := POSITION_IN_TABLE('VENDOR_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5496    IF (I <> -1) THEN
5497       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5498             'VENDOR_NAME', X_GROUP_ID, X_USER_ID,
5499             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5500             X_PROGRAM_ID, 'PO_VENDORS PV',
5501             'QRI.VENDOR_NAME = PV'||g_period||'VENDOR_NAME', -- bug 3554899.
5502             'VENDOR_ID = (SELECT MIN(PV.VENDOR_ID) ' ||
5503                   'FROM PO_VENDORS PV ' ||
5504                   'WHERE PV.VENDOR_NAME = QRI.VENDOR_NAME)',
5505             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5506             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5507             READ_ONLY_FLAG_TABLE(I));
5508 
5509    END IF;
5510 
5511    -- R12 Project MOAC 4637896.
5512    -- Change PO Number validation to use qa_po_numbers_lov_v as
5513    -- driving table using qri.operating_unit_id as auxilliary
5514    -- validation if it exists.
5515    I := POSITION_IN_TABLE('PO_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5516    IF (I <> -1) THEN
5517       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5518             'PO_NUMBER', X_GROUP_ID, X_USER_ID,
5519             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5520             X_PROGRAM_ID, 'qa_po_numbers_lov_v PH',
5521             'QRI.PO_NUMBER = PH.SEGMENT1',
5522             'PO_HEADER_ID = (SELECT PH.PO_HEADER_ID ' ||
5523                   'FROM qa_po_numbers_lov_v ph ' ||
5524                   'WHERE ph.segment1 = qri.po_number AND ' ||
5525                         '(qri.operating_unit_id IS NULL ' ||
5526                         ' OR qri.operating_unit_id = ph.org_id) AND ' ||
5527                         'rownum = 1)',
5528             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5529             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5530    END IF;
5531 
5532    I := POSITION_IN_TABLE('PO_RELEASE_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5533    IF (I <> -1) THEN
5534       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5535             'PO_RELEASE_NUM', X_GROUP_ID, X_USER_ID,
5536             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5537             X_PROGRAM_ID, 'PO_RELEASES PR',
5538             'PR.PO_HEADER_ID = QRI.PO_HEADER_ID AND PR.RELEASE_NUM = QRI.PO_RELEASE_NUM',
5539             'PO_RELEASE_ID = (SELECT MIN(PR.PO_RELEASE_ID) ' ||
5540                   'FROM PO_RELEASES PR ' ||
5541                   'WHERE PR.PO_HEADER_ID = QRI.PO_HEADER_ID AND PR.RELEASE_NUM = QRI.PO_RELEASE_NUM)',
5542             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5543             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I) );
5544    END IF;
5545 
5546    I := POSITION_IN_TABLE('CUSTOMER_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5547    IF (I <> -1) THEN
5548       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5549             'CUSTOMER_NAME', X_GROUP_ID, X_USER_ID,
5550             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5551             X_PROGRAM_ID, 'QA_CUSTOMERS_LOV_V RC',
5552             'QRI.CUSTOMER_NAME = RC.CUSTOMER_NAME AND ' ||
5553                   'RC.STATUS = ''A'' AND ' ||
5554                   'NVL(RC.CUSTOMER_PROSPECT_CODE, ''CUSTOMER'') = ' ||
5555                         '''CUSTOMER''',
5556             'CUSTOMER_ID = (SELECT MIN(RC.CUSTOMER_ID) ' ||
5557                   'FROM QA_CUSTOMERS_LOV_V RC ' ||
5558                   'WHERE RC.CUSTOMER_NAME = QRI.CUSTOMER_NAME ' ||
5559                   'AND RC.STATUS = ''A'' AND ' ||
5560                   'NVL(RC.CUSTOMER_PROSPECT_CODE, ''CUSTOMER'') = ' ||
5561                         '''CUSTOMER'')',
5562             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5563             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5564    END IF;
5565 
5566    -- add project and task validation here
5567 /*
5568 mtl_project_v changed to pjm_projects_all_v (selects from both pjm enabled and
5569 non-pjm enabled orgs).
5570 rkaza, 11/10/2001.
5571 */
5572 
5573 --
5574 --  Bug 5249078.  Changed pjm_projects_all_v to
5575 --  pjm_projects_v for MOAC compliance.
5576 --  bso Thu Jun  1 10:46:50 PDT 2006
5577 --
5578 
5579     I := POSITION_IN_TABLE('PROJECT_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5580    IF (I <> -1) THEN
5581       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5582             'PROJECT_NUMBER', X_GROUP_ID, X_USER_ID,
5583             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5584             X_PROGRAM_ID, 'PJM_PROJECTS_V PPAV',
5585             'QRI.PROJECT_NUMBER = PPAV.PROJECT_NUMBER ',
5586             'PROJECT_ID = (SELECT MIN(PPAV.PROJECT_ID) ' ||
5587                   'FROM PJM_PROJECTS_ALL_V  PPAV ' ||
5588                   'WHERE PPAV.PROJECT_NUMBER = QRI.PROJECT_NUMBER ) ',
5589             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5590             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5591    END IF;
5592 
5593 --
5594 -- Bug 5249078.  There is no need to change the following
5595 -- pjm_projects_all_v because the dependent project no. has
5596 -- been validated by the logic above.
5597 -- bso Thu Jun  1 10:54:20 PDT 2006
5598 --
5599 
5600  I := POSITION_IN_TABLE('TASK_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5601  IF (I <> -1) THEN
5602       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5603             'TASK_NUMBER', X_GROUP_ID, X_USER_ID,
5604             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5605             X_PROGRAM_ID, 'PA_TASKS PT',
5606             'QRI.TASK_NUMBER = PT.TASK_NUMBER AND '||
5607             'QRI.PROJECT_ID = PT.PROJECT_ID ',
5608             'TASK_ID = (SELECT MIN(PT.TASK_ID) ' ||
5609                   'FROM PA_TASKS  PT  ' ||
5610                   'WHERE PT.TASK_NUMBER = QRI.TASK_NUMBER  '||
5611                   'AND PT.PROJECT_ID = ( Select MIN ( PPAV.PROJECT_ID) ' ||
5612                   'FROM PJM_PROJECTS_ALL_V PPAV  ' ||
5613                   'WHERE PPAV.PROJECT_NUMBER = QRI.PROJECT_NUMBER ) ) ' ,
5614             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5615             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
5616             NULL,'PROJECT_NUMBER' );
5617    END IF;
5618 
5619 -- R12 OPM Deviations. Bug 4345503 Start
5620   I := POSITION_IN_TABLE('PROCESS_BATCH_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5621   IF (I <> -1) THEN
5622     VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5623             'PROCESS_BATCH_NUM', X_GROUP_ID, X_USER_ID,
5624             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5625             X_PROGRAM_ID, 'GME_BATCH_HEADER GBH',
5626             'QRI.PROCESS_BATCH_NUM = GBH.BATCH_NO AND QRI.ORGANIZATION_ID = GBH.ORGANIZATION_ID ',
5627             'PROCESS_BATCH_ID = (SELECT MIN(GBH.BATCH_ID) ' ||
5628 	    'FROM GME_BATCH_HEADER GBH ' ||
5629 	    'WHERE GBH.BATCH_NO = QRI.PROCESS_BATCH_NUM AND '||
5630 	    'GBH.ORGANIZATION_ID = QRI.ORGANIZATION_ID)',
5631             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5632             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5633   END IF;
5634 
5635   I := POSITION_IN_TABLE('PROCESS_BATCHSTEP_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5636   IF (I <> -1) THEN
5637     VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5638             'PROCESS_BATCHSTEP_NUM', X_GROUP_ID, X_USER_ID,
5639             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5640             X_PROGRAM_ID, 'GME_BATCH_STEPS GBS',
5641             'QRI.PROCESS_BATCHSTEP_NUM = GBS.BATCHSTEP_NO AND QRI.PROCESS_BATCH_ID = GBS.BATCH_ID ',
5642             'PROCESS_BATCHSTEP_ID = (SELECT MIN (GBS.BATCHSTEP_ID) FROM GME_BATCH_STEPS GBS '||
5643             'WHERE GBS.BATCHSTEP_NO = QRI.PROCESS_BATCHSTEP_NUM ' ||
5644             'AND GBS.BATCH_ID = QRI.PROCESS_BATCH_ID)',
5645             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5646             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
5647             NULL,'PROCESS_BATCH_NUM');
5648   END IF;
5649 
5650   --
5651   -- bug 5343944
5652   -- Corrected the Typo where the process_operation
5653   -- was written as process_operaton due to which
5654   -- the data for this element was not getting
5655   -- collected during collection import
5656   -- ntungare Thu Sep 14 10:09:59 PDT 2006
5657   --
5658   --I := POSITION_IN_TABLE('PROCESS_OPERATON', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5659   I := POSITION_IN_TABLE('PROCESS_OPERATION', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5660      IF (I <> -1) THEN
5661        VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5662                'PROCESS_OPERATION', X_GROUP_ID, X_USER_ID,
5663                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5664                X_PROGRAM_ID, 'GMO_BATCH_STEPS_V GBSV',
5665                'QRI.PROCESS_OPERATION= GBSV.OPERATION AND '||
5666                'QRI.PROCESS_BATCH_ID = GBSV.BATCH_ID AND '||
5667                --
5668                -- bug 5343944
5669                -- the view GSBV has the column batchstep_id and
5670                -- not batch_step_id. Similarly the table QRI has
5671                -- column process_batchstep_id and not batch_step_id
5672                -- Made necessary corrections
5673                -- ntungare
5674                --
5675                -- 'QRI.BATCH_STEP_ID = GBSV.BATCH_STEP_ID ',
5676                'QRI.PROCESS_BATCHSTEP_ID = GBSV.BATCHSTEP_ID ',
5677                'PROCESS_OPERATION_ID = (SELECT MIN (GBSV.OPRN_ID) FROM '||
5678                'GMO_BATCH_STEPS_V GBSV WHERE GBSV.OPERATION = '||
5679                'QRI.PROCESS_OPERATION AND GBSV.BATCH_ID = QRI.PROCESS_BATCH_ID '||
5680                'AND GBSV.BATCHSTEP_ID = QRI.PROCESS_BATCHSTEP_ID)',
5681                CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5682                DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5683                READ_ONLY_FLAG_TABLE(I),NULL,
5684                'PROCESS_BATCH_NUM', 'PROCESS_BATCHSTEP_NUM');
5685   END IF;
5686 
5687   I := POSITION_IN_TABLE('PROCESS_ACTIVITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5688      IF (I <> -1) THEN
5689        VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5690                'PROCESS_ACTIVITY', X_GROUP_ID, X_USER_ID,
5691                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5692                X_PROGRAM_ID, 'GME_BATCH_STEP_ACTIVITIES GBSA',
5693                'QRI.PROCESS_ACTIVITY = GBSA.ACTIVITY AND '||
5694                'QRI.PROCESS_BATCH_ID = GBSA.BATCH_ID AND '||
5695                'QRI.PROCESS_BATCHSTEP_ID = GBSA.BATCHSTEP_ID ',
5696                'PROCESS_ACTIVITY_ID = (SELECT MIN (GBSA.BATCHSTEP_ACTIVITY_ID) '||
5697                'FROM GME_BATCH_STEP_ACTIVITIES GBSA WHERE GBSA.ACTIVITY = '||
5698                'QRI.PROCESS_ACTIVITY AND GBSA.BATCH_ID = QRI.PROCESS_BATCH_ID '||
5699                'AND GBSA.BATCHSTEP_ID = QRI.PROCESS_BATCHSTEP_ID)',
5700                CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5701                DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5702                READ_ONLY_FLAG_TABLE(I),NULL,
5703                'PROCESS_BATCH_NUM', 'PROCESS_BATCHSTEP_NUM');
5704   END IF;
5705 
5706   I := POSITION_IN_TABLE('PROCESS_RESOURCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5707      IF (I <> -1) THEN
5708        VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5709                'PROCESS_RESOURCE', X_GROUP_ID, X_USER_ID,
5710                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5711                X_PROGRAM_ID, 'GME_BATCH_STEP_RESOURCES GBSR',
5712                'QRI.PROCESS_RESOURCE = GBSR.RESOURCES AND QRI.PROCESS_BATCH_ID = '||
5713                'GBSR.BATCH_ID AND QRI.PROCESS_BATCHSTEP_ID = GBSR.BATCHSTEP_ID '||
5714                'AND QRI.PROCESS_ACTIVITY_ID = GBSR.BATCHSTEP_ACTIVITY_ID ',
5715                'PROCESS_RESOURCE_ID = (SELECT MIN (GBSR.BATCHSTEP_RESOURCE_ID) '||
5716                'FROM GME_BATCH_STEP_RESOURCES GBSR WHERE GBSR.RESOURCES = '||
5717                'QRI.PROCESS_RESOURCE AND GBSR.BATCH_ID = QRI.PROCESS_BATCH_ID '||
5718                'AND GBSR.BATCHSTEP_ID = QRI.PROCESS_BATCHSTEP_ID AND '||
5719                'GBSR.BATCHSTEP_ACTIVITY_ID = QRI.PROCESS_ACTIVITY_ID)',
5720                CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5721                DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5722                READ_ONLY_FLAG_TABLE(I),NULL,
5723                'PROCESS_BATCH_NUM', 'PROCESS_BATCHSTEP_NUM', 'PROCESS_ACTIVITY');
5724   END IF;
5725 
5726   I := POSITION_IN_TABLE('PROCESS_PARAMETER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5727      IF (I <> -1) THEN
5728        VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5729                'PROCESS_PARAMETER', X_GROUP_ID, X_USER_ID,
5730                X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5731                X_PROGRAM_ID, 'GMP_PROCESS_PARAMETERS GP, GME_PROCESS_PARAMETERS GE',
5732                'QRI.PROCESS_PARAMETER = GP.PARAMETER_NAME AND GP.PARAMETER_ID = '||
5733                'GE.PARAMETER_ID AND GE.BATCHSTEP_RESOURCE_ID = QRI.PROCESS_RESOURCE_ID ',
5734                'PROCESS_PARAMETER_ID = (SELECT MIN (PARAMETER_ID) FROM '||
5735                'GME_PROCESS_PARAMETERS GE WHERE '||
5736                'GE.BATCHSTEP_RESOURCE_ID = '||
5737                'QRI.PROCESS_RESOURCE_ID)',
5738                CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5739                DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I),
5740                READ_ONLY_FLAG_TABLE(I),NULL,
5741                'PROCESS_RESOURCE');
5742   END IF;
5743 -- R12 OPM Deviations. Bug 4345503 End
5744 
5745 -- added the following to include new hardcoded element Transfer license plate number
5746 -- saugupta
5747 
5748    I := POSITION_IN_TABLE('LICENSE_PLATE_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5749    IF (I <> -1) THEN
5750       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5751             'LICENSE_PLATE_NUMBER', X_GROUP_ID, X_USER_ID,
5752             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5753             X_PROGRAM_ID, 'WMS_LICENSE_PLATE_NUMBERS WLPN',
5754             'QRI.LICENSE_PLATE_NUMBER = WLPN.LICENSE_PLATE_NUMBER ',
5755             'LPN_ID = (SELECT WLPN.LPN_ID ' ||
5756                  'FROM WMS_LICENSE_PLATE_NUMBERS WLPN '||
5757                  'WHERE WLPN.LICENSE_PLATE_NUMBER = QRI.LICENSE_PLATE_NUMBER'
5758             || ' AND ROWNUM = 1) ',
5759             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5760             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5761    END IF;
5762 
5763 -- added the following to include new hardcoded element Transfer license plate number
5764 -- saugupta
5765 
5766    I := POSITION_IN_TABLE('XFR_LICENSE_PLATE_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5767    IF (I <> -1) THEN
5768       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5769             'XFR_LICENSE_PLATE_NUMBER', X_GROUP_ID, X_USER_ID,
5770             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5771             X_PROGRAM_ID, 'WMS_LICENSE_PLATE_NUMBERS WLPN1',
5772             'QRI.XFR_LICENSE_PLATE_NUMBER = WLPN1.LICENSE_PLATE_NUMBER ',
5773             'XFR_LPN_ID = (SELECT WLPN1.LPN_ID ' ||
5774                  'FROM WMS_LICENSE_PLATE_NUMBERS WLPN1 '||
5775                  'WHERE WLPN1.LICENSE_PLATE_NUMBER = QRI.XFR_LICENSE_PLATE_NUMBER'
5776             || ' AND ROWNUM = 1) ',
5777             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5778             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5779 
5780 
5781    END IF;
5782 
5783    -- validate contract number here
5784    I := POSITION_IN_TABLE('CONTRACT_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5785    IF (I <> -1) THEN
5786       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5787             'CONTRACT_NUMBER', X_GROUP_ID, X_USER_ID,
5788             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5789             X_PROGRAM_ID, 'OKE_K_HEADERS_LOV_V OKEH',
5790             'QRI.CONTRACT_NUMBER = OKEH.K_NUMBER ',
5791             'CONTRACT_ID = (SELECT OKEH.K_HEADER_ID ' ||
5792                  'FROM OKE_K_HEADERS_LOV_V OKEH '||
5793                  'WHERE OKEH.K_NUMBER = QRI.CONTRACT_NUMBER ' ||
5794 		 'AND ROWNUM = 1) ',
5795             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5796             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5797    END IF;
5798 
5799    -- validate contract line number here
5800    I := POSITION_IN_TABLE('CONTRACT_LINE_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5801    IF (I <> -1) THEN
5802       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5803             'CONTRACT_LINE_NUMBER', X_GROUP_ID, X_USER_ID,
5804             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5805             X_PROGRAM_ID, 'OKE_K_LINES_FULL_V OKEL',
5806             'QRI.CONTRACT_LINE_NUMBER = OKEL.LINE_NUMBER ',
5807             'CONTRACT_LINE_ID = (SELECT OKEL.K_LINE_ID ' ||
5808                  'FROM OKE_K_LINES_FULL_V OKEL '||
5809                  'WHERE OKEL.LINE_NUMBER = QRI.CONTRACT_LINE_NUMBER ' ||
5810 		 'AND ROWNUM = 1) ',
5811             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5812             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
5813 	    null, 'CONTRACT_NUMBER');
5814    END IF;
5815 
5816    -- validate deliverable number here
5817    I := POSITION_IN_TABLE('DELIVERABLE_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5818    IF (I <> -1) THEN
5819       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5820             'DELIVERABLE_NUMBER', X_GROUP_ID, X_USER_ID,
5821             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5822             X_PROGRAM_ID, 'OKE_K_DELIVERABLES_VL OKED',
5823             'QRI.DELIVERABLE_NUMBER = OKED.DELIVERABLE_NUM ',
5824             'DELIVERABLE_ID = (SELECT OKED.DELIVERABLE_ID ' ||
5825                  'FROM OKE_K_DELIVERABLES_VL OKED '||
5826                  'WHERE OKED.DELIVERABLE_NUM = QRI.DELIVERABLE_NUMBER ' ||
5827 		 'AND ROWNUM = 1) ',
5828             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5829             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
5830 	    null, 'CONTRACT_LINE_NUMBER', 'CONTRACT_NUMBER');
5831    END IF;
5832 
5833    -- Added to_char() for QRI.SALES_ORDER because sales order is a
5834    -- number datatype in QRI and character datatype in qa_sales_orders_lov_v.
5835    -- Bug 3624361.suramasw.
5836 
5837    I := POSITION_IN_TABLE('SALES_ORDER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5838    IF (I <> -1) THEN
5839       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5840             'SALES_ORDER', X_GROUP_ID, X_USER_ID,
5841             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5842             X_PROGRAM_ID, 'qa_sales_orders_lov_v SH',
5843             'to_char(QRI.SALES_ORDER) = SH.ORDER_NUMBER ',
5844             'SO_HEADER_ID = (select sales_order_id from qa_sales_orders_lov_v'||
5845             ' where to_char(qri.sales_order) = order_number and rownum = 1) ',
5846             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5847             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5848    END IF;
5849 
5850    I := POSITION_IN_TABLE('RMA_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5851    IF (I <> -1) THEN
5852       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5853             'RMA_NUMBER', X_GROUP_ID, X_USER_ID,
5854             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5855             X_PROGRAM_ID, 'oe_order_headers SH2',
5856             'QRI.RMA_NUMBER = SH2.ORDER_NUMBER AND ' ||
5857                   'SH2.order_category_code in (''RETURN'',''MIXED'')',
5858             'RMA_HEADER_ID = (SELECT MIN(SH2.HEADER_ID) ' ||
5859                   'FROM oe_order_headers SH2 ' ||
5860                   'WHERE SH2.ORDER_NUMBER = QRI.RMA_NUMBER ' ||
5861                   'AND SH2.order_category_code in (''RETURN'',''MIXED''))',
5862             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5863             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5864    END IF;
5865 
5866    I := POSITION_IN_TABLE('QUANTITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5867    IF (I <> -1) THEN
5868       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5869             'QUANTITY', X_GROUP_ID, X_USER_ID,
5870             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5871             X_PROGRAM_ID, NULL, NULL, NULL,
5872             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5873             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5874    END IF;
5875 
5876    I := POSITION_IN_TABLE('TRANSACTION_DATE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5877    IF (I <> -1) THEN
5878       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5879             'TRANSACTION_DATE', X_GROUP_ID, X_USER_ID,
5880             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5881             X_PROGRAM_ID, NULL, NULL, NULL,
5882             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5883             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5884    END IF;
5885 
5886    I := POSITION_IN_TABLE('DATE_OPENED', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5887    IF (I <> -1) THEN
5888       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5889             'DATE_OPENED', X_GROUP_ID, X_USER_ID,
5890             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5891             X_PROGRAM_ID, NULL, NULL, NULL,
5892             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5893             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5894    END IF;
5895 
5896    I := POSITION_IN_TABLE('DATE_CLOSED', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5897    IF (I <> -1) THEN
5898       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5899             'DATE_CLOSED', X_GROUP_ID, X_USER_ID,
5900             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5901             X_PROGRAM_ID, NULL, NULL, NULL,
5902             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5903             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5904    END IF;
5905 
5906    I := POSITION_IN_TABLE('RECEIPT_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5907    IF (I <> -1) THEN
5908       -- Bug 7491455.FP For bug 6800960
5909       -- changing the query for validation of PO Receipt number to include RMA receipts
5910       /*VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5911             'RECEIPT_NUM', X_GROUP_ID, X_USER_ID,
5912             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5913             X_PROGRAM_ID, 'RCV_RECEIPTS_ALL_V RRA',
5914             'QRI.RECEIPT_NUM = RRA.RECEIPT_NUM', NULL,
5915             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5916             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));*/
5917       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5918            'RECEIPT_NUM', X_GROUP_ID, X_USER_ID,
5919            X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5920            X_PROGRAM_ID, '(SELECT DISTINCT RCVSH.RECEIPT_NUM
5921                            FROM RCV_SHIPMENT_HEADERS RCVSH, PO_VENDORS POV, RCV_TRANSACTIONS RT
5922                            WHERE RCVSH.RECEIPT_SOURCE_CODE in (''VENDOR'',''CUSTOMER'') AND
5923                            RCVSH.VENDOR_ID = POV.VENDOR_ID(+) AND
5924                            RT.SHIPMENT_HEADER_ID = RCVSH.SHIPMENT_HEADER_ID) RRA',
5925            'QRI.RECEIPT_NUM = RRA.RECEIPT_NUM', NULL,
5926            CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5927            DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5928       -- End of bug 7491455.pdube Fri Oct 17 00:14:28 PDT 2008
5929    END IF;
5930 
5931    -- Bug 3765678. COMP_ITEM is not getting validated along
5932    -- with ITEM if it is dependent on ITEM. Commenting call
5933    -- for COMP_ITEM below and moving it to stage 4 after
5934    -- validation of ITEM has happened. This is done to ensure
5935    -- ITEM gets validates before COMP_ITEM validation gats called
5936    -- as we call same proc validate_item() for validation of
5937    -- both ITEM and COMP_ITEM.
5938    -- saugupta Fri, 16 Jul 2004 00:01:43 -0700 PDT
5939 
5940    -- I := POSITION_IN_TABLE('COMP_ITEM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5941    -- IF (I <> -1) THEN
5942    --   VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5943    --         'COMP_ITEM', X_GROUP_ID, X_USER_ID,
5944    --         X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5945    --         X_PROGRAM_ID, NULL, NULL, NULL,
5946    --         CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5947    --         DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5948    -- END IF;
5949    -- -*-
5950 
5951    -- Added for the new collection element PARTY. Bug2255344.
5952    -- kabalakr 14 Mar 02.
5953 
5954    I := POSITION_IN_TABLE('PARTY_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5955    IF (I <> -1) THEN
5956       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
5957             'PARTY_NAME', X_GROUP_ID, X_USER_ID,
5958             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
5959             X_PROGRAM_ID, 'HZ_PARTIES HP',
5960             'QRI.PARTY_NAME = HP.PARTY_NAME AND ' ||
5961                   'HP.STATUS = ''A'' AND ' ||
5962                   'PARTY_TYPE IN (''ORGANIZATION'',''PERSON'')',
5963             'PARTY_ID = (SELECT MIN(HP.PARTY_ID) ' ||
5964                   'FROM HZ_PARTIES HP ' ||
5965                   'WHERE HP.PARTY_NAME = QRI.PARTY_NAME ' ||
5966                   'AND HP.STATUS = ''A'' AND ' ||
5967                   'PARTY_TYPE IN (''ORGANIZATION'',''PERSON''))',
5968             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
5969             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
5970    END IF;
5971 
5972    -- End of the changes for the new collection element PARTY.
5973 
5974    -- Added the following two calls to VALIDATE_STEPS for
5975    -- Asset Group and Asset Activity
5976    -- To fix the reopened bug 2368381
5977    -- rkunchal Thu Jul 18 07:23:13 PDT 2002
5978 
5979    --dgupta: Start R12 EAM Integration. Bug 4345492
5980    I := POSITION_IN_TABLE('ASSET_GROUP', DEVELOPER_NAME_TABLE, NUM_ELEMS);
5981    IF (I <> -1) THEN
5982       VALIDATE_STEPS(
5983         ENABLED_FLAG_TABLE(I),
5984            MANDATORY_FLAG_TABLE(I),
5985            'ASSET_GROUP',
5986            X_GROUP_ID,
5987            X_USER_ID,
5988            X_LAST_UPDATE_LOGIN,
5989            X_REQUEST_ID,
5990            X_PROGRAM_APPLICATION_ID,
5991            X_PROGRAM_ID,
5992            'mtl_system_items_b_kfv msikfv, mtl_parameters mp',
5993            'qri.asset_group = msikfv.concatenated_segments' ||
5994            ' and msikfv.organization_id = mp.organization_id' ||
5995            ' and msikfv.eam_item_type in (1,3) ' ||
5996            ' and mp.maint_organization_id = qri.organization_id',
5997            'qri.asset_group_id = (SELECT msikfv.inventory_item_id ' ||
5998            ' FROM mtl_system_items_b_kfv msikfv ' ||
5999            ' WHERE msikfv.concatenated_segments = qri.asset_group ' ||
6000            ' and rownum=1)', --multiple identical ids may belong to same asset group
6001            CHAR_ID_TABLE(I),
6002            CHAR_NAME_TABLE(I),
6003            DATATYPE_TABLE(I),
6004            DECIMAL_PRECISION_TABLE(I),
6005            X_PLAN_ID,
6006            VALUES_EXIST_FLAG_TABLE(I),
6007            READ_ONLY_FLAG_TABLE(I));
6008    END IF;
6009    --dgupta: End R12 EAM Integration. Bug 4345492
6010 
6011    I := POSITION_IN_TABLE('ASSET_ACTIVITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6012    IF (I <> -1) THEN
6013       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6014                      MANDATORY_FLAG_TABLE(I),
6015 		     'ASSET_ACTIVITY',
6016 		     X_GROUP_ID,
6017 		     X_USER_ID,
6018 		     X_LAST_UPDATE_LOGIN,
6019 		     X_REQUEST_ID,
6020 		     X_PROGRAM_APPLICATION_ID,
6021 		     X_PROGRAM_ID,
6022 		     NULL,
6023 		     NULL,
6024 		     NULL,
6025 		     CHAR_ID_TABLE(I),
6026 		     CHAR_NAME_TABLE(I),
6027 		     DATATYPE_TABLE(I),
6028 		     DECIMAL_PRECISION_TABLE(I),
6029 		     X_PLAN_ID,
6030 		     VALUES_EXIST_FLAG_TABLE(I),
6031 		     READ_ONLY_FLAG_TABLE(I),
6032 		     NULL,
6033 		     NULL);
6034    END IF;
6035 /* R12 DR Integration. Bug 4345489 Start */
6036 
6037    -- Bug 5144730. Corrected validate statements for
6038    -- Repair  Order  Number and Service  Task  Number
6039    -- saugupta Mon, 10 Apr 2006 03:31:26 -0700 PDT
6040    I := POSITION_IN_TABLE('REPAIR_ORDER_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6041    IF (I <> -1) THEN
6042       VALIDATE_STEPS(
6043         ENABLED_FLAG_TABLE(I),
6044            MANDATORY_FLAG_TABLE(I),
6045            'REPAIR_ORDER_NUMBER',
6046            X_GROUP_ID,
6047            X_USER_ID,
6048            X_LAST_UPDATE_LOGIN,
6049            X_REQUEST_ID,
6050            X_PROGRAM_APPLICATION_ID,
6051            X_PROGRAM_ID,
6052            'csd_repairs CR',
6053            'qri.repair_order_number = CR.repair_number',
6054            'repair_line_id = (SELECT cr.repair_line_id
6055               FROM csd_repairs CR
6056               WHERE cr.repair_number = qri.repair_order_number
6057 		    AND cr.status not in (''C'', ''H''))',
6058            CHAR_ID_TABLE(I),
6059            CHAR_NAME_TABLE(I),
6060            DATATYPE_TABLE(I),
6061            DECIMAL_PRECISION_TABLE(I),
6062            X_PLAN_ID,
6063            VALUES_EXIST_FLAG_TABLE(I),
6064            READ_ONLY_FLAG_TABLE(I));
6065    END IF;
6066 
6067 
6068    I := POSITION_IN_TABLE('JTF_TASK_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6069    IF (I <> -1) THEN
6070       VALIDATE_STEPS(
6071         ENABLED_FLAG_TABLE(I),
6072            MANDATORY_FLAG_TABLE(I),
6073            'JTF_TASK_NUMBER',
6074            X_GROUP_ID,
6075            X_USER_ID,
6076            X_LAST_UPDATE_LOGIN,
6077            X_REQUEST_ID,
6078            X_PROGRAM_APPLICATION_ID,
6079            X_PROGRAM_ID,
6080            'jtf_tasks_vl jtv',
6081            'qri.jtf_task_number = jtv.task_number',
6082            'jtf_task_id = (SELECT jtv.task_id
6083               FROM jtf_tasks_vl jtv
6084               WHERE jtv.task_number = qri.jtf_task_number)',
6085            CHAR_ID_TABLE(I),
6086            CHAR_NAME_TABLE(I),
6087            DATATYPE_TABLE(I),
6088            DECIMAL_PRECISION_TABLE(I),
6089            X_PLAN_ID,
6090            VALUES_EXIST_FLAG_TABLE(I),
6091            READ_ONLY_FLAG_TABLE(I));
6092    END IF;
6093    /* R12 DR Integration. Bug 4345489 End */
6094 -- added the following to include new hardcoded element followup activity
6095 -- saugupta
6096 
6097    I := POSITION_IN_TABLE('FOLLOWUP_ACTIVITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6098    IF (I <> -1) THEN
6099 
6100       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6101                      MANDATORY_FLAG_TABLE(I),
6102 		     'FOLLOWUP_ACTIVITY',
6103 		     X_GROUP_ID,
6104 		     X_USER_ID,
6105 		     X_LAST_UPDATE_LOGIN,
6106 		     X_REQUEST_ID,
6107 		     X_PROGRAM_APPLICATION_ID,
6108 		     X_PROGRAM_ID,
6109 		     NULL,
6110 		     NULL,
6111 		     NULL,
6112 		     CHAR_ID_TABLE(I),
6113 		     CHAR_NAME_TABLE(I),
6114 		     DATATYPE_TABLE(I),
6115 		     DECIMAL_PRECISION_TABLE(I),
6116 		     X_PLAN_ID,
6117 		     VALUES_EXIST_FLAG_TABLE(I),
6118 		     READ_ONLY_FLAG_TABLE(I),
6119 		     NULL,
6120 		     NULL);
6121 
6122    END IF;
6123 
6124    -- End of additions for bug 2368381
6125 
6126    --dgupta: Start R12 EAM Integration. Bug 4345492
6127    I := POSITION_IN_TABLE('ASSET_INSTANCE_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6128    IF (I <> -1) THEN
6129       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6130                      MANDATORY_FLAG_TABLE(I),
6131                      'ASSET_INSTANCE_NUMBER',
6132                      X_GROUP_ID,
6133                      X_USER_ID,
6134                      X_LAST_UPDATE_LOGIN,
6135                      X_REQUEST_ID,
6136                      X_PROGRAM_APPLICATION_ID,
6137                      X_PROGRAM_ID,
6138                      'csi_item_instances cii ',
6139                      'qri.asset_instance_number = cii.instance_number ',
6140                      'qri.asset_instance_id = (SELECT cii.instance_id FROM ' ||
6141                         'csi_item_instances cii' ||
6142 		                    ' WHERE cii.instance_number = qri.asset_instance_number)',
6143                      CHAR_ID_TABLE(I),
6144                      CHAR_NAME_TABLE(I),
6145                      DATATYPE_TABLE(I),
6146                      DECIMAL_PRECISION_TABLE(I),
6147                      X_PLAN_ID,
6148                      VALUES_EXIST_FLAG_TABLE(I),
6149 		                 READ_ONLY_FLAG_TABLE(I));
6150    END IF;
6151    --dgupta: End R12 EAM Integration. Bug 4345492
6152 
6153    I := POSITION_IN_TABLE('BILL_REFERENCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6154    IF (I <> -1) THEN
6155       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6156                      MANDATORY_FLAG_TABLE(I),
6157                      'BILL_REFERENCE',
6158                      X_GROUP_ID,
6159                      X_USER_ID,
6160                      X_LAST_UPDATE_LOGIN,
6161                      X_REQUEST_ID,
6162                      X_PROGRAM_APPLICATION_ID,
6163                      X_PROGRAM_ID,
6164                      NULL,
6165                      NULL,
6166                      NULL,
6167                      CHAR_ID_TABLE(I),
6168                      CHAR_NAME_TABLE(I),
6169                      DATATYPE_TABLE(I),
6170                      DECIMAL_PRECISION_TABLE(I),
6171                      X_PLAN_ID,
6172                      VALUES_EXIST_FLAG_TABLE(I),
6173                      READ_ONLY_FLAG_TABLE(I),
6174 		     NULL,
6175                      NULL);
6176    END IF;
6177 
6178 
6179    I := POSITION_IN_TABLE('ROUTING_REFERENCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6180    IF (I <> -1) THEN
6181 
6182       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6183                      MANDATORY_FLAG_TABLE(I),
6184                      'ROUTING_REFERENCE',
6185                      X_GROUP_ID,
6186                      X_USER_ID,
6187                      X_LAST_UPDATE_LOGIN,
6188                      X_REQUEST_ID,
6189                      X_PROGRAM_APPLICATION_ID,
6190                      X_PROGRAM_ID,
6191                      NULL,
6192                      NULL,
6193                      NULL,
6194                      CHAR_ID_TABLE(I),
6195                      CHAR_NAME_TABLE(I),
6196                      DATATYPE_TABLE(I),
6197                      DECIMAL_PRECISION_TABLE(I),
6198                      X_PLAN_ID,
6199                      VALUES_EXIST_FLAG_TABLE(I),
6200 		     READ_ONLY_FLAG_TABLE(I),
6201                      NULL,
6202                      NULL);
6203    END IF;
6204 
6205    --
6206    -- Included the following calls to VALIDATE_STEPS for
6207    -- newly added collection elements for ASO project
6208    -- rkunchal Thu Jul 25 01:43:48 PDT 2002
6209    --
6210 
6211    -- msg('For item_intance..');
6212    I := POSITION_IN_TABLE('ITEM_INSTANCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6213    IF (I <> -1) THEN
6214       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6215                      MANDATORY_FLAG_TABLE(I),
6216                      'ITEM_INSTANCE',
6217                      X_GROUP_ID,
6218                      X_USER_ID,
6219                      X_LAST_UPDATE_LOGIN,
6220                      X_REQUEST_ID,
6221                      X_PROGRAM_APPLICATION_ID,
6222                      X_PROGRAM_ID,
6223                      'qa_csi_item_instances cii',
6224                      'qri.item_instance = cii.instance_number',
6225                      'csi_instance_id = (SELECT cii.instance_id FROM ' ||
6226                        'qa_csi_item_instances cii, mtl_system_items_kfv msik ' ||
6227 		       'WHERE cii.inventory_item_id = msik.inventory_item_id AND ' ||
6228 		       'cii.last_vld_organization_id = msik.organization_id AND ' ||
6229 		       'cii.instance_number = qri.item_instance)',
6230                      CHAR_ID_TABLE(I),
6231                      CHAR_NAME_TABLE(I),
6232                      DATATYPE_TABLE(I),
6233                      DECIMAL_PRECISION_TABLE(I),
6234                      X_PLAN_ID,
6235                      VALUES_EXIST_FLAG_TABLE(I),
6236 		     READ_ONLY_FLAG_TABLE(I));
6237    END IF;
6238 
6239    -- msg('For counter_name...');
6240    I := POSITION_IN_TABLE('COUNTER_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6241    IF (I <> -1) THEN
6242       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6243                      MANDATORY_FLAG_TABLE(I),
6244                      'COUNTER_NAME',
6245                      X_GROUP_ID,
6246                      X_USER_ID,
6247                      X_LAST_UPDATE_LOGIN,
6248                      X_REQUEST_ID,
6249                      X_PROGRAM_APPLICATION_ID,
6250                      X_PROGRAM_ID,
6251                      'cs_counters cc',
6252                      'qri.counter_name = cc.name',
6253                      'counter_id = (SELECT cc.counter_id FROM ' ||
6254                        'cs_counters cc, cs_counter_groups ccg WHERE ' ||
6255 		       'cc.counter_group_id = ccg.counter_group_id AND ' ||
6256 		       'ccg.template_flag = ''N'' AND cc.name = qri.counter_name)',
6257                      CHAR_ID_TABLE(I),
6258                      CHAR_NAME_TABLE(I),
6259                      DATATYPE_TABLE(I),
6260                      DECIMAL_PRECISION_TABLE(I),
6261                      X_PLAN_ID,
6262                      VALUES_EXIST_FLAG_TABLE(I),
6263 		     READ_ONLY_FLAG_TABLE(I));
6264    END IF;
6265 
6266    -- msg('for maintenance_requirement...');
6267    I := POSITION_IN_TABLE('MAINTENANCE_REQUIREMENT', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6268    IF (I <> -1) THEN
6269       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6270                      MANDATORY_FLAG_TABLE(I),
6271                      'MAINTENANCE_REQUIREMENT',
6272                      X_GROUP_ID,
6273                      X_USER_ID,
6274                      X_LAST_UPDATE_LOGIN,
6275                      X_REQUEST_ID,
6276                      X_PROGRAM_APPLICATION_ID,
6277                      X_PROGRAM_ID,
6278                      'qa_ahl_mr amr',
6279                      'qri.maintenance_requirement = amr.title AND qri.version_number = amr.version_number',
6280                      'ahl_mr_id = (SELECT amr.mr_header_id FROM ' ||
6281                        'qa_ahl_mr amr WHERE qri.maintenance_requirement = amr.title ' ||
6282 		       'AND qri.version_number = amr.version_number)',
6283                      CHAR_ID_TABLE(I),
6284                      CHAR_NAME_TABLE(I),
6285                      DATATYPE_TABLE(I),
6286                      DECIMAL_PRECISION_TABLE(I),
6287                      X_PLAN_ID,
6288                      VALUES_EXIST_FLAG_TABLE(I),
6289 		     READ_ONLY_FLAG_TABLE(I));
6290    END IF;
6291 
6292    -- msg('For service_request...');
6293    I := POSITION_IN_TABLE('SERVICE_REQUEST', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6294    IF (I <> -1) THEN
6295       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6296                      MANDATORY_FLAG_TABLE(I),
6297                      'SERVICE_REQUEST',
6298                      X_GROUP_ID,
6299                      X_USER_ID,
6300                      X_LAST_UPDATE_LOGIN,
6301                      X_REQUEST_ID,
6302                      X_PROGRAM_APPLICATION_ID,
6303                      X_PROGRAM_ID,
6304                      'cs_incidents ci',
6305                      'qri.service_request = ci.incident_number',
6306                      'cs_incident_id = (SELECT ci.incident_id FROM ' ||
6307                        'cs_incidents ci WHERE ' ||
6308                        'ci.incident_number = qri.service_request)',
6309                      CHAR_ID_TABLE(I),
6310                      CHAR_NAME_TABLE(I),
6311                      DATATYPE_TABLE(I),
6312                      DECIMAL_PRECISION_TABLE(I),
6313                      X_PLAN_ID,
6314                      VALUES_EXIST_FLAG_TABLE(I),
6315 		     READ_ONLY_FLAG_TABLE(I));
6316    END IF;
6317 
6318    -- msg('For rework_job...');
6319    I := POSITION_IN_TABLE('REWORK_JOB', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6320    IF (I <> -1) THEN
6321       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6322                      MANDATORY_FLAG_TABLE(I),
6323                      'REWORK_JOB',
6324                      X_GROUP_ID,
6325                      X_USER_ID,
6326                      X_LAST_UPDATE_LOGIN,
6327                      X_REQUEST_ID,
6328                      X_PROGRAM_APPLICATION_ID,
6329                      X_PROGRAM_ID,
6330                      'wip_discrete_jobs_all_v we2',
6331                      'qri.rework_job = we2.wip_entity_name AND ' ||
6332                        'qri.organization_id = we2.organization_id',
6333                      'wip_rework_id = (SELECT we2.wip_entity_id FROM ' ||
6334                        'wip_discrete_jobs_all_v we2 WHERE ' ||
6335                        'qri.rework_job = we2.wip_entity_name ' ||
6336                        'AND qri.organization_id = we2.organization_id)',
6337                      CHAR_ID_TABLE(I),
6338                      CHAR_NAME_TABLE(I),
6339                      DATATYPE_TABLE(I),
6340                      DECIMAL_PRECISION_TABLE(I),
6341                      X_PLAN_ID,
6342                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
6343    END IF;
6344 
6345    -- msg('for Disposition_source...');
6346    I := POSITION_IN_TABLE('DISPOSITION_SOURCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6347    IF (I <> -1) THEN
6348       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6349                      MANDATORY_FLAG_TABLE(I),
6350                      'DISPOSITION_SOURCE',
6351                      X_GROUP_ID,
6352                      X_USER_ID,
6353                      X_LAST_UPDATE_LOGIN,
6354                      X_REQUEST_ID,
6355                      X_PROGRAM_APPLICATION_ID,
6356                      X_PROGRAM_ID,
6357                      NULL,
6358                      NULL,
6359                      NULL,
6360                      CHAR_ID_TABLE(I),
6361                      CHAR_NAME_TABLE(I),
6362                      DATATYPE_TABLE(I),
6363                      DECIMAL_PRECISION_TABLE(I),
6364                      X_PLAN_ID,
6365                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6366                      SQL_VALIDATION_STRING_TABLE(I));
6367    END IF;
6368 
6369    -- msg('For disposition...');
6370    I := POSITION_IN_TABLE('DISPOSITION', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6371    IF (I <> -1) THEN
6372       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6373                      MANDATORY_FLAG_TABLE(I),
6374                      'DISPOSITION',
6375                      X_GROUP_ID,
6376                      X_USER_ID,
6377                      X_LAST_UPDATE_LOGIN,
6378                      X_REQUEST_ID,
6379                      X_PROGRAM_APPLICATION_ID,
6380                      X_PROGRAM_ID,
6381                      NULL,
6382                      NULL,
6383                      NULL,
6384                      CHAR_ID_TABLE(I),
6385                      CHAR_NAME_TABLE(I),
6386                      DATATYPE_TABLE(I),
6387                      DECIMAL_PRECISION_TABLE(I),
6388                      X_PLAN_ID,
6389                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6390                      SQL_VALIDATION_STRING_TABLE(I));
6391    END IF;
6392 
6393    -- msg('For disposition_action...');
6394    I := POSITION_IN_TABLE('DISPOSITION_ACTION', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6395    IF (I <> -1) THEN
6396       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6397                      MANDATORY_FLAG_TABLE(I),
6398                      'DISPOSITION_ACTION',
6399                      X_GROUP_ID,
6400                      X_USER_ID,
6401                      X_LAST_UPDATE_LOGIN,
6402                      X_REQUEST_ID,
6403                      X_PROGRAM_APPLICATION_ID,
6404                      X_PROGRAM_ID,
6405                      NULL,
6406                      NULL,
6407                      NULL,
6408                      CHAR_ID_TABLE(I),
6409                      CHAR_NAME_TABLE(I),
6410                      DATATYPE_TABLE(I),
6411                      DECIMAL_PRECISION_TABLE(I),
6412                      X_PLAN_ID,
6413                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6414                      SQL_VALIDATION_STRING_TABLE(I));
6415    END IF;
6416 
6417    -- msg('for Disposition_status...');
6418    I := POSITION_IN_TABLE('DISPOSITION_STATUS', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6419    IF (I <> -1) THEN
6420       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6421                      MANDATORY_FLAG_TABLE(I),
6422                      'DISPOSITION_STATUS',
6423                      X_GROUP_ID,
6424                      X_USER_ID,
6425                      X_LAST_UPDATE_LOGIN,
6426                      X_REQUEST_ID,
6427                      X_PROGRAM_APPLICATION_ID,
6428                      X_PROGRAM_ID,
6429                      NULL,
6430                      NULL,
6431                      NULL,
6432                      CHAR_ID_TABLE(I),
6433                      CHAR_NAME_TABLE(I),
6434                      DATATYPE_TABLE(I),
6435                      DECIMAL_PRECISION_TABLE(I),
6436                      X_PLAN_ID,
6437                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6438                      SQL_VALIDATION_STRING_TABLE(I));
6439    END IF;
6440 
6441    --
6442    -- End of inclusions for ASO project
6443    -- rkunchal Thu Jul 25 01:43:48 PDT 2002
6444    --
6445 
6446 -- Start of inclusions for NCM Hardcode Elements.
6447 -- suramasw Thu Oct 31 10:48:59 PST 2002.
6448 -- Bug 2449067.
6449 
6450 
6451    I := POSITION_IN_TABLE('NONCONFORMANCE_SOURCE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6452    IF (I <> -1) THEN
6453       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6454                      MANDATORY_FLAG_TABLE(I),
6455                      'NONCONFORMANCE_SOURCE',
6456                      X_GROUP_ID,
6457                      X_USER_ID,
6458                      X_LAST_UPDATE_LOGIN,
6459                      X_REQUEST_ID,
6460                      X_PROGRAM_APPLICATION_ID,
6461                      X_PROGRAM_ID,
6462                      NULL,
6463                      NULL,
6464                      NULL,
6465                      CHAR_ID_TABLE(I),
6466                      CHAR_NAME_TABLE(I),
6467                      DATATYPE_TABLE(I),
6468                      DECIMAL_PRECISION_TABLE(I),
6469                      X_PLAN_ID,
6470                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6471                      SQL_VALIDATION_STRING_TABLE(I));
6472    END IF;
6473 
6474    I := POSITION_IN_TABLE('NONCONFORM_SEVERITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6475    IF (I <> -1) THEN
6476       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6477                      MANDATORY_FLAG_TABLE(I),
6478                      'NONCONFORM_SEVERITY',
6479                      X_GROUP_ID,
6480                      X_USER_ID,
6481                      X_LAST_UPDATE_LOGIN,
6482                      X_REQUEST_ID,
6483                      X_PROGRAM_APPLICATION_ID,
6484                      X_PROGRAM_ID,
6485                      NULL,
6486                      NULL,
6487                      NULL,
6488                      CHAR_ID_TABLE(I),
6489                      CHAR_NAME_TABLE(I),
6490                      DATATYPE_TABLE(I),
6491                      DECIMAL_PRECISION_TABLE(I),
6492                      X_PLAN_ID,
6493                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6494                      SQL_VALIDATION_STRING_TABLE(I));
6495    END IF;
6496 
6497    I := POSITION_IN_TABLE('NONCONFORM_PRIORITY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6498    IF (I <> -1) THEN
6499       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6500                      MANDATORY_FLAG_TABLE(I),
6501                      'NONCONFORM_PRIORITY',
6502                      X_GROUP_ID,
6503                      X_USER_ID,
6504                      X_LAST_UPDATE_LOGIN,
6505                      X_REQUEST_ID,
6506                      X_PROGRAM_APPLICATION_ID,
6507                      X_PROGRAM_ID,
6508                      NULL,
6509                      NULL,
6510                      NULL,
6511                      CHAR_ID_TABLE(I),
6512                      CHAR_NAME_TABLE(I),
6513                      DATATYPE_TABLE(I),
6514                      DECIMAL_PRECISION_TABLE(I),
6515                      X_PLAN_ID,
6516                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6517                      SQL_VALIDATION_STRING_TABLE(I));
6518    END IF;
6519 
6520    I := POSITION_IN_TABLE('NONCONFORMANCE_TYPE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6521    IF (I <> -1) THEN
6522       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6523                      MANDATORY_FLAG_TABLE(I),
6524                      'NONCONFORMANCE_TYPE',
6525                      X_GROUP_ID,
6526                      X_USER_ID,
6527                      X_LAST_UPDATE_LOGIN,
6528                      X_REQUEST_ID,
6529                      X_PROGRAM_APPLICATION_ID,
6530                      X_PROGRAM_ID,
6531                      NULL,
6532                      NULL,
6533                      NULL,
6534                      CHAR_ID_TABLE(I),
6535                      CHAR_NAME_TABLE(I),
6536                      DATATYPE_TABLE(I),
6537                      DECIMAL_PRECISION_TABLE(I),
6538                      X_PLAN_ID,
6539                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6540                      SQL_VALIDATION_STRING_TABLE(I));
6541    END IF;
6542 
6543    I := POSITION_IN_TABLE('NONCONFORMANCE_STATUS', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6544    IF (I <> -1) THEN
6545       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6546                      MANDATORY_FLAG_TABLE(I),
6547                      'NONCONFORMANCE_STATUS',
6548                      X_GROUP_ID,
6549                      X_USER_ID,
6550                      X_LAST_UPDATE_LOGIN,
6551                      X_REQUEST_ID,
6552                      X_PROGRAM_APPLICATION_ID,
6553                      X_PROGRAM_ID,
6554                      NULL,
6555                      NULL,
6556                      NULL,
6557                      CHAR_ID_TABLE(I),
6558                      CHAR_NAME_TABLE(I),
6559                      DATATYPE_TABLE(I),
6560                      DECIMAL_PRECISION_TABLE(I),
6561                      X_PLAN_ID,
6562                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6563                      SQL_VALIDATION_STRING_TABLE(I));
6564    END IF;
6565 
6566    --
6567    -- Bug 4425863
6568    -- Added the lookup for the element Nonconformance_Code so that if it is
6569    -- present in the plan then its validated
6570    -- ntungare Fri Dec 16 03:08:08 PST 2005
6571    --
6572    I := POSITION_IN_TABLE('NONCONFORMANCE_CODE', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6573    IF (I <> -1) THEN
6574       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6575                      MANDATORY_FLAG_TABLE(I),
6576                      'NONCONFORMANCE_CODE',
6577                      X_GROUP_ID,
6578                      X_USER_ID,
6579                      X_LAST_UPDATE_LOGIN,
6580                      X_REQUEST_ID,
6581                      X_PROGRAM_APPLICATION_ID,
6582                      X_PROGRAM_ID,
6583                      NULL,
6584                      NULL,
6585                      NULL,
6586                      CHAR_ID_TABLE(I),
6587                      CHAR_NAME_TABLE(I),
6588                      DATATYPE_TABLE(I),
6589                      DECIMAL_PRECISION_TABLE(I),
6590                      X_PLAN_ID,
6591                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6592                      SQL_VALIDATION_STRING_TABLE(I));
6593    END IF;
6594 
6595 -- End of inclusions for NCM Hardcode Elements.
6596 
6597    -- anagarwa Thu Nov 14 13:31:42 PST 2002
6598    -- Start inclusions for CAR Hardcoded Elements
6599 
6600    I := POSITION_IN_TABLE('REQUEST_SOURCE', DEVELOPER_NAME_TABLE, NUM_ELEMS
6601 );
6602    IF (I <> -1) THEN
6603       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6604                      MANDATORY_FLAG_TABLE(I),
6605                      'REQUEST_SOURCE',
6606                      X_GROUP_ID,
6607                      X_USER_ID,
6608                      X_LAST_UPDATE_LOGIN,
6609                      X_REQUEST_ID,
6610                      X_PROGRAM_APPLICATION_ID,
6611                      X_PROGRAM_ID,
6612                      NULL,
6613                      NULL,
6614                      NULL,
6615                      CHAR_ID_TABLE(I),
6616                      CHAR_NAME_TABLE(I),
6617                      DATATYPE_TABLE(I),
6618                      DECIMAL_PRECISION_TABLE(I),
6619                      X_PLAN_ID,
6620                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6621                      SQL_VALIDATION_STRING_TABLE(I));
6622    END IF;
6623 
6624    I := POSITION_IN_TABLE('REQUEST_PRIORITY', DEVELOPER_NAME_TABLE, NUM_ELEMS
6625 );
6626    IF (I <> -1) THEN
6627       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6628                      MANDATORY_FLAG_TABLE(I),
6629                      'REQUEST_PRIORITY',
6630                      X_GROUP_ID,
6631                      X_USER_ID,
6632                      X_LAST_UPDATE_LOGIN,
6633                      X_REQUEST_ID,
6634                      X_PROGRAM_APPLICATION_ID,
6635                      X_PROGRAM_ID,
6636                      NULL,
6637                      NULL,
6638                      NULL,
6639                      CHAR_ID_TABLE(I),
6640                      CHAR_NAME_TABLE(I),
6641                      DATATYPE_TABLE(I),
6642                      DECIMAL_PRECISION_TABLE(I),
6643                      X_PLAN_ID,
6644                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6645                      SQL_VALIDATION_STRING_TABLE(I));
6646    END IF;
6647 
6648    I := POSITION_IN_TABLE('REQUEST_SEVERITY', DEVELOPER_NAME_TABLE, NUM_ELEMS
6649 );
6650    IF (I <> -1) THEN
6651       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6652                      MANDATORY_FLAG_TABLE(I),
6653                      'REQUEST_SEVERITY',
6654                      X_GROUP_ID,
6655                      X_USER_ID,
6656                      X_LAST_UPDATE_LOGIN,
6657                      X_REQUEST_ID,
6658                      X_PROGRAM_APPLICATION_ID,
6659                      X_PROGRAM_ID,
6660                      NULL,
6661                      NULL,
6662                      NULL,
6663                      CHAR_ID_TABLE(I),
6664                      CHAR_NAME_TABLE(I),
6665                      DATATYPE_TABLE(I),
6666                      DECIMAL_PRECISION_TABLE(I),
6667                      X_PLAN_ID,
6668                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6669                      SQL_VALIDATION_STRING_TABLE(I));
6670    END IF;
6671 
6672    I := POSITION_IN_TABLE('REQUEST_STATUS', DEVELOPER_NAME_TABLE, NUM_ELEMS
6673 );
6674    IF (I <> -1) THEN
6675       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6676                      MANDATORY_FLAG_TABLE(I),
6677                      'REQUEST_STATUS',
6678                      X_GROUP_ID,
6679                      X_USER_ID,
6680                      X_LAST_UPDATE_LOGIN,
6681                      X_REQUEST_ID,
6682                      X_PROGRAM_APPLICATION_ID,
6683                      X_PROGRAM_ID,
6684                      NULL,
6685                      NULL,
6686                      NULL,
6687                      CHAR_ID_TABLE(I),
6688                      CHAR_NAME_TABLE(I),
6689                      DATATYPE_TABLE(I),
6690                      DECIMAL_PRECISION_TABLE(I),
6691                      X_PLAN_ID,
6692                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6693                      SQL_VALIDATION_STRING_TABLE(I));
6694    END IF;
6695 
6696    I := POSITION_IN_TABLE('ECO_NAME', DEVELOPER_NAME_TABLE, NUM_ELEMS
6697 );
6698    IF (I <> -1) THEN
6699       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
6700                      MANDATORY_FLAG_TABLE(I),
6701                      'ECO_NAME',
6702                      X_GROUP_ID,
6703                      X_USER_ID,
6704                      X_LAST_UPDATE_LOGIN,
6705                      X_REQUEST_ID,
6706                      X_PROGRAM_APPLICATION_ID,
6707                      X_PROGRAM_ID,
6708                      NULL,
6709                      NULL,
6710                      NULL,
6711                      CHAR_ID_TABLE(I),
6712                      CHAR_NAME_TABLE(I),
6713                      DATATYPE_TABLE(I),
6714                      DECIMAL_PRECISION_TABLE(I),
6715                      X_PLAN_ID,
6716                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6717                      SQL_VALIDATION_STRING_TABLE(I));
6718    END IF;
6719 
6720 -- End of inclusions for CAR Hardcode Elements.
6721 
6722 
6723    FOR J IN 1..QLTNINRB.RES_CHAR_COLUMNS LOOP
6724       I := POSITION_IN_TABLE('CHARACTER' || TO_CHAR(J),
6725             RESULT_COLUMN_NAME_TABLE, NUM_ELEMS);
6726       IF (I <> -1) THEN
6727          IF (NVL(DEVELOPER_NAME_TABLE(I), 'X')
6728                NOT IN ('FROM_INTRAOPERATION_STEP',
6729                'TO_INTRAOPERATION_STEP','Bom_Revision','routing_revision')) THEN
6730             VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6731                   'CHARACTER' || TO_CHAR(J), X_GROUP_ID, X_USER_ID,
6732                   X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6733                   X_PROGRAM_ID, NULL, NULL, NULL,
6734                   CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6735                   DECIMAL_PRECISION_TABLE(I), X_PLAN_ID,
6736                   VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6737                   SQL_VALIDATION_STRING_TABLE(I));
6738          END IF;
6739       END IF;
6740    END LOOP;
6741 
6742    -- For Sequence Project. Call Derive_sequence for all the enabled
6743    -- Sequence Collection elements in the plan.
6744    -- kabalakr 15 JAN 2002.
6745 
6746    FOR J IN 1..QA_SEQUENCE_API.MAX_SEQUENCE LOOP
6747       I := POSITION_IN_TABLE('SEQUENCE'||to_char(j),
6748             RESULT_COLUMN_NAME_TABLE, NUM_ELEMS);
6749       IF (I <> -1) THEN
6750          -- Bug 3069404 ksoh Tue Mar 16 10:43:36 PST 2004
6751          -- sequence element is really read-only
6752          -- should check if the user is trying to import into it
6753          VALIDATE_SEQUENCE(
6754             P_COL_NAME => 'SEQUENCE'||to_char(j),
6755             P_GROUP_ID => X_GROUP_ID,
6756             P_USER_ID => X_USER_ID,
6757             P_LAST_UPDATE_LOGIN => X_LAST_UPDATE_LOGIN,
6758             P_REQUEST_ID => X_REQUEST_ID,
6759             P_PROGRAM_APPLICATION_ID => X_PROGRAM_APPLICATION_ID,
6760             P_PROGRAM_ID => X_PROGRAM_ID,
6761             P_CHAR_NAME => CHAR_NAME_TABLE(I),
6762 	        P_TXN_TYPE => TYPE_OF_TXN);
6763          IF(ENABLED_FLAG_TABLE(I) = 1) THEN
6764             DERIVE_SEQUENCE(X_GROUP_ID, X_USER_ID, X_LAST_UPDATE_LOGIN, X_REQUEST_ID,
6765                     X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, 'SEQUENCE'||to_char(J),
6766                           CHAR_ID_TABLE(I), TYPE_OF_TXN);
6767          END IF;
6768       END IF;
6769    END LOOP;
6770 
6771    -- End of Sequence Project Changes.
6772 
6773 
6774 
6775    -- stage 4 -----------------------------------------------------------------
6776    --
6777    -- validate ...
6778    ----------------------------------------------------------------------------
6779 
6780    -- item is a special case because it may or may not have a parent element,
6781    -- depending on whether production line is on the plan.  earlier, when
6782    -- we checked to see if production line was on the plan before validating
6783    -- it, we set the item_parent variable to 'production_line'.  if production
6784    -- line wasn't on the plan, item_parent will be null.  another thing about
6785    -- item...after item is validated, if production line is also on the plan,
6786    -- then the validate_steps routine will derive wip_entity_id.
6787 
6788    I := POSITION_IN_TABLE('ITEM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6789 
6790    IF (I <> -1) THEN
6791       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6792             'ITEM', X_GROUP_ID, X_USER_ID,
6793             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6794             X_PROGRAM_ID, NULL, NULL, NULL,
6795             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6796             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6797             NULL, ITEM_PARENT);
6798    END IF;
6799 
6800    -- Bug 3765678. COMP_ITEM is not getting validated along
6801    -- with ITEM if it is dependent on ITEM. Moved call for
6802    -- VALIDATE_STEPS() for COMP_ITEM after validation of
6803    -- ITEM happens. This is done to ensure that COMP_ITEM
6804    -- gets properly validated if dependent on ITEM.
6805    -- saugupta Fri, 16 Jul 2004 00:07:27 -0700 PDT
6806 
6807    -- Bug 3781489. User was able to import values to COMP_ITEM even if parent column ITEM
6808    -- is empty. Passing 'ITEM' as a PARENT_COL and ITEM_PARENT as GRAND_PARENT_COL parameter
6809    -- to VALIDATE_STEPS call. Parent column dependency is taken care inside VALIDATE_STEPS procedure.
6810    -- srhariha. Thu Jul 22 03:05:03 PDT 2004
6811 
6812    I := POSITION_IN_TABLE('COMP_ITEM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6813    IF (I <> -1) THEN
6814       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6815             'COMP_ITEM', X_GROUP_ID, X_USER_ID,
6816             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6817             X_PROGRAM_ID, NULL, NULL, NULL,
6818             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6819             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6820             null,'ITEM',ITEM_PARENT);
6821    END IF;
6822    -- -*-
6823 
6824    I := POSITION_IN_TABLE('PO_LINE_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6825    IF (I <> -1) THEN
6826       --
6827       -- Bug 4760817.
6828       -- Added 'QRI.PO_LINE_NUM IS NOT NULL' for the where clause column below
6829       -- so that the unique index PO_LINES_U2 in table PO_LINES_ALL is used
6830       -- when importing results for the collection element 'PO Line Number
6831       -- ntungare Wed Dec 21 05:12:28 PST 2005
6832       --
6833 
6834       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6835             'PO_LINE_NUM', X_GROUP_ID, X_USER_ID,
6836             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6837             X_PROGRAM_ID, 'PO_LINES_VAL_V PLVV',
6838             'QRI.PO_LINE_NUM = PLVV.LINE_NUM AND ' ||
6839                   'QRI.PO_HEADER_ID = PLVV.PO_HEADER_ID AND ' ||
6840                    'QRI.PO_LINE_NUM IS NOT NULL',
6841             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6842             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6843             NULL, 'PO_NUMBER');
6844    END IF;
6845 
6846    I := POSITION_IN_TABLE('COMP_UOM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6847    IF (I <> -1) THEN
6848       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6849             'COMP_UOM', X_GROUP_ID, X_USER_ID,
6850             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6851             X_PROGRAM_ID, 'MTL_ITEM_UOMS_VIEW MIUV2',
6852             'QRI.COMP_UOM = MIUV2.UOM_CODE AND ' ||
6853                   'QRI.COMP_ITEM_ID = MIUV2.INVENTORY_ITEM_ID AND ' ||
6854                   'QRI.ORGANIZATION_ID = MIUV2.ORGANIZATION_ID',
6855             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6856             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6857             NULL, 'COMP_ITEM');
6858    END IF;
6859 
6860    I := POSITION_IN_TABLE('COMP_REVISION', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6861    IF (I <> -1) THEN
6862       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6863             'COMP_REVISION', X_GROUP_ID, X_USER_ID,
6864             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6865             X_PROGRAM_ID, 'MTL_ITEM_REVISIONS MIR',
6866             'QRI.COMP_REVISION = MIR.REVISION AND ' ||
6867                   'QRI.COMP_ITEM_ID = MIR.INVENTORY_ITEM_ID AND ' ||
6868                   'QRI.ORGANIZATION_ID = MIR.ORGANIZATION_ID',
6869             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6870             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6871             NULL, 'COMP_ITEM');
6872    END IF;
6873 
6874    I := POSITION_IN_TABLE('COMP_SUBINVENTORY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6875    IF (I <> -1) THEN
6876       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6877             'COMP_SUBINVENTORY', X_GROUP_ID, X_USER_ID,
6878             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6879             X_PROGRAM_ID, NULL, NULL,
6880             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6881             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6882             NULL, 'COMP_ITEM');
6883    END IF;
6884 
6885    I := POSITION_IN_TABLE('COMP_LOT_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6886    IF (I <> -1) THEN
6887       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6888             'COMP_LOT_NUMBER', X_GROUP_ID, X_USER_ID,
6889             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6890             X_PROGRAM_ID, NULL, NULL, NULL, CHAR_ID_TABLE(I),
6891             CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6892             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6893             NULL, 'COMP_ITEM');
6894    END IF;
6895 
6896    I := POSITION_IN_TABLE('COMP_SERIAL_NUMBER', DEVELOPER_NAME_TABLE,
6897          NUM_ELEMS);
6898    IF (I <> -1) THEN
6899       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6900             'COMP_SERIAL_NUMBER', X_GROUP_ID, X_USER_ID,
6901             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6902             X_PROGRAM_ID, NULL, NULL, NULL, CHAR_ID_TABLE(I),
6903             CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6904             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6905             NULL, 'COMP_ITEM');
6906    END IF;
6907 
6908 
6909    -- stage 5 -----------------------------------------------------------------
6910    --
6911    -- validate things dependent on job or prodline/item
6912    ----------------------------------------------------------------------------
6913 
6914    -- !! what exactly are the parent and grandparent columns for op seqs?
6915 
6916    I := POSITION_IN_TABLE('FROM_OP_SEQ_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6917    IF (I <> -1) THEN
6918       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6919             'FROM_OP_SEQ_NUM', X_GROUP_ID, X_USER_ID,
6920             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6921             X_PROGRAM_ID, 'WIP_OPERATIONS_ALL_V WOAV',
6922             'WOAV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
6923                   'AND WOAV.WIP_ENTITY_ID = QRI.WIP_ENTITY_ID ' ||
6924                   'AND WOAV.OPERATION_SEQ_NUM = QRI.FROM_OP_SEQ_NUM ' ||
6925                   'AND (QRI.LINE_ID IS NULL OR ' ||
6926                      'WOAV.REPETITIVE_SCHEDULE_ID = ' ||
6927                      '(SELECT REPETITIVE_SCHEDULE_ID ' ||
6928                      'FROM WIP_FIRST_OPEN_SCHEDULE_V ' ||
6929                      'WHERE ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
6930                      'AND WIP_ENTITY_ID = QRI.WIP_ENTITY_ID ' ||
6931                      'AND LINE_ID = QRI.LINE_ID))',
6932             NULL,
6933             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6934             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6935             NULL, 'JOB_NAME', ITEM_PARENT);
6936    END IF;
6937 
6938    I := POSITION_IN_TABLE('TO_OP_SEQ_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6939    IF (I <> -1) THEN
6940       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6941             'TO_OP_SEQ_NUM', X_GROUP_ID, X_USER_ID,
6942             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6943             X_PROGRAM_ID, 'WIP_OPERATIONS_ALL_V WOAV',
6944             'WOAV.ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
6945                   'AND WOAV.WIP_ENTITY_ID = QRI.WIP_ENTITY_ID ' ||
6946                   'AND WOAV.OPERATION_SEQ_NUM = QRI.TO_OP_SEQ_NUM ' ||
6947                   'AND (QRI.LINE_ID IS NULL OR ' ||
6948                      'WOAV.REPETITIVE_SCHEDULE_ID = ' ||
6949                      '(SELECT REPETITIVE_SCHEDULE_ID ' ||
6950                      'FROM WIP_FIRST_OPEN_SCHEDULE_V ' ||
6951                      'WHERE ORGANIZATION_ID = QRI.ORGANIZATION_ID ' ||
6952                      'AND WIP_ENTITY_ID = QRI.WIP_ENTITY_ID ' ||
6953                      'AND LINE_ID = QRI.LINE_ID))',
6954             NULL,
6955             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6956             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6957             NULL, 'JOB_NAME', ITEM_PARENT);
6958    END IF;
6959 
6960    I := POSITION_IN_TABLE('UOM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6961    IF (I <> -1) THEN
6962       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6963             'UOM', X_GROUP_ID, X_USER_ID,
6964             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6965             X_PROGRAM_ID, 'MTL_ITEM_UOMS_VIEW MIUV2',
6966             'QRI.UOM = MIUV2.UOM_CODE AND ' ||
6967                   'QRI.ITEM_ID = MIUV2.INVENTORY_ITEM_ID AND ' ||
6968                   'QRI.ORGANIZATION_ID = MIUV2.ORGANIZATION_ID',
6969             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6970             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6971             NULL, 'ITEM', ITEM_PARENT);
6972    END IF;
6973 
6974    I := POSITION_IN_TABLE('REVISION', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6975    IF (I <> -1) THEN
6976       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6977             'REVISION', X_GROUP_ID, X_USER_ID,
6978             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6979             X_PROGRAM_ID, 'MTL_ITEM_REVISIONS MIR',
6980             'QRI.REVISION = MIR.REVISION AND ' ||
6981                   'QRI.ITEM_ID = MIR.INVENTORY_ITEM_ID AND ' ||
6982                   'QRI.ORGANIZATION_ID = MIR.ORGANIZATION_ID',
6983             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6984             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6985             NULL, 'ITEM', ITEM_PARENT);
6986    END IF;
6987 
6988    I := POSITION_IN_TABLE('SUBINVENTORY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
6989    IF (I <> -1) THEN
6990       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
6991             'SUBINVENTORY', X_GROUP_ID, X_USER_ID,
6992             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
6993             X_PROGRAM_ID, NULL, NULL,
6994             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
6995             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
6996             NULL, 'ITEM', ITEM_PARENT);
6997    END IF;
6998 
6999 -- Start of inclusions for NCM Hardcode Elements.
7000 -- suramasw Thu Oct 31 10:48:59 PST 2002.
7001 -- Bug 2449067.
7002 
7003    I := POSITION_IN_TABLE('TO_SUBINVENTORY', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7004    IF (I <> -1) THEN
7005       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7006             'TO_SUBINVENTORY', X_GROUP_ID, X_USER_ID,
7007             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7008             X_PROGRAM_ID, NULL, NULL,
7009             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7010             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7011             NULL, 'ITEM', ITEM_PARENT);
7012    END IF;
7013 
7014 -- End of inclusions for NCM Hardcode Elements.
7015 
7016    I := POSITION_IN_TABLE('LOT_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7017    IF (I <> -1) THEN
7018       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7019             'LOT_NUMBER', X_GROUP_ID, X_USER_ID,
7020             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7021             X_PROGRAM_ID, NULL, NULL, NULL, CHAR_ID_TABLE(I),
7022             CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7023             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7024             NULL, 'ITEM', ITEM_PARENT);
7025    END IF;
7026 
7027    -- enter results checks to see whether last digit of a serial number is
7028    -- numeric.  we don't do this but probably should.
7029 
7030    I := POSITION_IN_TABLE('SERIAL_NUMBER', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7031    IF (I <> -1) THEN
7032       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7033             'SERIAL_NUMBER', X_GROUP_ID, X_USER_ID,
7034             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7035             X_PROGRAM_ID, NULL, NULL, NULL, CHAR_ID_TABLE(I),
7036             CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7037             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7038             NULL, 'ITEM', ITEM_PARENT);
7039    END IF;
7040 
7041 
7042 -- Start of inclusions for NCM Hardcode Elements.
7043 -- suramasw Thu Oct 31 10:48:59 PST 2002.
7044 -- Bug 2449067.
7045 
7046 
7047    I := POSITION_IN_TABLE('LOT_STATUS', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7048    IF (I <> -1) THEN
7049 
7050       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7051             'LOT_STATUS', X_GROUP_ID, X_USER_ID,
7052             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7053             X_PROGRAM_ID, 'MTL_MATERIAL_STATUSES MMS, MTL_LOT_NUMBERS MLN',
7054             'MMS.STATUS_CODE = QRI.LOT_STATUS AND MMS.ENABLED_FLAG = 1 '||
7055             ' AND MLN.LOT_NUMBER = QRI.LOT_NUMBER AND MLN.STATUS_ID = MMS.STATUS_ID',
7056             'LOT_STATUS_ID = (SELECT MMS.STATUS_ID '||
7057             ' FROM MTL_LOT_NUMBERS MLN,MTL_MATERIAL_STATUSES MMS '||
7058             ' WHERE MLN.STATUS_ID = MMS.STATUS_ID '||
7059             ' AND MLN.LOT_NUMBER = QRI.LOT_NUMBER AND MMS.ENABLED_FLAG = 1 '||
7060             ' AND MLN.INVENTORY_ITEM_ID = QRI.ITEM_ID )',
7061             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7062             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
7063    END IF;
7064 
7065    I := POSITION_IN_TABLE('SERIAL_STATUS', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7066    IF (I <> -1) THEN
7067       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7068             'SERIAL_STATUS', X_GROUP_ID, X_USER_ID,
7069             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7070             X_PROGRAM_ID, 'MTL_MATERIAL_STATUSES MMS, MTL_SERIAL_NUMBERS MSN',
7071             'MMS.STATUS_CODE = QRI.SERIAL_STATUS AND MMS.ENABLED_FLAG = 1 '||
7072             ' AND MSN.SERIAL_NUMBER = QRI.SERIAL_NUMBER AND MSN.STATUS_ID = MMS.STATUS_ID',
7073             'SERIAL_STATUS_ID = (SELECT MMS.STATUS_ID '||
7074             ' FROM MTL_SERIAL_NUMBERS MSN,MTL_MATERIAL_STATUSES MMS '||
7075             ' WHERE MSN.STATUS_ID = MMS.STATUS_ID '||
7076             ' AND MSN.SERIAL_NUMBER = QRI.SERIAL_NUMBER AND MMS.ENABLED_FLAG = 1 '||
7077             ' AND MSN.INVENTORY_ITEM_ID = QRI.ITEM_ID )',
7078             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7079             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
7080    END IF;
7081 
7082 -- End of inclusions for NCM Hardcode Elements.
7083 
7084 
7085    -- !!! here we will validate comp_locator
7086    -- !!!
7087 
7088    I := POSITION_IN_TABLE('COMP_LOCATOR', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7089    IF (I <> -1) THEN
7090       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7091             'COMP_LOCATOR', X_GROUP_ID, X_USER_ID,
7092             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7093             X_PROGRAM_ID, NULL, NULL,
7094             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7095             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7096             NULL, 'COMP_SUBINVENTORY', 'COMP_ITEM');
7097    END IF;
7098 
7099    I := POSITION_IN_TABLE('PO_SHIPMENT_NUM', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7100    IF (I <> -1) THEN
7101       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7102             'PO_SHIPMENT_NUM', X_GROUP_ID, X_USER_ID,
7103             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7104             X_PROGRAM_ID, 'PO_SHIPMENTS_ALL_V PSAV',
7105             'QRI.PO_SHIPMENT_NUM = PSAV.SHIPMENT_NUM AND ' ||
7106                   'PSAV.PO_LINE_ID = (SELECT PO_LINE_ID FROM ' ||
7107                   'PO_LINES_VAL_V WHERE LINE_NUM = QRI.PO_LINE_NUM ' ||
7108                   'AND PO_HEADER_ID = QRI.PO_HEADER_ID)',
7109             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7110             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7111             NULL, 'PO_LINE_NUM', 'PO_NUMBER');
7112    END IF;
7113 
7114    --
7115    -- See Bug 2588213
7116    -- To support the element Maintenance Op Seq Number
7117    -- to be used along with Maintenance Workorder
7118    -- rkunchal Mon Sep 23 23:46:28 PDT 2002
7119    -- To validate Maintenance Op Seq which is dependent on Maintenance Workorder
7120    --
7121    I := POSITION_IN_TABLE('MAINTENANCE_OP_SEQ', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7122    IF (I <> -1) THEN
7123       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I),
7124                      MANDATORY_FLAG_TABLE(I),
7125                      'MAINTENANCE_OP_SEQ',
7126                      X_GROUP_ID,
7127                      X_USER_ID,
7128                      X_LAST_UPDATE_LOGIN,
7129                      X_REQUEST_ID,
7130                      X_PROGRAM_APPLICATION_ID,
7131                      X_PROGRAM_ID,
7132                      'WIP_OPERATIONS_ALL_V WOAV',
7133                      'woav.organization_id = qri.organization_id AND ' ||
7134                        'woav.wip_entity_id = qri.work_order_id AND ' ||
7135                        'woav.operation_seq_num = qri.maintenance_op_seq',
7136                      NULL,
7137                      CHAR_ID_TABLE(I),
7138                      CHAR_NAME_TABLE(I),
7139                      DATATYPE_TABLE(I),
7140                      DECIMAL_PRECISION_TABLE(I),
7141                      X_PLAN_ID,
7142                      VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7143                      SQL_VALIDATION_STRING_TABLE(I));
7144    END IF;
7145    --
7146    -- End of inclusions for Bug 2588213
7147    --
7148 
7149    -- stage 6 -----------------------------------------------------------------
7150    --
7151    -- validate locator and the characterx columns
7152    ----------------------------------------------------------------------------
7153 
7154    -- !!! validate locator here
7155    -- !!!
7156 
7157    I := POSITION_IN_TABLE('LOCATOR', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7158    IF (I <> -1) THEN
7159       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7160             'LOCATOR', X_GROUP_ID, X_USER_ID,
7161             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7162             X_PROGRAM_ID, NULL, NULL,
7163             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7164             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7165             NULL, 'SUBINVENTORY', 'ITEM', ITEM_PARENT);
7166    END IF;
7167 
7168 -- Start of inclusions for NCM Hardcode Elements.
7169 -- suramasw Thu Oct 31 10:48:59 PST 2002.
7170 -- Bug 2449067.
7171 
7172 
7173    I := POSITION_IN_TABLE('TO_LOCATOR', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7174    IF (I <> -1) THEN
7175       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7176             'TO_LOCATOR', X_GROUP_ID, X_USER_ID,
7177             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7178             X_PROGRAM_ID, NULL, NULL,
7179             NULL, CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7180             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7181             NULL, 'TO_SUBINVENTORY', 'ITEM', ITEM_PARENT);
7182    END IF;
7183 
7184 -- End of inclusions for NCM Hardcode Elements.
7185 
7186    I := POSITION_IN_TABLE('FROM_INTRAOPERATION_STEP', DEVELOPER_NAME_TABLE,
7187          NUM_ELEMS);
7188    IF (I <> -1) THEN
7189       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7190             RESULT_COLUMN_NAME_TABLE(I), X_GROUP_ID, X_USER_ID,
7191             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7192             X_PROGRAM_ID, NULL, NULL, NULL,
7193             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7194             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7195             SQL_VALIDATION_STRING_TABLE(I),
7196             'FROM_OP_SEQ_NUM', 'JOB_NAME', ITEM_PARENT);
7197    END IF;
7198 
7199    I := POSITION_IN_TABLE('TO_INTRAOPERATION_STEP', DEVELOPER_NAME_TABLE,
7200          NUM_ELEMS);
7201    IF (I <> -1) THEN
7202       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7203             RESULT_COLUMN_NAME_TABLE(I), X_GROUP_ID, X_USER_ID,
7204             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7205             X_PROGRAM_ID, NULL, NULL, NULL,
7206             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7207             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),
7208             SQL_VALIDATION_STRING_TABLE(I),
7209             'TO_OP_SEQ_NUM', 'JOB_NAME', ITEM_PARENT);
7210    END IF;
7211 
7212 
7213    I := POSITION_IN_TABLE('Bom_Revision', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7214 
7215    IF (I <> -1) THEN
7216 
7217       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7218             RESULT_COLUMN_NAME_TABLE(I), X_GROUP_ID, X_USER_ID,
7219             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7220             X_PROGRAM_ID, 'MTL_ITEM_REVISIONS MIR',
7221             'MIR.REVISION = QRI.'||RESULT_COLUMN_NAME_TABLE(I)||
7222             ' AND MIR.INVENTORY_ITEM_ID = QRI.BILL_REFERENCE_ID'||
7223             ' AND MIR.ORGANIZATION_ID = QRI.ORGANIZATION_ID',
7224             RESULT_COLUMN_NAME_TABLE(I)|| '= QRI.'||RESULT_COLUMN_NAME_TABLE(I),
7225             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7226             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I));
7227    END IF;
7228 
7229    I := POSITION_IN_TABLE('routing_revision', DEVELOPER_NAME_TABLE, NUM_ELEMS);
7230 
7231    IF (I <> -1) THEN
7232 
7233       VALIDATE_STEPS(ENABLED_FLAG_TABLE(I), MANDATORY_FLAG_TABLE(I),
7234             RESULT_COLUMN_NAME_TABLE(I), X_GROUP_ID, X_USER_ID,
7235             X_LAST_UPDATE_LOGIN, X_REQUEST_ID, X_PROGRAM_APPLICATION_ID,
7236             X_PROGRAM_ID, 'MTL_RTG_ITEM_REVISIONS MRIR',
7237             'MRIR.PROCESS_REVISION = QRI.'||RESULT_COLUMN_NAME_TABLE(I)||
7238             ' AND MRIR.INVENTORY_ITEM_ID = QRI.ROUTING_REFERENCE_ID'||
7239             ' AND MRIR.ORGANIZATION_ID = QRI.ORGANIZATION_ID',
7240             RESULT_COLUMN_NAME_TABLE(I)|| '= QRI.'||RESULT_COLUMN_NAME_TABLE(I),
7241             CHAR_ID_TABLE(I), CHAR_NAME_TABLE(I), DATATYPE_TABLE(I),
7242             DECIMAL_PRECISION_TABLE(I), X_PLAN_ID, VALUES_EXIST_FLAG_TABLE(I), READ_ONLY_FLAG_TABLE(I),NULL);
7243    END IF;
7244 
7245 
7246 
7247    -- stage 7 -----------------------------------------------------------------
7248    --
7249    -- done with validation
7250    -- set the process status to 3 (error) for all rows that had errors
7251    ----------------------------------------------------------------------------
7252 
7253    -- final step: set error status for all rows that had errors
7254    SET_ERROR_STATUS(X_GROUP_ID, X_USER_ID, X_REQUEST_ID,
7255          X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID, X_LAST_UPDATE_LOGIN);
7256 
7257    RETURN TRUE;
7258 END VALIDATE;
7259 
7260 
7261 -- Adding update capabilities.  For each column of QA_RESULTS that will be
7262 -- updated, a record is inserted into QA_RESULTS_UPDATE_HISTORY.  Provides an
7263 -- audit trail.
7264 PROCEDURE POPULATE_HISTORY_TABLE(X_GROUP_ID NUMBER,
7265 				 X_TXN_HEADER_ID NUMBER,
7266 				 STMT_OF_ROWIDS VARCHAR2,
7267 				 X_USER_ID NUMBER,
7268 				 X_LAST_UPDATE_LOGIN NUMBER,
7269 				 X_REQUEST_ID NUMBER,
7270 				 X_PROGRAM_APPLICATION_ID NUMBER,
7271 				 X_PROGRAM_ID NUMBER) IS
7272   X_PLAN_ID				NUMBER;
7273   NUM_COLS				BINARY_INTEGER;
7274   J						BINARY_INTEGER;
7275   RESULT_COLUMN_ID_TABLE		NUMBER_TABLE;
7276   RESULT_COLUMN_NAME_TABLE	CHAR30_TABLE;
7277   SQL_STATEMENT			VARCHAR2(10000);
7278 
7279     -- Bug 3765730.Added the datatype table which will be used in building the SQL.
7280     -- srhariha. Wed Jul 14 22:36:50 PDT 2004.
7281   DATATYPE_TABLE NUMBER_TABLE;
7282 
7283     -- Bug 4270911. CU2 SQL Literal fix.
7284     -- New variables;
7285     -- srhariha. Fri Apr 15 02:42:07 PDT 2005.
7286 
7287   L_ROWID ROWID;
7288 
7289 
7290 BEGIN
7291   SELECT MAX(PLAN_ID)
7292   INTO X_PLAN_ID
7293   FROM QA_RESULTS_INTERFACE QRI
7294   WHERE QRI.GROUP_ID = X_GROUP_ID
7295   AND PROCESS_STATUS = 2;
7296 
7297   -- if no rows were successfully validated, no need to continue....
7298   IF (X_PLAN_ID IS NULL)
7299     THEN RETURN;
7300   END IF;
7301 
7302   -- get result column ids corresponding to elements of the plan....
7303   NUM_COLS := 0;
7304 
7305     -- Bug 3765730.Populating datatype table which will be used in building the SQL.
7306     -- srhariha. Wed Jul 14 22:36:50 PDT 2004.
7307 
7308   -- Bug 4958776. SQL Repository Fix SQL ID: 15009199
7309   -- replacing view with base tables
7310   FOR RESREC IN (SELECT QPC.CHAR_ID, QPC.RESULT_COLUMN_NAME, QC.DATATYPE
7311                  FROM QA_PLAN_CHARS QPC, qa_chars qc
7312                  WHERE QPC.PLAN_ID = X_PLAN_ID
7313                  AND QC.CHAR_ID = QPC.CHAR_ID ) LOOP
7314     NUM_COLS := NUM_COLS + 1;
7315     RESULT_COLUMN_ID_TABLE(NUM_COLS) := RESREC.CHAR_ID;
7316     RESULT_COLUMN_NAME_TABLE(NUM_COLS) := RESREC.RESULT_COLUMN_NAME;
7317     DATATYPE_TABLE(NUM_COLS) := RESREC.DATATYPE;
7318   END LOOP;
7319 
7320   -- Bug 3136107.
7321   -- SQL Bind project. Code modified to use bind variables instead of literals
7322   -- Same as the fix done for Bug 3079312.suramasw.
7323 
7324   -- Added the NVL condition for QR.RESULT_COLUMN_NAME_TABLE.
7325   -- Comparing NULL values should have NVL else the query fails to insert record
7326   -- into qa_results_update_history.This happens when you enter a record through
7327   -- EQR and then update the record through collection import.
7328   -- Bug 3273447. suramasw
7329 
7330   -- Bug 3765730.Updating functionality was not working if the plan has hardcoded date element.
7331   -- In the SQL_STATEMENT we were replacing null with -99999,which worked for NUMBER and VARCHAR2
7332   -- but was giving exception for DATE type.
7333   -- To fix the issue, added a decode inside NVL based on DATATYPE.Also to avoid hardcoding effect
7334   -- (Easter eggs) added similar condition but with different value inside NVL.Also GSCC wont
7335   -- allow hardcoding dates,so using SYSDATE and SYSDATE+1.
7336   -- srhariha. Wed Jul 14 22:36:50 PDT 2004.
7337 
7338   -- Bug 4270911. CU2 SQL Literal fix. TD #27-28
7339   -- Replaced NVL comparison with is null comparison.
7340   -- Rewrote the 3765730 fix.
7341   -- Using bind variable for STMT_OF_ROWID with assumption that QA open interface allows
7342   -- update of only sinlge row.
7343   -- srhariha. Fri Apr 15 02:42:07 PDT 2005.
7344 
7345   L_ROWID := substr(stmt_of_rowids,3,length(stmt_of_rowids)-4);
7346 
7347 
7348   FOR J IN 1..NUM_COLS LOOP
7349     SQL_STATEMENT := 'INSERT INTO QA_RESULTS_UPDATE_HISTORY ' ||
7350 			'(OCCURRENCE,UPDATE_ID,CREATION_DATE,CREATED_BY,' ||
7351 			' LAST_UPDATE_DATE,LAST_UPDATED_BY,LAST_UPDATE_LOGIN,' ||
7352 			' TXN_HEADER_ID,CHAR_ID,OLD_VALUE,REQUEST_ID,' ||
7353 			' PROGRAM_APPLICATION_ID,PROGRAM_ID,PROGRAM_UPDATE_DATE) ' ||
7354 		     'SELECT QR.OCCURRENCE, QA_RESULTS_UPDATE_HISTORY_S.nextval, ' ||
7355 			'sysdate, :USER_ID, sysdate, :USER_ID2, :LAST_UPDATE_LOGIN, ' ||
7356                         ':TXN_HEADER_ID, :RESULT_COLUMN_ID' ||
7357 			', QR.' || RESULT_COLUMN_NAME_TABLE(J) || ', ' ||
7358                         ':REQUEST_ID, :PROGRAM_APPLICATION_ID, ' ||
7359                         ':PROGRAM_ID, sysdate ' ||
7360 		     'FROM QA_RESULTS QR, ' ||
7361 		     'QA_RESULTS_INTERFACE QRI ' ||
7362 		     'WHERE QR.ROWID = :BIND_ROWID ' ||
7363 		     ' AND QRI.GROUP_ID = :GROUP_ID ' ||
7364                    '  AND (QR.' || RESULT_COLUMN_NAME_TABLE(J) || ' <> QRI.' || RESULT_COLUMN_NAME_TABLE(J)||
7365                      '   OR (QR.'  || RESULT_COLUMN_NAME_TABLE(J)|| ' IS NOT NULL AND ' ||
7366                             'QRI.' || RESULT_COLUMN_NAME_TABLE(J)|| ' IS NULL )' ||
7367                      '   OR (QRI.'  || RESULT_COLUMN_NAME_TABLE(J)|| ' IS NOT NULL AND ' ||
7368                             'QR.' || RESULT_COLUMN_NAME_TABLE(J)|| ' IS NULL ))';
7369 
7370 
7371 
7372 
7373 
7374       EXECUTE IMMEDIATE SQL_STATEMENT USING X_USER_ID,
7375                                             X_USER_ID,
7376                                             X_LAST_UPDATE_LOGIN,
7377                                             X_TXN_HEADER_ID,
7378                                             RESULT_COLUMN_ID_TABLE(J),
7379                                             X_REQUEST_ID,
7380                                             X_PROGRAM_APPLICATION_ID,
7381                                             X_PROGRAM_ID,
7382                                             L_ROWID,
7383                                             X_GROUP_ID;
7384 
7385    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
7386   END LOOP;
7387 
7388 END POPULATE_HISTORY_TABLE;
7389 
7390 
7391 -- Adding update capabilities.  This procedure does the actual updates to
7392 -- QA_RESULTS.
7393 PROCEDURE UPDATE_VALID_ROWS(X_GROUP_ID 			NUMBER,
7394 			    		X_USER_ID 			NUMBER,
7395 			    		X_LAST_UPDATE_LOGIN		NUMBER,
7396 			    		X_TXN_HEADER_ID		NUMBER,
7397 			    		X_REQUEST_ID			NUMBER,
7398 			    		X_PROGRAM_APPLICATION_ID	NUMBER,
7399 			    		X_PROGRAM_ID			NUMBER,
7400 			    		STMT_OF_ROWIDS			VARCHAR2) IS
7401   X_PLAN_ID				NUMBER;
7402   X_TRANSACTION_INTERFACE_ID	NUMBER;
7403   I						BINARY_INTEGER;
7404   NUM_ELEMS				NUMBER;
7405   COLUMNS_TABLE			CHAR30_TABLE;
7406   COLUMN_LIST				VARCHAR2(10000);
7407   VALUE_LIST				VARCHAR2(10000);
7408   SQL_STATEMENT			VARCHAR2(20000);
7409   DUMMY				NUMBER;
7410 
7411   -- For Bug2548710.
7412   K                    NUMBER := 0;
7413   NUM_ROWS             NUMBER;
7414   X_INTERFACE_ID       NUMBER;
7415   SOURCE_CURSOR        INTEGER;
7416   IGNORE               INTEGER;
7417   ERRMSG               VARCHAR2(30);
7418   ID_FIELD             VARCHAR2(30);
7419   INTERFACE_ID_TABLE   NUMBER_TABLE;
7420 
7421   -- Bug 3788305.suramasw.
7422   l_rowid ROWID;
7423 
7424 BEGIN
7425   I := 0;
7426 
7427   SELECT MAX(TRANSACTION_INTERFACE_ID)
7428   INTO X_TRANSACTION_INTERFACE_ID
7429   FROM QA_RESULTS_INTERFACE QRI
7430   WHERE QRI.GROUP_ID = X_GROUP_ID
7431   AND PROCESS_STATUS = 2;
7432 
7433   SELECT MAX(PLAN_ID)
7434   INTO X_PLAN_ID
7435   FROM QA_RESULTS_INTERFACE QRI
7436   WHERE QRI.TRANSACTION_INTERFACE_ID = X_TRANSACTION_INTERFACE_ID
7437   AND PROCESS_STATUS = 2;
7438 
7439   -- if no rows were successfully validated, no need to continue....
7440   IF (X_PLAN_ID IS NULL)
7441     THEN RETURN;
7442   END IF;
7443 
7444   -- Get all the interface_ids for this group_id onto a struct.
7445   -- We need to update the SEQUENCExx columns before we update to
7446   -- QA_RESULTS. For more info see Bug 2548710.
7447 
7448    -- Bug 3136107.
7449    -- SQL Bind project. Code modified to use bind variables instead of literals
7450    -- Same as the fix done for Bug 3079312.suramasw.
7451 
7452   SQL_STATEMENT :=
7453          'SELECT TRANSACTION_INTERFACE_ID ' ||
7454          'FROM QA_RESULTS_INTERFACE QRI ' ||
7455          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
7456          ' AND QRI.PROCESS_STATUS = 2 ' ||
7457          ' AND NOT EXISTS
7458                (SELECT ''X'' ' ||
7459                'FROM QA_INTERFACE_ERRORS QIE ' ||
7460                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
7461                   'QRI.TRANSACTION_INTERFACE_ID )';
7462 
7463   SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
7464   DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
7465 
7466   DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
7467 
7468   DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
7469   IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
7470 
7471   LOOP
7472      IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
7473         K := K + 1;
7474         DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
7475         INTERFACE_ID_TABLE(K) := X_INTERFACE_ID;
7476      ELSE
7477         EXIT;
7478      END IF;
7479   END LOOP;
7480   NUM_ROWS := K ;
7481 
7482 
7483   -- Before we update, make sure that all the variables are initialized.
7484   -- Exceptions can rise, if all its not done.
7485 
7486   IF (G_INIT_SEQ_TAB = 1) THEN
7487      -- Call local initialization procedure. Bug 2548710 rponnusa Mon Nov 18 03:49:15 PST 2002
7488 
7489      INIT_SEQ_TABLE(NUM_ROWS);
7490   END IF;
7491 
7492   -- Use the bulk binding option to update all the SEQUENCExx columns
7493   -- together. Fetch the values for all sequence columns from the
7494   -- global variables. For more info see bug 2548710.
7495 
7496   FORALL J IN 1..NUM_ROWS
7497       UPDATE QA_RESULTS_INTERFACE QRI
7498       SET    SEQUENCE1  = G_SEQ_TAB1(J),
7499              SEQUENCE2  = G_SEQ_TAB2(J),
7500              SEQUENCE3  = G_SEQ_TAB3(J),
7501              SEQUENCE4  = G_SEQ_TAB4(J),
7502              SEQUENCE5  = G_SEQ_TAB5(J),
7503              SEQUENCE6  = G_SEQ_TAB6(J),
7504              SEQUENCE7  = G_SEQ_TAB7(J),
7505              SEQUENCE8  = G_SEQ_TAB8(J),
7506              SEQUENCE9  = G_SEQ_TAB9(J),
7507              SEQUENCE10 = G_SEQ_TAB10(J),
7508              SEQUENCE11 = G_SEQ_TAB11(J),
7509              SEQUENCE12 = G_SEQ_TAB12(J),
7510              SEQUENCE13 = G_SEQ_TAB13(J),
7511              SEQUENCE14 = G_SEQ_TAB14(J),
7512              SEQUENCE15 = G_SEQ_TAB15(J)
7513       WHERE  QRI.GROUP_ID = X_GROUP_ID
7514       AND    QRI.TRANSACTION_INTERFACE_ID = INTERFACE_ID_TABLE(J)
7515       AND    NOT EXISTS
7516                 (SELECT 'X'
7517                  FROM QA_INTERFACE_ERRORS QIE
7518                  WHERE QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID);
7519 
7520   -- End of changes for bug 2548710.
7521 
7522   FOR COLUMN_NAMES_REC IN (SELECT QPC.RESULT_COLUMN_NAME
7523 			   FROM QA_PLAN_CHARS QPC,
7524 			   QA_CHARS QC
7525 			   WHERE QPC.PLAN_ID = X_PLAN_ID
7526 			   AND QPC.CHAR_ID = QC.CHAR_ID) LOOP
7527     I := I + 1;
7528     COLUMNS_TABLE(I) := COLUMN_NAMES_REC.RESULT_COLUMN_NAME;
7529   END LOOP;
7530   NUM_ELEMS := I;
7531 
7532   -- to build our update statement, we first need to construct a column list,
7533   -- value list, and row list.  These are all texts we will use to construct
7534   -- the update statement.
7535 
7536    --
7537    -- Modified the COLUMN_LIST and VALUE_LIST to include
7538    -- new columns added for ASO project.
7539    -- rkunchal Thu Jul 25 01:43:48 PDT 2002
7540    --
7541   -- msg('In Update_Valid_Rows...');
7542   COLUMN_LIST := 'LAST_UPDATE_DATE, QA_LAST_UPDATE_DATE, ' ||
7543 	      'LAST_UPDATED_BY, QA_LAST_UPDATED_BY, LAST_UPDATE_LOGIN, ' ||
7544 		 'TXN_HEADER_ID, REQUEST_ID, ' ||
7545 		 'PROGRAM_APPLICATION_ID, PROGRAM_ID, PROGRAM_UPDATE_DATE,' ||
7546                  'MTI_TRANSACTION_HEADER_ID,' ||
7547                  'MTI_TRANSACTION_INTERFACE_ID,' ||
7548                  'MMT_TRANSACTION_ID,' ||
7549                  'WJSI_GROUP_ID,' ||
7550                  'WMTI_GROUP_ID,' ||
7551                  'WMT_TRANSACTION_ID,' ||
7552                  'RTI_INTERFACE_TRANSACTION_ID '
7553 		 ;
7554 
7555    -- Bug 3136107.
7556    -- SQL Bind project. Code modified to use bind variables instead of literals
7557    -- Same as the fix done for Bug 3079312.suramasw.
7558 
7559    -- QA_LAST_UPDATED_BY should take the value from qri.QA_LAST_UPDATED_BY because
7560    -- the record might be updated by different user than the user who submitted the
7561    -- concurrent request. qri.QA_LAST_UPDATED_BY will store the value of the user
7562    -- who updated the record.
7563    -- Bug 3663648.suramasw.
7564 
7565   VALUE_LIST := 'SYSDATE, SYSDATE, :USER_ID, ' ||
7566                 'NVL(qri.QA_LAST_UPDATED_BY,qr.QA_LAST_UPDATED_BY),' ||
7567                 ':LAST_UPDATE_LOGIN, :TXN_HEADER_ID, :REQUEST_ID, :PROGRAM_APPLICATION_ID, ' ||
7568                 ':PROGRAM_ID, SYSDATE, ' ||
7569                 'NVL(qri.MTI_TRANSACTION_HEADER_ID, qr.MTI_TRANSACTION_HEADER_ID), ' ||
7570                 'NVL(qri.MTI_TRANSACTION_INTERFACE_ID, qr.MTI_TRANSACTION_INTERFACE_ID), ' ||
7571                 'NVL(qri.MMT_TRANSACTION_ID, qr.MMT_TRANSACTION_ID), ' ||
7572                 'NVL(qri.WJSI_GROUP_ID, qr.WJSI_GROUP_ID), ' ||
7573                 'NVL(qri.WMTI_GROUP_ID, qr.WMTI_GROUP_ID), ' ||
7574                 'NVL(qri.WMT_TRANSACTION_ID, qr.WMT_TRANSACTION_ID), ' ||
7575                 'NVL(qri.RTI_INTERFACE_TRANSACTION_ID, qr.RTI_INTERFACE_TRANSACTION_ID) '
7576                 ;
7577 
7578   FOR I IN 1..NUM_ELEMS LOOP
7579     COLUMN_LIST := COLUMN_LIST || ', ' || COLUMNS_TABLE(I);
7580     VALUE_LIST := VALUE_LIST || ', NVL(QRI.'|| COLUMNS_TABLE(I) ||
7581 		        ', QR.' || COLUMNS_TABLE(I) || ') ';
7582   END LOOP;
7583 
7584   -- build the SQL statement that updates records into QA_RESULTS
7585 
7586 
7587   -- Bug 4270911. CU2 SQL Literal fix. TD #29
7588   -- Using bind variable for STMT_OF_ROWIDS, under the assumption
7589   -- that QA open interface only supports update of single row.
7590   -- srhariha. Fri Apr 15 02:42:07 PDT 2005.
7591 
7592   SQL_STATEMENT := 'UPDATE QA_RESULTS QR SET (' || COLUMN_LIST || ') = ' ||
7593      '(SELECT ' || VALUE_LIST ||
7594 	' FROM QA_RESULTS_INTERFACE QRI ' ||
7595 	'WHERE QRI.TRANSACTION_INTERFACE_ID = :TRANSACTION_INTERFACE_ID ' ||
7596 	') WHERE ROWID = :BIND_ROWID';
7597 
7598 
7599   -- Lock the record and update.   bso
7600 
7601   -- Modified the select statement as below for locking the record before
7602   -- update as the original sql was resulting in full table scan on qa_results.
7603   -- The value of stmt_of_rowids will be for eg - ('AAAJv4AAmAAAph+AAD').
7604   -- Usage of rowid as '('''||rowid||''')' in the select stmt is masking the
7605   -- CBO path on rowid and results in full table scan.So trimmed the prefix ('
7606   -- and suffix ') and stored the remaining in a local variable(l_rowid).Then
7607   -- the original sql that was used to lock the row is changed as below to use
7608   -- l_rowid.After the change there will be no FTS when locking the record.
7609   -- Commented the old select stmt.
7610   -- Bug 3788305.suramasw.
7611 
7612   l_rowid := substr(stmt_of_rowids,3,length(stmt_of_rowids)-4);
7613 
7614 
7615   SELECT 1 INTO DUMMY FROM qa_results where rowid = l_rowid FOR UPDATE NOWAIT;
7616 
7617   -- End of inclusion for bug 3788305.suramasw.
7618 
7619   /*
7620     SELECT 1 INTO DUMMY FROM qa_results
7621     WHERE '('''||rowid||''')' = stmt_of_rowids
7622     FOR UPDATE NOWAIT;
7623   */
7624 
7625     -- Bug 3136107.
7626     -- SQL Bind project. Code modified to use bind variables instead of literals
7627     -- Same as the fix done for Bug 3079312.suramasw.
7628 
7629     EXECUTE IMMEDIATE SQL_STATEMENT USING X_USER_ID,
7630                                           X_LAST_UPDATE_LOGIN,
7631                                           X_TXN_HEADER_ID,
7632                                           X_REQUEST_ID,
7633                                           X_PROGRAM_APPLICATION_ID,
7634                                           X_PROGRAM_ID,
7635                                           X_TRANSACTION_INTERFACE_ID,
7636                                           L_ROWID;
7637 
7638     -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
7639 
7640   -- msg('Update_valid_rows successfully executed the query...');
7641     -- Bug 2302539
7642     -- To process History records in Parent-child
7643     -- scanario the following call added.
7644     -- rponnusa Wed Apr 24 12:19:54 PDT 2002
7645     QA_PARENT_CHILD_PKG.insert_history_auto_rec(X_PLAN_ID, X_TXN_HEADER_ID, 1, 4) ;
7646 EXCEPTION
7647 
7648     WHEN resource_busy THEN
7649       INSERT INTO QA_INTERFACE_ERRORS
7650          (TRANSACTION_INTERFACE_ID, ERROR_MESSAGE, ERROR_COLUMN,
7651           LAST_UPDATE_DATE, LAST_UPDATED_BY,
7652           CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
7653           REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
7654           PROGRAM_UPDATE_DATE)
7655       SELECT TRANSACTION_INTERFACE_ID, ERROR_BUSY, NULL,
7656           SYSDATE, X_USER_ID,
7657           SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
7658           X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
7659           SYSDATE
7660       FROM QA_RESULTS_INTERFACE
7661       WHERE TRANSACTION_INTERFACE_ID = X_TRANSACTION_INTERFACE_ID;
7662 
7663       UPDATE QA_RESULTS_INTERFACE
7664       SET    PROCESS_STATUS = 3
7665       WHERE  TRANSACTION_INTERFACE_ID = X_TRANSACTION_INTERFACE_ID;
7666 
7667       COMMIT;
7668 
7669 END UPDATE_VALID_ROWS;
7670 
7671 --
7672 -- Bugs 5641894, 5752546
7673 -- New procedure update_no_validate to update the plan_id, org_id, spec_id and the who columns in case the validation flag has been set to FALSE.
7674 -- For bug 5752546, Added two more parameters, one to get the type of transaction 1 - Insert and 2 - Update and the other parameter returns the row_ids which would be used for update transactions.
7675 -- skolluku Tue Feb 20 2007
7676 --
7677 
7678 PROCEDURE update_no_validate(x_group_id IN NUMBER,
7679                              type_of_txn IN NUMBER,
7680                              stmt_of_rowids OUT NOCOPY VARCHAR2) AS
7681    X_USER_ID                   NUMBER;
7682    X_USER_NAME                 VARCHAR2(100);
7683    X_REQUEST_ID                NUMBER;
7684    X_PROGRAM_APPLICATION_ID    NUMBER;
7685    X_PROGRAM_ID                NUMBER;
7686    X_LAST_UPDATE_LOGIN         NUMBER;
7687 
7688    X_PLAN_ID                   NUMBER;
7689    CHAR_ID_TABLE               NUMBER_TABLE;
7690    ENABLED_FLAG_TABLE          NUMBER_TABLE;
7691    MANDATORY_FLAG_TABLE        NUMBER_TABLE;
7692    DATATYPE_TABLE              NUMBER_TABLE;
7693    DECIMAL_PRECISION_TABLE     NUMBER_TABLE;
7694    VALUES_EXIST_FLAG_TABLE     NUMBER_TABLE;
7695    CHAR_NAME_TABLE             CHAR30_TABLE;
7696    DEVELOPER_NAME_TABLE        CHAR30_TABLE;
7697    RESULT_COLUMN_NAME_TABLE    CHAR30_TABLE;
7698    SQL_VALIDATION_STRING_TABLE CHAR1500_TABLE;
7699    HARDCODED_COLUMN_TABLE      CHAR30_TABLE;
7700    NUM_ELEMS                   BINARY_INTEGER;
7701    COPY_STMT_OF_ROWIDS         VARCHAR2(10000);
7702    READ_ONLY_FLAG_TABLE        NUMBER_TABLE;
7703 
7704 BEGIN
7705    X_USER_ID                := who_user_id;
7706    X_REQUEST_ID             := who_request_id;
7707    X_PROGRAM_APPLICATION_ID := who_program_application_id;
7708    X_PROGRAM_ID             := who_program_id;
7709    X_LAST_UPDATE_LOGIN      := who_last_update_login;
7710 
7711    -- get the current user name.
7712    SELECT USER_NAME
7713    INTO   X_USER_NAME
7714    FROM   FND_USER_VIEW
7715    WHERE  USER_ID = X_USER_ID;
7716 
7717    -- update who columns and org_id
7718    UPDATE QA_RESULTS_INTERFACE QRI
7719    SET    QA_CREATED_BY = X_USER_ID,
7720           QA_CREATED_BY_NAME = X_USER_NAME,
7721           QA_LAST_UPDATED_BY = X_USER_ID,
7722           QA_LAST_UPDATED_BY_NAME = X_USER_NAME,
7723           LAST_UPDATE_DATE = SYSDATE,
7724           LAST_UPDATED_BY = X_USER_ID,
7725           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
7726           REQUEST_ID = X_REQUEST_ID,
7727           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
7728           PROGRAM_ID = X_PROGRAM_ID,
7729           PROGRAM_UPDATE_DATE = SYSDATE,
7730           ORGANIZATION_ID =
7731                 (SELECT MIN(OOD.ORGANIZATION_ID)
7732                  FROM   MTL_PARAMETERS OOD
7733                  WHERE  OOD.ORGANIZATION_CODE = QRI.ORGANIZATION_CODE)
7734    WHERE  GROUP_ID = X_GROUP_ID
7735      AND  PROCESS_STATUS = 2;
7736 
7737    -- update plan_id and spec_id
7738    UPDATE QA_RESULTS_INTERFACE QRI
7739       SET -- plan_id
7740           PLAN_ID =
7741                 (SELECT MIN(QP.PLAN_ID)
7742                  FROM   QA_PLANS QP
7743                  WHERE  QP.NAME = QRI.PLAN_NAME
7744                    AND  QP.ORGANIZATION_ID = QRI.ORGANIZATION_ID),
7745           -- spec_id
7746           SPEC_ID =
7747                 (SELECT MIN(QSVV.SPEC_ID)
7748                  FROM   QA_SPECS QSVV
7749                  WHERE  QSVV.SPEC_NAME = QRI.SPEC_NAME
7750                    AND  QSVV.ORGANIZATION_ID = QRI.ORGANIZATION_ID
7751                      AND  trunc(sysdate) BETWEEN
7752                           nvl(trunc(qsvv.effective_from), trunc(sysdate)) AND
7753                           nvl(trunc(qsvv.effective_to), trunc(sysdate)))
7754     WHERE QRI.GROUP_ID = X_GROUP_ID
7755       AND QRI.PROCESS_STATUS = 2;
7756 
7757    IF TYPE_OF_TXN = 2 THEN
7758        SELECT MAX(PLAN_ID)
7759        INTO   X_PLAN_ID
7760        FROM   QA_RESULTS_INTERFACE QRI
7761        WHERE  QRI.GROUP_ID = X_GROUP_ID;
7762 
7763        SELECT
7764           qpc.char_id,
7765           upper(replace(qc.name, ' ', '_')),
7766           qc.hardcoded_column,
7767           qc.developer_name,
7768           qpc.result_column_name,
7769           qpc.enabled_flag,
7770           qpc.mandatory_flag,
7771           qc.datatype,
7772           nvl(qpc.decimal_precision,qc.decimal_precision),
7773           qc.sql_validation_string,
7774           qpc.values_exist_flag,
7775           qpc.read_only_flag
7776        BULK COLLECT INTO
7777           char_id_table,
7778           char_name_table,
7779           hardcoded_column_table,
7780           developer_name_table,
7781           result_column_name_table,
7782           enabled_flag_table,
7783           mandatory_flag_table,
7784           datatype_table,
7785           decimal_precision_table,
7786           sql_validation_string_table,
7787           values_exist_flag_table,
7788           read_only_flag_table
7789        FROM
7790           qa_chars qc,
7791           qa_plan_chars qpc
7792        WHERE
7793           qpc.plan_id = x_plan_id AND
7794           qpc.char_id = qc.char_id;
7795 
7796         NUM_ELEMS := char_id_table.count;
7797 
7798         COPY_STMT_OF_ROWIDS := VALIDATE_UPDATE_TYPE_RECORDS(X_GROUP_ID,
7799                                                  X_PLAN_ID,
7800                                                  CHAR_NAME_TABLE,
7801                                                  DEVELOPER_NAME_TABLE,
7802                                                  HARDCODED_COLUMN_TABLE,
7803                                                  DATATYPE_TABLE,
7804                                                  NUM_ELEMS,
7805                                                  X_USER_ID,
7806                                                  X_LAST_UPDATE_LOGIN,
7807                                                  X_REQUEST_ID,
7808                                                  X_PROGRAM_APPLICATION_ID,
7809                                                  X_PROGRAM_ID);
7810         STMT_OF_ROWIDS := COPY_STMT_OF_ROWIDS;
7811 
7812         IF COPY_STMT_OF_ROWIDS IS NOT NULL THEN
7813             RETRIEVE_UPDATE_RECORDS(X_GROUP_ID,
7814                                   COPY_STMT_OF_ROWIDS,
7815                                   DEVELOPER_NAME_TABLE,
7816                                   RESULT_COLUMN_NAME_TABLE,
7817                                   DATATYPE_TABLE,
7818                                   CHAR_NAME_TABLE,
7819                                   NUM_ELEMS,
7820                                   X_PLAN_ID,
7821                                   READ_ONLY_FLAG_TABLE,
7822                                   ENABLED_FLAG_TABLE);
7823         END IF;
7824    END IF;
7825 
7826 END update_no_validate;
7827 
7828 
7829 PROCEDURE TRANSFER_VALID_ROWS(X_GROUP_ID NUMBER,
7830                               X_USER_ID NUMBER,
7831                               X_LAST_UPDATE_LOGIN NUMBER,
7832                               X_TXN_HEADER_ID NUMBER,
7833                               X_REQUEST_ID NUMBER,
7834                               X_PROGRAM_APPLICATION_ID NUMBER,
7835                               X_PROGRAM_ID NUMBER) IS
7836    X_PLAN_ID                NUMBER;
7837    I                        NUMBER;
7838    NUM_ELEMS                NUMBER;
7839    RESULT_COLUMN_NAME_TABLE CHAR30_TABLE;
7840    COLUMN_LIST              VARCHAR2(10000);
7841    VALUE_LIST               VARCHAR2(10000);
7842    SQL_STATEMENT            VARCHAR2(20000);
7843 
7844    -- For bug2548710.
7845    K                    NUMBER := 0;
7846    NUM_ROWS             NUMBER;
7847    X_INTERFACE_ID       NUMBER;
7848    SOURCE_CURSOR        INTEGER;
7849    IGNORE               INTEGER;
7850    ERRMSG               VARCHAR2(30);
7851    ID_FIELD             VARCHAR2(30);
7852    INTERFACE_ID_TABLE   NUMBER_TABLE;
7853 
7854    -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
7855    l_return_status      VARCHAR2(1);
7856 
7857 BEGIN
7858    SELECT MAX(PLAN_ID)
7859    INTO   X_PLAN_ID
7860    FROM   QA_RESULTS_INTERFACE QRI
7861    WHERE  QRI.GROUP_ID = X_GROUP_ID
7862      AND  PROCESS_STATUS = 2;
7863 
7864    -- if no rows were successfully validated, no need to continue
7865 
7866    IF (X_PLAN_ID IS NULL) THEN
7867       RETURN;
7868    END IF;
7869 
7870    -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
7871    -- comment out the following code
7872 /*
7873 
7874    -- Get all the interface_ids for this group_id onto a struct.
7875    -- We need to update the SEQUENCExx columns before we insert into
7876    -- QA_RESULTS. For more info see Bug 2548710.
7877 
7878    -- Bug 3136107.
7879    -- SQL Bind project. Code modified to use bind variables instead of literals
7880    -- Same as the fix done for Bug 3079312.suramasw.
7881 
7882    SQL_STATEMENT :=
7883          'SELECT TRANSACTION_INTERFACE_ID ' ||
7884          'FROM QA_RESULTS_INTERFACE QRI ' ||
7885          'WHERE QRI.GROUP_ID = :GROUP_ID ' ||
7886          ' AND QRI.PROCESS_STATUS = 2 ' ||
7887          ' AND NOT EXISTS
7888                (SELECT ''X'' ' ||
7889                'FROM QA_INTERFACE_ERRORS QIE ' ||
7890                'WHERE QIE.TRANSACTION_INTERFACE_ID = ' ||
7891                   'QRI.TRANSACTION_INTERFACE_ID )';
7892 
7893 
7894    SOURCE_CURSOR := DBMS_SQL.OPEN_CURSOR;
7895    DBMS_SQL.PARSE(SOURCE_CURSOR, SQL_STATEMENT, DBMS_SQL.NATIVE);
7896 
7897    DBMS_SQL.BIND_VARIABLE(SOURCE_CURSOR, ':GROUP_ID', X_GROUP_ID);
7898 
7899    DBMS_SQL.DEFINE_COLUMN(SOURCE_CURSOR, 1, X_INTERFACE_ID);
7900    IGNORE := DBMS_SQL.EXECUTE(SOURCE_CURSOR);
7901 
7902    LOOP
7903       IF (DBMS_SQL.FETCH_ROWS(SOURCE_CURSOR) > 0) THEN
7904          K := K + 1;
7905          DBMS_SQL.COLUMN_VALUE(SOURCE_CURSOR, 1, X_INTERFACE_ID);
7906          INTERFACE_ID_TABLE(K) := X_INTERFACE_ID;
7907       ELSE
7908          EXIT;
7909       END IF;
7910    END LOOP;
7911    NUM_ROWS := K ;
7912    DBMS_SQL.CLOSE_CURSOR(SOURCE_CURSOR);
7913 
7914    -- Before we update, make sure that all the variables are initialized.
7915    -- Exceptions can rise, if its not done.
7916 
7917    IF (G_INIT_SEQ_TAB = 1) THEN
7918       -- Call local initialization procedure. Bug 2548710 rponnusa Mon Nov 18 03:49:15 PST 2002
7919 
7920       INIT_SEQ_TABLE(NUM_ROWS);
7921    END IF;
7922 
7923    -- Use the bulk binding option to update all the SEQUENCExx columns
7924    -- together. Fetch the values for all sequence columns from the
7925    -- global variables. For more info see bug 2548710.
7926 
7927    FORALL J IN 1..NUM_ROWS
7928       UPDATE QA_RESULTS_INTERFACE QRI
7929       SET    SEQUENCE1  = G_SEQ_TAB1(J),
7930              SEQUENCE2  = G_SEQ_TAB2(J),
7931              SEQUENCE3  = G_SEQ_TAB3(J),
7932              SEQUENCE4  = G_SEQ_TAB4(J),
7933              SEQUENCE5  = G_SEQ_TAB5(J),
7934              SEQUENCE6  = G_SEQ_TAB6(J),
7935              SEQUENCE7  = G_SEQ_TAB7(J),
7936              SEQUENCE8  = G_SEQ_TAB8(J),
7937              SEQUENCE9  = G_SEQ_TAB9(J),
7938              SEQUENCE10 = G_SEQ_TAB10(J),
7939              SEQUENCE11 = G_SEQ_TAB11(J),
7940              SEQUENCE12 = G_SEQ_TAB12(J),
7941              SEQUENCE13 = G_SEQ_TAB13(J),
7942              SEQUENCE14 = G_SEQ_TAB14(J),
7943              SEQUENCE15 = G_SEQ_TAB15(J)
7944       WHERE  QRI.GROUP_ID = X_GROUP_ID
7945       AND    QRI.TRANSACTION_INTERFACE_ID = INTERFACE_ID_TABLE(J)
7946       AND    NOT EXISTS
7947                 (SELECT 'X'
7948                  FROM QA_INTERFACE_ERRORS QIE
7949                  WHERE QIE.TRANSACTION_INTERFACE_ID = QRI.TRANSACTION_INTERFACE_ID);
7950 
7951    -- End of changes for bug 2548710.
7952 */
7953 
7954    I := 0;
7955    -- Bug 4958776. SQL Repository Fix SQL ID: 15009245
7956    FOR CHARREC IN (SELECT RESULT_COLUMN_NAME
7957                      FROM QA_PLAN_CHARS
7958                     WHERE PLAN_ID = X_PLAN_ID) LOOP
7959       I := I + 1;
7960       RESULT_COLUMN_NAME_TABLE(I) := CHARREC.RESULT_COLUMN_NAME;
7961    END LOOP;
7962    NUM_ELEMS := I;
7963 
7964    --
7965    -- Modified the COLUMN_LIST and VALUE_LIST to include
7966    -- new columns added for ASO project.
7967    -- This would make ID-transfer without validations
7968    -- rkunchal Thu Jul 25 01:43:48 PDT 2002
7969    --
7970 
7971    COLUMN_LIST := 'COLLECTION_ID, OCCURRENCE, LAST_UPDATE_DATE, ' ||
7972          'QA_LAST_UPDATE_DATE, LAST_UPDATED_BY, QA_LAST_UPDATED_BY, ' ||
7973          'CREATION_DATE, QA_CREATION_DATE, CREATED_BY, QA_CREATED_BY, ' ||
7974          'LAST_UPDATE_LOGIN, REQUEST_ID, PROGRAM_APPLICATION_ID, ' ||
7975          'PROGRAM_ID, PROGRAM_UPDATE_DATE, ' ||
7976          'TXN_HEADER_ID, ' ||
7977          'ORGANIZATION_ID, PLAN_ID, SPEC_ID,' ||
7978          'MTI_TRANSACTION_HEADER_ID,' ||
7979          'MTI_TRANSACTION_INTERFACE_ID,' ||
7980          'MMT_TRANSACTION_ID,' ||
7981          'WJSI_GROUP_ID,' ||
7982          'WMTI_GROUP_ID,' ||
7983          'WMT_TRANSACTION_ID,' ||
7984          'RTI_INTERFACE_TRANSACTION_ID ' ;
7985 
7986    -- Bug 3136107.
7987    -- SQL Bind project. Code modified to use bind variables instead of literals
7988    -- Same as the fix done for Bug 3079312.suramasw.
7989 
7990    VALUE_LIST := 'COLLECTION_ID, QA_OCCURRENCE_S.NEXTVAL, SYSDATE, ' ||
7991          'SYSDATE,  :USER_ID, QA_LAST_UPDATED_BY, ' ||
7992          'SYSDATE, SYSDATE, :USER_ID2, QA_CREATED_BY, ' ||
7993          ':LAST_UPDATE_LOGIN, :REQUEST_ID, :PROGRAM_APPLICATION_ID, ' ||
7994          ':PROGRAM_ID, SYSDATE,:TXN_HEADER_ID ' ||
7995          ', ORGANIZATION_ID, PLAN_ID, NVL(SPEC_ID, 0),' ||
7996          'MTI_TRANSACTION_HEADER_ID,' ||
7997          'MTI_TRANSACTION_INTERFACE_ID,' ||
7998          'MMT_TRANSACTION_ID,' ||
7999          'WJSI_GROUP_ID,' ||
8000          'WMTI_GROUP_ID,' ||
8001          'WMT_TRANSACTION_ID,' ||
8002          'RTI_INTERFACE_TRANSACTION_ID ' ;
8003 
8004    FOR I IN 1..NUM_ELEMS LOOP
8005       COLUMN_LIST := COLUMN_LIST || ', ' || RESULT_COLUMN_NAME_TABLE(I);
8006       VALUE_LIST := VALUE_LIST || ', ' || RESULT_COLUMN_NAME_TABLE(I);
8007    END LOOP;
8008 
8009    -- build the sql statement that transfers records into qa_results
8010 
8011    SQL_STATEMENT := 'INSERT INTO QA_RESULTS (' || COLUMN_LIST ||
8012          ') SELECT ' || VALUE_LIST || ' FROM QA_RESULTS_INTERFACE ' ||
8013          'WHERE GROUP_ID = :GROUP_ID ' ||
8014          ' AND  PROCESS_STATUS = 2';
8015 
8016    -- Bug 3136107.
8017    -- SQL Bind project. Code modified to use bind variables instead of literals
8018    -- Same as the fix done for Bug 3079312.suramasw.
8019 
8020    EXECUTE IMMEDIATE SQL_STATEMENT USING X_USER_ID,
8021                                          X_USER_ID,
8022                                          X_LAST_UPDATE_LOGIN,
8023                                          X_REQUEST_ID,
8024                                          X_PROGRAM_APPLICATION_ID,
8025                                          X_PROGRAM_ID,
8026                                          X_TXN_HEADER_ID,
8027                                          X_GROUP_ID;
8028 
8029    -- QLTTRAFB.EXEC_SQL(SQL_STATEMENT);
8030 
8031   -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
8032   -- call api to generate seq. value for all the records identified by txn_header_id
8033   -- we can safely call sequence api before inserting history/automatic records
8034   -- since Seq. values only going to be copied to history/automatic records
8035   QA_SEQUENCE_API.Generate_Seq_for_DDE(X_TXN_HEADER_ID,X_PLAN_ID,l_return_status);
8036 
8037    -- Bug 2302539
8038    -- To process History/automatic records in Parent-child
8039    -- scanario the following call added.
8040    -- rponnusa Wed Apr 24 12:19:54 PDT 2002
8041 
8042    QA_PARENT_CHILD_PKG.insert_history_auto_rec(X_PLAN_ID, X_TXN_HEADER_ID, 1, 2) ;
8043    QA_PARENT_CHILD_PKG.insert_history_auto_rec(X_PLAN_ID, X_TXN_HEADER_ID, 1, 4) ;
8044 
8045 END TRANSFER_VALID_ROWS;
8046 
8047 
8048 FUNCTION TRANSACTION_WORKER(X_GROUP_ID NUMBER,
8049                             X_VAL_FLAG NUMBER,
8050                             X_DEBUG VARCHAR2,
8051 			    TYPE_OF_TXN NUMBER) RETURN BOOLEAN IS
8052 
8053    X_USER_ID                NUMBER;
8054    X_REQUEST_ID             NUMBER;
8055    X_PROGRAM_APPLICATION_ID NUMBER;
8056    X_PROGRAM_ID             NUMBER;
8057    X_LAST_UPDATE_LOGIN      NUMBER;
8058    X_COLLECTION_ID          NUMBER;
8059    X_TXN_HEADER_ID          NUMBER := 0;
8060    ACTIONS_REQUEST_ID       NUMBER;
8061    DUMMY                    NUMBER;
8062 
8063    ERRCODE                  BOOLEAN;
8064    ACTION_FLAG              BOOLEAN;
8065    CRITICAL_ERROR           EXCEPTION;
8066 
8067    STMT_OF_ROWIDS	    VARCHAR2(10000);    -- For update capabilities.
8068    l_error_message          VARCHAR2(240);
8069 
8070    CURSOR C IS SELECT MARKER FROM QA_RESULTS_INTERFACE
8071          WHERE GROUP_ID = X_GROUP_ID
8072          AND   PROCESS_STATUS = 2
8073          AND   MARKER IS NOT NULL;
8074 
8075 BEGIN
8076    X_USER_ID := who_user_id;
8077    X_REQUEST_ID := who_request_id;
8078    X_PROGRAM_APPLICATION_ID := who_program_application_id;
8079    X_PROGRAM_ID := who_program_id;
8080    X_LAST_UPDATE_LOGIN := who_last_update_login;
8081 
8082    -- update process status to 2 (running) for rows in this group
8083 
8084    UPDATE QA_RESULTS_INTERFACE
8085    SET    PROCESS_STATUS = 2,
8086           REQUEST_ID = X_REQUEST_ID,
8087           LAST_UPDATE_DATE = SYSDATE,
8088           LAST_UPDATED_BY = X_USER_ID,
8089           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
8090           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
8091           PROGRAM_ID = X_PROGRAM_ID,
8092           PROGRAM_UPDATE_DATE = SYSDATE
8093    WHERE  GROUP_ID = X_GROUP_ID;
8094 
8095    -- Get the count of records processed by each worker.
8096    -- Bug 2548710 rponnusa Mon Nov 18 03:49:15 PST 2002
8097 
8098    G_ROW_COUNT := SQL%ROWCOUNT;
8099 
8100    -- delete rows from the errors table that are associated with the
8101    -- rows we are about to validate.  we do this so that old errors will
8102    -- not stick around after the user has resubmitted a record.
8103 
8104    DELETE FROM QA_INTERFACE_ERRORS
8105    WHERE  TRANSACTION_INTERFACE_ID IN
8106       (SELECT TRANSACTION_INTERFACE_ID
8107          FROM QA_RESULTS_INTERFACE
8108         WHERE GROUP_ID = X_GROUP_ID);
8109 
8110    COMMIT;
8111 
8112    -- Modified call to 'Validate'.  Added 2 more parameters as a result of
8113    -- adding update capabilities.
8114    IF (X_VAL_FLAG = 1) THEN
8115       ERRCODE := QLTTRAWB.VALIDATE(X_GROUP_ID,TYPE_OF_TXN,STMT_OF_ROWIDS);
8116       IF (ERRCODE = FALSE) THEN
8117          RAISE CRITICAL_ERROR;
8118       END IF;
8119    --
8120    -- Bugs 5641894, 5752546
8121    -- Made a call to the procedure update_no_validate to update the plan_id, org_id, spec_id and the who columns in case the validation flag has been set to FALSE
8122    -- For bug 5752546 added two more parameters, one to send the type of transaction 1 - Insert and 2 - Update and the other parameter gets the row_ids which would be used for update transactions.
8123    -- skolluku Tue Feb 20 2007
8124    --
8125    ELSE
8126       update_no_validate(X_GROUP_ID,TYPE_OF_TXN,STMT_OF_ROWIDS);
8127    END IF;
8128 
8129    -- update collection_id, qa_created_by, and qa_last_updated_by
8130    -- if they are null for inserts
8131    -- update qa_created_by and qa_last_updated_by if they are null for updates
8132 
8133    IF TYPE_OF_TXN <> 2
8134      THEN SELECT QA_COLLECTION_ID_S.NEXTVAL INTO X_COLLECTION_ID FROM DUAL;
8135    		UPDATE QA_RESULTS_INTERFACE
8136    		SET    COLLECTION_ID = NVL(COLLECTION_ID, X_COLLECTION_ID),
8137           	  QA_CREATED_BY = NVL(QA_CREATED_BY, X_USER_ID),
8138           	  QA_LAST_UPDATED_BY = NVL(QA_LAST_UPDATED_BY, X_USER_ID)
8139    		WHERE  GROUP_ID = X_GROUP_ID
8140      	AND  PROCESS_STATUS = 2;
8141      ELSE UPDATE QA_RESULTS_INTERFACE
8142 		SET  QA_CREATED_BY = NVL(QA_CREATED_BY, X_USER_ID),
8143 		     QA_LAST_UPDATED_BY = NVL(QA_LAST_UPDATED_BY, X_USER_ID)
8144 	     WHERE  GROUP_ID = X_GROUP_ID
8145 		AND  PROCESS_STATUS = 2;
8146    END IF;
8147 
8148 
8149    -- figure out if action package needs to be called by seeing if any
8150    -- rows have a non-null marker column
8151 
8152    OPEN C;
8153    FETCH C INTO DUMMY;
8154    IF (C%FOUND) THEN
8155       ACTION_FLAG := TRUE;
8156    ELSE
8157       ACTION_FLAG := FALSE;
8158    END IF;
8159    CLOSE C;
8160 
8161    -- we need to select a txn_header_id, in case actions were fired
8162 
8163    SELECT MTL_MATERIAL_TRANSACTIONS_S.NEXTVAL INTO X_TXN_HEADER_ID FROM DUAL;
8164 
8165    -- insert the valid records into the results table
8166    -- modified for update capabilities; 1 = 'INSERT' and 2 = 'UPDATE'
8167    -- also everything else will be interpreted as 'INSERT'
8168    IF TYPE_OF_TXN = 2 THEN
8169        POPULATE_HISTORY_TABLE(X_GROUP_ID, X_TXN_HEADER_ID,
8170 	   STMT_OF_ROWIDS, X_USER_ID, X_LAST_UPDATE_LOGIN,
8171            X_REQUEST_ID,X_PROGRAM_APPLICATION_ID,X_PROGRAM_ID);
8172 
8173        UPDATE_VALID_ROWS(X_GROUP_ID, X_USER_ID, X_LAST_UPDATE_LOGIN,
8174            X_TXN_HEADER_ID, X_REQUEST_ID,
8175 	   X_PROGRAM_APPLICATION_ID,
8176            X_PROGRAM_ID, STMT_OF_ROWIDS);
8177    ELSE
8178        TRANSFER_VALID_ROWS(X_GROUP_ID, X_USER_ID, X_LAST_UPDATE_LOGIN,
8179            X_TXN_HEADER_ID, X_REQUEST_ID,
8180 	   X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID);
8181    END IF;
8182 
8183 
8184    -- if actions were triggered, fire the actions package.  we will also
8185    -- fire the actions package if validate flag is false.  in this case,
8186    -- we haven't done any validation, so we have no way of knowing for sure
8187    -- whether or not actions were triggered.  to be safe, we have to fire
8188    -- the actions package every time, even though it may not be needed.
8189 
8190    -- Passing IMPORT as the value for ARGUMENT2 in qltactwb.
8191    -- whenever qltactwb is called from qlttrawb, the value IMPORT will
8192    -- also be passed.
8193    -- Bug 3273447. suramasw
8194 
8195    IF ((ACTION_FLAG = TRUE) OR (X_VAL_FLAG = 2)) THEN
8196       ACTIONS_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST('QA', 'QLTACTWB', NULL,
8197             NULL, FALSE, X_TXN_HEADER_ID,'IMPORT');
8198    END IF;
8199 
8200    -- update process status to 4 for successful rows
8201 
8202    UPDATE QA_RESULTS_INTERFACE
8203    SET    PROCESS_STATUS = 4,
8204           REQUEST_ID = X_REQUEST_ID,
8205           LAST_UPDATE_DATE = SYSDATE,
8206           LAST_UPDATED_BY = X_USER_ID,
8207           LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
8208           PROGRAM_APPLICATION_ID = X_PROGRAM_APPLICATION_ID,
8209           PROGRAM_ID = X_PROGRAM_ID,
8210           PROGRAM_UPDATE_DATE = SYSDATE
8211    WHERE  GROUP_ID = X_GROUP_ID
8212      AND  PROCESS_STATUS = 2;
8213 
8214    -- delete any error messages still around for successfully-validated rows
8215 
8216    DELETE FROM QA_INTERFACE_ERRORS
8217    WHERE  TRANSACTION_INTERFACE_ID IN
8218    (SELECT TRANSACTION_INTERFACE_ID
8219       FROM QA_RESULTS_INTERFACE
8220      WHERE PROCESS_STATUS = 4);
8221 
8222    -- delete all status 4 rows, not just the ones associated with the
8223    -- current group id.  we delete all so that if the user changed a
8224    -- record's status to 4 in the update form, it won't stay around forever.
8225    -- only delete the rows if the MRP_DEBUG profile is not set to Y.
8226 
8227    IF (NVL(X_DEBUG, 'N') <> 'Y') THEN
8228       DELETE FROM QA_RESULTS_INTERFACE WHERE PROCESS_STATUS = 4;
8229    END IF;
8230 
8231    COMMIT;
8232 
8233    RETURN TRUE;
8234 
8235 EXCEPTION
8236 
8237    -- user_sql_error exception was added for better diagnosis of import
8238    -- problems, which most often is limited to user defined sql validation
8239    -- string.  Please see bug # 1680481 for details.
8240    --
8241    -- ORASHID
8242 
8243    WHEN user_sql_error THEN
8244 
8245        l_error_message := error_bad_sql || ' ' || g_sqlerrm;
8246 
8247        INSERT INTO qa_interface_errors
8248            (transaction_interface_id, error_message, error_column,
8249             last_update_date, last_updated_by,
8250             creation_date, created_by, last_update_login,
8251             request_id, program_application_id, program_id,
8252             program_update_date)
8253        SELECT transaction_interface_id, substr(l_error_message,1, 240),
8254            g_col_name, sysdate, x_user_id, sysdate, x_user_id,
8255            x_last_update_login, x_request_id, x_program_application_id,
8256            x_program_id, sysdate
8257        FROM qa_results_interface
8258        WHERE group_id = x_group_id;
8259 
8260        UPDATE qa_results_interface
8261        SET    process_status = 3
8262        WHERE  group_id = x_group_id;
8263 
8264        COMMIT;
8265        RETURN FALSE;
8266 
8267    WHEN OTHERS THEN
8268       INSERT INTO QA_INTERFACE_ERRORS
8269          (TRANSACTION_INTERFACE_ID, ERROR_MESSAGE, ERROR_COLUMN,
8270           LAST_UPDATE_DATE, LAST_UPDATED_BY,
8271           CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN,
8272           REQUEST_ID, PROGRAM_APPLICATION_ID, PROGRAM_ID,
8273           PROGRAM_UPDATE_DATE)
8274       SELECT TRANSACTION_INTERFACE_ID, ERROR_CRITICAL, NULL,
8275           SYSDATE, X_USER_ID,
8276           SYSDATE, X_USER_ID, X_LAST_UPDATE_LOGIN,
8277           X_REQUEST_ID, X_PROGRAM_APPLICATION_ID, X_PROGRAM_ID,
8278           SYSDATE
8279       FROM QA_RESULTS_INTERFACE
8280       WHERE GROUP_ID = X_GROUP_ID;
8281 
8282       UPDATE QA_RESULTS_INTERFACE
8283       SET    PROCESS_STATUS = 3
8284       WHERE  GROUP_ID = X_GROUP_ID;
8285 
8286       COMMIT;
8287       RETURN FALSE;
8288 
8289 END TRANSACTION_WORKER;
8290 
8291 
8292 -- This is a new function that adds multiple update capability to the
8293 -- current collection import module (which could only process one
8294 -- update at a time.
8295 --
8296 -- Bryan So (BSO) 1/2/1998
8297 
8298 FUNCTION TRANSACTION_UPDATE(G_ID NUMBER,
8299                             VAL_FLAG NUMBER,
8300                             DEBUG VARCHAR2,
8301 			    TYPE_OF_TXN NUMBER) RETURN BOOLEAN IS
8302 
8303    NEW_GROUP_ID NUMBER;
8304    RESULT BOOLEAN;
8305    CURSOR c1 IS SELECT rowid
8306                 FROM QA_RESULTS_INTERFACE
8307                 WHERE GROUP_ID = G_ID;
8308 
8309 BEGIN
8310     -- Loop through the group of update records
8311     RESULT := TRUE;
8312     FOR rec IN c1 LOOP
8313         -- Get a new group ID to be used for the update records.
8314         SELECT QA_GROUP_S.NEXTVAL INTO NEW_GROUP_ID FROM DUAL;
8315 
8316         UPDATE QA_RESULTS_INTERFACE
8317             SET GROUP_ID = NEW_GROUP_ID
8318   	    WHERE rowid = rec.rowid;
8319 
8320         -- Call the old transaction worker to do the job.
8321 	-- Result will be set to true if ALL updates succeed.
8322 	-- (All updates will be processed even if some of them fail.)
8323 
8324 	RESULT := RESULT and TRANSACTION_WORKER(NEW_GROUP_ID,
8325 		    VAL_FLAG, DEBUG, TYPE_OF_TXN);
8326     END LOOP;
8327 
8328     RETURN RESULT;
8329 
8330 END TRANSACTION_UPDATE;
8331 
8332 
8333 -- wrapper so that the transaction worker can be called as a concurrent
8334 -- program.
8335 --
8336 --    argument1 is the group id
8337 --    argument2 is a validation flag
8338 --    argument3 is a debug flag (profile MRP_DEBUG)
8339 --    argument4 is transaction type (2 = update, else insert)
8340 --    argument5 is workflow key (or null if no workflow launched)
8341 --    argument6 is the parent's (import manager) request ID
8342 --    argument7 is the user id of the person who ran import
8343 --    argument8 is the workflow itemtype
8344 
8345 
8346 PROCEDURE WRAPPER (ERRBUF OUT NOCOPY VARCHAR2,
8347                    RETCODE OUT NOCOPY VARCHAR2,
8348                    ARGUMENT1 IN VARCHAR2,
8349                    ARGUMENT2 IN VARCHAR2,
8350                    ARGUMENT3 IN VARCHAR2,
8351 		   ARGUMENT4 IN VARCHAR2,
8352 		   ARGUMENT5 IN VARCHAR2,
8353 		   ARGUMENT6 IN VARCHAR2,
8354                    ARGUMENT7 IN VARCHAR2,
8355 		   ARGUMENT8 IN VARCHAR2) IS
8356 
8357    X_RETURN BOOLEAN;
8358    TYPE_OF_TXN NUMBER;
8359    workflow_type Varchar2(8) := argument8;
8360    workflow_key number := to_number(argument5);
8361 BEGIN
8362     -- R12 Project MOAC 4637896.  Simple MOAC Initialization needed.
8363     -- This will initialize MOAC entities' VPD security to populate
8364     -- them with the right values for validation purpose.
8365     -- bso Sun Oct  2 11:48:14 PDT 2005
8366     qa_moac_pkg.init;
8367 
8368    -- get the translated message text
8369 
8370 -- Just a test 'bso delete this later
8371 -- qlttrafb.exec_sql('alter session set nls_numeric_characters='',.''');
8372 
8373    ERROR_REJECT := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_REJECT'));
8374    ERROR_DISABLED := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_DISABLED'));
8375    ERROR_MANDATORY := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_MANDATORY'));
8376    ERROR_NEED_PARENT := dequote(FND_MESSAGE.GET_STRING('QA',
8377          'QA_INTERFACE_NEED_PARENT'));
8378    ERROR_INVALID_VALUE := dequote(FND_MESSAGE.GET_STRING('QA',
8379          'QA_INTERFACE_INVALID_VALUE'));
8380    ERROR_OUTSIDE_LIMITS := dequote(FND_MESSAGE.GET_STRING('QA',
8381          'QA_INTERFACE_OUTSIDE_LIMITS'));
8382    ERROR_CRITICAL := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_CRITICAL'));
8383    ERROR_INVALID_NUMBER := dequote(FND_MESSAGE.GET_STRING('QA',
8384          'QA_INTERFACE_INVALID_NUMBER'));
8385    ERROR_INVALID_DATE := dequote(FND_MESSAGE.GET_STRING('QA',
8386          'QA_INTERFACE_INVALID_DATE'));
8387 
8388    ERROR_NEED_REV := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_NEED_REV'));
8389    ERROR_CANT_HAVE_REV := dequote(FND_MESSAGE.GET_STRING('QA',
8390          'QA_INTERFACE_CANT_HAVE_REV'));
8391    ERROR_CANT_HAVE_LOC := dequote(FND_MESSAGE.GET_STRING('QA',
8392          'QA_INTERFACE_CANT_HAVE_LOC'));
8393    ERROR_BUSY := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_BUSY'));
8394    ERROR_BAD_SQL := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_BAD_USER_SQL'));
8395 
8396    -- Gapless Sequence Proj. rponnusa Wed Jul 30 04:52:45 PDT 2003
8397    G_SEQUENCE_DEFAULT := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_SEQ_DEFAULT'));
8398 
8399    -- Tracking Bug : 3104827. Review Tracking Bug : 3148873
8400    -- Added to Get Error Message String for Read Only Flag Collection Plan Elements
8401    -- saugupta Wed Aug 27 07:25:51 PDT 2003.
8402    ERROR_READ_ONLY := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_READ_ONLY'));
8403 
8404    -- Bug 3069404 ksoh Tue Mar 16 10:43:36 PST 2004
8405    -- Error message for importing sequence element
8406    ERROR_SEQUENCE := dequote(FND_MESSAGE.GET_STRING('QA', 'QA_INTERFACE_SEQUENCE'));
8407 
8408    -- For Timezone Compliance bug 3179845. Error used for invalid date and Time.
8409    -- kabalakr Mon Oct 27 04:33:49 PST 2003.
8410 
8411    ERROR_INVALID_DATETIME := dequote(FND_MESSAGE.GET_STRING('QA',
8412          'QA_INTERFACE_INVALID_DATETIME'));
8413 
8414 
8415    --
8416    -- A rather unusual situation, we will use the request id of the
8417    -- parent (import manager).  This will be set in the wrapper.
8418    -- bso
8419    --
8420    who_request_id := to_number(argument6);
8421    who_created_by := to_number(argument7);
8422    who_user_id    := to_number(argument7);
8423    who_last_update_login := to_number(argument7);
8424 
8425    TYPE_OF_TXN := TO_NUMBER(ARGUMENT4);
8426    -- Bug 3785197. Update was failing if read only or sequence elements was set as matching element.
8427    -- Storing the transaction type to a global variable which will be used in VALIDATE_STEPS()
8428    -- procedure. G_TYPE_OF_TXN = 1 (Insert) or 2 (Update).
8429    -- srhariha. Fri Jul 23 03:04:52 PDT 2004.
8430    G_TYPE_OF_TXN := TYPE_OF_TXN;
8431 
8432   IF TYPE_OF_TXN = 1 THEN -- perform insert
8433        X_RETURN := TRANSACTION_WORKER(TO_NUMBER(ARGUMENT1),
8434 		     TO_NUMBER(ARGUMENT2), ARGUMENT3, TYPE_OF_TXN);
8435    ELSE -- perform update
8436        X_RETURN := TRANSACTION_UPDATE(TO_NUMBER(ARGUMENT1),
8437 		     TO_NUMBER(ARGUMENT2), ARGUMENT3, TYPE_OF_TXN);
8438    END IF;
8439 
8440    COMMIT;
8441 
8442    --
8443    -- If some import records are inserted through self-service apps,
8444    -- then the workflow_key passed in will not be null.  A workflow
8445    -- have also been launched by the manager.  This workflow is in
8446    -- blocking state until all workers finish.  Since we just finished,
8447    -- tell workflow to unblock one worker.
8448    --
8449    IF workflow_key IS NOT NULL THEN
8450        qa_ss_import_wf.unblock(workflow_type, workflow_key);
8451    END IF;
8452 
8453    ERRBUF := '';
8454    IF X_RETURN THEN
8455        RETCODE := 0;
8456    ELSE
8457        RETCODE := 1;
8458    END IF;
8459 
8460    EXCEPTION WHEN OTHERS THEN
8461        --
8462        -- Of utmost importance is to terminate the workflow (if there
8463        -- is one) even in critical situation.  Otherwise, workflow
8464        -- will loop.
8465        --
8466        IF workflow_key IS NOT NULL THEN
8467            qa_ss_import_wf.unblock(workflow_type, workflow_key);
8468        END IF;
8469        raise;
8470 
8471 END WRAPPER;
8472 
8473 -- Bug 2548710. Added following procedure
8474 -- rponnusa Mon Nov 18 03:49:15 PST 2002
8475 
8476 PROCEDURE INIT_SEQ_TABLE(p_count IN NUMBER) IS
8477 
8478 -- Initialize all unused g_seq_tabxx to null before going for bulk update
8479 
8480 BEGIN
8481   IF G_SEQ_TAB1 IS NULL THEN
8482      G_SEQ_TAB1 := CHAR50_TABLE();
8483      G_SEQ_TAB1.EXTEND(p_count);
8484   END IF;
8485 
8486   IF G_SEQ_TAB2 IS NULL THEN
8487      G_SEQ_TAB2 := CHAR50_TABLE();
8488      G_SEQ_TAB2.EXTEND(p_count);
8489   END IF;
8490 
8491   IF G_SEQ_TAB3 IS NULL THEN
8492      G_SEQ_TAB3 := CHAR50_TABLE();
8493      G_SEQ_TAB3.EXTEND(p_count);
8494   END IF;
8495 
8496   IF G_SEQ_TAB4 IS NULL THEN
8497      G_SEQ_TAB4 := CHAR50_TABLE();
8498      G_SEQ_TAB4.EXTEND(p_count);
8499   END IF;
8500 
8501   IF G_SEQ_TAB5 IS NULL THEN
8502      G_SEQ_TAB5 := CHAR50_TABLE();
8503      G_SEQ_TAB5.EXTEND(p_count);
8504   END IF;
8505 
8506   IF G_SEQ_TAB6 IS NULL THEN
8507      G_SEQ_TAB6 := CHAR50_TABLE();
8508      G_SEQ_TAB6.EXTEND(p_count);
8509   END IF;
8510 
8511   IF G_SEQ_TAB7 IS NULL THEN
8512      G_SEQ_TAB7 := CHAR50_TABLE();
8513      G_SEQ_TAB7.EXTEND(p_count);
8514   END IF;
8515 
8516   IF G_SEQ_TAB8 IS NULL THEN
8517      G_SEQ_TAB8 := CHAR50_TABLE();
8518      G_SEQ_TAB8.EXTEND(p_count);
8519   END IF;
8520 
8521   IF G_SEQ_TAB9 IS NULL THEN
8522      G_SEQ_TAB9 := CHAR50_TABLE();
8523      G_SEQ_TAB9.EXTEND(p_count);
8524   END IF;
8525 
8526   IF G_SEQ_TAB10 IS NULL THEN
8527      G_SEQ_TAB10 := CHAR50_TABLE();
8528      G_SEQ_TAB10.EXTEND(p_count);
8529   END IF;
8530 
8531   IF G_SEQ_TAB11 IS NULL THEN
8532      G_SEQ_TAB11 := CHAR50_TABLE();
8533      G_SEQ_TAB11.EXTEND(p_count);
8534   END IF;
8535 
8536   IF G_SEQ_TAB12 IS NULL THEN
8537      G_SEQ_TAB12 := CHAR50_TABLE();
8538      G_SEQ_TAB12.EXTEND(p_count);
8539   END IF;
8540 
8541   IF G_SEQ_TAB13 IS NULL THEN
8542      G_SEQ_TAB13 := CHAR50_TABLE();
8543      G_SEQ_TAB13.EXTEND(p_count);
8544   END IF;
8545 
8546   IF G_SEQ_TAB14 IS NULL THEN
8547      G_SEQ_TAB14 := CHAR50_TABLE();
8548      G_SEQ_TAB14.EXTEND(p_count);
8549   END IF;
8550 
8551   IF G_SEQ_TAB15 IS NULL THEN
8552      G_SEQ_TAB15 := CHAR50_TABLE();
8553      G_SEQ_TAB15.EXTEND(p_count);
8554   END IF;
8555 
8556   -- Gapless Sequence Proj Start.
8557   -- rponnusa Wed Jul 30 04:52:45 PDT 2003
8558 
8559   IF G_PLAN_ID_TAB IS NULL THEN
8560      G_PLAN_ID_TAB := NUM_TABLE();
8561      G_PLAN_ID_TAB.EXTEND(p_count);
8562   END IF;
8563 
8564   IF G_COLLECTION_ID_TAB IS NULL THEN
8565      G_COLLECTION_ID_TAB := NUM_TABLE();
8566      G_COLLECTION_ID_TAB.EXTEND(p_count);
8567   END IF;
8568 
8569   IF G_OCCURRENCE_TAB IS NULL THEN
8570      G_OCCURRENCE_TAB := NUM_TABLE();
8571      G_OCCURRENCE_TAB.EXTEND(p_count);
8572   END IF;
8573 
8574   IF G_TXN_HEADER_ID_TAB IS NULL THEN
8575      G_TXN_HEADER_ID_TAB := NUM_TABLE();
8576      G_TXN_HEADER_ID_TAB.EXTEND(p_count);
8577   END IF;
8578 
8579  -- Gapless Sequence Proj End
8580 
8581   G_INIT_SEQ_TAB := 2;
8582 
8583 END INIT_SEQ_TABLE;
8584 
8585 
8586 
8587 
8588 
8589 
8590 
8591 
8592 END QLTTRAWB;
8593