[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