[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;