DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_QC_TEST_VALUES_GRP

Source


1 PACKAGE BODY GMD_QC_TEST_VALUES_GRP as
2 /* $Header: GMDGTVLB.pls 115.9 2002/11/21 18:34:22 mchandak noship $*/
3 
4 /*===========================================================================
5   PROCEDURE  NAME:	check_range_overlap
6 
7   DESCRIPTION:		This procedure checks for test type 'L' - numeric
8   			range with label whether the subrange overlaps
9   			with any other subrange within a test.
10   			This procedure should be called after insert/update
11   			of GMD_QC_TEST_VALUES_TL for test type 'L' but BEFORE
12   			COMMIT.
13 
14   PARAMETERS:		In  : p_test_id
15   			OUT : x_min_range - minimum value of the whole range.
16   			      x_max_range - maximum value of the whole range.
17 
18   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
19 ===========================================================================*/
20 PROCEDURE CHECK_RANGE_OVERLAP(
21 		    p_test_id		 IN   VARCHAR2,
22 		    x_min_range		 OUT NOCOPY  NUMBER,
23 		    x_max_range          OUT NOCOPY  NUMBER,
24 		    x_return_status      OUT NOCOPY  VARCHAR2,
25          	    x_message_data       OUT NOCOPY VARCHAR2) IS
26 
27 l_progress  VARCHAR2(3);
28 l_exists    VARCHAR2(1);
29 l_min	    NUMBER;
30 l_max	    NUMBER;
31 l_counter   NUMBER(4):= 0;
32 l_prev_max  NUMBER;
33 
34 CURSOR CR_TEST_VALUES IS
35 SELECT min_num,max_num
36 FROM   gmd_qc_test_values_b
37 WHERE  test_id = p_test_id
38 ORDER BY NVL(min_num, -999999999.999999999) ;
39 
40 BEGIN
41 	l_progress := '010';
42 
43      	x_return_status := FND_API.G_RET_STS_SUCCESS ;
44 
45 	IF p_test_id IS NULL THEN
46 	    FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_CODE_NULL');
47             FND_MSG_PUB.ADD;
48             RAISE FND_API.G_EXC_ERROR;
49 	END IF;
50 
51 	l_progress := '020';
52 
53 -- this cursor also takes care of multiple NULLS in min_num AND multiple NULLS in max_num in addition
54 -- to checking whether  a subrange overlaps with other subrange.
55 -- Selects each record ordered by min values and compares the min value in the current record to the
56 -- max value in the previous record.If they are the same, gives error.
57 
58 	OPEN  CR_TEST_VALUES;
59         LOOP
60             FETCH CR_TEST_VALUES INTO l_min,l_max;
61             IF CR_TEST_VALUES%NOTFOUND THEN
62                 CLOSE CR_TEST_VALUES ;
63             	EXIT;
64             END IF;
65             l_counter := l_counter + 1 ;
66             x_max_range := l_max ;
67             IF l_counter > 1 THEN
68                 IF NVL(l_min,-999999999.999999999) <= NVL(l_prev_max,999999999.999999999) THEN
69                     CLOSE CR_TEST_VALUES ;
70           	    FND_MESSAGE.SET_NAME('GMD','GMD_RANGES_MAY_NOT_OVERLAP');
71           	    FND_MSG_PUB.ADD;
72             	    RAISE FND_API.G_EXC_ERROR;
73          	END IF;
74        	    ELSIF l_counter = 1 THEN
75               x_min_range := l_min;
76             END IF;
77             l_prev_max := l_max;
78         END LOOP;
79 
80 EXCEPTION
81 WHEN FND_API.G_EXC_ERROR THEN
82       x_return_status := FND_API.G_RET_STS_ERROR ;
83       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
84 WHEN OTHERS
85 THEN
86       IF CR_TEST_VALUES%ISOPEN THEN
87       	  CLOSE CR_TEST_VALUES ;
88       END IF;
89       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
90       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.CHECK_RANGE_OVERLAP' );
91       FND_MESSAGE.Set_Token('ERROR', SUBSTR(SQLERRM,1,100));
92       FND_MESSAGE.Set_Token('POSITION',l_progress );
93       FND_MSG_PUB.ADD;
94       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
95       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
96 END CHECK_RANGE_OVERLAP;
97 
98 
99 FUNCTION get_test_value_desc (
100 		    p_test_id	      IN   NUMBER,
101 		    p_test_value_num  IN   NUMBER ,
102 		    p_test_value_char IN   VARCHAR2 ) RETURN VARCHAR2 IS
103 
104 l_test_value_desc  VARCHAR2(240) ;
105 l_test_type	   VARCHAR2(1);
106 BEGIN
107 
108 	IF p_test_id IS NULL OR ( p_test_value_num IS NULL AND p_test_value_char IS NULL) THEN
109 	    return(null);
110 	END IF;
111 
112 	SELECT test_type INTO l_test_type
113 	FROM GMD_QC_TESTS_B
114 	WHERE test_id = p_test_id ;
115 
116 	IF l_test_type = 'L' THEN
117 	   SELECT DISPLAY_LABEL_NUMERIC_RANGE INTO l_test_value_desc
118 	   FROM  GMD_QC_TEST_VALUES
119 	   WHERE test_id = p_test_id
120 	   AND    p_test_value_num >= nvl(min_num,p_test_value_num)
121 	   AND    p_test_value_num <= nvl(max_num,p_test_value_num);
122 	ELSIF l_test_type = 'T' THEN
123 	   IF p_test_value_num IS NOT NULL THEN
124 	      SELECT test_value_desc INTO l_test_value_desc
125 	      FROM  GMD_QC_TEST_VALUES
126 	      WHERE test_id = p_test_id
127 	      AND   text_range_seq = p_test_value_num ;
128 	   ELSE
129 	      SELECT test_value_desc INTO l_test_value_desc
130 	      FROM  GMD_QC_TEST_VALUES
131 	      WHERE test_id = p_test_id
132 	      AND   value_char = p_test_value_char ;
133 	   END IF;
134 	ELSIF l_test_type = 'V' THEN
135 	   SELECT test_value_desc INTO l_test_value_desc
136 	   FROM  GMD_QC_TEST_VALUES
137 	   WHERE test_id = p_test_id
138 	   AND   value_char = p_test_value_char ;
139 
140 	END IF;
141 
142 	RETURN(l_test_value_desc);
143 
144 EXCEPTION
145 WHEN OTHERS THEN
146     RETURN(NULL);
147 END GET_TEST_VALUE_DESC;
148 
149 /*===========================================================================
150   PROCEDURE  NAME:	check_valid_test
151 
152   DESCRIPTION:		This procedure checks whether the test is valid or
153   			not before inserting/deleting into test values table.
154 
155   PARAMETERS:		In  : p_test_id
156   			OUT : test_type   - test type
157   			      display_precision - display precision of the test.
158 
159   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
160 ===========================================================================*/
161 
162 PROCEDURE CHECK_VALID_TEST(
163 	p_test_id	     IN  NUMBER,
164 	x_test_type	     OUT NOCOPY VARCHAR2,
165 	x_display_precision  OUT NOCOPY NUMBER,
166         x_return_status      OUT NOCOPY VARCHAR2,
167         x_message_data       OUT NOCOPY VARCHAR2) IS
168 
169 l_progress  VARCHAR2(3);
170 l_delete_mark  NUMBER(5);
171 
172 CURSOR cr_get_test_type(l_test_id NUMBER) IS
173 SELECT test_type,display_precision,delete_mark FROM GMD_QC_TESTS_B
174 WHERE test_id = p_test_id ;
175 
176 
177 BEGIN
178 	l_progress := '010';
179 
180 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
181 
182 	IF p_test_id IS NULL THEN
183 	     FND_MESSAGE.SET_NAME('GMD','TEST_ID_CODE_NULL');
184 	     FND_MSG_PUB.ADD;
185 	     RAISE FND_API.G_EXC_ERROR;
186 	END IF;
187 
188 	OPEN  cr_get_test_type(p_test_id);
189     	FETCH cr_get_test_type INTO x_test_type,x_display_precision,l_delete_mark;
190     	IF cr_get_test_type%NOTFOUND THEN
191     	     CLOSE cr_get_test_type;
192     	     FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_TEST');
193              FND_MESSAGE.SET_TOKEN('TEST', TO_CHAR(p_test_id));
194              FND_MSG_PUB.ADD;
195              RAISE FND_API.G_EXC_ERROR;
196     	END IF;
197     	CLOSE cr_get_test_type ;
198 
199     	l_progress := '020';
200 
201     	IF l_delete_mark = 1 THEN
202     	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_DELETED');
203              FND_MESSAGE.SET_TOKEN('TEST',TO_CHAR(p_test_id));
204              FND_MSG_PUB.ADD;
205              RAISE FND_API.G_EXC_ERROR;
206     	END IF;
207     	IF GMD_QC_TESTS_GRP.test_exist_in_spec(p_test_id => p_test_id) THEN
208     	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_USED_IN_SPEC');
209              FND_MESSAGE.SET_TOKEN('TEST',TO_CHAR(p_test_id));
210              FND_MSG_PUB.ADD;
211              RAISE FND_API.G_EXC_ERROR;
212     	END IF;
213 
214 EXCEPTION
215 WHEN FND_API.G_EXC_ERROR THEN
216       x_return_status := FND_API.G_RET_STS_ERROR ;
217       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
218 
219 WHEN OTHERS THEN
220       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
221       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.CHECK_VALID_TEST');
222       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
223       FND_MESSAGE.Set_Token('POSITION',l_progress );
224       FND_MSG_PUB.ADD;
225       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
226       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
227 
228 END CHECK_VALID_TEST;
229 
230 
231 PROCEDURE CHECK_FOR_NULL_AND_FKS(
232 	p_test_type	     IN VARCHAR,
233 	p_display_precision  IN NUMBER,
234         p_qc_test_values_rec IN GMD_QC_TEST_VALUES%ROWTYPE,
235         x_qc_test_values_rec OUT NOCOPY GMD_QC_TEST_VALUES%ROWTYPE,
236 	x_return_status      OUT NOCOPY  VARCHAR2,
237         x_message_data       OUT NOCOPY VARCHAR2) IS
238 
239 l_progress  VARCHAR2(3);
240 
241 BEGIN
242 	l_progress := '010';
243 
244 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
245 
246 	x_qc_test_values_rec := p_qc_test_values_rec ;
247 
248 -- There should be no test values for p_test_type IN ('U','N','E').. Do that validation in PUBLIC API's
249 
250         IF x_qc_test_values_rec.EXPRESSION_REF_TEST_ID IS NOT NULL THEN
251                FND_MESSAGE.SET_NAME('GMD','GMD_EXP_TEST_ID_NOT_REQD');
252                FND_MSG_PUB.ADD;
253                RAISE FND_API.G_EXC_ERROR;
254         END IF;
255 
256         IF p_test_type = 'L' THEN -- numeric range with label.
257 	    IF x_qc_test_values_rec.min_num  IS NULL  AND x_qc_test_values_rec.max_num  IS NULL
258 	    THEN
259 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_MIN_MAX_REQ');
260 	            FND_MSG_PUB.ADD;
261 	            RAISE FND_API.G_EXC_ERROR;
262 	    END IF;
263 
264 	    IF LTRIM(RTRIM(x_qc_test_values_rec.display_label_numeric_range)) IS NULL THEN
265 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_DISPLAY_LABEL_REQ');
266 	            FND_MSG_PUB.ADD;
267 	            RAISE FND_API.G_EXC_ERROR;
268 	    END IF;
269 
270 	    IF x_qc_test_values_rec.value_char IS NOT NULL THEN
271 	       FND_MESSAGE.SET_NAME('GMD','GMD_TEST_VALUE_CHAR_NOT_REQD');
272                FND_MSG_PUB.ADD;
273                RAISE FND_API.G_EXC_ERROR;
274             END IF;
275 
276 	    IF x_qc_test_values_rec.test_value_desc IS NOT NULL THEN
277 	       FND_MESSAGE.SET_NAME('GMD','GMD_TEST_VALUE_DESC_NOT_REQD');
278                FND_MSG_PUB.ADD;
279                RAISE FND_API.G_EXC_ERROR;
280             END IF;
281 
282 	    x_qc_test_values_rec.min_num := ROUND(x_qc_test_values_rec.min_num,p_display_precision);
283 	    x_qc_test_values_rec.max_num := ROUND(x_qc_test_values_rec.max_num,p_display_precision);
284 
285 	    IF x_qc_test_values_rec.min_num IS NOT NULL  AND x_qc_test_values_rec.max_num IS NOT NULL
286 	    THEN
287 	         IF x_qc_test_values_rec.min_num > x_qc_test_values_rec.max_num THEN
288 		    FND_MESSAGE.SET_NAME('GMD','GMD_TEST_MIN_MAX_ERROR');
289 	            FND_MSG_PUB.ADD;
290 	            RAISE FND_API.G_EXC_ERROR;
291 	         END IF;
292 	    END IF;
293 	ELSE
294 	    IF x_qc_test_values_rec.min_num IS NOT NULL OR x_qc_test_values_rec.max_num IS NOT NULL THEN
295 	       FND_MESSAGE.SET_NAME('GMD','GMD_TEST_RANGE_NOT_REQD');
296                FND_MSG_PUB.ADD;
297                RAISE FND_API.G_EXC_ERROR;
298             END IF;
299 
300             IF x_qc_test_values_rec.display_label_numeric_range IS NOT NULL THEN
301 	       FND_MESSAGE.SET_NAME('GMD', 'GMD_DISPLAY_LABEL_NOT_REQD');
302 	       FND_MSG_PUB.ADD;
303 	       RAISE FND_API.G_EXC_ERROR;
304 	    END IF;
305 	END IF;
306 
307 	IF p_test_type = 'V' THEN  -- List Of Values
308 	    IF LTRIM(RTRIM(x_qc_test_values_rec.value_char)) IS NULL THEN
309 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_VALUE_CHAR_REQ');
310 	            FND_MSG_PUB.ADD;
311 	            RAISE FND_API.G_EXC_ERROR;
312 	    END IF;
313 
314 	    IF LTRIM(RTRIM(x_qc_test_values_rec.test_value_desc)) IS NULL THEN
315 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_VALUE_DESC_REQ');
316 	            FND_MSG_PUB.ADD;
317 	            RAISE FND_API.G_EXC_ERROR;
318 	    END IF;
319 	 END IF;
320 
321 	 IF p_test_type = 'T' THEN  -- Text Range
322 	    IF LTRIM(RTRIM(x_qc_test_values_rec.value_char)) IS NULL THEN
323 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_VALUE_CHAR_REQ');
324 	            FND_MSG_PUB.ADD;
325 	            RAISE FND_API.G_EXC_ERROR;
326 	    END IF;
327 
328 	    IF LTRIM(RTRIM(x_qc_test_values_rec.test_value_desc)) IS NULL THEN
329 		    FND_MESSAGE.SET_NAME('GMD', 'GMD_TEST_VALUE_DESC_REQ');
330 	            FND_MSG_PUB.ADD;
331 	            RAISE FND_API.G_EXC_ERROR;
332 	    END IF;
333 
334 	    SELECT NVL(MAX(text_range_seq),0) + 1 INTO x_qc_test_values_rec.text_range_seq
335 	    FROM   GMD_QC_TEST_VALUES_B
336 	    WHERE  test_id = x_qc_test_values_rec.test_id ;
337 
338 	 ELSE
339 
340 	    IF x_qc_test_values_rec.text_range_seq IS NOT NULL THEN
341 	       FND_MESSAGE.SET_NAME('GMD', 'GMD_SEQ_NOT_REQD');
342 	       FND_MSG_PUB.ADD;
343 	       RAISE FND_API.G_EXC_ERROR;
344 	    END IF;
345 	 END IF;
346 
347 EXCEPTION
348 WHEN FND_API.G_EXC_ERROR THEN
349       x_return_status := FND_API.G_RET_STS_ERROR ;
350       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
351 
352 WHEN OTHERS THEN
353       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
354       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.CHECK_FOR_NULL_AND_FKS');
355       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
356       FND_MESSAGE.Set_Token('POSITION',l_progress );
357       FND_MSG_PUB.ADD;
358       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
359       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
360 
361 END CHECK_FOR_NULL_AND_FKS;
362 
363 
364 /*===========================================================================
365   PROCEDURE  NAME:	validate_before_insert
366 
367   DESCRIPTION:		This procedure validates test values before insert.
368 
369   PARAMETERS:
370 
371   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
372 ===========================================================================*/
373 
374 PROCEDURE VALIDATE_BEFORE_INSERT(
375 	p_qc_test_values_rec IN GMD_QC_TEST_VALUES%ROWTYPE,
376 	x_qc_test_values_rec OUT NOCOPY GMD_QC_TEST_VALUES%ROWTYPE,
377 	x_return_status    OUT NOCOPY VARCHAR2,
378         x_message_data     OUT NOCOPY VARCHAR2) IS
379 
380 l_progress  		VARCHAR2(3);
381 l_temp      		VARCHAR2(1);
382 l_test_type 		VARCHAR2(1);
383 l_display_precision	NUMBER(1);
384 
385 CURSOR cr_test_value_exist IS
386   SELECT 'x'  FROM GMD_QC_TEST_VALUES_B
387   WHERE test_id = p_qc_test_values_rec.test_id
388   AND   value_char = p_qc_test_values_rec.value_char ;
389 
390 BEGIN
391 	l_progress := '010';
392 
393 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
394 
395 	IF p_qc_test_values_rec.test_id IS NULL THEN
396 	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_REQ');
397 	     FND_MSG_PUB.ADD;
398 	     RAISE FND_API.G_EXC_ERROR;
399 	END IF;
400 
401 	check_valid_test(p_test_id	   => p_qc_test_values_rec.test_id,
402 			 x_test_type	   => l_test_type,
403 			 x_display_precision  => l_display_precision,
404         		 x_return_status   => x_return_status,
405         		 x_message_data    => x_message_data );
406 
407     	IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
408     	   RETURN;
409     	END IF;
410 
411     	IF l_test_type IN ('N','E','U') THEN
412     	    FND_MESSAGE.SET_NAME('GMD','GMD_TEST_VALUE_REC_NOT_REQ');
413 	    FND_MSG_PUB.ADD;
414 	    RAISE FND_API.G_EXC_ERROR;
415     	END IF;
416 
417 	CHECK_FOR_NULL_AND_FKS(
418                 p_test_type	=> l_test_type,
419                 p_display_precision => l_display_precision,
420         	p_qc_test_values_rec => p_qc_test_values_rec,
421         	x_qc_test_values_rec => x_qc_test_values_rec,
422 		x_return_status => x_return_status,
423         	x_message_data  => x_message_data );
424 
425         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
426             return;
427         END IF;
428 
429 	-- check for duplicate test values.
430 	IF l_test_type IN ('V','T') THEN
431 	    OPEN  cr_test_value_exist;
432 	    FETCH cr_test_value_exist INTO l_temp;
433 	    IF cr_test_value_exist%FOUND THEN
434 	        CLOSE cr_test_value_exist;
435 	        FND_MESSAGE.SET_NAME('GMD','GMD_DUP_TEST_VALUE');
436    	        FND_MESSAGE.SET_TOKEN('TEST',to_char(x_qc_test_values_rec.test_id));
437 	        FND_MSG_PUB.ADD;
438 	        RAISE FND_API.G_EXC_ERROR;
439 	    END IF;
440 	    CLOSE cr_test_value_exist;
441 	END IF;
442 
443 EXCEPTION
444 WHEN FND_API.G_EXC_ERROR THEN
445       x_return_status := FND_API.G_RET_STS_ERROR ;
446       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
447 
448 WHEN OTHERS THEN
449       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
450       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.VALIDATE_BEFORE_INSERT');
451       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
452       FND_MESSAGE.Set_Token('POSITION',l_progress );
453       FND_MSG_PUB.ADD;
454       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
455       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
456 
457 END validate_before_insert;
458 
459 /*===========================================================================
460 
461   PROCEDURE NAME:	validate_after_insert_all
462   DESCRIPTION:		This procedure updates min_value_num and max_value_num
463   		        in test header table and also validates if the range
464   		        doesnt overlap.
465   		        NOTE : Call after all test values are inserted.
466 
467 ===========================================================================*/
468 
469 PROCEDURE VALIDATE_AFTER_INSERT_ALL(
470 	p_gmd_qc_tests_rec IN  GMD_QC_TESTS%ROWTYPE,
471 	x_gmd_qc_tests_rec OUT NOCOPY  GMD_QC_TESTS%ROWTYPE,
472         x_return_status    OUT NOCOPY VARCHAR2,
473         x_message_data     OUT NOCOPY VARCHAR2) IS
474 
475 
476 l_progress  VARCHAR2(3);
477 l_test_values_count  BINARY_INTEGER;
478 l_min_range	NUMBER;
479 l_max_range	NUMBER;
480 
481 BEGIN
482 	l_progress := '010';
483 
484 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
485 
486 	x_gmd_qc_tests_rec := p_gmd_qc_tests_rec;
487 
488 
489 	IF x_gmd_qc_tests_rec.test_id IS NULL THEN
490 	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_ID_CODE_NULL');
491 	     FND_MSG_PUB.ADD;
492 	     RAISE FND_API.G_EXC_ERROR;
493 	END IF;
494 
495 -- atleast one test value record must be there.
496 	IF x_gmd_qc_tests_rec.test_type in ('V','T','L') THEN
497             SELECT NVL(COUNT(1),0) INTO l_test_values_count
498             FROM GMD_QC_TEST_VALUES_B
499             WHERE test_id = x_gmd_qc_tests_rec.test_id ;
500 
501             IF l_test_values_count = 0 THEN
502 	       FND_MESSAGE.SET_NAME('GMD','GMD_NO_TEST_VALUES');
503                FND_MESSAGE.SET_TOKEN('TEST',x_gmd_qc_tests_rec.test_code);
504                FND_MSG_PUB.ADD;
505 	       RAISE FND_API.G_EXC_ERROR;
506             END IF;
507         END IF;
508 
509         l_progress := '020';
510 
511         IF x_gmd_qc_tests_rec.test_type = 'L' THEN
512       	    GMD_QC_TEST_VALUES_GRP.CHECK_RANGE_OVERLAP(
513 		    p_test_id	    => x_gmd_qc_tests_rec.test_id,
514 		    x_min_range	    => l_min_range,
515 		    x_max_range     => l_max_range,
516 		    x_return_status => x_return_status,
517 		    x_message_data  => x_message_data);
518 
519             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
520                 RETURN;
521             END IF;
522 
523 	    IF x_gmd_qc_tests_rec.exp_error_type = 'N' AND l_min_range IS NOT NULL AND l_max_range IS NOT NULL THEN
524       	        gmd_qc_tests_grp.validate_all_exp_error(
525       	    	    p_validation_level		=> 'SPEC',
526 		    p_exp_error_type  		=> x_gmd_qc_tests_rec.exp_error_type,
527 		    p_below_spec_min            => x_gmd_qc_tests_rec.below_spec_min,
528 		    p_below_min_action_code     => x_gmd_qc_tests_rec.below_min_action_code,
529 		    p_above_spec_min            => x_gmd_qc_tests_rec.above_spec_min,
530 		    p_above_min_action_code     => x_gmd_qc_tests_rec.above_min_action_code,
531 		    p_below_spec_max            => x_gmd_qc_tests_rec.below_spec_max,
532 		    p_below_max_action_code     => x_gmd_qc_tests_rec.below_max_action_code,
533 		    p_above_spec_max            => x_gmd_qc_tests_rec.above_spec_max,
534 		    p_above_max_action_code     => x_gmd_qc_tests_rec.above_max_action_code,
535 		    p_test_min        		=> l_min_range,
536 		    p_test_max        		=> l_max_range,
537          	    x_return_status 		=> x_return_status,
538         	    x_message_data  		=> x_message_data );
539 
540                  IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
541                      RETURN;
542                  END IF;
543              END IF;
544 
545   	     UPDATE GMD_QC_TESTS_B
546 	     SET min_value_num = l_min_range,
547   	         max_value_num = l_max_range
548              WHERE
549 	         test_id = x_gmd_qc_tests_rec.test_id ;
550 
551   	     x_gmd_qc_tests_rec.min_value_num := l_min_range;
552 	     x_gmd_qc_tests_rec.max_value_num := l_max_range;
553 
554         END IF; -- :gmd_qc_tests.test_type = 'L'
555 
556 	l_progress := '030';
557 
558         IF x_gmd_qc_tests_rec.test_type = 'T' THEN
559  	    SELECT MIN(text_range_seq),MAX(text_range_seq)
560 	    INTO   l_min_range,l_max_range
561 	    FROM   GMD_QC_TEST_VALUES_B
562 	    WHERE  test_id = x_gmd_qc_tests_rec.test_id;
563 
564 	    UPDATE GMD_QC_TESTS_B
565 	    SET min_value_num = l_min_range,
566   	        max_value_num = l_max_range
567             WHERE
568 	        test_id = x_gmd_qc_tests_rec.test_id ;
569 
570 	    x_gmd_qc_tests_rec.min_value_num := l_min_range;
571 	    x_gmd_qc_tests_rec.max_value_num := l_max_range;
572 
573         END IF; -- end of :gmd_qc_tests.test_type = 'T'
574 
575 EXCEPTION
576 WHEN FND_API.G_EXC_ERROR THEN
577       x_return_status := FND_API.G_RET_STS_ERROR ;
578       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
579 
580 WHEN OTHERS THEN
581       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
582       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.VALIDATE_AFTER_INSERT_ALL');
583       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
584       FND_MESSAGE.Set_Token('POSITION',l_progress );
585       FND_MSG_PUB.ADD;
586       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
587       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
588 
589 END validate_after_insert_all;
590 
591 /*===========================================================================
592   PROCEDURE  NAME:	validate_before_delete
593 
594   DESCRIPTION:		This procedure checks whether test header is not marked
595   			for purge.
596 
597   PARAMETERS:
598 
599   CHANGE HISTORY:	Created		09-JUL-02	MCHANDAK
600 ===========================================================================*/
601 
602 PROCEDURE VALIDATE_BEFORE_DELETE(
603 	p_test_value_id	   IN NUMBER,
604 	x_return_status    OUT NOCOPY VARCHAR2,
605         x_message_data     OUT NOCOPY VARCHAR2) IS
606 
607 l_progress  VARCHAR2(3);
608 l_temp      VARCHAR2(1);
609 l_test_type VARCHAR2(1);
610 l_test_id   NUMBER;
611 l_display_precision	NUMBER(1);
612 
613 CURSOR cr_get_test_id IS
614   SELECT test_id  FROM GMD_QC_TEST_VALUES_B
615   WHERE test_value_id = p_test_value_id ;
616 
617 BEGIN
618 	l_progress := '010';
619 	x_return_status := FND_API.G_RET_STS_SUCCESS ;
620 
621 	IF p_test_value_id IS NULL THEN
622 	     FND_MESSAGE.SET_NAME('GMD','GMD_TEST_VALUE_ID_REQ');
623 	     FND_MSG_PUB.ADD;
624 	     RAISE FND_API.G_EXC_ERROR;
625 	END IF;
626 
627 	OPEN  cr_get_test_id;
628 	FETCH cr_get_test_id INTO l_test_id;
629 	IF cr_get_test_id%NOTFOUND THEN
630 	   CLOSE cr_get_test_id;
631 	   FND_MESSAGE.SET_NAME('GMD','GMD_TEST_VALUE_INVALID');
632 	   FND_MESSAGE.SET_TOKEN('TEST_VALUE',to_char(p_test_value_id));
633 	   FND_MSG_PUB.ADD;
634 	   RAISE FND_API.G_EXC_ERROR;
635 	END IF;
636 	CLOSE cr_get_test_id;
637 
638 	check_valid_test(p_test_id	   => l_test_id,
639 			 x_test_type	   => l_test_type,
640 			 x_display_precision  => l_display_precision,
641         		 x_return_status   => x_return_status,
642         		 x_message_data    => x_message_data );
643 
644     	IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
645     	   RETURN;
646     	END IF;
647 
648 EXCEPTION
649 WHEN FND_API.G_EXC_ERROR THEN
650       x_return_status := FND_API.G_RET_STS_ERROR ;
651       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
652 
653 WHEN OTHERS THEN
654       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
655       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.VALIDATE_BEFORE_DELETE');
656       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
657       FND_MESSAGE.Set_Token('POSITION',l_progress );
658       FND_MSG_PUB.ADD;
659       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
660       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
661 
662 END VALIDATE_BEFORE_DELETE ;
663 
664 
665 PROCEDURE VALIDATE_AFTER_DELETE_ALL(
666 	p_gmd_qc_tests_rec IN  GMD_QC_TESTS%ROWTYPE,
667 	x_gmd_qc_tests_rec OUT NOCOPY  GMD_QC_TESTS%ROWTYPE,
668         x_return_status    OUT NOCOPY VARCHAR2,
669         x_message_data     OUT NOCOPY VARCHAR2) IS
670 
671 l_progress  VARCHAR2(3);
672 
673 BEGIN
674 	VALIDATE_AFTER_INSERT_ALL(
675 		p_gmd_qc_tests_rec => p_gmd_qc_tests_rec,
676 		x_gmd_qc_tests_rec => x_gmd_qc_tests_rec,
677         	x_return_status  => x_return_status,
678         	x_message_data   => x_message_data ) ;
679 
680         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
681             return;
682         END IF;
683 
684 EXCEPTION
685 WHEN FND_API.G_EXC_ERROR THEN
686       x_return_status := FND_API.G_RET_STS_ERROR ;
687       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
688 
689 WHEN OTHERS THEN
690       FND_MESSAGE.Set_Name('GMD','GMD_API_ERROR');
691       FND_MESSAGE.Set_Token('PACKAGE','GMD_QC_TEST_VALUES_GRP.VALIDATE_AFTER_DELETE_ALL');
692       FND_MESSAGE.Set_Token('ERROR', substr(sqlerrm,1,100));
693       FND_MESSAGE.Set_Token('POSITION',l_progress );
694       FND_MSG_PUB.ADD;
695       x_message_data := FND_MSG_PUB.GET(FND_MSG_PUB.G_LAST,FND_API.G_FALSE);
696       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
697 
698 END VALIDATE_AFTER_DELETE_ALL ;
699 
700 FUNCTION text_range_char_to_seq ( p_test_id IN NUMBER,
701 				  p_value_char IN VARCHAR2)
702 
703 RETURN NUMBER IS
704 l_seq   BINARY_INTEGER;
705 BEGIN
706 
707   SELECT text_range_seq INTO l_seq
708   FROM   GMD_QC_TEST_VALUES_B
709   WHERE  test_id 	= p_test_id
710   AND    value_char	= p_value_char ;
711 
712   RETURN (l_seq);
713 
714 EXCEPTION WHEN OTHERS THEN
715    FND_MESSAGE.Set_Name('GMD','GMD_TEXT_RANGE_SEQ_INVALID');
716    FND_MESSAGE.Set_Token('TEST',to_char(p_test_id));
717    FND_MESSAGE.Set_Token('VALUE',p_value_char);
718    FND_MSG_PUB.ADD;
719    RETURN(-1);
720 END text_range_char_to_seq;
721 
722 END GMD_QC_TEST_VALUES_GRP ;