Process Order API in Oracle Order Management


The Process Orders API is very sensitive to the setup of Oracle apps, as the API does lots of internal validations before applying any changes, it’s very important that the user running the API has the requisite permissions, another possible stumbling block could be the processing constraints, it has to be ensured that the login from which the API is run does not have processing constraints attached to it which prevent the API from functioning properly. All The details about the processing constraints can be viewed by going to the following menu


Setup -> Rules -> Security -> Processing Constraints

Process Order API
This document will explain the use of this API for the following:

1.   Creating Order Lines
2.   Deleting Shipment Lines
3.   Splitting Shipment Lines
4.   Reserving a shipment Line
5.   Updating a shipment line
6.   Scheduling a shipment line
7.   Applying Hold on an Order Line


Process Orders API can process multiple records in one call, this is achieved by accepting parameters in the form of a table, and each row corresponds to one record.

Any program using this API will require 2 phases, 1st phase involves inserting data into the table which will in turn be used as an input parameter to the API, and the second would be the actual API call. The 1st phase begins with the creation of a new row in the table this is done as follows:

<table name> (<row number>):= OE_ORDER_PUB.G_MISS_LINE_REC;

after creating the line all the mandatory and  possibly some of the optional parameters are written into the newly created row, for example for a  shipment line to be deleted the row would have been filled as follows.

<table name>(<row number>).line_id := < give the line ID of the line to be deleted>;
<table name>(<row number>).change_reason := '<give the reason for deleting the line>';
<table name> (<row number>).operation := OE_GLOBALS.G_OPR_DELETE;

please note that by incrementing the row number, and following similar procedure the programmer can actually create a number of such rows spanning  possibly multiple operations. The second phase involves the actual call of the API here the programmer passes the above table as the input parameter to the API, One of the ways of doing this is as follows:

OE_ORDER_PUB.Process_Order
            (   p_api_version_number               =>  1.00
          ,   p_init_msg_list                           =>  'T'
          ,   p_return_values                          =>  'T'
          ,   p_action_commit                        =>  'F'
          ,   x_return_status                           =>  l_chr_return_status
          ,   x_msg_count                              =>  l_num_msg_cnt
          ,   x_msg_data                                =>  l_chr_msg
          ,   p_header_rec                              =>  l_header_rec
          ,   p_line_tbl                                   =>  l_line_tbl
          ,   p_old_line_tbl                            =>  l_old_Line_Tbl
          ,   p_action_request_tbl                  =>  l_Request_Tbl
          ,   x_header_rec                              =>  l_Header_Rec
          ,   x_header_val_rec                       =>  l_Header_Val_Rec
          ,   x_Header_Adj_tbl                      =>  l_Header_Adj_Tbl
          ,   x_Header_Adj_val_tbl               =>  l_Header_Adj_Val_Tbl
          ,   x_Header_price_Att_tbl             =>  l_Header_Price_Att_Tbl
          ,   x_Header_Adj_Att_tbl               =>  l_Header_Adj_Att_Tbl
          ,   x_Header_Adj_Assoc_tbl           =>  l_Header_Adj_Assoc_Tbl
          ,   x_Header_Scredit_tbl                 =>  l_Header_Scredit_Tbl
          ,   x_Header_Scredit_val_tbl          =>  l_Header_Scredit_Val_Tbl
          ,   x_line_tbl                                    =>  <table name>
          ,   x_line_val_tbl                             =>  l_Line_Val_Tbl
          ,   x_Line_Adj_tbl                           =>  l_Line_Adj_Tbl
          ,   x_Line_Adj_val_tbl                    =>  l_Line_Adj_Val_Tbl
          ,   x_Line_price_Att_tbl                  =>  l_Line_Price_Att_Tbl
          ,   x_Line_Adj_Att_tbl                    =>  l_Line_Adj_Att_Tbl
          ,   x_Line_Adj_Assoc_tbl               =>  l_Line_Adj_Assoc_Tbl
          ,   x_Line_Scredit_tbl                      =>  l_Line_Scredit_Tbl
          ,   x_Line_Scredit_val_tbl               =>  l_Line_Scredit_Val_Tbl
          ,   x_Lot_Serial_tbl                         =>  l_Lot_Serial_Tbl
          ,   x_Lot_Serial_val_tbl                  =>  l_Lot_Serial_Val_Tbl
          ,   x_action_request_tbl                   =>  l_Request_Tbl
     );

please note the above code for the API call is pretty much independent of the functionality the API is being used for, the functionality is a field already written in the input parameter ( the table).           

     

In the following  i = the current line number in the table

Creating Order Lines

l_line_tbl(i) := OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i).header_id := <header_id>;
l_line_tbl(i).inventory_item_id := <inventory_item_id>;
l_line_tbl(i).ordered_quantity :=<ordered quantity>;
l_line_tbl(i).operation := OE_GLOBALS.G_OPR_CREATE;


Deleting Shipment Lines

l_line_tbl(i) := OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i).line_id :=<line_id>;
l_line_tbl(i).operation := OE_GLOBALS.G_OPR_DELETE;

Splitting Shipment Lines

l_line_tbl(1):=OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i).split_action_code := 'SPLIT';
l_line_tbl(i).split_by := 'USER';
l_line_tbl(i).line_id :=<line_id>;
l_line_tbl(i).inventory_item_id := <inventory_item_id>;
l_line_tbl(i).ordered_quantity := <ordered_quantity>;
l_line_tbl(i).operation := OE_GLOBALS.G_OPR_UPDATE;
l_line_tbl(i+1):=OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i+1).split_action_code := 'SPLIT';
l_line_tbl(i+1).split_by := 'USER';
l_line_tbl(i+1).inventory_item_id := <inventory_item_id>;
l_line_tbl(i+1).ordered_quantity := <ordered_quantity>;
l_line_tbl(i+1).split_from_line_id := l_line_tbl(i).line_id;
l_line_tbl(i+1).operation := OE_GLOBALS.G_OPR_CREATE;

Reserving a shipment Line

l_line_tbl(i):=OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i).line_id := <line_id>;
l_line_tbl(i).reserved_quantity := <reserved_qty>;
l_line_tbl(i).operation := OE_GLOBALS.G_OPR_UPDATE;

Updating a shipment line

l_line_tbl(1):=OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(1).ordered_quantity:=<ordered_quantity>;
l_line_tbl(1).line_id :=<line_id>;
l_line_tbl(1).operation :=  OE_GLOBALS.G_OPR_UPDATE;

Scheduling a shipment line

l_line_tbl(i):=OE_ORDER_PUB.G_MISS_LINE_REC;
l_line_tbl(i).line_id := <line_id>;
l_line_tbl(i).delivery_lead_time := <transit_time>;
l_line_tbl(i).schedule_ship_date := <schedule_ship_date>;
l_line_tbl(i).operation := OE_GLOBALS.G_OPR_UPDATE;
                 
Applying Hold on an Order Line

l_request_rec.entity := OE_GLOBALS.G_ENTITY_LINE;
l_request_rec.entity_id := <line_id>;
-- request record parameters
-- defective product hold (hold_id)
l_request_rec.param1 := <request_rec_param1>;
-- indicator that it is an item hold (hold_entity_code)
l_request_rec.param2 = <request_rec_param2>;
-- Id of the item (hold_entity_id)
l_request_rec.param3 := <request_rec_param3>;
-- inserting request record into the action request table
l_action_request_tbl := <request_rec>;
l_request_rec.request_name := OE_GLOBALS.G_APPLY_HOLD;


REUSABLE CODE

Once the programmer has built the table for the API call, the programmer may optionally write the code for calling the API or he may pass the table created above to this procedure which will in turn do the actual API call.

PROCEDURE poapi_call( l_line_tbl  IN  OE_ORDER_PUB.Line_Tbl_Type) IS

   l_return_status               VARCHAR2(1);
   l_num_msg_cnt                  NUMBER;
   l_header_rec                  OE_ORDER_PUB.Header_Rec_Type;
   l_header_val_rec              OE_ORDER_PUB.Header_Val_Rec_Type;
   l_line_rec                OE_ORDER_PUB.Line_Rec_Type;
   l_Split_line_rec          OE_ORDER_PUB.Line_Rec_Type;
   l_Header_Adj_tbl                 OE_ORDER_PUB.Header_Adj_Tbl_Type;
   l_Header_Adj_val_tbl             OE_ORDER_PUB.Header_Adj_Val_Tbl_Type;
   l_Header_price_Att_tbl        OE_ORDER_PUB.Header_Price_Att_Tbl_Type ;
   l_Header_Adj_Att_tbl          OE_ORDER_PUB.Header_Adj_Att_Tbl_Type ;
   l_Header_Adj_Assoc_tbl        OE_ORDER_PUB.Header_Adj_Assoc_Tbl_Type ;
   l_Header_Scredit_tbl          OE_ORDER_PUB.Header_Scredit_Tbl_Type;
   l_Header_Scredit_val_tbl      OE_ORDER_PUB.Header_Scredit_Val_Tbl_Type;
   l_line_val_tbl                OE_ORDER_PUB.Line_Val_Tbl_Type;
   l_Line_Adj_tbl                OE_ORDER_PUB.Line_Adj_Tbl_Type;
   l_Line_Adj_val_tbl            OE_ORDER_PUB.Line_Adj_Val_Tbl_Type;
   l_Line_price_Att_tbl          OE_ORDER_PUB.Line_Price_Att_Tbl_Type ;
   l_Line_Adj_Att_tbl            OE_ORDER_PUB.Line_Adj_Att_Tbl_Type ;
   l_Line_Adj_Assoc_tbl          OE_ORDER_PUB.Line_Adj_Assoc_Tbl_Type ;
   l_Line_Scredit_tbl            OE_ORDER_PUB.Line_Scredit_Tbl_Type;
   l_Line_Scredit_val_tbl        OE_ORDER_PUB.Line_Scredit_Val_Tbl_Type;
   l_Lot_Serial_tbl              OE_ORDER_PUB.Lot_Serial_Tbl_Type;
   l_Lot_Serial_val_tbl          OE_ORDER_PUB.Lot_Serial_Val_Tbl_Type;
   l_old_header_rec              OE_ORDER_PUB.Header_Rec_Type;
   l_old_Header_Adj_tbl          OE_ORDER_PUB.Header_Adj_Tbl_Type;
   l_old_header_Val_rec           OE_ORDER_PUB.Header_Rec_Type;
   l_old_Header_Adj_Val_tbl       OE_ORDER_PUB.Header_Adj_Tbl_Type;
   l_old_Header_price_Att_tbl    OE_ORDER_PUB.Header_Price_Att_Tbl_Type ;
   l_old_Header_Adj_Att_tbl      OE_ORDER_PUB.Header_Adj_Att_Tbl_Type ;
   l_old_Header_Adj_Assoc_tbl    OE_ORDER_PUB.Header_Adj_Assoc_Tbl_Type ;
   l_old_Header_Scredit_tbl      OE_ORDER_PUB.Header_Scredit_Tbl_Type;
   l_old_Header_Scredit_Val_tbl  OE_ORDER_PUB.Header_Scredit_Tbl_Type;
   l_old_line_tbl                OE_ORDER_PUB.Line_Tbl_Type;
   l_old_Line_Val_Tbl             OE_ORDER_PUB.Line_Tbl_Type;
   l_old_Line_Adj_tbl            OE_ORDER_PUB.Line_Adj_Tbl_Type;
   l_old_Line_Adj_Val_tbl        OE_ORDER_PUB.Line_Adj_Tbl_Type;
   l_old_Line_price_Att_tbl      OE_ORDER_PUB.Line_Price_Att_Tbl_Type ;
   l_old_Line_Adj_Att_tbl        OE_ORDER_PUB.Line_Adj_Att_Tbl_Type ;
   l_old_Line_Adj_Assoc_tbl      OE_ORDER_PUB.Line_Adj_Assoc_Tbl_Type ;
   l_old_Line_Scredit_tbl        OE_ORDER_PUB.Line_Scredit_Tbl_Type;
   l_old_Line_Scredit_Val_tbl    OE_ORDER_PUB.Line_Scredit_Tbl_Type;
   l_old_Lot_Serial_tbl          OE_ORDER_PUB.Lot_Serial_Tbl_Type;
   l_old_Lot_Serial_Val_tbl      OE_ORDER_PUB.Lot_Serial_Tbl_Type;
   l_Request_Tbl                  OE_ORDER_PUB.Request_Tbl_Type;
   l_returnline_tbl              OE_ORDER_PUB.Line_Tbl_Type;
   l_returnheader_rec             OE_ORDER_PUB.Header_Rec_Type;
   l_pls_line                PLS_INTEGER;
   l_num_LnCnt               NUMBER := 0;
   l_chr_return_status            VARCHAR2(30);
   l_chr_msg                 VARCHAR2(2000);
   l_message                 VARCHAR2(2000);
   l_msg_index_out           NUMBER;
   l_chr_action                   VARCHAR2(10) := NULL;
   iTempCnt                       NUMBER := 1;
   l_msg_data                VARCHAR2(2000);


BEGIN
OE_ORDER_PUB.Process_Order
     (   p_api_version_number            =>  1.00
          ,   p_init_msg_list                   =>  'T'
          ,   p_return_values                  =>  'T'
          ,   p_action_commit                =>  'F'
          ,   x_return_status                   =>  l_chr_return_status
          ,   x_msg_count                      =>  l_num_msg_cnt
          ,   x_msg_data                           =>  l_chr_msg
          ,   p_header_rec                         =>  l_header_rec
          ,   p_line_tbl                              =>  l_line_tbl
          ,   p_old_line_tbl                       =>  l_old_Line_Tbl
          ,   p_action_request_tbl             =>  l_Request_Tbl
          ,   x_header_rec                         =>  l_Header_Rec
          ,   x_header_val_rec                  =>  l_Header_Val_Rec
          ,   x_Header_Adj_tbl                 =>  l_Header_Adj_Tbl
          ,   x_Header_Adj_val_tbl          =>  l_Header_Adj_Val_Tbl
          ,   x_Header_price_Att_tbl        =>  l_Header_Price_Att_Tbl
          ,   x_Header_Adj_Att_tbl          =>  l_Header_Adj_Att_Tbl
          ,   x_Header_Adj_Assoc_tbl      =>  l_Header_Adj_Assoc_Tbl
          ,   x_Header_Scredit_tbl            =>  l_Header_Scredit_Tbl
          ,   x_Header_Scredit_val_tbl     =>  l_Header_Scredit_Val_Tbl
          ,   x_line_tbl                               =>  l_Line_Tbl
          ,   x_line_val_tbl                        =>  l_Line_Val_Tbl
          ,   x_Line_Adj_tbl                      =>  l_Line_Adj_Tbl
          ,   x_Line_Adj_val_tbl               =>  l_Line_Adj_Val_Tbl
          ,   x_Line_price_Att_tbl             =>  l_Line_Price_Att_Tbl
          ,   x_Line_Adj_Att_tbl               =>  l_Line_Adj_Att_Tbl
          ,   x_Line_Adj_Assoc_tbl          =>  l_Line_Adj_Assoc_Tbl
          ,   x_Line_Scredit_tbl                =>  l_Line_Scredit_Tbl
          ,   x_Line_Scredit_val_tbl          =>  l_Line_Scredit_Val_Tbl
          ,   x_Lot_Serial_tbl                    =>  l_Lot_Serial_Tbl
          ,   x_Lot_Serial_val_tbl             =>  l_Lot_Serial_Val_Tbl
          ,   x_action_request_tbl             =>  l_Request_Tbl
     );

EXCEPTION
  WHEN OTHERS THEN
     fnd_file.put_line (fnd_file.LOG, 'POAPI_call went in to an unknown
   exception');
     fnd_file.put_line(fnd_file.LOG, 'Error message is '|| SQLERRM);
    IF l_num_msg_cnt > 0 THEN
          FOR l_index IN 1..l_num_msg_cnt LOOP
l_msg_data := oe_msg_pub.get(p_msg_index => l_index, p_encoded => 'F');
             fnd_file.put_line(2,l_msg_data);
             fnd_file.put_line(fnd_file.LOG, 'POAPI went into
               exception');
          END LOOP;
    END IF;

END poapi_call;