Monday, December 19, 2011

Internal Requisitions and Internal Sales Orders

Internal Requisitions (IR) and Internal Sales Orders (ISO) are used to transfer material from one inventory organization or warehouse to another, within the same company.

The organization that requisitions the material should have an employee, who is authorized to enter an internal requisition in the system. This employee also needs to be assigned to an Approval Group where, by virtue of his position he is either able to approve the requisition himself or forward it to an approver who can approve the IR for him.

Material has to be requisitioned by an organization, called the Destination Organization. This is the organization that creates the IR. This material will be supplied by an organization called the Source Organization. This is the organization that ships the ISO.

These two organizations need to have a Shipping Network defined between them, which allows for movement of material between them through the use of IR only.
The IR should carry the destination location as a valid internal Ship To location defined within the destination organization.


Now, since the destination organization acts as a customer, it should be defined as an Internal Customer in Order Management. For the internal requisition process, an internal customer is one, which is associated to an internal location as the Ship To location.

So, if an order is raised for this customer, then the Ship To location on the order header would be the internal location assigned to this customer.


Source: http://www.oracle-apps-training-online.com/internal-requisitions.html

What is Backorder in OM

1. Pick release has processed the delivery line and cannot find the entire quantity.  This typically occurs when the Oracle Inventory indicates that there is not enough material (either because there is not enough material or because the inventory balance is incorrect). 

2. At ship confirm, you Enter Shipped Quantity that is less than Original Requested Quantity. Backorder the entire delivery quantity transfer a reservation to cycle count.
 
3. This typically occurs when the material that you want to ship:
a. Has become unavailable, for example, damaged, between picking and shipping.
b. Is available and you backorder material for specific business reasons. For example, all available material has  been allocated to a specific customer when you find out additional supply for other orders will be delayed.

What is Blanket Sales Agreement

Blanket Sales Agreements are used when you have specific characteristics related to a purchasing agreement between a customer and a supplier. These characteristics include the date range of the agreement, the items included, the price of the items, the quantity of each item that the parties committed to, as well as other attributes, like freight or payment terms.

Once a Blanket Sales Agreement is entered for a customer, multiple releases (shipments) against the Blanket Sales Agreement are processed over a period of time within Order Management. The order is fulfilled and billed according to the terms of the Blanket Sales Agreement. Tracking information will also be accumulated for Blanket Sales Agreements, such as, Blanket Sales Agreements quantity fulfilled, and dollar value fulfilled of released lines. This information is used to view status of orders executed against a Blanket Sales Agreement.

Source: http://www.oracleug.com/user-guide/order-management/blanket-sales-agreements

Shipping: Drop Shipment

In a depressed economy, companies are looking at any supply chain process where they can save time, money or resources. Drop shipping is a popular process where companies can reduce the need to keep inventory in their warehouse, lower their overall shipping costs and improve customer service.

The drop shipment process allows companies to collect sales orders information from customers and send that information to their manufacturers. Those manufacturers will then ship the items directly to the customers.



Source: http://logistics.about.com/od/operationalsupplychain/a/Dropship.htm

Saturday, July 23, 2011

Export data from Excel to Table using custom Web ADI Integrator

Case: User needs a function XXFunc in responsiblity XXResp which creates Excel document and allows user to upload data from Excel sheet to custom Table.

Pre-Req
For Microsoft Excel 2002 or 2003:
1.From the Tools menu, select Macro, then Security, and then Security Level.
2.In the Security Level tab, select the High option.
3.In the Trusted Sources or Trusted Publishers tab, select the Trust access to Visual Basic Project option.

For Microsoft Excel 2007:
1.Choose the Microsoft Office button, and then choose Excel Options. In the Trust Center category, choose Trust Center Settings, and then the Macro Settings category.
2.Select the Disable all macros except digitally signed macros option.
3.Select the Trust access to the VBA project object model option.
Set profile option 'BNE Allow No Security Rule' to Yes at user level. The default value is No.
Add responsibilities 'Desktop Integration Manager', 'Desktop Integrator' to the current user.

Steps
1.Create custom table 'XX_ONT_WEBADI_TEST'. Create custom API 'XX_ONT_WEBADI_TEST_PKG' which validates and inserts data into custom table.
2.Create Integrator 'XX ONT ADI Test Integrator'.
3.Create Interface 'XX ONT ADI Test Interface' to the above integrator and set custom API 'XX_ONT_WEBADI_TEST_PKG' to the interface.
4.Create Contents(Optional).
5.Create Layout 'XX ONT ADI Test Layout' and set to integrator 'XX ONT ADI Test Integrator'.
6.You can test at this stage from Desktop Integrator responsiblity.

7.Create Function 'XX ONT ADI Test Func' and set integrator to the function. Attach this function to the menu under resposibility.
8.Navigate to Resposibility->Menu->XX ONT ADI Test Func. Opens OA Page. Click on Create Document button opens Excel Sheet.
 
Detailed Steps
1.Create custom table 'XX_ONT_WEBADI_TEST'. Create custom API 'XX_ONT_WEBADI_TEST_PKG' which validates and inserts data into custom table. Paremeters in procedure Load_Prc() should be the columns in the table which you want to update using Web ADI integrator. 
2.Create Integrator 'XX ONT ADI Test Integrator'.
Navigation: Desktop Integration Manager(R)->Create Integrator
Enter name, internal name and application.
Must select 'Display In Create Document Page' checkbox which allows current integrator available for creating document(Excel). Click Next.
3.Create Interface 'XX ONT ADI Test Interface' to the above integrator and set custom API 'XX_ONT_WEBADI_TEST_PKG' to the interface. Click Apply.
In next screen, click Select radio button of interface 'XX ONT ADI Test Interface' and wait. This reads API given in the interface and loads procedure parameters as attributes. Click Next.
4.Create Contents(Optional). Click Submit.
5.Create Layout 'XX ONT ADI Test Layout' and set to integrator 'XX ONT ADI Test Integrator'.
Navigation: Desktop Integrator(R)->Define Layout
Select integrator 'XX ONT ADI Test Integrator' from dropdown. Click Go.
This screen shows exisitng layouts if there are any. Click on Create button to create one.
Provide layout name as 'XX ONT ADI Test Layout' and select no.of headers 1. Click Next.
This picks integrator attributes as layout fields. Select Placement as 'Line' and provide default values if there are any required. Click Apply.
Layout created successfully.
6.Test from Desktop Integrator responsiblity.
Navigation: Desktop Integrator(R)->Create Document
Select integrator as XX ONT ADI Test Integrator. Click Next.
In Review stage, Click Create Document button. This opens popup window to Open/Save a file WebADI.xls. Click Open button.
This opens Excel sheet with format given in layout 'XX ONT ADI Test Layout'. Close Download OA window.
Enter Data into excel sheet. To upload data into table, navigate to Add-Ins(M)->Oracle->Upload from excel sheet menu on top. This opens Upload window. Click on Upload button. Once data is successully uploaded, excel sheet shows green icon for each line indicates no errors in upload.
Check same from backend.

7.Create Function 'XX ONT ADI Test Func' and set integrator to the function. Attach this function to the menu under resposibility.
Navigation: Application Developer(R)->Application->Function
Create function as shown in below screens.
In the next screen you need to set form parameter. Modify below string and set correct integrator, layout and content details.
bne:page=BneCreateDoc&bne:language=US&bne:reporting=N&bne:viewer=BNE:EXCEL2000,2003,2007&bne:integrator=XXONT:XXGF_TEST1_INTG_INTG&bne:layout=XXONT:XXGF_TEST1_INTG_DFLT&bne:content=XXONT:XXGF_TEST1_INTG_CNT
Add function 'XX ONT ADI Test Func' to menu. Prompt given as 'ADI Test Load'.
8.Navigate to Resposibility->Menu->ADI Test Load. This opens OA page. Click on Create Document button to open new excel sheet with layout.

Thursday, July 21, 2011

Oracle Web ADI

Oracle WEB ADI- Oracle Web Application Desktop Integrator  
  • Wed ADI automatically imports data into your Web ADI spreadsheets from the Oracle E-Business Suite or from a text file. Imported information can be quickly modified in Excel, validated, and uploaded to the Oracle E-Business Suite.
  • This feature can be useful when migrating data from a legacy system to the Oracle E-Business Suite.
  • All data in the spreadsheet can be validated against Oracle E-Business Suite business rules before it is uploaded.
  • You can use the layout functionality to determine what fields appear in your spreadsheet, where they appear, and if they contain default values. These definitions can be saved, reused, and modified as needed.

Concepts
Integrator – This is the definition that stores the information about the action the user wishes to perform. For example, downloading specific data to a spreadsheet for viewing or to modify and upload back to the database. For ADE sers, this equated to the Style.
API – Application Programming Interface. This is the pl/sql interface by which data is validated and uploaded into Oracle HRMS. You would associate an api with an integrator if it was intended to either create new data in the application or update data that had been previously downloaded. See Oracle HRMS Configuring,Reporting and System Administration manual for a list of supported apis.
View – A view is an object by which you can query data on a table or tables. If the action you are intending to perform involves downloading data, you must associate a view with the integrator. If you are using Create style APIs, you do not require a view. You can elect to use a seeded view, for example, PER_PEOPLE_V, to use with your integrator. However, if the integrator is for updating data, then it is recommended that you create your own views and remember to include the OBJECT_VERSION_NUMBER, and any other In/Out parameters used by your chosen API.
One thing to beware of is the use of Aliases in views if you are downloading from a form. For example,if you use an alias for Applicant_Name called Starter, and then use a restrictive query in the form on Applicant Name before running the integrator in Web ADI, you will get the following error in the BNE log.
BneBaseSQL.executeBneQuery: Exception while running query. Error Code: 904, Message: ORA-00904: "APPLICANT_NAME": invalid identifier
The column APPLICANT_NAME has been overwritten by the alias in the definition loaded into the BNE tables.
Layout – This is where the user selects the columns to be displayed in the spreadsheet or Word document from the API and/or View used by the integrator. An integrator can have more than one layout defined for it. You can choose which one to use when you create your document.
Mapping – the mapping definition links the data source to the api columns. If no view is specified against the integrator or no text file used to load data, then no mapping is needed. When the data source is a view, the mapping is created automatically, however if a text file is being used then a mapping needs to be manually defined to associate each column in the file (source) to the relevant api parameter (target). See example c) in section, A Step by Step Guide to Creating HRMS Integrators. 

Pre-req
For Microsoft Excel 2002 or 2003:
1.From the Tools menu, select Macro, then Security, and then Security Level.
2.In the Security Level tab, select the High option.
3.In the Trusted Sources or Trusted Publishers tab, select the Trust access to Visual Basic Project option.

For Microsoft Excel 2007:
1.Choose the Microsoft Office button, and then choose Excel Options. In the Trust Center category, choose Trust Center Settings, and then the Macro Settings category.
2.Select the Disable all macros except digitally signed macros option.
3.Select the Trust access to the VBA project object model option.

Set profile option 'BNE Allow No Security Rule' to Yes at user level. The default value is No.
Add responsibilities 'Desktop Integration Manager', 'Desktop Integrator' to the current user.

Debugging
You can get a log file to help diagnose an error in Web ADI. The following profile options need to be set:
BNE: Server Log Filename: Use this profile option to change the name of the Web ADI log file on the middle tier. If this profile option is not set, bne.log is used.
BNE: Server Log Path: This profile option can be used to set the directory for the Web ADI log file on the applications server. If this profile option is not set, then the FND_TOP/log directory is used.
BNE: Server Log Level: This profile option determines the level of detail that is recorded in the Web ADI log file. The valid values are noted below. The level of granularity and amount of information recorded to the log file increases as you move down the list.
  • CRITICAL_ERROR: - Messages that are the result of a system failure. The integrity and reliability of the system is in doubt as a result of this error.
  • ERROR: - Messages that are the result of an unexpected error in the system. It is possible to recover from these errors; the system may still be in a usable state. Setting the profile option to this value will include CRITICAL_ERROR messages in the log file.
  • WARNING: - Messages trapped by the application.These errors were handled by the application but the system administrator should be aware of them occurring. Setting the profile option to this value will include ERROR and CRITICAL_ERROR messages as well.
  • INFORMATION: - Additional messaging is added to the log file that includes processing information. Setting the profile option to this value includes CRITICAL_ERROR, WARNING, and ERROR log messages. This is the setting that is used by Web ADI if the profile option is not set at the site level.
  • DETAIL: - Messages that summarize what is written to the log file. Setting the profile option to this value includes CRITICAL_ERROR, WARNING, ERROR, and INFORMATION log messages.
  • TRACE: - Messaging that generated detailed debugging statements. Setting the profile option to this value includes CRITICAL_ERROR, WARNING, ERROR, INFORMATION and DETAIL log messages.  

Main Tables and API

BNE_INTEGRATORS_TL
BNE_INTERFACES_TL
BNE_INTERFACE_COLS_TL
BNE_CONTENTS_TL
BNE_MAPPINGS_TL
BNE_LAYOUTS_TL
BNE_LAYOUT_COLS

API to create custom web adi programatically..
BNE_INTEGRATOR_UTILS.CREATE_INTEGRATOR
BNE_INTEGRATOR_UTILS.CREATE_INTERFACE_FOR_API
BNE_INTEGRATOR_UTILS.CREATE_DEFAULT_LAYOUT
BNE_INTEGRATOR_UTILS.CREATE_TABLE_LOV
BNE_INTEGRATOR_UTILS.CREATE_CCID_KFF
BNE_INTEGRATOR_UTILS.CREATE_JAVA_LOV

Saturday, May 7, 2011

Reservation Creation and Importance of MTL_SALES_ORDERS

We can use following Standard API to create reservation programatically.
INV_RESERVATION_PUB.CREATE_RESERVATION(
                               x_return_status             => x_return_status,
                               x_msg_count                 => x_msg_count,
                               x_msg_data                  => x_msg_data,
                               x_serial_number             => l_dummy_sn,
                               x_quantity_reserved       => l_quantity_reserved,
                               x_reservation_id             => l_reservation_id,
                               p_api_version_number     => 1.0,
                               p_init_msg_lst                => FND_API.G_FALSE,
                               p_rsv_rec                      => l_reservation_record,
                               p_partial_reservation_flag => FND_API.G_TRUE,
                               p_force_reservation_flag  => FND_API.G_TRUE,
                               p_serial_number              => l_dummy_sn,
                               p_validation_flag             => FND_API.G_TRUE);

Following are two important input parameters:
l_reservation_record.demand_source_header_id  :=  ??;
l_reservation_record.demand_source_line_id       :=  line_id;

While calling above procedure, one must pass SALES_ORDER_ID from MTL_SALES_ORDERS table instead of Order HEADER_ID from OE_ORDER_HEADERS_ALL for input parameter l_reservation_record.demand_source_header_id


About  MTL_SALES_ORDERS Table from Oracle ETRM:

MTL_SALES_ORDERS stores Inventory's local definition of sales orders.

Unlike account numbers which are stored as flexfields in GL_CODE_COMBINATIONS, or purchase orders which are stored in PO_HEADERS, sales orders are not assumed to originate in any particular application. MTL_SALES_ORDERS exists for the purpose of mapping sales orders between other applications and Inventory.

MTL_SALES_ORDERS is a key flexfield table with no structure defining column or set defining column. The flexfield code for this table is MKTS. Only one structure for the flexfield may be defined for any installation of Inventory. Inventory demand interface and demand manager will validate sales orders on segment values, and will create a new SALES_ORDER_ID when necessary.

Saturday, April 23, 2011

API to get Lot On-hand, Available to Reserve and Transactable Quantites

Below is the sample test procedure and API to get the Lot On-hand, Available to Reserve and Transactable quantities. Same we can query from Inventory responsibility under
Navigation: On-hand, Availability->On-hand Quantity.












Test Procedure:
---------------------

DECLARE
v_lpn_onhand NUMBER;
v_reservable_quantity NUMBER;
v_transactable_quantity NUMBER;
v_sqoh           NUMBER;    
v_satt           NUMBER;    
v_satr           NUMBER;

BEGIN
XXHG_ONT_AUTO_RESERVATION_PKG.get_lot_item_qty(
                p_lpn_id => NULL,
                p_organization_id => 104, --HG5
                p_source_type_id => 8, --Inventory
                p_inventory_item_id => 3001, --HG_Sample_Item
                p_revision => NULL,
                p_locator_id => NULL,
                p_subinventory_code => NULL,
                p_lot_number => 'HG.Lot.20001439.1',
                p_is_revision_control => 'FALSE',
                p_is_serial_control => 'FALSE',
                p_is_lot_control => 'TRUE',
                x_lpn_onhand => v_lpn_onhand,
                x_reservable_quantity => v_reservable_quantity,
                x_transactable_quantity => v_transactable_quantity,            
                p_grade_code     => NULL,  
                x_sqoh           => v_sqoh ,    
                x_satt           => v_satt ,    
                x_satr           => v_satr      
              -- NSRIVAST, INVCONV, END
          );
        
dbms_output.put_line('v_lpn_onhand :'||v_lpn_onhand);
dbms_output.put_line('v_reservable_quantity :'||v_reservable_quantity);
dbms_output.put_line('v_transactable_quantity :'||v_transactable_quantity);

EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('Error: '||SQLERRM);         
END;


Output:
-------

v_lpn_onhand :80
v_reservable_quantity :60
v_transactable_quantity :60




Custom API:
----------------


CREATE OR REPLACE PACKAGE BODY APPS.XXHG_ONT_AUTO_RESERVATION_PKG 
AS
PROCEDURE  get_lot_item_qty(
                p_lpn_id IN NUMBER,
                p_organization_id IN NUMBER,
                p_source_type_id IN NUMBER,
                p_inventory_item_id IN NUMBER,
                p_revision IN VARCHAR2,
                p_locator_id IN NUMBER,
                p_subinventory_code IN VARCHAR2,
                p_lot_number IN VARCHAR2,
                p_is_revision_control IN VARCHAR2,
                p_is_serial_control IN VARCHAR2,
                p_is_lot_control IN VARCHAR2,
                x_lpn_onhand OUT NUMBER,
                x_reservable_quantity OUT NUMBER,
                x_transactable_quantity OUT NUMBER,
              -- NSRIVAST, INVCONV , Start
                p_grade_code     IN VARCHAR2,  
                x_sqoh           OUT NUMBER ,    
                x_satt           OUT NUMBER ,    
                x_satr           OUT NUMBER      
              -- NSRIVAST, INVCONV, END
    ) IS
    l_msg_count VARCHAR2(100);
    l_msg_data VARCHAR2(1000);
    l_rqoh NUMBER;
    l_qr NUMBER;
    l_qs NUMBER;
    l_atr NUMBER;
    l_att NUMBER;
    l_qoh NUMBER;
    l_lpn_context NUMBER ;
    l_return_status VARCHAR2(1);
    x_return VARCHAR2(1);
    l_is_revision_control BOOLEAN := FALSE;
    l_is_serial_control BOOLEAN := FALSE;
    l_is_lot_control BOOLEAN := FALSE ;
    l_lpn_context NUMBER;
    l_tree_mode  NUMBER;
                
    -- NSRIVAST, INVCONV,  Start
        x_srqoh    NUMBER;
        x_sqr    NUMBER;
        x_sqs    NUMBER;
    -- NSRIVAST, INVCONV, END
                  
    QUANTITY_EXCEPTION EXCEPTION;
    BEGIN
                
      -- Clearing the quantity cache
      inv_quantity_tree_pub.clear_quantity_cache;
                
      IF Upper(p_is_revision_control) = 'TRUE' THEN
        l_is_revision_control := TRUE;
      ELSE
        l_is_revision_control := FALSE;
      END IF;
                
      IF Upper(p_is_serial_control) = 'TRUE' THEN
        l_is_serial_control := TRUE;
      ELSE
        l_is_serial_control := FALSE;
      END IF ;
                
      -- BUG NO 2768731
      IF p_lot_number IS NULL THEN
        l_is_lot_control := FALSE;
      ELSE
        l_is_lot_control := TRUE;
      END IF;
                
      IF (p_inventory_item_id IS NULL) THEN
        RAISE QUANTITY_EXCEPTION;
      END IF ;    
                
      -- Reserve mode
      l_tree_mode := 1;  --To get Available To Reserve Quantity
    
      --Call public API          
      inv_quantity_tree_pub.query_quantities
          (p_api_version_number    =>   1.0
           , p_init_msg_lst          =>   'F'
           , x_return_status         =>   l_return_status
           , x_msg_count             =>   l_msg_count
           , x_msg_data              =>   l_msg_data
           , p_organization_id       =>   p_organization_id
           , p_inventory_item_id     =>   p_inventory_item_id
           , p_tree_mode             =>   l_tree_mode
           , p_is_revision_control   =>   l_is_revision_control
           , p_is_lot_control        =>   l_is_lot_control
           , p_is_serial_control     =>   l_is_serial_control
           , p_demand_source_type_id =>   p_source_type_id
           , p_revision              =>   p_revision
           , p_lot_number            =>   p_lot_number
           , p_lot_expiration_date   =>   NULL
           , p_subinventory_code     =>   p_subinventory_code
           , p_locator_id            =>   p_locator_id
           , p_onhand_source         =>   3
           , x_qoh                   =>   l_qoh
           , x_rqoh                  =>   l_rqoh
           , x_qr                    =>   l_qr
           , x_qs                    =>   l_qs
           , x_att                   =>   l_att
           , x_atr                   =>   l_atr
           , p_lpn_id                =>   p_lpn_id
           -- NSRIVAST, INVCONV, Start
           , p_grade_code            =>   p_grade_code    
           , x_sqoh                  =>   x_sqoh        
           , x_satt                  =>   x_satt        
           , x_satr                  =>   x_satr        
    --       , p_transaction_type      =>   NULL
           , x_srqoh                 =>   x_srqoh
           , x_sqr                   =>   x_sqr
           , x_sqs                   =>   x_sqs
           , p_demand_source_header_id     =>   -1
           , p_demand_source_line_id       =>   -1
           , p_demand_source_name          =>   -1
           , p_transfer_subinventory_code  =>   NULL  
           , p_cost_group_id           =>   NULL  
           , p_transfer_locator_id           =>   NULL  
          -- NSRIVAST, INVCONV, End
    );

      IF (l_return_status = 'S') THEN
        x_lpn_onhand := l_qoh;
        x_reservable_quantity := l_atr;
      ELSE  
        x_return :='F';
        RAISE QUANTITY_EXCEPTION;
      END IF ;  

      -- Transact mode
      l_tree_mode := 2;  --To get Transactable Quantity
                
      --Call public API
      inv_quantity_tree_pub.query_quantities
          (p_api_version_number    =>   1.0
           , p_init_msg_lst          =>   'F'
           , x_return_status         =>   l_return_status
           , x_msg_count             =>   l_msg_count
           , x_msg_data              =>   l_msg_data
           , p_organization_id       =>   p_organization_id
           , p_inventory_item_id     =>   p_inventory_item_id
           , p_tree_mode             =>   l_tree_mode
           , p_is_revision_control   =>   l_is_revision_control
           , p_is_lot_control        =>   l_is_lot_control
           , p_is_serial_control     =>   l_is_serial_control
           , p_demand_source_type_id =>   p_source_type_id
           , p_revision              =>   p_revision
           , p_lot_number            =>   p_lot_number
           , p_lot_expiration_date   =>   NULL
           , p_subinventory_code     =>   p_subinventory_code
           , p_locator_id            =>   p_locator_id
           , p_onhand_source         =>   3
           , x_qoh                   =>   l_qoh
           , x_rqoh                  =>   l_rqoh
           , x_qr                    =>   l_qr
           , x_qs                    =>   l_qs
           , x_att                   =>   l_att
           , x_atr                   =>   l_atr
           , p_lpn_id                =>   p_lpn_id
           -- NSRIVAST, INVCONV, Start
           , p_grade_code            =>   p_grade_code    
           , x_sqoh                  =>   x_sqoh        
           , x_satt                  =>   x_satt        
           , x_satr                  =>   x_satr        
    --       , p_transaction_type      =>   NULL
           , x_srqoh                 =>   x_srqoh
           , x_sqr                   =>   x_sqr
           , x_sqs                          =>   x_sqs
           , p_demand_source_header_id      =>  -1
           , p_demand_source_line_id        =>  -1
           , p_demand_source_name           =>  -1
           , p_transfer_subinventory_code   =>   NULL  
           , p_cost_group_id        =>   NULL  
           , p_transfer_locator_id            =>   NULL  
          -- NSRIVAST, INVCONV, End
    );

      IF (l_return_status = 'S') THEN
        x_lpn_onhand := l_qoh;
        x_transactable_quantity := l_att;
      ELSE  
        x_return :='F';
        RAISE QUANTITY_EXCEPTION;
      END IF ;
                
      EXCEPTION
      WHEN   QUANTITY_EXCEPTION THEN
      dbms_output.put_line('Quanity Exception Raised'||SQLERRM);
                
      WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);

    END get_lot_item_qty;

END XXHG_ONT_AUTO_RESERVATION_PKG;

Related Posts Plugin for WordPress, Blogger...