DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMD_TECH_PARAMS

Source


1 PACKAGE BODY gmd_tech_params AS
2 /* $Header: GMDTECHB.pls 115.7 2003/05/06 18:28:34 ssitaram noship $ */
3 
4 G_PKG_NAME VARCHAR2(32);
5 
6 /*======================================================================
7 --  PROCEDURE :
8 --   load_ingred_tp
9 --
10 --  DESCRIPTION:
11 --    This PL/SQL procedure is responsible for returning the
12 --    Ingredient technical parameters.
13 --
14 --  REQUIREMENTS
15 --
16 --  SYNOPSIS:
17 --    load_ingred_tp(X_lab_type, X_formula_id, X_item_id, X_line_no,
18 --                   X_tech_tbl, X_return_status, X_msg_count, X_msg_data);
19 --
20 --
21 --===================================================================== */
22 PROCEDURE load_ingred_tp(p_lab_type          IN  VARCHAR2,
23                          p_formula_id        IN  NUMBER,
24                          p_item_id           IN  NUMBER,
25                          p_line_no           IN  NUMBER,
26                          x_tech_table        OUT NOCOPY tech_param_tab,
27                          x_return_status     OUT NOCOPY VARCHAR2,
28                          x_msg_count         OUT NOCOPY NUMBER,
29                          x_msg_data          OUT NOCOPY VARCHAR2) IS
30 
31   X_row          NUMBER := 0;
32   X_data_type    NUMBER;
33   l_tech_table   tech_param_tab;
34 
35   NO_LAB_TYPE    EXCEPTION;
36   NO_ATTRIB_DATA EXCEPTION;
37 BEGIN
38   x_return_status := FND_API.G_RET_STS_SUCCESS;
39   IF (p_lab_type IS NULL) THEN
40     RAISE NO_LAB_TYPE;
41   END IF;
42   gmd_tech_params.load_lab_arrays(p_formula_id     => p_formula_id,
43                                   p_lab_type       => p_lab_type,
44                                   p_prod_tech_parm => 0);
45   IF (attrib_master_tbl.count = 0) THEN
46     RAISE NO_ATTRIB_DATA;
47   END IF;
48   FOR i IN 1..tp_master_tbl.count LOOP
49     X_row       := X_row + 1;
50     X_data_type := tp_master_tbl(i).data_type;
51     x_tech_table(X_row).tech_parm_name := tp_master_tbl(i).tech_parm_name;
52     x_tech_table(X_row).uom            := tp_master_tbl(i).tp_uom;
53     x_tech_table(X_row).data_type      := X_data_type;
54     x_tech_table(X_row).expression     := tp_master_tbl(i).expression;
55     FOR j IN 1..attrib_master_tbl.count LOOP
56       IF ((attrib_master_tbl(j).tech_parm_name = tp_master_tbl(i).tech_parm_name) AND
57           (attrib_master_tbl(j).item_id = p_item_id) AND
58           (attrib_master_tbl(j).line_type = -1) AND
59           (attrib_master_tbl(j).line_no = p_line_no)) THEN
60         IF (X_data_type IN (0,2)) THEN
61           x_tech_table(X_row).value := attrib_master_tbl(j).char_value;
62         ELSIF (X_data_type = 3) THEN
63           x_tech_table(X_row).value := attrib_master_tbl(j).boolean_value;
64         ELSIF (X_data_type IN (1,5,6,7,8,9,10)) THEN
65           x_tech_table(X_row).value := attrib_master_tbl(j).num_value;
66         END IF;
67         EXIT;
68       END IF;
69     END LOOP;
70   END LOOP;
71   calculate_expr(p_tech_table => x_tech_table,
72                  calc_table   => l_tech_table);
73 
74   x_tech_table := l_tech_table;
75 
76   item_master_tbl.delete;
77   tp_master_tbl.delete;
81      x_return_status := FND_API.G_RET_STS_ERROR;
78   attrib_master_tbl.delete;
79 EXCEPTION
80   WHEN NO_LAB_TYPE THEN
82      FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_LAB_TYPE_PARM');
83      FND_MSG_PUB.ADD;
84      FND_MSG_PUB.COUNT_AND_GET(P_count => x_msg_count,
85                                P_data  => x_msg_data);
86   WHEN NO_ATTRIB_DATA THEN
87      x_return_status := FND_API.G_RET_STS_ERROR;
88      FND_MESSAGE.SET_NAME('GMD', 'LM_NO_ATTRIB_DATA');
89      FND_MSG_PUB.ADD;
90      FND_MSG_PUB.COUNT_AND_GET(P_count => x_msg_count,
91                                P_data  => x_msg_data);
92 END load_ingred_tp;
93 
94 /*======================================================================
95 --  PROCEDURE :
96 --   load_prod_tp
97 --
98 --  DESCRIPTION:
99 --    This PL/SQL procedure is responsible for returning the
100 --    Product technical parameters.
101 --
102 --  REQUIREMENTS
103 --
104 --  SYNOPSIS:
105 --    load_prod_tp(X_lab_type, X_formula_id, X_item_id, X_line_no,
106 --                   X_tech_tbl, X_return_status, X_msg_count, X_msg_data);
107 --  HISTORY
108 --   23-May-2002  N.Vikranth  BUG 2360400 - Modified the condition to consider
109 --                            the By-Products while retrieving the Technical
110 --                            Parameter values in Technical Parameters form.
111 --===================================================================== */
112 PROCEDURE load_prod_tp(p_lab_type          IN  VARCHAR2,
113                        p_formula_id        IN  NUMBER,
114                        p_item_id           IN  NUMBER,
115                        p_line_no           IN  NUMBER,
116                        x_tech_table        OUT NOCOPY tech_param_tab,
117                        x_return_status     OUT NOCOPY VARCHAR2,
118                        x_msg_count         OUT NOCOPY NUMBER,
119                        x_msg_data          OUT NOCOPY VARCHAR2) IS
120 
121   X_conv_qty     NUMBER := 0;
122   X_prim_qty     NUMBER := 0;
123   X_prim_uom     VARCHAR2(4);
124   X_data_type    NUMBER;
125   X_result       NUMBER;
126   l_tech_table   tech_param_tab;
127 
128   NO_LAB_TYPE    EXCEPTION;
129   NO_ATTRIB_DATA EXCEPTION;
130   UOM_CONV_ERR   EXCEPTION;
131 BEGIN
132   x_return_status := FND_API.G_RET_STS_SUCCESS;
133   IF (p_lab_type IS NULL) THEN
134     RAISE NO_LAB_TYPE;
135   END IF;
136   gmd_tech_params.load_lab_arrays(p_formula_id     => p_formula_id,
137                                   p_lab_type       => p_lab_type,
138                                   p_prod_tech_parm => 1);
139   convert_uoms(p_lab_type      => p_lab_type,
140                x_return_status => x_return_status);
141   IF (x_return_status <> 'S') THEN
142     RAISE UOM_CONV_ERR;
143   END IF;
144   FOR k IN 1..item_master_tbl.count LOOP
145     IF ((item_master_tbl(k).item_id = p_item_id) AND
146       --BEGIN BUG 2360400 Nayini Vikranth
147       --Modified the condition to consider the By-Product
148       --when the line_type is 2
149       (item_master_tbl(k).line_type >= 1) AND
150       --END BUG 2360400
151       (item_master_tbl(k).line_no = p_line_no)) THEN
152       X_prim_qty := item_master_tbl(k).primary_uom_qty;
153       X_prim_uom := item_master_tbl(k).item_primary_uom;
154       EXIT;
155     END IF;
156   END LOOP;
157   FOR i IN 1..tp_master_tbl.count LOOP
158     X_data_type := tp_master_tbl(i).data_type;
159     x_tech_table(i).tech_parm_name := tp_master_tbl(i).tech_parm_name;
160     x_tech_table(i).uom            := tp_master_tbl(i).tp_uom;
161     x_tech_table(i).data_type      := X_data_type;
162     x_tech_table(i).expression     := tp_master_tbl(i).expression;
163     FOR j IN 1..attrib_master_tbl.count LOOP
164       IF ((attrib_master_tbl(j).tech_parm_name = tp_master_tbl(i).tech_parm_name) AND
165           (attrib_master_tbl(j).item_id = p_item_id) AND
166           --BEGIN BUG 2360400 Nayini Vikranth
167           --Modified the condition to consider the By-Product
168           --when the line_type is 2
169           (attrib_master_tbl(j).line_type >= 1) AND
170           --END BUG 2360400
171           (attrib_master_tbl(j).line_no = p_line_no)) THEN
172         IF (X_data_type IN (0,2)) THEN
173           x_tech_table(i).value := attrib_master_tbl(j).char_value;
174         ELSIF (X_data_type = 3) THEN
175           x_tech_table(i).value := attrib_master_tbl(j).boolean_value;
176         ELSIF (X_data_type = 1) THEN
177           x_tech_table(i).value := attrib_master_tbl(j).num_value;
178         ELSIF (X_data_type IN (5, 6, 7, 8, 9, 10)) THEN
179           IF (X_data_type = 5) THEN
180             rollup_wt_pct(p_tech_parm_name => attrib_master_tbl(j).tech_parm_name,
181                           p_result         => X_result);
182           ELSIF (X_data_type IN (6,7)) THEN
183             rollup_vol_pct_and_spec_gr(p_tech_parm_name => attrib_master_tbl(j).tech_parm_name,
184                                        p_data_type      => X_data_type,
185                                        p_result         => X_result);
186           ELSIF (X_data_type = 8) THEN
187             rollup_cost_and_units(p_tech_parm_name => attrib_master_tbl(j).tech_parm_name,
188                                   p_prod_uom       => X_prim_uom,
189                                   p_lab_type       => p_lab_type,
190                                   p_result         => X_result,
191                                   x_return_status  => x_return_status);
192             IF (x_return_status <> 'S') THEN
193               X_result := 0;
194             END IF;
195             IF (X_result <> 0) THEN
196               X_result := X_result / X_prim_qty;
197             END IF;
198           ELSIF (X_data_type = 9) THEN
199             rollup_equiv_wt(p_tech_parm_name => attrib_master_tbl(j).tech_parm_name,
203                             x_return_status  => x_return_status);
200                             p_prod_uom       => X_prim_uom,
201                             p_lab_type       => p_lab_type,
202                             p_result         => X_result,
204             IF (x_return_status <> 'S') THEN
205               X_result := 0;
206             END IF;
207           ELSIF (X_data_type = 10) THEN
208             rollup_cost_and_units(p_tech_parm_name => attrib_master_tbl(j).tech_parm_name,
209                                   p_prod_uom       => X_prim_uom,
210                                   p_lab_type       => p_lab_type,
211                                   p_result         => X_result,
212                                   x_return_status  => x_return_status);
213             IF (x_return_status <> 'S') THEN
214               X_result := 0;
215             END IF;
216           END IF;
217           x_tech_table(i).value := X_result;
218         END IF;
219         EXIT;
220       END IF;
221     END LOOP;
222   END LOOP;
223   calculate_expr(p_tech_table => x_tech_table,
224                  calc_table   => l_tech_table);
225 
226   x_tech_table := l_tech_table;
227 
228   item_master_tbl.delete;
229   tp_master_tbl.delete;
230   attrib_master_tbl.delete;
231 EXCEPTION
232   WHEN NO_LAB_TYPE THEN
233      x_return_status := FND_API.G_RET_STS_ERROR;
234      FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_LAB_TYPE_PARM');
235      FND_MSG_PUB.ADD;
236      FND_MSG_PUB.COUNT_AND_GET(P_count => x_msg_count,
237                                P_data  => x_msg_data);
238   WHEN NO_ATTRIB_DATA THEN
239      x_return_status := FND_API.G_RET_STS_ERROR;
240      FND_MESSAGE.SET_NAME('GMD', 'LM_NO_ATTRIB_DATA');
241      FND_MSG_PUB.ADD;
242      FND_MSG_PUB.COUNT_AND_GET(P_count => x_msg_count,
243                                P_data  => x_msg_data);
244   WHEN UOM_CONV_ERR THEN
245      x_return_status := FND_API.G_RET_STS_ERROR;
246      FND_MSG_PUB.COUNT_AND_GET(P_count => x_msg_count,
247                                P_data  => x_msg_data);
248 END load_prod_tp;
249 
250 /*======================================================================
251 --  PROCEDURE :
252 --   load_lab_arrays
253 --
254 --  DESCRIPTION:
255 --    This PL/SQL procedure is responsible for loading
256 --    all the formula related and parameter related data.
257 --
258 --  REQUIREMENTS
259 --
260 --  SYNOPSIS:
261 --    load_lab_arrays(X_formula_id, X_lab_type, X_prod_tech_parm);
262 --
263 --
264 --===================================================================== */
265 PROCEDURE load_lab_arrays(p_formula_id NUMBER, p_lab_type VARCHAR2, p_prod_tech_parm NUMBER) IS
266 
267   CURSOR Cur_ic_item IS
268     SELECT i.item_no, i.item_id, i.item_um, d.line_type, d.qty,
269            d.item_um line_um, d.line_no, d.formulaline_id, NVL(d.tpformula_id,0) tpformula_id
270     FROM   ic_item_mst i, fm_matl_dtl d
271     WHERE  formula_id = p_formula_id
272            AND i.item_id = d.item_id
273     ORDER BY d.line_type, d.line_no;
274 
275   CURSOR Cur_lm_attrib IS
276     SELECT i.orgn_code, i.item_id, i.tech_parm_name, i.num_data,
277            i.text_data, i.boolean_data, NVL(f.tpformula_id,0) tpformula_id,
278            f.line_type, f.line_no
279     FROM   lm_item_dat i, fm_matl_dtl f
280     WHERE  orgn_code = p_lab_type
281            AND i.item_id = f.item_id
282            AND f.formula_id = p_formula_id
283            AND NVL(i.formula_id,0) = NVL(f.tpformula_id,0)
284            AND i.lot_id = 0
285     ORDER BY f.line_type, f.line_no;
286 
287   CURSOR Cur_lm_tp IS
288     SELECT t.orgn_code lab_type, t.tech_parm_name, p.sort_seq, t.expression_char,
289            t.data_type, t.lm_unit_code, q.orgn_code, q.assay_code
290     FROM   lm_tech_hdr t, lm_prlt_asc p, gmd_tests q
291     WHERE  t.orgn_code = p_lab_type
292            AND p.orgn_code = t.orgn_code
293            AND t.tech_parm_name = p.tech_parm_name
294            AND t.qcassy_typ_id = q.qcassy_typ_id(+)
295     ORDER BY p.sort_seq;
296 
297   X_row	NUMBER := 0;
298   X_set	NUMBER := 0;
299   X_rec	Cur_lm_attrib%ROWTYPE;
300 BEGIN
301   /* Fetch all item-related information into item_master_array.*/
302   FOR get_item IN Cur_ic_item LOOP
303     X_row := X_row + 1;
304     item_master_tbl(X_row).item_no          := get_item.item_no;
305     item_master_tbl(X_row).item_id          := get_item.item_id;
306     item_master_tbl(X_row).item_primary_uom := get_item.item_um;
307     item_master_tbl(X_row).line_type        := get_item.line_type;
308     item_master_tbl(X_row).quantity         := get_item.qty;
309     item_master_tbl(X_row).uom              := get_item.line_um;
310     item_master_tbl(X_row).line_no          := get_item.line_no;
311     item_master_tbl(X_row).line_id          := get_item.formulaline_id;
312     item_master_tbl(X_row).formula_id       := get_item.tpformula_id;
313     item_master_tbl(X_row).lot_no           := NULL;
314     item_master_tbl(X_row).sublot_no        := NULL;
315     item_master_tbl(X_row).lot_id           := NULL;
316     item_master_tbl(X_row).primary_uom_qty  := 0;
317     item_master_tbl(X_row).mass_uom_qty     := 0;
318     item_master_tbl(X_row).vol_uom_qty      := 0;
319   END LOOP;
320   X_row := 0;
321   /* Get technical parameter-related data */
322   FOR get_tp IN Cur_lm_tp LOOP
323     X_row := X_row + 1;
324     tp_master_tbl(X_row).tech_parm_name := get_tp.tech_parm_name;
325     tp_master_tbl(X_row).expression     := get_tp.expression_char;
326     tp_master_tbl(X_row).data_type      := get_tp.data_type;
327     tp_master_tbl(X_row).tp_uom         := get_tp.lm_unit_code;
331   /*Get attribute-related data*/
328     tp_master_tbl(X_row).qc_orgn_code   := get_tp.orgn_code;
329     tp_master_tbl(X_row).qc_assay_name  := get_tp.assay_code;
330   END LOOP;
332   OPEN Cur_lm_attrib;
333   LOOP
334     FETCH Cur_lm_attrib INTO X_rec;
335     EXIT WHEN Cur_lm_attrib%NOTFOUND;
336     X_set := 0;
337     FOR i IN 1..item_master_tbl.count LOOP
338       IF ((item_master_tbl(i).item_id = X_rec.item_id) AND (item_master_tbl(i).formula_id = X_rec.tpformula_id)) THEN
339         IF ((item_master_tbl(i).line_type = X_rec.line_type) AND (item_master_tbl(i).line_no = X_rec.line_no)) THEN
340           X_set := 1;
341         END IF;
342       END IF;
343     END LOOP;
344     IF (X_set = 1) THEN
345       FOR j IN 1..tp_master_tbl.count LOOP
346         IF (tp_master_tbl(j).tech_parm_name = X_rec.tech_parm_name) THEN
347           X_row := attrib_master_tbl.count + 1;
348           attrib_master_tbl(X_row).item_id        := X_rec.item_id;
349           attrib_master_tbl(X_row).line_type      := X_rec.line_type;
350           attrib_master_tbl(X_row).line_no        := X_rec.line_no;
351           attrib_master_tbl(X_row).tech_parm_name := X_rec.tech_parm_name;
352           attrib_master_tbl(X_row).num_value      := X_rec.num_data;
353           attrib_master_tbl(X_row).char_value     := X_rec.text_data;
354           attrib_master_tbl(X_row).boolean_value  := X_rec.boolean_data;
355         END IF;
356       END LOOP;
357     END IF;
358   END LOOP;
359   CLOSE Cur_lm_attrib;
360   IF (p_prod_tech_parm = 1) THEN
361     get_qc_results;
362   END IF;
363 END load_lab_arrays;
364 
365 /*======================================================================
366 --  PROCEDURE :
367 --   calculate_expr
368 --
369 --  DESCRIPTION:
370 --    This PL/SQL procedure is responsible for calculating
371 --    the expression value.
372 --
373 --  REQUIREMENTS
374 --
375 --  SYNOPSIS:
376 --
377 --
378 --===================================================================== */
379 PROCEDURE calculate_expr(p_tech_table tech_param_tab,
380                          calc_table OUT NOCOPY tech_param_tab) IS
381   X_row        NUMBER;
382   X_expr       VARCHAR2(500);
383   X_sql_stmt   VARCHAR2(1000);
384   X_value      VARCHAR2(100);
385   X_cur        INTEGER;
386   X_carrot     NUMBER;
387   X_power      NUMBER;
388   X_end_char   VARCHAR2(10);
389   X_end_bracs  NUMBER;
390   X_end_expr   VARCHAR2(100);
391   X_start_expr VARCHAR2(100);
392   X_using      Varchar2(1000);
393 
394   l_bind      VARCHAR2(100);
395 
396  BEGIN
397    calc_table := p_tech_table;
398    FOR i IN 1..calc_table.count LOOP
399    BEGIN
400      IF (calc_table(i).data_type = 4) THEN
401        X_expr := UPPER(calc_table(i).expression);
402        X_expr := REPLACE(X_expr, ' ', NULL);
403 
404        FOR j IN 1..calc_table.count LOOP
405          l_bind := ':TPM'||j;
406 
407          IF (calc_table(j).tech_parm_name IS NOT NULL) THEN
408             X_expr := REPLACE(X_expr, UPPER(calc_table(j).tech_parm_name) ,l_bind);
409          END IF;
410        END LOOP;
411 
412        WHILE (INSTR(X_expr,'^') > 0) LOOP
413          X_carrot := INSTR(X_expr,'^');
414          X_end_bracs := 0;
415          LOOP
416            X_carrot   := X_carrot + 1;
417            X_end_char := SUBSTR(X_expr, X_carrot, 1);
418            IF (X_end_char = '(') THEN
419              X_end_bracs := X_end_bracs + 1;
420            ELSIF (X_end_char = ')') THEN
421              X_end_bracs := X_end_bracs - 1;
422            END IF;
423            IF (X_end_bracs = 0) THEN
424              IF (X_end_char IN ('+', '-', '*', '/', '^')) THEN
425                EXIT;
426              ELSIF (X_end_char = ')') THEN
427                X_end_expr := X_end_expr||X_end_char;
428                EXIT;
429              END IF;
430            END IF;
431            X_end_expr := X_end_expr||X_end_char;
432          END LOOP;
433          X_carrot := INSTR(X_expr,'^');
434          X_end_bracs := 0;
435          LOOP
436            X_carrot   := X_carrot - 1;
437            X_end_char := SUBSTR(X_expr, X_carrot, 1);
438            IF (X_end_char = ')') THEN
439              X_end_bracs := X_end_bracs + 1;
440            ELSIF (X_end_char = '(') THEN
441              X_end_bracs := X_end_bracs - 1;
442            END IF;
443            IF (X_end_bracs = 0) THEN
444              IF (X_end_char IN ('+', '-', '*', '/', '^')) THEN
445                EXIT;
446              ELSIF (X_end_char = '(') THEN
447                X_start_expr := X_end_char||X_start_expr;
448                EXIT;
449              END IF;
450            END IF;
451            X_start_expr := X_end_char||X_start_expr;
452          END LOOP;
453          X_expr := REPLACE(X_expr, X_start_expr||'^'||X_end_expr, 'POWER('||X_start_expr||','||X_end_expr||')');
454        END LOOP;
455        X_expr     := 'ROUND('||X_expr||',6)';
456        X_sql_stmt := 'select '||X_expr||' from dual';
457 
458        IF (dbms_sql.is_open(X_cur)) THEN
459          dbms_sql.close_cursor(X_cur);
460        END IF;
461 
462        X_cur := dbms_sql.open_cursor;
463        dbms_sql.parse(X_cur, X_sql_stmt, 0);
464 
465        FOR j IN 1..calc_table.count LOOP
466          IF (calc_table(j).tech_parm_name IS NOT NULL) AND
467             (INSTR(X_sql_stmt, ':TPM'||j) <> 0) THEN
468            DBMS_SQL.BIND_VARIABLE(X_cur,':TPM'||j, calc_table(j).value);
469          END IF;
470        END LOOP;
471 
472        dbms_sql.define_column(X_cur, 1, X_expr, 100);
473        X_row := dbms_sql.execute(X_cur);
474        IF (dbms_sql.fetch_rows(X_cur) > 0) THEN
475          dbms_sql.column_value(X_cur, 1, X_value);
476          calc_table(i).value := X_value;
477        END IF;
478 
479        dbms_sql.close_cursor(X_cur);
480 
481      END IF;
482    EXCEPTION
483      WHEN OTHERS THEN
484        IF (dbms_sql.is_open(X_cur)) THEN
485          dbms_sql.close_cursor(X_cur);
486        END IF;
487        fnd_msg_pub.add_exc_msg ('GMD_TECH_PARAMS', 'CALCULATE_EXPR');
488    END;
489    END LOOP;
490  END calculate_expr;
491 
492 /*======================================================================
493 --  PROCEDURE :
494 --   convert_uoms
495 --
496 --  DESCRIPTION:
497 --    This PL/SQL procedure is responsible for calculating
498 --    the mass uom qty and vol uom qty.
499 --
500 --  REQUIREMENTS
501 --
502 --  SYNOPSIS:
503 --    load_lab_arrays(X_tech_table, X_calc_table);
504 --
505 --
506 --===================================================================== */
507 PROCEDURE convert_uoms(p_lab_type      IN  VARCHAR2,
508                        x_return_status OUT NOCOPY VARCHAR2) IS
509   X_mass_ind	NUMBER := 0;
510   X_vol_ind       NUMBER := 0;
511   X_conv_qty      NUMBER := 0;
512   X_item_no       VARCHAR2(32);
513   X_mass_type     VARCHAR2(4);
514   X_mass_um       VARCHAR2(4);
515   X_vol_type      VARCHAR2(4);
516   X_vol_um        VARCHAR2(4);
517   NO_UOM_CONV	EXCEPTION;
518   BAD_SYS_UOM	EXCEPTION;
519   CURSOR Cur_get_um(V_um_type VARCHAR2) IS
520     SELECT std_um
521     FROM   sy_uoms_typ
522     WHERE  um_type = V_um_type;
523 BEGIN
524   x_return_status := FND_API.G_RET_STS_SUCCESS;
525   FOR i IN 1..tp_master_tbl.count LOOP
526     IF (tp_master_tbl(i).data_type IN (5,9)) THEN
527       X_mass_ind := 1;
528     ELSIF (tp_master_tbl(i).data_type IN (6,7)) THEN
529       X_vol_ind := 1;
530     END IF;
531   END LOOP;
532   IF (X_mass_ind = 1) THEN
533     X_mass_type := FND_PROFILE.VALUE('LM$UOM_MASS_TYPE');
534     OPEN Cur_get_um(X_mass_type);
535     FETCH Cur_get_um INTO X_mass_um;
536     IF (Cur_get_um%NOTFOUND) THEN
537       CLOSE Cur_get_um;
538       RAISE BAD_SYS_UOM;
539     END IF;
540     CLOSE Cur_get_um;
541   END IF;
542   IF (X_vol_ind = 1) THEN
543     X_vol_type := FND_PROFILE.VALUE('LM$UOM_VOLUME_TYPE');
544     OPEN Cur_get_um(X_vol_type);
545     FETCH Cur_get_um INTO X_vol_um;
546     IF (Cur_get_um%NOTFOUND) THEN
547       CLOSE Cur_get_um;
548       RAISE BAD_SYS_UOM;
549     END IF;
550     CLOSE Cur_get_um;
551   END IF;
552   FOR i IN 1..item_master_tbl.count LOOP
556                                            item_master_tbl(i).item_primary_uom, 0, p_lab_type);
553     IF (item_master_tbl(i).item_primary_uom <> item_master_tbl(i).uom) THEN
554       X_conv_qty := gmicuom.uom_conversion(item_master_tbl(i).item_id, item_master_tbl(i).formula_id,
555                                            item_master_tbl(i).quantity, item_master_tbl(i).uom,
557       IF (X_conv_qty < 0) THEN
558         X_item_no := item_master_tbl(i).item_no;
559         RAISE NO_UOM_CONV;
560       END IF;
561       item_master_tbl(i).primary_uom_qty := X_conv_qty;
562     ELSE
563       item_master_tbl(i).primary_uom_qty := item_master_tbl(i).quantity;
564     END IF;
565     X_conv_qty := 0;
566     IF (X_mass_ind = 1) THEN
567       IF (item_master_tbl(i).uom <> X_mass_um) THEN
568         X_conv_qty := gmicuom.uom_conversion(item_master_tbl(i).item_id, item_master_tbl(i).formula_id,
569                                              item_master_tbl(i).quantity, item_master_tbl(i).uom,
570                                              X_mass_um, 0, p_lab_type);
571         IF (X_conv_qty < 0) THEN
572           X_item_no := item_master_tbl(i).item_no;
573           RAISE NO_UOM_CONV;
574         END IF;
575         item_master_tbl(i).mass_uom_qty := X_conv_qty;
576       ELSE
577         item_master_tbl(i).mass_uom_qty := item_master_tbl(i).quantity;
578       END IF;
579     END IF;
580     X_conv_qty := 0;
581     IF (X_vol_ind = 1) THEN
582       IF (item_master_tbl(i).uom <> X_vol_um) THEN
583         X_conv_qty := gmicuom.uom_conversion(item_master_tbl(i).item_id, item_master_tbl(i).formula_id,
584                                              item_master_tbl(i).quantity, item_master_tbl(i).uom,
585                                              X_vol_um, 0, p_lab_type);
586         IF (X_conv_qty < 0) THEN
587           X_item_no := item_master_tbl(i).item_no;
588           RAISE NO_UOM_CONV;
589         END IF;
590         item_master_tbl(i).vol_uom_qty := X_conv_qty;
591       ELSE
592         item_master_tbl(i).vol_uom_qty := item_master_tbl(i).quantity;
593       END IF;
594     END IF;
595   END LOOP;
596 EXCEPTION
597   WHEN NO_UOM_CONV THEN
598     x_return_status := FND_API.G_RET_STS_ERROR;
599     FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_UOMCV');
600     FND_MESSAGE.SET_TOKEN('ITEM_NO', X_item_no);
601     FND_MSG_PUB.ADD;
602   WHEN BAD_SYS_UOM THEN
603     x_return_status := FND_API.G_RET_STS_ERROR;
604     FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_SYSTEM_UOMS');
605     FND_MSG_PUB.ADD;
606 END convert_uoms;
607 
608 /*======================================================================
609 --  PROCEDURE :
610 --   get_qc_results
611 --
612 --  DESCRIPTION:
613 --    This PL/SQL procedure is responsible for retrieving
614 --    the qc results.
615 --
616 --  REQUIREMENTS
617 --
618 --  SYNOPSIS:
619 --    get_qc_results;
620 --
621 --  HISTORY
622 --    27-Nov-2001 M. Grosser - Removed lot_id,whse_code and location IS NULL
623 --                             from where clause of cursor Cur_get_qcvalue because
624 --                             they were preventing the retrieval of any records.
625 --===================================================================== */
626 PROCEDURE get_qc_results IS
627 
628   CURSOR Cur_get_qcvalue (V_orgn_code VARCHAR2, V_item_id NUMBER, V_assay_code VARCHAR2) IS
629     SELECT a.text_result, a.num_result
630     FROM   qc_rslt_mst a, gmd_tests b
631     WHERE  a.item_id = V_item_id
632            AND a.formula_id IS NULL
633            AND a.routing_id IS NULL
634            AND a.oprn_id IS NULL
635            AND a.cust_id IS NULL
636            AND a.vendor_id IS NULL
637            AND a.batch_id IS NULL
638            AND a.final_mark = 1
639            AND a.delete_mark = 0
640            AND a.orgn_code = V_orgn_code
641            AND a.assay_code = V_assay_code
642            AND a.orgn_code = b.orgn_code
643            AND a.assay_code = b.assay_code
644     ORDER BY result_date DESC;
645   X_rec  Cur_get_qcvalue%ROWTYPE;
646   X_row  NUMBER;
647 BEGIN
648   FOR i IN 1..item_master_tbl.count LOOP
649     FOR j IN 1..tp_master_tbl.count LOOP
650       IF (tp_master_tbl(j).qc_orgn_code IS NOT NULL AND tp_master_tbl(j).qc_assay_name IS NOT NULL) THEN
651         OPEN Cur_get_qcvalue(tp_master_tbl(j).qc_orgn_code, item_master_tbl(i).item_id, tp_master_tbl(j).qc_assay_name);
652         FETCH Cur_get_qcvalue INTO X_rec;
653         IF (Cur_get_qcvalue%FOUND) THEN
654           X_row := attrib_master_tbl.count + 1;
655           attrib_master_tbl(X_row).item_id        := item_master_tbl(i).item_id;
656           attrib_master_tbl(X_row).line_type      := item_master_tbl(i).line_type;
657           attrib_master_tbl(X_row).line_no        := item_master_tbl(i).line_no;
658           attrib_master_tbl(X_row).tech_parm_name := tp_master_tbl(j).tech_parm_name;
659           attrib_master_tbl(X_row).num_value      := X_rec.num_result;
660           attrib_master_tbl(X_row).char_value     := X_rec.text_result;
661         END IF;
662         CLOSE Cur_get_qcvalue;
663       END IF;
664     END LOOP;
665   END LOOP;
666 END get_qc_results;
667 
668 /*======================================================================
669 --  PROCEDURE :
670 --   rollup_wt_pct
671 --
672 --  DESCRIPTION:
673 --    This PL/SQL procedure is responsible for retrieving
674 --    the rollup weight percent.
675 --
676 --  REQUIREMENTS
677 --
678 --  SYNOPSIS:
679 --    rollup_wt_pct(X_tech_parm_name, X_result);
680 --
681 --
682 --===================================================================== */
683 PROCEDURE rollup_wt_pct(p_tech_parm_name VARCHAR2, p_result OUT NOCOPY NUMBER) IS
684   X_total_ingred_wt 	NUMBER := 0;
685   X_total_ingred_pct 	NUMBER := 0;
689   X_total_pct 	      NUMBER := 0;
686   X_total_byprod_wt 	NUMBER := 0;
687   X_total_byprod_pct 	NUMBER := 0;
688   X_total_wt 	      NUMBER := 0;
690 BEGIN
691   FOR i IN 1..item_master_tbl.count LOOP
692     FOR j IN 1..attrib_master_tbl.count LOOP
693       IF ((item_master_tbl(i).item_id = attrib_master_tbl(j).item_id) AND
694           (item_master_tbl(i).line_type = attrib_master_tbl(j).line_type) AND
695           (item_master_tbl(i).line_no = attrib_master_tbl(j).line_no) AND
696           (attrib_master_tbl(j).tech_parm_name = p_tech_parm_name)) THEN
697         IF (item_master_tbl(i).line_type = -1) THEN
698           X_total_ingred_wt  := NVL(item_master_tbl(i).mass_uom_qty,0) + X_total_ingred_wt;
699           X_total_ingred_pct := NVL(attrib_master_tbl(j).num_value,0) * NVL(item_master_tbl(i).mass_uom_qty,0) + X_total_ingred_pct;
700         ELSIF (item_master_tbl(i).line_type = 2) THEN
701           X_total_byprod_wt  := NVL(item_master_tbl(i).mass_uom_qty,0) + X_total_byprod_wt;
702           X_total_byprod_pct := NVL(attrib_master_tbl(j).num_value,0) * NVL(item_master_tbl(i).mass_uom_qty,0) + X_total_byprod_pct;
703         END IF;
704         EXIT;
705       END IF;
706     END LOOP;
707   END LOOP;
708   X_total_pct := X_total_ingred_pct - X_total_byprod_pct;
709   X_total_wt  := X_total_ingred_wt - X_total_byprod_wt;
710   IF (X_total_wt <> 0) THEN
711     p_result := X_total_pct / X_total_wt;
712   ELSE
713     p_result := 0;
714   END IF;
715 END rollup_wt_pct;
716 
717 /*======================================================================
718 --  PROCEDURE :
719 --   rollup_vol_pct_and_spec_gr
720 --
721 --  DESCRIPTION:
722 --    This PL/SQL procedure is responsible for retrieving
723 --    the rollup volume percent and specific gravity.
724 --
725 --  REQUIREMENTS
726 --
727 --  SYNOPSIS:
728 --    rollup_vol_pct_and_spec_gr(X_tech_parm_name, X_data_type, X_result);
729 --
730 --
731 --===================================================================== */
732 PROCEDURE rollup_vol_pct_and_spec_gr(p_tech_parm_name VARCHAR2, p_data_type NUMBER, p_result OUT NOCOPY NUMBER) IS
733   X_total_ingred_vol 	NUMBER := 0;
734   X_total_ingred_pct 	NUMBER := 0;
735   X_total_ingred_spgr 	NUMBER := 0;
736   X_total_byprod_vol 	NUMBER := 0;
737   X_total_byprod_pct 	NUMBER := 0;
738   X_total_byprod_spgr 	NUMBER := 0;
739   X_total_vol 	      NUMBER := 0;
740   X_total_pct 	      NUMBER := 0;
741   X_total_spgr 	      NUMBER := 0;
742 BEGIN
743   FOR i IN 1..item_master_tbl.count LOOP
744     FOR j IN 1..attrib_master_tbl.count LOOP
745       IF ((item_master_tbl(i).item_id = attrib_master_tbl(j).item_id) AND
746           (item_master_tbl(i).line_type = attrib_master_tbl(j).line_type) AND
747           (item_master_tbl(i).line_no = attrib_master_tbl(j).line_no) AND
748           (attrib_master_tbl(j).tech_parm_name = p_tech_parm_name)) THEN
749         IF (item_master_tbl(i).line_type = -1) THEN
750           X_total_ingred_vol  := X_total_ingred_vol + NVL(item_master_tbl(i).vol_uom_qty,0);
751           X_total_ingred_pct  := X_total_ingred_pct + (NVL(item_master_tbl(i).vol_uom_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
752           X_total_ingred_spgr := X_total_ingred_spgr + (NVL(item_master_tbl(i).vol_uom_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
753         ELSIF (item_master_tbl(i).line_type = -1) THEN
754           X_total_byprod_vol  := X_total_byprod_vol + NVL(item_master_tbl(i).vol_uom_qty,0);
755           X_total_byprod_pct  := X_total_byprod_pct + (NVL(item_master_tbl(i).vol_uom_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
756           X_total_byprod_spgr := X_total_byprod_spgr + (NVL(item_master_tbl(i).vol_uom_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
757         END IF;
758         EXIT;
759       END IF;
760     END LOOP;
761   END LOOP;
762   X_total_vol := X_total_ingred_vol - X_total_byprod_vol;
763   IF (X_total_vol <> 0) THEN
764     IF (p_data_type = 6) THEN
765       X_total_pct := X_total_ingred_pct - X_total_byprod_pct;
766       IF (X_total_pct <= 0) THEN
767         p_result := 0;
768       ELSE
769         p_result := X_total_pct / X_total_vol;
770       END IF;
771     ELSE
772       X_total_spgr := X_total_ingred_spgr - X_total_byprod_spgr;
773       IF (X_total_spgr <= 0) THEN
774         p_result := 0;
775       ELSE
776         p_result := X_total_spgr / X_total_vol;
777       END IF;
778     END IF;
779   ELSE
780     p_result := 0;
781   END IF;
782 END rollup_vol_pct_and_spec_gr;
783 
784 /*======================================================================
785 --  PROCEDURE :
786 --   rollup_cost_and_units
787 --
788 --  DESCRIPTION:
789 --    This PL/SQL procedure is responsible for retrieving
790 --    the rollup cost.
791 --
792 --  REQUIREMENTS
793 --
794 --  SYNOPSIS:
795 --    rollup_cost_and_units(X_tech_parm_name, X_tp_uom,
796 --                          X_lab_type, X_result, X_return_status);
797 --
798 --
799 --===================================================================== */
800 PROCEDURE rollup_cost_and_units(p_tech_parm_name VARCHAR2, p_prod_uom VARCHAR2,
801                                 p_lab_type VARCHAR2, p_result OUT NOCOPY NUMBER, x_return_status OUT NOCOPY VARCHAR2) IS
802   X_total_ingred_rollup NUMBER := 0;
803   X_total_byprod_rollup NUMBER := 0;
804   X_conv_qty            NUMBER := 0;
805   X_item_no            VARCHAR2(32);
806   NO_UOM_CONV	     EXCEPTION;
807 BEGIN
808   x_return_status := FND_API.G_RET_STS_SUCCESS;
809   FOR i IN 1..item_master_tbl.count LOOP
810     FOR j IN 1..attrib_master_tbl.count LOOP
811       IF ((item_master_tbl(i).item_id = attrib_master_tbl(j).item_id) AND
815         IF (item_master_tbl(i).item_primary_uom <> p_prod_uom) THEN
812           (item_master_tbl(i).line_type = attrib_master_tbl(j).line_type) AND
813           (item_master_tbl(i).line_no = attrib_master_tbl(j).line_no) AND
814           (attrib_master_tbl(j).tech_parm_name = p_tech_parm_name)) THEN
816           X_conv_qty := gmicuom.uom_conversion(item_master_tbl(i).item_id, item_master_tbl(i).formula_id,
817                                                item_master_tbl(i).primary_uom_qty, item_master_tbl(i).item_primary_uom,
818                                                p_prod_uom, 0, p_lab_type);
819           IF (X_conv_qty < 0) THEN
820             X_item_no := item_master_tbl(i).item_no;
821             RAISE NO_UOM_CONV;
822           END IF;
823         ELSE
824           X_conv_qty := item_master_tbl(i).primary_uom_qty;
825         END IF;
826         IF (item_master_tbl(i).line_type = -1) THEN
827           X_total_ingred_rollup := X_total_ingred_rollup + (NVL(X_conv_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
828         ELSIF (item_master_tbl(i).line_type = 2) THEN
829           X_total_byprod_rollup := X_total_byprod_rollup + (NVL(X_conv_qty,0) * NVL(attrib_master_tbl(j).num_value,0));
830         END IF;
831       END IF;
832     END LOOP;
833   END LOOP;
834   p_result := X_total_ingred_rollup - X_total_byprod_rollup;
835 EXCEPTION
836   WHEN NO_UOM_CONV THEN
837     x_return_status := FND_API.G_RET_STS_ERROR;
838     FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_UOMCV');
839     FND_MESSAGE.SET_TOKEN('ITEM_NO', X_item_no);
840     FND_MSG_PUB.ADD;
841 END rollup_cost_and_units;
842 
843 /*======================================================================
844 --  PROCEDURE :
845 --   rollup_equiv_wt
846 --
847 --  DESCRIPTION:
848 --    This PL/SQL procedure is responsible for retrieving
849 --    the rollup equivalent weight.
850 --
851 --  REQUIREMENTS
852 --
853 --  SYNOPSIS:
854 --    rollup_equiv_wt(X_tech_parm_name, X_prod_uom, X_lab_type, X_result);
855 --
856 --
857 --===================================================================== */
858 PROCEDURE rollup_equiv_wt(p_tech_parm_name VARCHAR2, p_prod_uom VARCHAR2,
859                           p_lab_type VARCHAR2, p_result OUT NOCOPY NUMBER, x_return_status OUT NOCOPY VARCHAR2) IS
860   X_eq_wt_qty          NUMBER := 0;
861   X_total_ingred_eqvts NUMBER := 0;
862   X_total_ingred_mass  NUMBER := 0;
863   X_total_byprod_eqvts NUMBER := 0;
864   X_total_byprod_mass  NUMBER := 0;
865   X_total_eqvts        NUMBER := 0;
866   X_total_mass         NUMBER := 0;
867   X_item_no            VARCHAR2(32);
868   NO_UOM_CONV	     EXCEPTION;
869 BEGIN
870   x_return_status := FND_API.G_RET_STS_SUCCESS;
871   FOR i IN 1..item_master_tbl.count LOOP
872     FOR j IN 1..attrib_master_tbl.count LOOP
873       IF ((item_master_tbl(i).item_id = attrib_master_tbl(j).item_id) AND
874           (item_master_tbl(i).line_type = attrib_master_tbl(j).line_type) AND
875           (item_master_tbl(i).line_no = attrib_master_tbl(j).line_no) AND
876           (attrib_master_tbl(j).tech_parm_name = p_tech_parm_name)) THEN
877         IF (item_master_tbl(i).line_type <> 1) THEN
878           X_eq_wt_qty := item_master_tbl(i).quantity;
879           IF (item_master_tbl(i).uom <> p_prod_uom) THEN
880             X_eq_wt_qty := gmicuom.uom_conversion(item_master_tbl(i).item_id, item_master_tbl(i).formula_id,
881                                                   item_master_tbl(i).quantity, item_master_tbl(i).uom,
882                                                   p_prod_uom, 0, p_lab_type);
883             IF (X_eq_wt_qty < 0) THEN
884               X_item_no := item_master_tbl(i).item_no;
885               RAISE NO_UOM_CONV;
886             END IF;
887           END IF;
888           IF (item_master_tbl(i).line_type = -1) THEN
889             IF (NVL(attrib_master_tbl(j).num_value,0) <> 0) THEN
890               X_total_ingred_eqvts := X_total_ingred_eqvts + (X_eq_wt_qty / attrib_master_tbl(j).num_value);
891             END IF;
892             X_total_ingred_mass := X_total_ingred_mass + X_eq_wt_qty;
893           ELSIF (item_master_tbl(i).line_type = 2) THEN
894             IF (NVL(attrib_master_tbl(j).num_value,0) <> 0) THEN
895               X_total_byprod_eqvts := X_total_byprod_eqvts + (X_eq_wt_qty / attrib_master_tbl(j).num_value);
896             END IF;
897             X_total_byprod_mass := X_total_byprod_mass + X_eq_wt_qty;
898           END IF;
899         END IF;
900       END IF;
901     END LOOP;
902   END LOOP;
903   X_total_mass  := X_total_ingred_mass - X_total_byprod_mass;
904   X_total_eqvts := X_total_ingred_eqvts - X_total_byprod_eqvts;
905   IF (X_total_eqvts <> 0) THEN
906     p_result := X_total_mass / X_total_eqvts;
907   ELSE
908     p_result := 0;
909   END IF;
910 EXCEPTION
911   WHEN NO_UOM_CONV THEN
912     x_return_status := FND_API.G_RET_STS_ERROR;
913     FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_UOMCV');
914     FND_MESSAGE.SET_TOKEN('ITEM_NO', X_item_no);
915     FND_MSG_PUB.ADD;
916 END rollup_equiv_wt;
917 
918 
919 /*======================================================================
920 --  FUNCTION :
921 --    check_for_tech_data
922 --
923 --  DESCRIPTION:
924 --    This PL/SQL function is used to determine if there is any technical data
925 --    entered for this lab_type/item combination.  It will also check for results
926 --    for any technical parameter that is defined as a qc assay.
927 --
928 --  SYNOPSIS:
929 --    check_for_tech_data(p_lab_type VARCHAR2, pitem_id NUMBER, pformula_id NUMBER) RETURN NUMBER;
930 --
931 --  CALLED FROM:
932 --    GMDFRMED.fmb, GMDFMLED.fmb, GMDFRMLN.fmb
933 --
934 --  HISTORY
938                              pitem_id NUMBER,
935 --    27-Nov-2001  M. Grosser  BUG 1915337 - Created procedure
936 --===================================================================== */
937 FUNCTION check_for_tech_data(plab_type VARCHAR2,
939                              pformula_id NUMBER) RETURN NUMBER IS
940 
941   x_value NUMBER;
942   x_lab_type VARCHAR2(4);
943 
944   CURSOR cur_lab_type IS
945     SELECT 1
946       FROM sy_orgn_mst
947       WHERE  orgn_code = plab_type
948              AND plant_ind = 2 ;
949 
950   CURSOR cur_check_item_data IS
951     SELECT 1
952       FROM lm_item_dat
953       WHERE  orgn_code = x_lab_type
954              AND lot_id = 0
955              AND delete_mark = 0
956              AND (NVL(formula_id,0) = NVL(pformula_id,0)
957               OR formula_id = 0)
958              AND item_id = pitem_id ;
959 
960   CURSOR cur_get_qcvalue IS
961     SELECT 1
962     FROM   qc_rslt_mst q, lm_prlt_asc s, lm_tech_hdr h
963     WHERE  q.item_id = pitem_id
964            AND q.formula_id IS NULL
965            AND q.routing_id IS NULL
966            AND q.oprn_id IS NULL
967            AND q.cust_id IS NULL
968            AND q.vendor_id IS NULL
969            AND q.batch_id IS NULL
970            AND q.final_mark = 1
971            AND q.delete_mark = 0
972            AND q.qcassy_typ_id = h.qcassy_typ_id
973            AND s.orgn_code = x_lab_type
974            AND h.tech_parm_name = s.tech_parm_name
975            AND h.qcassy_typ_id IS NOT NULL
976            AND q.orgn_code = NVL(plab_type,x_lab_type)
977     ORDER BY result_date DESC;
978 
979   NO_LAB_TYPE    EXCEPTION;
980   NO_ATTRIB_DATA EXCEPTION;
981 
982 BEGIN
983   /* If a value has been sent in for lab type, confirm it is a valid lab type */
984   IF (plab_type IS NOT NULL) THEN
985     OPEN cur_lab_type;
986     FETCH cur_lab_type into x_value;
987     IF cur_lab_type%FOUND THEN
988       x_lab_type := plab_type;
989     END IF;
990     CLOSE cur_lab_type;
991   END IF;
992 
993   /* If no value was been sent in or it was not a valid lab type, get the default lab type */
994   IF (x_lab_type IS NULL) THEN
995     IF FND_PROFILE.DEFINED('GEMMS_DEFAULT_LAB_TYPE') THEN
996       x_lab_type :=  FND_PROFILE.VALUE('GEMMS_DEFAULT_LAB_TYPE');
997     ELSE
998       /* No default lab type, raise an error */
999       RAISE NO_LAB_TYPE;
1000     END IF;
1001   END IF;
1002 
1003   /*  Check to see if there is any item tech data in lm_item_dat  */
1004   OPEN cur_check_item_data;
1005   FETCH cur_check_item_data into x_value;
1006 
1007   /* If there is no data in lm_item_dat, see if there are qc results for this item */
1008   IF cur_check_item_data%NOTFOUND THEN
1009     OPEN cur_get_qcvalue;
1010     FETCH cur_get_qcvalue into x_value;
1011 
1012     /* If there are no qc results either, return that there is no item tech data */
1013     IF cur_get_qcvalue%NOTFOUND THEN
1014       RAISE NO_ATTRIB_DATA;
1015     END IF;
1016     CLOSE cur_get_qcvalue;
1017   END IF;
1018   CLOSE cur_check_item_data;
1019 
1020   /* If you get here, you have found some data */
1021   RETURN 1;
1022 
1023 
1024 EXCEPTION
1025   WHEN NO_LAB_TYPE THEN
1026      FND_MESSAGE.SET_NAME('GMD', 'LM_BAD_LAB_TYPE_PARM');
1027      FND_MSG_PUB.ADD;
1028      RETURN -1;
1029 
1030   WHEN NO_ATTRIB_DATA THEN
1031      FND_MESSAGE.SET_NAME('GMD', 'LM_NO_ATTRIB_DATA');
1032      FND_MSG_PUB.ADD;
1033      RETURN 0;
1034 
1035   WHEN OTHERS THEN
1036      RETURN -1;
1037 
1038 END check_for_tech_data;
1039 
1040 
1041 END gmd_tech_params;