DBA Data[Home] [Help]

PACKAGE BODY: APPS.QLTTRAWB

Source


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