Monday 16 December 2019

EGO/EFF - User Defined Attributes -- Useful tables

ego_attrs_v -- All info about User-defined attributes.

ego_fnd_dsc_flx_ctx_ext -- Metadata about Attribute Groups. This is extension to FND_DESCR_FLEX_CONTEXTS.

JPX Import command for loading VO Substiution

Steps:
1. Generate JPX file from JDev
2. Copy the file to instance middle-tier
3. Execute below command to load the JPX

java oracle.jrad.tools.xml.importer.JPXImporter $XXCUST_TOP/mds/XXVOTEST.jpx -username APPS -password $apps_pwd -dbconnection $tns_string 

Sunday 15 December 2019

Transact move order using API

Steps:
Create Move Order and approve --> Allocate Qty to move order lines --> Run API to transact material from the allocated sub inventory


DECLARE
    p_org_id             NUMBER := &p_org_id;
    p_invorg_id          NUMBER := &p_invorg_id;
    p_sales_order_num    VARCHAR2 (200) := &p_sales_order_num;
    l_api_version        NUMBER := 1.0;
    l_init_msg_list      VARCHAR2 (2) := FND_API.G_TRUE;
    l_commit             VARCHAR2 (2) := FND_API.G_FALSE;
    x_return_status      VARCHAR2 (2);
    x_msg_count          NUMBER := 0;
    x_msg_data           VARCHAR2 (20000);
    l_return_status      VARCHAR2 (2);
    l_msg_data           VARCHAR2 (255);
    l_idx                NUMBER := 0;
    l_from_date          DATE;
    l_to_date            DATE;


    -- API variable declarations
    l_move_order_type    NUMBER := 1;
    l_transaction_mode   NUMBER := 1;
    l_tmoline_tbl        INV_MOVE_ORDER_PUB.trolin_tbl_type;
    l_mold_tbl           INV_MO_LINE_DETAIL_UTIL.g_mmtt_tbl_type;
    x_mmtt_tbl           INV_MO_LINE_DETAIL_UTIL.g_mmtt_tbl_type;
    x_trolin_tbl         INV_MOVE_ORDER_PUB.trolin_tbl_type;
    l_transaction_date   DATE := SYSDATE;

    CURSOR trans_move_order_cur (cp_org_id       NUMBER,
                                 cp_inv_org_id   NUMBER,
                                 cp_order_num    VARCHAR2)
    IS
        SELECT oola.line_id,
               oola.line_number,
               wdd.released_status,
               wdd.move_order_line_id,
               oola.ship_from_org_id
          FROM oe_order_lines_all            oola,
               wsh_delivery_details          wdd,
               org_organization_definitions  mtlp,
               hr_operating_units            hou
         WHERE     1 = 1
               AND mtlp.operating_unit = cp_org_id
               AND mtlp.operating_unit = hou.organization_id
               AND hou.organization_id = cp_org_id
               AND mtlp.organization_id =
                   NVL (cp_inv_org_id, mtlp.organization_id)
               AND wdd.organization_id = mtlp.organization_id
               AND wdd.source_code = 'OE'
               AND wdd.source_line_id = oola.line_id
               AND wdd.released_status = 'S'
               AND wdd.oe_interfaced_flag = 'N'
               AND wdd.inv_interfaced_flag = 'N'
               AND oola.flow_status_code = 'AWAITING_SHIPPING'
               AND EXISTS
                       (SELECT '1'
                          FROM ont.oe_order_headers_all ooha
                         WHERE     header_id = wdd.source_header_id
                               AND ooha.order_number + 0 =
                                   NVL (cp_order_num, ooha.order_number));

    TYPE trans_move_order_tab IS TABLE OF trans_move_order_cur%ROWTYPE;

    cr_move_order_tbl    trans_move_order_tab;
BEGIN
    fnd_global.apps_initialize (fnd_global.user_id, fnd_global.resp_id, 665); -- 665-- WSH


    OPEN trans_move_order_cur (p_org_id, p_invorg_id, p_sales_order_num);

    FETCH trans_move_order_cur BULK COLLECT INTO cr_move_order_tbl;

    CLOSE trans_move_order_cur;


    DBMS_OUTPUT.put_line (
        'Orders -- move from Released to Warehouse to Ship Confirm');

    FOR i IN 1 .. cr_move_order_tbl.COUNT
    LOOP
        l_tmoline_tbl (l_idx).line_id :=
            cr_move_order_tbl (i).move_order_line_id;
        l_idx := NVL (l_tmoline_tbl.COUNT, 0) + 1;
    END LOOP;



    IF (l_tmoline_tbl.COUNT > 0)
    THEN
        INV_PICK_WAVE_PICK_CONFIRM_PUB.Pick_Confirm (
            p_api_version_number   => l_api_version,
            p_init_msg_list        => l_init_msg_list,
            p_commit               => l_commit,
            x_return_status        => x_return_status,
            x_msg_count            => x_msg_count,
            x_msg_data             => x_msg_data,
            p_move_order_type      => l_move_order_type,
            p_transaction_mode     => l_transaction_mode,
            p_trolin_tbl           => l_tmoline_tbl,
            p_mold_tbl             => l_mold_tbl,
            x_mmtt_tbl             => x_mmtt_tbl,
            x_trolin_tbl           => x_trolin_tbl,
            p_transaction_date     => l_transaction_date);

        IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)
        THEN
            DBMS_OUTPUT.put_line ('Message count: ' || x_msg_count);

            IF (x_msg_count > 1)
            THEN
                FOR i IN 1 .. x_msg_count
                LOOP
                    x_msg_data :=
                        fnd_msg_pub.get (p_msg_index   => i,
                                         p_encoded     => FND_API.G_FALSE);
                    DBMS_OUTPUT.put_line ('message :' || x_msg_data);
                END LOOP;
            END IF;
        END IF;
    END IF;

    COMMIT;
EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line (
            'Error in XX_WSH_TRANSACT_MOVE_ORDER_PKG.' || SQLERRM);
END;

Move Order Types


Value Move Order Type
1 Requisition
2 Replenishment
3 Pick Wave
4 Receipt
5 Manufacturing Component Pick
6 Put Away

Data fix to insert missing move order header

DECLARE
    CURSOR missing_mtrh_cur IS
        SELECT mtrl.header_id, --move order header id
               wdd.organization_id,
               enforce_ship_set_and_smc,
               wpb.pick_grouping_rule_id,
               wpb.name --
          FROM wsh_delivery_details     wdd,
               wsh_shipping_parameters  wsp,
               mtl_txn_request_lines    mtrl,
               wsh_picking_batches      wpb
         WHERE     line_id = move_order_line_id
               AND source_code = 'OE'
               AND wdd.move_order_line_id IS NOT NULL
               AND wsp.organization_id = wdd.organization_id
               AND wdd.batch_id = wpb.batch_id
               AND released_status = 'S'
               AND NOT EXISTS
                       (SELECT 1
                          FROM mtl_txn_request_headers mtrh
                         WHERE mtrh.header_id = mtrl.header_id);

    l_counter   NUMBER := 0;
    l_count      NUMBER;
BEGIN
    FOR missing_mtrh_rec IN missing_mtrh_cur
    LOOP
        SELECT COUNT (*)
          INTO l_count
          FROM mtl_txn_request_headers
         WHERE header_id = missing_mtrh_rec.header_id;

        IF (l_count = 0)
        THEN
            INSERT INTO mtl_txn_request_headers (created_by,
                                                 creation_date,
                                                 header_id,
                                                 header_status,
                                                 last_updated_by,
                                                 last_update_date,
                                                 last_update_login,
                                                 organization_id,
                                                 request_number,
                                                 move_order_type,
                                                 transaction_type_id,
                                                 grouping_rule_id)
                 VALUES (-1,
                         SYSDATE,
                         missing_mtrh_rec.header_id,
                         7,
                         -1,
                         SYSDATE,
                         0,
                         missing_mtrh_rec.organization_id,
                         missing_mtrh_rec.name,
                         3, -- Pick Wave
                         52, -- Sales Order Pick
                         missing_mtrh_rec.pick_grouping_rule_id);
        END IF;

        l_counter := l_counter + 1;
    END LOOP;

    DBMS_OUTPUT.put_line ('Number of Records Processed : ' || l_counter);
    COMMIT;
END;
/

Script to check for Move Order lines with missing Move Order headers

SELECT mtrl.header_id,
                   wdd.organization_id,
                   wsp.enforce_ship_set_and_smc,
                   wpb.pick_grouping_rule_id,
                   wpb.NAME
              FROM wsh_delivery_details     wdd,
                   wsh_shipping_parameters  wsp,
                   mtl_txn_request_lines    mtrl,
                   wsh_picking_batches      wpb
             WHERE     mtrl.line_id = wdd.move_order_line_id
                   AND wdd.source_code = 'OE'
                   AND wdd.move_order_line_id IS NOT NULL
                   AND wsp.organization_id = wdd.organization_id
                   AND wdd.batch_id = wpb.batch_id
                   AND wdd.released_status = 'S'
                   AND NOT EXISTS
                           (SELECT 1
                              FROM mtl_txn_request_headers mtrh
                             WHERE mtrh.header_id = mtrl.header_id);

Issues when download file with more than 2GB in Java

Use below code to download content with more than 2 GB



    long length = fileObj.length();
    if (length <= Integer.MAX_VALUE)
    {
      response.setContentLength((int)length);
    }
    else
    {
      response.addHeader("Content-Length", Long.toString(length));
    }

Friday 26 July 2019

AutoInvoice: "Stuck in the Interface" issue: Interface line not created in AR/ Reprocess stuck records from AR Interface

Steps to reprocess the stuck records in ra_interface_lines_all

1. Make sure Auto Invoice program is not running
2. Clear the flags from ra_interface_lines_all

UPDATE ra_interface_lines_all
   SET interface_line_id = NULL,
       customer_trx_id = NULL,
       request_id = NULL,
       link_to_line_id = NULL,
       interface_status  = null
 WHERE NVL (interface_status, 'x') != 'P';

commit

3. Re-run AutoInvoice.

Refer below note for more details:
Troubleshooting AutoInvoice: "Stuck in the Interface" issues: Interface line not created in AR and no error is showing in the interface (Doc ID 1146573.1)

Tuesday 23 July 2019

Query to get on-hand quantity

   
The quantity on hand of an item at any particular control level and location can be
found by summing TRANSACTION_QUANTITY for all records that match the
criteria


 SELECT SUM (primary_transaction_quantity)
        FROM mtl_onhand_quantities_detail
       WHERE     inventory_item_id = p_inventory_item_id
             AND organization_id = p_organization_id
             AND subinventory_code = p_subinventory_code
             AND NVL (lot_number, '$') = NVL (p_lot_number, '$')
             AND revision = p_item_revision;

ra_customer_trx_lines_all Interface Line columns mapping for ORDER ENTRY Source



INTERFACE_LINE_ATTRIBUTE1 Order Number   OE_ORDER_HEADERS_ALL.ORDER_NUMBER
INTERFACE_LINE_ATTRIBUTE2 Order Type Order Type
INTERFACE_LINE_ATTRIBUTE3 Delivery Delivery
INTERFACE_LINE_ATTRIBUTE6 Line ID oe_order_lines_all.LINE_ID
INTERFACE_LINE_ATTRIBUTE7 Picking Line ID Picking Line ID
INTERFACE_LINE_ATTRIBUTE11 Price Adjustment ID oe_price_adjustments.PRICE_ADJUSTMENT_ID

Other columns can be viewed from DFF setup

Descriptive Flex Segments
  -- Query using -- Application > Receivables &  Title > Line Transaction Flexfield
    Go to context "Order Entry"

Cancel Line API Error ORA-01403: No Data Found in Package OE_ORDER_GRP Procedure Automatic_account_creation

Issue: Cancel Line API Error ORA-01403: No Data Found in Package OE_ORDER_GRP Procedure Automatic_account_creation

Steps: Used API oe_order_pub.process_order to Cancel Line with proper init commands but still got the error.

      oe_msg_pub.initialize;
      oe_debug_pub.initialize;
      mo_global.init ('ONT');
      mo_global.set_org_context (g_org_id, NULL, 'ONT');
      fnd_global.set_nls_context ('AMERICAN');
      mo_global.set_policy_context ('S', g_org_id);

In order for the API to work correctly, we need to set the org context and initialize  correctly.

Upon further investigation found that the ORG_ID passed to the script does not match with Order Org :D


Tuesday 18 June 2019

Copy/Replicate Concurrent program including executable, parameter and request groups

Script to copy concurrent program including executable, parameter and request groups

Usage: 1) Replace l_prefix value with desired value
            2) Replace 'Financial Tax Register' with the program that you want to copy or replicate


DECLARE
    l_prefix   VARCHAR2 (30) := 'XX ';                  -- new program pre-fix

    CURSOR c_program_details IS
        SELECT (SELECT APPLICATION_NAME
                  FROM apps.fnd_application_vl
                 WHERE application_id = e.APPLICATION_ID)
                   exec_application,
               e.EXECUTABLE_NAME,
               e.USER_EXECUTABLE_NAME,
               e.DESCRIPTION
                   exec_description,
               (SELECT meaning
                  FROM apps.fnd_lookup_values_vl
                 WHERE     1 = 1
                       AND lookup_code = e.EXECUTION_METHOD_CODE
                       AND lookup_type = 'CP_EXECUTION_METHOD_CODE'
                       AND enabled_flag = 'Y')
                   exec_method,
               e.EXECUTION_FILE_NAME,
               e.SUBROUTINE_NAME,
               e.EXECUTION_FILE_PATH,
               (SELECT APPLICATION_NAME
                  FROM apps.fnd_application_vl
                 WHERE application_id = P.APPLICATION_ID)
                   prog_application,
               p.CONCURRENT_PROGRAM_NAME,
               p.USER_CONCURRENT_PROGRAM_NAME,
               p.description
                   prog_description,
               p.PRINT_FLAG,
               p.RUN_ALONE_FLAG,
               p.SRS_FLAG,
               p.SAVE_OUTPUT_FLAG,
               p.REQUIRED_STYLE,
               p.OUTPUT_FILE_TYPE,
               p.enable_trace,
               p.restart,
               p.nls_compliant,
               (SELECT application_short_name
                  FROM apps.fnd_application_vl
                 WHERE application_id = p.application_id)
                   prog_appl_short_name
          FROM apps.fnd_executables_vl e, apps.fnd_concurrent_programs_vl p
         WHERE     1 = 1
               AND p.USER_CONCURRENT_PROGRAM_NAME = 'Financial Tax Register'
               --and e.EXECUTABLE_NAME='XX..'
               AND p.EXECUTABLE_ID = e.EXECUTABLE_ID
               AND p.EXECUTABLE_APPLICATION_ID = e.application_id;
BEGIN
    FOR r_program IN c_program_details
    LOOP
        -- Register Executable
        BEGIN
            FND_PROGRAM.executable (
                executable            => l_prefix || r_program.USER_EXECUTABLE_NAME -- user executable name
                                                                                   ,
                application           => r_program.EXEC_APPLICATION -- application
                                                                   ,
                short_name            => l_prefix || r_program.EXECUTABLE_NAME -- short_name
                                                                              ,
                description           => l_prefix || r_program.EXEC_DESCRIPTION -- description
                                                                               ,
                execution_method      => r_program.exec_method -- execution_method
                                                              ,
                execution_file_name   => r_program.EXECUTION_FILE_NAME -- execution_file_name
                                                                      ,
                subroutine_name       => r_program.SUBROUTINE_NAME -- subroutine_name
                                                                  ,
                icon_name             => ''                            -- icon
                                           ,
                language_code         => 'US'                 -- language_code
                                             ,
                execution_file_path   => r_program.EXECUTION_FILE_PATH --execution_file_path
                                                                      );
            --COMMIT;
            DBMS_OUTPUT.put_line ('Executable created');
        END;

        -- Register CP
        BEGIN
            -- Register Concurrent program
            APPS.FND_PROGRAM.register (
                program                    =>
                    l_prefix || r_program.USER_CONCURRENT_PROGRAM_NAME,
                application                => r_program.PROG_APPLICATION,
                enabled                    => 'Y',
                short_name                 => l_prefix || r_program.CONCURRENT_PROGRAM_NAME,
                description                => l_prefix || r_program.PROG_DESCRIPTION,
                executable_short_name      =>
                    l_prefix || r_program.EXECUTABLE_NAME,
                executable_application     => r_program.EXEC_APPLICATION,
                execution_options          => '',
                priority                   => NULL,
                save_output                => r_program.SAVE_OUTPUT_FLAG,
                PRINT                      => r_program.PRINT_FLAG,
                cols                       => NULL,
                rows                       => NULL,
                style                      => NULL,
                style_required             => r_program.REQUIRED_STYLE,
                printer                    => NULL,
                request_type               => NULL,
                request_type_application   => NULL,
                use_in_srs                 => r_program.SRS_FLAG,
                allow_disabled_values      => 'N',
                run_alone                  => r_program.RUN_ALONE_FLAG,
                output_type                => r_program.OUTPUT_FILE_TYPE,
                enable_trace               => r_program.ENABLE_TRACE,
                restart                    => r_program.RESTART,
                nls_compliant              => r_program.NLS_COMPLIANT,
                icon_name                  => NULL,
                language_code              => 'US',
                mls_function_short_name    => NULL,
                mls_function_application   => NULL,
                incrementor                => NULL,
                refresh_portlet            => NULL);
            --COMMIT;
            DBMS_OUTPUT.put_line ('CP created');
        END;

        -- Copy Parameters
        FOR param_rec
            IN (SELECT params.column_seq_num
                           sequence,
                       params.end_user_column_name
                           parameter,
                       params.description,
                       params.enabled_flag
                           enabled,
                       vs.flex_value_set_name
                           value_set,
                       params.default_type,
                       params.DEFAULT_VALUE,
                       params.required_flag
                           required,
                       params.security_enabled_flag
                           enable_security,
                       params.range_code
                           range,
                       params.display_flag
                           display,
                       params.display_size,
                       params.maximum_description_len
                           description_size,
                       params.concatenation_description_len
                           concatenated_description_size,
                       params.form_left_prompt
                           prompt,
                       params.srw_param
                           token,
                       'N'
                           cd_parameter                      --cp.cd_parameter
                  FROM FND_DESCR_FLEX_COL_USAGE_VL  params,
                       fnd_flex_value_sets          vs
                 WHERE     1 = 1
                       AND descriptive_flexfield_name =
                           '$SRS$.' || r_program.CONCURRENT_PROGRAM_NAME
                       AND vs.flex_value_set_id = params.flex_value_set_id(+))
        LOOP
            BEGIN
                fnd_program.parameter (
                    program_short_name              =>
                        l_prefix || r_program.CONCURRENT_PROGRAM_NAME, -- program short name
                    application                     => r_program.prog_appl_short_name, -- application short name
                    sequence                        => param_rec.sequence,
                    parameter                       => param_rec.parameter,
                    --parameter             =>  param_rec.token,
                    description                     => param_rec.description,
                    enabled                         => param_rec.enabled,
                    value_set                       => param_rec.value_set,
                    default_type                    => param_rec.default_type,
                    DEFAULT_VALUE                   => param_rec.DEFAULT_VALUE,
                    required                        => param_rec.required,
                    enable_security                 => param_rec.enable_security,
                    range                           => param_rec.range,
                    display                         => param_rec.display,
                    display_size                    => param_rec.display_size,
                    description_size                => param_rec.description_size,
                    concatenated_description_size   =>
                        param_rec.concatenated_description_size,
                    prompt                          => param_rec.prompt,
                    token                           => param_rec.token,
                    --token                        =>  null,
                    cd_parameter                    => param_rec.cd_parameter);
            END;
        END LOOP;

        DBMS_OUTPUT.put_line ('Parameters copied');

        -- Assign program to request group(s)
        -- Copy request groups
        FOR r_req_group
            IN (SELECT rg.REQUEST_GROUP_NAME,
                       (SELECT APPLICATION_NAME
                          FROM apps.fnd_application_vl
                         WHERE application_id = rg.application_id)
                           rg_application
                  FROM apps.fnd_request_groups          rg,
                       apps.Fnd_Request_Group_Units     u,
                       apps.fnd_concurrent_programs_vl  p
                 WHERE     1 = 1
                       AND p.USER_CONCURRENT_PROGRAM_NAME =
                           r_program.USER_CONCURRENT_PROGRAM_NAME
                       AND u.REQUEST_UNIT_TYPE = 'P'
                       AND u.UNIT_APPLICATION_ID = p.application_id
                       AND u.REQUEST_UNIT_ID = p.concurrent_program_id
                       AND u.REQUEST_GROUP_ID = rg.request_group_id
                       AND u.application_id = rg.application_id)
        LOOP
            BEGIN
                FND_PROGRAM.add_to_group (
                    l_prefix || r_program.CONCURRENT_PROGRAM_NAME,
                    r_program.PROG_APPLICATION                  -- application
                                              ,
                    r_req_group.REQUEST_GROUP_NAME       -- Request Group Name
                                                  ,
                    r_req_group.rg_application);    --Report Group Application
            --COMMIT;
            END;
        END LOOP;

        DBMS_OUTPUT.put_line ('Assignment completed');

        EXIT;                                  -- exit after one round of loop
    END LOOP;
--commit;
EXCEPTION
    WHEN OTHERS
    THEN
        ROLLBACK;
        NULL;
END;
/