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