DBA Data[Home] [Help]

PACKAGE BODY: APPS.BOMPCOAN

Source


1 PACKAGE BODY BOMPCOAN AS
2 /* $Header: BOMCOANB.pls 120.4.12020000.3 2012/07/20 07:08:02 nlingamp ship $ */
3 /*==========================================================================+
4 |   Copyright (c) 1993 Oracle Corporation Belmont, California, USA          |
5 |                          All rights reserved.                             |
6 +===========================================================================+
7 |                                                                           |
8 | File Name    : BOMCOANB.pls                                               |
9 | DESCRIPTION  :                                                            |
10 |              This file creates a packaged procedure that performs ECO     |
11 |              autonumbering.  When passed a user id and an organization    |
12 |              id, it searches for a valid ECO autonumber prefix and next   |
13 |              available number, searching in the following order:          |
14 |                 1 - specific user, specific organization                  |
15 |                 2 - specific user, across all organizations               |
16 |                 3 - specific organization, across all users               |
17 |                 4 - across all users and all organizations                |
18 | INPUTS       :  P_USER_ID - user id					    |
19 |                 P_ORGANIZATION_ID - organization id                       |
20 |                 P_MODE - indicates whether or not to update next          |
21 |                          available number in the ECO autonumber table     |
22 |                                                                           |
23 +==========================================================================*/
24 
25 
26 
27 --Begin  bug fix 9234014
28 PROCEDURE Check_Next_AutoNum(p_user_id  IN NUMBER
29    , p_organization_id  IN NUMBER
30    , p_change_notice IN VARCHAR2
31    , x_return_status IN OUT NOCOPY VARCHAR2)
32 
33 IS
34     p_next_number       ENG_AUTO_NUMBER_ECN.NEXT_AVAILABLE_NUMBER%TYPE;
35     p_prefix_temp       VARCHAR2(12);
36     p_prefix_temp1       VARCHAR2(12);
37     p_greatest_num      NUMBER;
38     l_return_status     VARCHAR2(1);
39     p_temp_number      NUMBER;
40     no_prefix_found     EXCEPTION;
41 
42     CURSOR PREFIX_CURSOR (c_user_id IN NUMBER,
43                           c_org_id  IN NUMBER,
44                           c_prefix IN VARCHAR2) IS
45                  SELECT
46                           alpha_prefix,
47                           next_available_number
48                  FROM     eng_auto_number_ecn
49                  WHERE    nvl(organization_id, c_org_id) = c_org_id
50                  AND      nvl(user_id, c_user_id) = c_user_id
51                  AND      alpha_prefix = c_prefix
52 		             AND      change_type_id IS NULL
53                  ORDER BY user_id, organization_id;
54 
55 
56 BEGIN
57 
58 
59 
60 P_PREFIX_TEMP1 := RTRIM(P_CHANGE_NOTICE,'0123456789');
61 
62 IF P_PREFIX_TEMP1 = P_CHANGE_NOTICE
63 THEN
64   RAISE no_prefix_found;
65 ELSE
66  OPEN PREFIX_CURSOR(P_USER_ID, P_ORGANIZATION_ID, P_PREFIX_TEMP1);
67 
68  FETCH PREFIX_CURSOR INTO
69                          p_prefix_temp,
70                          p_next_number;
71 
72 /* If no prefix is found, raise an exception and return to calling routine */
73 
74  IF PREFIX_CURSOR%NOTFOUND
75  THEN RAISE no_prefix_found;
76  END IF;
77  CLOSE PREFIX_CURSOR;
78 
79 END IF;
80 
81 /* Find the chosen prefix and next number combination */
82 --p_temp_num is from change_notice
83 P_TEMP_NUMBER := GREATEST(TO_NUMBER(LTRIM(P_CHANGE_NOTICE,P_PREFIX_TEMP)))+1;
84 
85 P_NEXT_NUMBER := GREATEST(P_NEXT_NUMBER, P_TEMP_NUMBER);
86 
87 SELECT GREATEST(P_NEXT_NUMBER,
88        NVL(GREATEST(TO_NUMBER(LTRIM(CHANGE_NOTICE,P_PREFIX_TEMP))),0)+1)
89 INTO   P_GREATEST_NUM
90 FROM   ENG_ENGINEERING_CHANGES
91 WHERE  ORGANIZATION_ID = P_ORGANIZATION_ID
92 AND    RTRIM(CHANGE_NOTICE,'0123456789') = P_PREFIX_TEMP;
93 
94 P_NEXT_NUMBER := GREATEST(P_GREATEST_NUM, P_NEXT_NUMBER);
95 
96 /* Ensure that the length of the entire string is less than or equal to 10,
97 the maximum length for ECO name */
98 
99 if LENGTHB(P_PREFIX_TEMP || P_NEXT_NUMBER) <= 10
100 then
101    l_return_status := 'S';
102 else
103    l_return_status := 'F';
104 end if;
105 x_return_status := l_return_status;
106 
107 
108 EXCEPTION
109 WHEN no_prefix_found THEN
110  l_return_status := 'S';
111  x_return_status := l_return_status;
112 
113  WHEN no_data_found THEN
114    if LENGTHB(P_PREFIX_TEMP || P_NEXT_NUMBER) <= 10
115    then
116      l_return_status := 'S';
117   else
118      l_return_status := 'F';
119   end if;
120 x_return_status := l_return_status;
121 WHEN others THEN
122  l_return_status := 'S';
123  x_return_status := l_return_status;
124 
125 END Check_Next_AutoNum;
126 
127 --Eng bug fix 9234014
128 
129 
130 PROCEDURE BOM_ECO_AUTONUMBER
131    (P_USER_ID 			IN	NUMBER,
132     P_ORGANIZATION_ID		IN	NUMBER,
133     P_MODE 			IN      NUMBER,
134     P_PREFIX			IN OUT NOCOPY  VARCHAR2,
135     x_return_status		IN	OUT NOCOPY    VARCHAR2)
136 IS
137 
138     p_next_number       ENG_AUTO_NUMBER_ECN.NEXT_AVAILABLE_NUMBER%TYPE;
139     p_prefix_temp       VARCHAR2(12);
140     p_output_user_id    NUMBER;
141     p_output_org_id     NUMBER;
142     p_greatest_num      NUMBER;
143     l_rowid             VARCHAR2(102);
144     p_next_num_temp     number; --added for bug 9234014
145 
146     no_prefix_found     EXCEPTION;
147     next_eco_invalid    EXCEPTION;  --added for bug 9234014
148  /* Added row_id to the cursor */
149     CURSOR PREFIX_CURSOR (c_user_id IN NUMBER,
150                           c_org_id  IN NUMBER) IS
151                  SELECT
152 		          rowid ,
153 			  alpha_prefix,
154                           next_available_number,
155                           user_id,
156                           organization_id
157                  FROM     eng_auto_number_ecn
158                  WHERE    nvl(organization_id, c_org_id) = c_org_id
159                  AND      nvl(user_id, c_user_id) = c_user_id
160 		 AND      change_type_id IS NULL --* Added for bug #3959772
161                  ORDER BY user_id, organization_id
162 		 FOR UPDATE;
163 
164 
165 BEGIN
166 
167 /* P_MODE = 1 --> update ENG_AUTO_NUMBER_ECN to show next available
168                   number
169 */
170 
171 OPEN PREFIX_CURSOR(P_USER_ID, P_ORGANIZATION_ID);
172 
173 FETCH PREFIX_CURSOR INTO
174                          l_rowid ,
175                          p_prefix_temp,
176                          p_next_number,
177                          p_output_user_id,
178                          p_output_org_id;
179 
180 /* If no prefix is found, raise an exception and return to calling routine */
181 
182 IF PREFIX_CURSOR%NOTFOUND
183 THEN RAISE no_prefix_found;
184 END IF;
185 
186 CLOSE PREFIX_CURSOR;
187 
188 /* Ensure that chosen prefix and next number has not already been used */
189 
190 SELECT GREATEST(P_NEXT_NUMBER,
191        NVL(MAX(TO_NUMBER(LTRIM(CHANGE_NOTICE,P_PREFIX_TEMP))),0)+1)
192 INTO   P_GREATEST_NUM
193 FROM   ENG_ENG_CHANGES_INTERFACE
194 WHERE  ORGANIZATION_ID = P_ORGANIZATION_ID
195 AND    RTRIM(CHANGE_NOTICE,'0123456789') = P_PREFIX_TEMP;
196 
197 P_NEXT_NUMBER := GREATEST(P_GREATEST_NUM, P_NEXT_NUMBER);
198 
199 SELECT GREATEST(P_NEXT_NUMBER,
200        NVL(MAX(TO_NUMBER(LTRIM(CHANGE_NOTICE,P_PREFIX_TEMP))),0)+1)
201 INTO   P_GREATEST_NUM
202 FROM   ENG_ENGINEERING_CHANGES
203 WHERE  ORGANIZATION_ID = P_ORGANIZATION_ID
204 AND    RTRIM(CHANGE_NOTICE,'0123456789') = P_PREFIX_TEMP;
205 
206 P_NEXT_NUMBER := GREATEST(P_GREATEST_NUM, P_NEXT_NUMBER);
207 
208 /* Ensure that the length of the entire string is less than or equal to 10,
209 the maximum length for ECO name */
210 
211 
212 if LENGTHB(P_PREFIX_TEMP || P_NEXT_NUMBER) <= 10
213 then
214     p_next_num_temp := P_NEXT_NUMBER + 1;
215   --check if the next available number would be greater than > 10 digits then fail this update and raise exception
216   --added for bug 9234014 (begin)
217   if LENGTHB(P_PREFIX_TEMP || p_next_num_temp) > 10 THEN
218    RAISE next_eco_invalid;
219    --added for bug 9234014 (end)
220   else
221 
222    if P_MODE = 1   -- Only update the autonumber table if P_MODE is 1
223    then
224    --Added rowd_id ,as for case 4 ,the update statement updated all the records ,which is not desirable
225    UPDATE ENG_AUTO_NUMBER_ECN
226    SET NEXT_AVAILABLE_NUMBER = P_NEXT_NUMBER+1
227    WHERE NVL(ORGANIZATION_ID, -999) = NVL(P_OUTPUT_ORG_ID, -999)
228    AND   NVL(USER_ID, -999) = NVL(P_OUTPUT_USER_ID, -999)
229    AND   rowid =l_rowid;
230    end if;
231  end if;
232 P_PREFIX := P_PREFIX_TEMP || P_NEXT_NUMBER;
233 x_return_status := 'S'; --added for bug 9234014
234 else RAISE no_prefix_found;
235 
236 end if;
237 
238 EXCEPTION
239 WHEN no_prefix_found THEN --added for bug 9234014 (begin)
240 P_PREFIX := null;
241 x_return_status := 'F';
242 
243 WHEN next_eco_invalid
244 THEN
245 P_PREFIX := P_PREFIX_TEMP || P_NEXT_NUMBER;
246 x_return_status := 'F';
247 
248 WHEN others THEN
249 P_PREFIX := null;
250 x_return_status := 'F'; --added for bug 9234014 (end)
251 
252 END BOM_ECO_AUTONUMBER;
253 
254 END BOMPCOAN;