Escolar Documentos
Profissional Documentos
Cultura Documentos
function of support to provide help to the user on writing their own custom wrapper files
but they may be able to give you the advice on this. An example wrapper file is provided in
the User Guide (see below).
As a general comment, when a user is setting out to write procedures and functions using
these APIs, it is advisable first to write simple scripts like the ones detailed in this paper
(that is to say, with a single row of data embedded in the script as constants) to become
confident of the working of the API itself before moving on to a wrapper which reads and
processes a batch of input rows.
It should also be noted that Oracle will support the use of the Public APIs ONLY. You
should not directly call the private APIs. For example, the use of
'gme_api_pub.create_batch' is supported, however, 'gme_api_main.create_batch' is not
supported.
An additional point to is that GME Debugging works when using the APIs in the exactly
the same way that it works when using the application in the normal way.
This can provide useful additional information if the results of an API run are not as
expected.
In order to generate a GME debug file, do the following:
1. Set Profile Option 'FND: Debug Log Enabled' at User level to 'Yes' and
Profile Option 'FND: Debug Log Level' at User level to 'Statement' and run
the API in the normal way.
2. The GME Debug log files are to be found in the 'utl_file_dir' directory. This
query
select nvl(substr(value, 1, instr(value, ',')-1),value)
from v$parameter
where name = 'utl_file_dir'
/
will show the user the directory where the log file will be generated. GME debug Log file
names start with the Applications User Name, and the format of the file name is
'USERNAMEEvent'; for example ORAUSRCreateBatch or ORAUSRAllocateLine.
For a detailed description of available public APIs, refer to the Process Execution API
Users Guide Release 11i - Part No. A97388-04. When attempting to use an API, it is
recommended to read the manual thoroughly, especially the sections that outline the
parameters required by the relevant API.
All of the scripts provided in this document should be executed using the APPS SQL*Plus
user.
Document History
Create Date : 25-JUL-2006
Last Update Date : 01-AUG-2006
Table of Contents
Related Documents
x_return_status VARCHAR2(1);
l_batch_header GME_BATCH_HEADER%ROWTYPE;
l_msg_index_out NUMBER;
BEGIN
l_batch_header.plant_code :='PR1';
l_batch_header.batch_type :=p_batch_type;
l_batch_header.batch_no:= '';
l_batch_header.plan_start_date := '';
l_batch_header.plan_cmplt_date := '';
l_batch_header.due_date :=TO_DATE('10-AUG-2006 12:00:00','DD-MON-YYYY
HH24:MI:SS');
l_batch_header.update_inventory_ind :='Y';
l_batch_header.recipe_validity_rule_id :=1239;
l_batch_header.wip_whse_code:='PR1';
fnd_global.apps_initialize(user_id =>1003637,
resp_id => null,
resp_appl_id => null);
gme_api_pub.create_batch(
p_api_version => p_api_version
,p_validation_level => p_validation_level
,p_init_msg_list => p_init_msg_list
,p_commit => true
,x_message_count => x_message_count
,x_message_list => x_message_list
,x_return_status => x_return_status
,p_batch_header => l_batch_header
,x_batch_header => x_batch_header
,p_batch_size => 10
,p_batch_size_uom => 'KG'
,p_creation_mode => 'RECIPE'
,p_recipe_id => null
,p_recipe_no => 'JGC_1'
,p_recipe_version => '301'
,p_product_no => null
,p_product_id => null
,p_ignore_qty_below_cap => true
,p_ignore_shortages => true
,x_unallocated_material =>x_unallocated_material );
gme_debug.display_messages(x_message_count);
dbms_output.put_line('x_message_count ='||TO_CHAR(x_message_count));
dbms_output.put_line('x_message_list =
'||length(x_message_list)||SubStr(x_message_list,length(x_message_list)-20,20));
dbms_output.put_line('x_message_list ='||x_message_list);
dbms_output.put_line('x_return_status ='||x_return_status);
dbms_output.put_line('x_batch_header.batch_id= '||
TO_CHAR(x_batch_header.batch_id));
dbms_output.put_line(SubStr('x_batch_header.plant_code ='||
x_batch_header.plant_code,1,255));
dbms_output.put_line(SubStr('x_batch_header.batch_no ='||
x_batch_header.batch_no,1,255));
END;
/
To find the Validity Rule Id, run this script
select r.recipe_no
,r.recipe_version
,r.recipe_id
,v.RECIPE_VALIDITY_RULE_ID
,v.orgn_code
,RECIPE_USE
,PREFERENCe
,START_DATe
,END_DATE
,MIN_QTY
,MAX_QTY
,STD_QTY
,ITEM_UM
from gmd_recipes r
,gmd_recipe_validity_rules v
where r.recipe_no='&recipe_no'
and r.recipe_version='&version'
and r.recipe_id=v.recipe_id
order by
v.preference
Remarks on Example 1
1. Notice the alter session set nls_language=american; command. This command is
used to ensure that the language in the current SQL*Plus session matches one of the
installed languages within the Application. It is always safe to set this to american.
2. The set serveroutput on size 1000000 command is there to ensure that the
'dbms_out.put_line' messages can be seen on the screen. In real life examples, the
user will probably use the 'utl_file.put_line' command in order to write these
messages to a text log file.
3. Note the combination of the Recipe Number and Version and the Validity Rule Id.
The Validity Rule Id must be attached to the relevant Recipe, and both must be
Approved for General Use. The Validity Rule must be effective on the relevant
batch dates (in this case, the batch due date). To find the appropriate value of
Validity Rule Id, run the script shown above.
4. Note the Batch Size and UOM. These must be valid within the limits set by the
Validity Rule being used.
5. The fnd_global.apps_initialize is used to set the application context. In the above
example, the context is set according to the applications user whose id is 1003637.
The relevant id can found for the required user by using this command: select
user_id from fnd_user where user_name='&user_name'; and entering the required
username. The user selected should have a responsibility attached which allows
creation of batches via the application.
6. A full description of the Create Batch API and its parameters can be found in the
User Guide pages 4-16 to 4-19.
p_batch_header.wip_whse_code := '';
gme_api_pub.create_batch(
p_api_version
,p_validation_level => 100
,p_init_msg_list
=> TRUE
,p_commit
=> FALSE
,x_message_count
=> x_message_count
,x_message_list
=> x_message_list
,x_return_status
=> x_return_status
,p_batch_header
=> p_batch_header
,x_batch_header
=> x_batch_header
,p_batch_size
=> 100
,p_batch_size_uom
=> 'KG'
,p_creation_mode
=> 'PRODUCT'
,p_recipe_id
=> null
,p_recipe_no
=> null
,p_recipe_version
=> null
,p_product_no
=> 'JGC_1'
,p_product_id
=> NULL
,p_ignore_qty_below_cap => TRUE
,p_ignore_shortages => TRUE
,x_unallocated_material => x_unallocated_material
);
gme_debug.display_messages(x_message_count);
dbms_output.put_line('x_message_count = '||TO_CHAR(x_message_count));
dbms_output.put_line('x_message_list = '||x_message_list);
dbms_output.put_line('x_return_status = '||x_return_status);
dbms_output.put_line('x_batch_header.batch_id = '||TO_CHAR(x_batch_header.batch_id));
dbms_output.put_line(SubStr('x_batch_header.plant_code = '||
x_batch_header.plant_code,1,255));
dbms_output.put_line(SubStr('x_batch_header.batch_no = '||
x_batch_header.batch_no,1,255));
dbms_output.put_line('x_batch_header.batch_type = '||
TO_CHAR(x_batch_header.batch_type));
dbms_output.put_line('x_batch_header.recipe_validity_rule_id ='||
TO_CHAR(x_batch_header.recipe_validity_rule_id));
dbms_output.put_line('x_batch_header.formula_id = '||
TO_CHAR(x_batch_header.formula_id));
dbms_output.put_line('x_batch_header.routing_id = '||
TO_CHAR(x_batch_header.routing_id));
dbms_output.put_line('x_batch_header.plan_start_date = '||
TO_CHAR(x_batch_header.plan_start_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.due_date = '||TO_CHAR(x_batch_header.due_date,
'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.plan_cmplt_date = '||
x_unallocated_material(i).alloc_uom,1,255));
END IF;
END LOOP;
END IF;
gme_api_pub.save_batch(
p_batch_header
=> p_batch_header,
X_return_status
=> x_return_status,
p_commit
=>TRUE);
EXCEPTION
WHEN OTHERS THEN
SQLERRM);
RAISE;
END;
/
Remarks on Example 2
1. The remarks made against Example 1 remain valid for Example 2. In
addition please note the following.
2. In this example, the product to be output is specified and the quantity to be
output is likewise specified. Once again, however, there must be a valid
Recipe Validity Rule that can used to create the batch. See remark 3 on
example 1 for more details.
3. Notice that when the API creating the batch (gme_api_pub.create_batch) is
run, the transaction is not committed. Instead this is done at a later stage
using the 'gme_api_pub.save_batch' API. The user may care to use this
technique when, for example, creating and releasing a batch in a single
transaction.
x_batch_header GME_BATCH_HEADER%rowtype;
x_unallocated_material GME_API_PUB.UNALLOCATED_MATERIALS_TAB;
l_msg_index_out NUMBER;
BEGIN
-- Following line is set the output buffer
dbms_output.enable(100000);
/*************************************************************************
*************
* Enter your user id below
* NOTE: To retrieve user_id Log on to the application.
* Select to Production Supervisor responsibility
* Navigate Others->Session parameters
* You will see your USER ID and Username on the screen.
* fnd_profile.initialize(user_id);
*************************************************************************
*************/
-- set the applications context
fnd_global.apps_initialize( USER_ID =>1007882,
resp_id =>NULL,
resp_appl_id =>NULL
);
/*************************************************************************
*************
* (R) = Required, (O) = Optional
* enter your own plant_code (R), recipe_validity_Rule_Id(O), batch_type (R)
* specify batch_no (R if testing manual doc ordering)
* dates are optional;format of the dates is
* TO_DATE('10-OCT-2001 12:00:00','DD-MON-YYYY HH24:MI:SS');
* In esence you supply the date and appropriate format.
* wip_whse_code is optional.
* update_inventory_ind is optional and should only be used if the plant is a Lab.
* 'Y'=Transactions to be created, 'N'=transactions should not be created.
*************************************************************************
*************/
p_batch_header.plant_code := 'PR1'; p_batch_header.batch_no := '';
-- batch_type .. 10=fpo, 0=batch
p_batch_header.batch_type := 0;
p_batch_header.recipe_validity_rule_id := null;
p_batch_header.plan_start_date := ''; --TO_DATE('30-JUL-2006 12:00:00','DD-MONYYYY HH24:MI:SS');
p_batch_header.due_date := ''; ---TO_DATE('');
p_batch_header.plan_cmplt_date := ''; --TO_DATE('');
p_batch_header.wip_whse_code := '';
-- -- you have the option to set the below param to N when testing Lab batch creation
p_batch_header.update_inventory_ind := 'Y';
/*************************************************************************
*************
* Now call the stored program
* Leave first 4 parameters as they are
* enter p_batch_size and p_batch_size_uom are required
* if p_creation_mode is 'PRODUCT', 'OUTPUT', 'INPUT')
* enter p_creation_mode = RECIPE, PRODUCT,OUTPUT,INPUT
* p_batch_header_validity_rule_id OR p_recipe_id OR (p_recipe_no and
p_recipe_version)
* are required if p_creation_mode = 'RECIPE','INPUT','OUTPUT'
* p_batch_header_validity_rule_id OR p_product_id OR p_product_no
* are required if p_creation_mode = 'PRODUCT'
* If p_ignore_shortages id passed as FALSE then in case of shortages
* and profile option GMI:Allow negative inventory is set to Warning or Error
* Batch will not be created and the x_unallocated procedure will be populated
* with the material lines causing shortages.
* p_ignore_qty_below_caprocess quantity of any of
* the resources in the batch is less than the minimum capacity for that resource
* batch will not be created.
*************************************************************************
*************/
gme_api_pub.create_batch(
,p_api_version => 1
,p_validation_level => 100
,p_init_msg_list => TRUE
,p_commit => TRUE
,x_message_count => x_message_count
,x_message_list => x_message_list
,x_return_status => x_return_status
,p_batch_header => p_batch_header
,x_batch_header => x_batch_header
,p_batch_size => 1000
,p_batch_size_uom => 'KG'
,p_creation_mode => 'OUTPUT'
,p_recipe_id => NULL
,p_recipe_no => 'JGC_1'
,p_recipe_version => '301'
,p_product_no => 'JGC_1'
,p_product_id => NULL
,p_ignore_qty_below_cap => TRUE
,p_ignore_shortages => TRUE
,x_unallocated_material => x_unallocated_material
);
/*************************************************************************
**************
* Following line can be uncommented, if there are multiple messages return by the
* API, and you want to see all those messages. These will be written to the Log file
* If generated by the API.
*************************************************************************
**************/
-- gme_debug.display_messages(x_message_count);
/*************************************************************************
**************
* Output the results
* One of the following will be the outcome of the API call( x_return_status)
* S - Success
* E - Error
* U - Unexpected Error
* N - Items failed auto allocation
* V - Inventory shortage exists
*************************************************************************
**************/
IF x_return_status <> FND_API.g_ret_sts_success THEN
IF X_message_count = 1 THEN
DBMS_OUTPUT.PUT_LINE('Error:'||X_message_list);
ELSE
FOR i IN 1..x_message_count LOOP
FND_MSG_PUB.get (p_msg_index => i
,p_data => X_message_list
,p_msg_index_out => l_msg_index_out);
DBMS_OUTPUT.PUT_LINE('Error: '||X_message_list);
END LOOP;
END IF;
ELSE
dbms_output.put_line('x_message_count = '||TO_CHAR(x_message_count));
dbms_output.put_line('x_message_list = '||length(x_message_list)||
SubStr(x_message_list,length(x_message_list)-20,20));
dbms_output.put_line('x_return_status = '||x_return_status);
dbms_output.put_line('x_batch_header.batch_id = '||TO_CHAR(x_batch_header.batch_id));
dbms_output.put_line(SubStr('x_batch_header.plant_code = '||
x_batch_header.plant_code,1,255));
dbms_output.put_line(SubStr('x_batch_header.batch_no = '||
x_batch_header.batch_no,1,255));
dbms_output.put_line('x_batch_header.batch_type = '||
TO_CHAR(x_batch_header.batch_type));
dbms_output.put_line('x_batch_header.recipe_validity_rule_id = '||
TO_CHAR(x_batch_header.recipe_validity_rule_id));
dbms_output.put_line('x_batch_header.formula_id = '||
TO_CHAR(x_batch_header.formula_id));
dbms_output.put_line('x_batch_header.routing_id = '||
TO_CHAR(x_batch_header.routing_id));
dbms_output.put_line('x_batch_header.plan_start_date = '||
TO_CHAR(x_batch_header.plan_start_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.due_date = '||TO_CHAR(x_batch_header.due_date,
'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.plan_cmplt_date = '||
TO_CHAR(x_batch_header.plan_cmplt_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.batch_status = '||
TO_CHAR(x_batch_header.batch_status));
dbms_output.put_line(SubStr('x_batch_header.wip_whse_code = '||
x_batch_header.wip_whse_code,1,255));
dbms_output.put_line(SubStr('x_batch_header.poc_ind = '||
x_batch_header.poc_ind,1,255));
dbms_output.put_line(SubStr('x_batch_header.update_inventory_ind = '||
x_batch_header.update_inventory_ind,1,255));
dbms_output.put_line('x_batch_header.last_update_date = '||
TO_CHAR(x_batch_header.last_update_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.last_updated_by = '||
TO_CHAR(x_batch_header.last_updated_by));
dbms_output.put_line('x_batch_header.creation_date = '||
TO_CHAR(x_batch_header.creation_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.created_by = '||
TO_CHAR(x_batch_header.created_by));
dbms_output.put_line('x_batch_header.last_update_login = '||
TO_CHAR(x_batch_header.last_update_login));
dbms_output.put_line('x_batch_header.delete_mark = '||
TO_CHAR(x_batch_header.delete_mark));
dbms_output.put_line('x_batch_header.text_code = '||
TO_CHAR(x_batch_header.text_code));
dbms_output.put_line('x_batch_header.automatic_step_calculation = '||
TO_CHAR(x_batch_header.automatic_step_calculation));
IF x_unallocated_material.count > 0 THEN
FOR i IN x_unallocated_material.first..x_unallocated_material.last LOOP
IF x_unallocated_material.exists(i) THEN
dbms_output.put_line('x_unallocated_material('||to_char(i)||').batch_id = '||
TO_CHAR(x_unallocated_material(i).batch_id));
dbms_output.put_line(SubStr('x_unallocated_material('||to_char(i)||').batch_no = '||
x_unallocated_material(i).batch_no,1,255));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').material_detail_id = '||
TO_CHAR(x_unallocated_material(i).material_detail_id));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').line_type = '||
TO_CHAR(x_unallocated_material(i).line_type));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').line_no = '||
TO_CHAR(x_unallocated_material(i).line_no));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').item_id = '||
TO_CHAR(x_unallocated_material(i).item_id));
dbms_output.put_line(SubStr('x_unallocated_material('||to_char(i)||').item_no = '||
x_unallocated_material(i).item_no,1,255));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').alloc_qty = '||
TO_CHAR(x_unallocated_material(i).alloc_qty));
dbms_output.put_line('x_unallocated_material('||to_char(i)||').unalloc_qty = '||
TO_CHAR(x_unallocated_material(i).unalloc_qty));
dbms_output.put_line(SubStr('x_unallocated_material('||to_char(i)||').alloc_uom = '||
x_unallocated_material(i).alloc_uom,1,255));
END IF;
END LOOP;
END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on example 3
1. See Remarks for both Example 1 and Example 2. As in Example 1, the
Recipe and Version numbers are specified and like Example 2, the Product is
specified. This example differs from the others in that it allows the user to
control both the recipe used and the output quantity. It basically provides the
same functionality as using the Total Output tab when creating a batch in
the application.
x_return_status
VARCHAR2(1);
l_material_detail
gme_material_details%ROWTYPE;
x_material_detail
gme_material_details%ROWTYPE;
p_values_tab
gme_api_pub.field_values_tab;
l_field
gme_api_pub.p_field;
l_unallocated_material gme_api_pub.unallocated_materials_tab;
l_msg_index_out NUMBER;
BEGIN
-- Set the applications context
fnd_global.apps_initialize( USER_ID =>1007882,
resp_id =>NULL,
resp_appl_id =>NULL);
l_batch_header.plant_code
:='PR1';
l_batch_header.batch_type
:= 0;
l_batch_header.plan_start_date
:= SYSDATE;
l_batch_header.plan_cmplt_date
:= SYSDATE;
l_batch_header.due_date
:= SYSDATE;
l_batch_header.update_inventory_ind
:= 'Y';
l_batch_header.wip_whse_code
:= 'PR1';
l_batch_header.recipe_validity_rule_id := 1239;
--- CREATE THE BATCH
-gme_api_pub.create_batch (p_api_version
=> 1
,p_validation_level
=> 1000
,p_init_msg_list
=> TRUE
,p_commit
=> FALSE
,x_message_count
=> x_message_count
,x_message_list
=> x_message_list
,x_return_status
=> x_return_status
,p_batch_header
=> l_batch_header
,x_batch_header
=> x_batch_header
,p_batch_size
=> 10
,p_batch_size_uom
=> 'KG'
,p_creation_mode
=> 'RECIPE'
,p_recipe_id
=> NULL
,p_recipe_no
=> 'JGC_1'
,p_recipe_version
=> '301'
,p_product_no
=> NULL
,p_product_id
=> NULL
,p_ignore_qty_below_cap => TRUE
,p_ignore_shortages
=> TRUE
,x_unallocated_material => x_unallocated_material);
IF x_return_status <> FND_API.g_ret_sts_success THEN
IF X_message_count = 1 THEN
DBMS_OUTPUT.PUT_LINE('Error:'||X_message_list);
ELSE
FOR i IN 1..x_message_count LOOP
FND_MSG_PUB.get (p_msg_index => i
,p_data => X_message_list
,p_msg_index_out => l_msg_index_out);
DBMS_OUTPUT.PUT_LINE('Error: '||X_message_list);
END LOOP;
END IF;
ELSE
dbms_output.put_line('x_message_count = '||TO_CHAR(x_message_count));
dbms_output.put_line('x_message_list = length'||length(x_message_list)||' Contents ' ||
substr(x_message_list,1,200));
dbms_output.put_line('x_return_status = '||x_return_status);
dbms_output.put_line('x_batch_header.batch_id = '||
TO_CHAR(x_batch_header.batch_id));
dbms_output.put_line(SubStr('x_batch_header.plant_code = '||
x_batch_header.plant_code,1,255));
dbms_output.put_line(SubStr('x_batch_header.batch_no = '||
x_batch_header.batch_no,1,255));
dbms_output.put_line('x_batch_header.batch_type = '||
TO_CHAR(x_batch_header.batch_type));
dbms_output.put_line('x_batch_header.recipe_validity_rule_id = '||
TO_CHAR(x_batch_header.recipe_validity_rule_id));
dbms_output.put_line('x_batch_header.formula_id = '||
TO_CHAR(x_batch_header.formula_id));
dbms_output.put_line('x_batch_header.routing_id = '||
TO_CHAR(x_batch_header.routing_id));
dbms_output.put_line('x_batch_header.plan_start_date = '||
TO_CHAR(x_batch_header.plan_start_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.due_date = '||
TO_CHAR(x_batch_header.due_date, 'DD-MON-YYYY HH24:MI:SS'));
dbms_output.put_line('x_batch_header.plan_cmplt_date = '||
TO_CHAR(x_batch_header.plan_cmplt_date, 'DD-MON-YYYY HH24:MI:SS');
dbms_output.put_line('x_batch_header.batch_status = '||
TO_CHAR(x_batch_header.batch_status));
l_batch_header.batch_type
:= 0;
l_batch_header.batch_id
:= x_batch_header.batch_id;
l_batch_header.plan_start_date
:= SYSDATE;
l_batch_header.plan_cmplt_date
:= SYSDATE;
l_batch_header.due_date
:= SYSDATE;
l_batch_header.update_inventory_ind := 'Y';
l_batch_header.actual_start_date
:= SYSDATE;
----- RELEASE IT
--gme_api_pub.release_batch (p_api_version
=> 1
,p_validation_level
=> 1000
,p_init_msg_list
=> TRUE
,p_commit
=> FALSE
,x_message_count
=> x_message_count
,x_message_list
=> x_message_list
,x_return_status
=> x_return_status
,p_batch_header
=> l_batch_header
,x_batch_header
=> x_batch_header
,p_ignore_shortages
=> TRUE
,x_unallocated_material => l_unallocated_material
,p_ignore_unalloc
=> TRUE);
IF x_return_status = FND_API.g_ret_sts_success THEN
dbms_output.put_line('Batch Released');
p_batch_header.batch_id
:= x_batch_header.batch_id;
--- SAVE THE CHANGES
-gme_api_pub.save_batch(
p_batch_header
=> p_batch_header,
X_return_status
=> x_return_status,
p_commit
=>TRUE);
else
dbms_output.put_line('Batch Release failed');
IF X_message_count = 1 THEN
DBMS_OUTPUT.PUT_LINE('Error:'||X_message_list);
ELSE
FOR i IN 1..x_message_count LOOP
FND_MSG_PUB.get
(p_msg_index => i
,p_data => X_message_list
,p_msg_index_out => l_msg_index_out);
DBMS_OUTPUT.PUT_LINE('Error: '||X_message_list);
END LOOP;
end if;
end if;
end if;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on example 4
This script creates, releases and saves a batch. Note that when the batch is created
and released, these changes are not committed (that is to say, 'p_commit' is set to
False). This enables the user to treat both batch creation and release as part of the
same transaction and commit the changes if both operations succeed.
dbms_output.put_line('x_batch_header.plan_cmplt_date = '||
TO_CHAR(x_batch_header.plan_cmplt_date, 'DD-MON-YYYY HH24:MI:SS');
dbms_output.put_line('x_batch_header.batch_status = '||
TO_CHAR(x_batch_header.batch_status));
l_material_detail.batch_id :=x_batch_header.batch_id;
l_material_detail.line_no :=2;
l_material_detail.item_id :=712;
l_material_detail.plan_qty :=100;
l_material_detail.scale_type :=1;
l_material_detail.alloc_ind :=0;
l_material_detail.item_um :='LB';
l_material_detail.line_type :=-1;
l_material_detail.cost_alloc :=0;
l_material_detail.contribute_yield_ind :='Y';
l_material_detail.scrap_factor :=0;
l_material_detail.phantom_type :=0;
p_batch_header := x_batch_header;
--- INSERT INGREDIENT LINE
-gme_api_pub.insert_material_line (p_api_version =>1
,p_validation_level =>100
,p_init_msg_list =>FALSE
,p_commit =>FALSE
,x_message_count =>x_message_count
,x_message_list =>x_message_list
,x_return_status =>x_return_status
,p_material_detail =>l_material_detail
,p_batchstep_no =>NULL
,x_material_detail =>x_material_detail);
IF x_return_status = FND_API.g_ret_sts_success THEN
dbms_output.put_line('Material line inserted for item id '||x_material_detail.item_id);
--- SAVE THE CHANGES
-gme_api_pub.save_batch(
p_batch_header => p_batch_header,
X_return_status => x_return_status,
p_commit =>TRUE);
else
dbms_output.put_line('Material line insertion failed');
DBMS_OUTPUT.PUT_LINE('Error:'||X_message_list);
end if;
end if;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on Example 5
This is similar to Example 4 except that this time, once the batch is created, a new
ingredient line is added. The changes are then saved via the save batch API.
DBMS_OUTPUT.put_line('whse_code = '||x_tran_row.whse_code);
DBMS_OUTPUT.put_line('location = '||x_tran_row.location);
DBMS_OUTPUT.put_line('alloc_qty = '||x_tran_row.alloc_qty);
DBMS_OUTPUT.put_line('trans_qty = '||x_tran_row.trans_qty);
DBMS_OUTPUT.put_line('trans_qty2 = '||x_tran_row.trans_qty2);
DBMS_OUTPUT.put_line('completed_ind = '||x_tran_row.completed_ind);
DBMS_OUTPUT.put_line('trans_date = '||x_tran_row.trans_date);
else
DBMS_OUTPUT.put_line('x_message_count = '||TO_CHAR(L_message_count));
DBMS_OUTPUT.put_line(SubStr('x_message_list = '||l_message_list,1,255));
DBMS_OUTPUT.put_line(SubStr('x_return_status = '||x_return_status,1,255));
end if;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on Example 6
This will create a line allocation for either an ingredient or product line. Note this
API can be used in conjunction with the gme_api_pub.insert_material_line API to
both add and allocate a new material line. Once again the gme_api_pub.save_batch
procedure can be used to save both transactions once the user is sure there are no
errors.
resp_appl_id =>NULL);
v_batch_header.batch_id := 4355;
v_batch_header.ACTUAL_CMPLT_DATE := sysdate;
gme_api_pub.certify_batch (
p_init_msg_list => TRUE
,p_commit => false
,x_message_count => v_message_count
,x_message_list => v_message_list
,x_return_status => v_return_status
,p_del_incomplete_manual => TRUE
,p_ignore_shortages => TRUE
,p_batch_header => v_batch_header
,x_batch_header => x_batch_header
,x_unallocated_material => v_unallocated_material);
IF v_return_status = 'S' THEN
dbms_output.put_line( 'Certify succeeded');
gme_api_pub.save_batch(x_batch_header, v_return_status);
dbms_output.put_line( 'save_batch: status='|| v_return_status);
commit;
else
dbms_output.put_line( 'Certify failed status= '|| v_return_status);
DBMS_OUTPUT.PUT_LINE('Error: '||v_message_list);
rollback;
end if;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on example 7
Bear in mind the state the batch must be in before it can completed - that is, the quantity of
the output product should have been recorded and the ingredients allocated. If the user has
any doubts about this, it is suggested that they create, release, allocate and attempt to
complete a batch in the Application. If this can be done in the application then a batch in
the same state should be able to be completed using the API. Notice also in this example the
commit is done at the end of the script i.e. after the save batch.
end if;
if v_return_status = 'S' then
l_usage := true;
else
rollback;
end if;
----- Complete step
--IF l_usage = true then
gme_api_pub.certify_step(
p_init_msg_list => TRUE
,p_commit => FALSE
,x_message_count => v_message_count
,x_message_list => v_message_list
,x_return_status => v_return_status
,p_batch_step => v_batch_step
,x_batch_step => x_batch_step
,x_unallocated_material => v_unallocated_material
,p_del_incomplete_manual => FALSE
,p_ignore_shortages => TRUE);
if v_return_status = 'S' then
l_certify := true;
----- Save the changes
--gme_api_pub.save_batch(x_batch_header, v_return_status);
dbms_output.put_line( 'save_batch: status='|| v_return_status);
if v_return_status = 'S' then
commit;
else
rollback;
end if;
else
dbms_output.put_line( 'Certify step: status='|| v_return_status||', message='||
v_message_list);
rollback;
end if;
end if;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error '||TO_CHAR(SQLCODE)||': '||SQLERRM);
RAISE;
END;
/
Remarks on Example 8
This example releases a batch step, records actual resource usage and then completes the
step. Assuming all operations are successful, the changes are then saved using the save
batch API and the changes are committed.
Related Documents
Oracle Process Manufacturing Process Execution API User's Guide
Sample Code
alter session set nls_language=american;
set serveroutput on
declare
l_material_detail_in gme_material_details%ROWTYPE;
l_material_detail_out gme_material_details%ROWTYPE;
p_api_version NUMBER := gme_api_pub.
api_version;
p_validation_level NUMBER := gme_api_pub.
max_errors;
p_commit BOOLEAN := TRUE;
x_message_count NUMBER;
x_message_list VARCHAR2 (100);
x_return_status VARCHAR2 (20);
l_values_tab gme_api_pub.field_values_tab;
p_scale_phantom BOOLEAN := FALSE;
l_batch_save gme_batch_header%ROWTYPE;
retcode varchar2(1);
errbuf VARCHAR2(1000);
l_index number;
BEGIN
fnd_global.apps_initialize( USER_ID =>1007882,
resp_id =>NULL,
resp_appl_id =>NULL
);
l_material_detail_in.MATERIAL_DETAIL_ID:=22537;
l_material_detail_in.BATCH_ID:= 4454;
l_material_detail_in.wip_PLAN_QTY:=1030;
l_material_detail_in.release_type:=1;
l_material_detail_in.attribute1:='Y';
-- l_index :=1;
-- l_values_tab(l_index).p_value := 'RELEASE_TYPE';
l_index :=1;
l_values_tab(l_index).p_value := 'WIP_PLAN_QTY';
l_index :=2;
l_values_tab(l_index).p_value := 'ATTRIBUTE1';
gme_api_pub.update_material_line
(p_api_version => p_api_version,
p_validation_level =>
p_validation_level,
p_init_msg_list => FALSE,
p_commit => p_commit,
x_message_count =>
x_message_count,
x_message_list =>
x_message_list,
x_return_status =>
x_return_status,
p_material_detail =>
l_material_detail_in,
p_values_tab => l_values_tab,
p_scale_phantom =>
p_scale_phantom,
x_material_detail =>
l_material_detail_out
);
if x_return_status='E' then
retcode:=2;
errbuf:=x_message_list;
end if;
DBMS_OUTPUT.PUT_LINE('update_material_line status ='|| x_return_status);
DBMS_OUTPUT.PUT_LINE('errbuf ='|| errbuf);
l_batch_save.batch_id := 4454;
Gme_Api_Pub.save_batch(p_batch_header =>l_batch_save,
x_return_status =>x_return_status );
DBMS_OUTPUT.PUT_LINE('save batch return Status ='|| x_return_status);
IF x_return_status = Fnd_Api.g_ret_sts_success THEN
DBMS_OUTPUT.PUT_LINE('commit');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('rollback');
ROLLBACK;
END IF;
END;
/