Delete Lines from Sales Order

REQUIREMENT

Delete the sales order lines having a specific item.

SOLUTION

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */
define(['N/record', 'N/search'],
    /**
 * @param{record} record
 * @param{search} search
 */
    (record, search) => {
        /**
         * Defines the function that is executed at the beginning of the map/reduce process and generates the input data.
         * @param {Object} inputContext
         * @param {boolean} inputContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {Object} inputContext.ObjectRef - Object that references the input data
         * @typedef {Object} ObjectRef
         * @property {string|number} ObjectRef.id - Internal ID of the record instance that contains the input data
         * @property {string} ObjectRef.type - Type of the record instance that contains the input data
         * @returns {Array|Object|Search|ObjectRef|File|Query} The input data to use in the map/reduce process
         * @since 2015.2
         */

        const getInputData = (inputContext) => {
            try {
                var transactionSearchObj = search.create({
                    type: "salesorder",
                    filters:
                        [
                            ["type", "anyof", "SalesOrd"],
                            "AND",
                            ["name", "anyof", "206"],
                            "AND",
                            ["item.name", "is", "ABC"],
                            "AND",
                            ["formulatext: {item.salesdescription}", "is", "ABC"],
                            "AND",
                            ["status", "anyof", "SalesOrd:B"],
                           
                        ],
                    columns:
                        [
                            search.createColumn({ name: "internalid", label: "Internal ID" })

                        ]
                });
                let transactionArray = []
                let searchResults = transactionSearchObj.run().getRange({
                    start: 0,
                    end: 1000
                })

                if (searchResults.length > 0) {
                    for (let i = 0; i < searchResults.length; i++) {
                        if (!transactionArray.includes(searchResults[i])) {
                            transactionArray.push(searchResults[i].getValue({ name: "internalid", label: "Internal ID" }))
                        }

                    }

                }
                log.debug("transactionArray", transactionArray)
                return transactionArray

            }
            catch (e) {
                log.debug("error@getInputData", e)
            }
        }

        
        /**
         * Defines the function that is executed when the reduce entry point is triggered. This entry point is triggered
         * automatically when the associated map stage is complete. This function is applied to each group in the provided context.
         * @param {Object} reduceContext - Data collection containing the groups to process in the reduce stage. This parameter is
         *     provided automatically based on the results of the map stage.
         * @param {Iterator} reduceContext.errors - Serialized errors that were thrown during previous attempts to execute the
         *     reduce function on the current group
         * @param {number} reduceContext.executionNo - Number of times the reduce function has been executed on the current group
         * @param {boolean} reduceContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {string} reduceContext.key - Key to be processed during the reduce stage
         * @param {List<String>} reduceContext.values - All values associated with a unique key that was passed to the reduce stage
         *     for processing
         * @since 2015.2
         */
        const reduce = (reduceContext) => {
            try {
                let searcResult = reduceContext.values.map(JSON.parse);
 
                let currentRec = record.load({
                    type: 'salesorder',
                    id: searcResult[0]
                });

                let lineCount = currentRec.getLineCount({
                    sublistId: 'item'
                });

                for (let i = lineCount; i > 0; i--) {
                    let item = currentRec.getSublistValue({
                        sublistId: 'item',
                        fieldId: 'item',
                        line: i - 1
                    });

                    if (item == 7921) {
 
                        currentRec.removeLine({
                            sublistId: 'item',
                            line: i - 1,
                            ignoreRecalc: true
                        });

                    }
                   
                }
                currentRec.save();
            }
            catch (e) {
                log.debug("error@Reduce", e)
            }
        }


        /**
         * Defines the function that is executed when the summarize entry point is triggered. This entry point is triggered
         * automatically when the associated reduce stage is complete. This function is applied to the entire result set.
         * @param {Object} summaryContext - Statistics about the execution of a map/reduce script
         * @param {number} summaryContext.concurrency - Maximum concurrency number when executing parallel tasks for the map/reduce
         *     script
         * @param {Date} summaryContext.dateCreated - The date and time when the map/reduce script began running
         * @param {boolean} summaryContext.isRestarted - Indicates whether the current invocation of this function is the first
         *     invocation (if true, the current invocation is not the first invocation and this function has been restarted)
         * @param {Iterator} summaryContext.output - Serialized keys and values that were saved as output during the reduce stage
         * @param {number} summaryContext.seconds - Total seconds elapsed when running the map/reduce script
         * @param {number} summaryContext.usage - Total number of governance usage units consumed when running the map/reduce
         *     script
         * @param {number} summaryContext.yields - Total number of yields when running the map/reduce script
         * @param {Object} summaryContext.inputSummary - Statistics about the input stage
         * @param {Object} summaryContext.mapSummary - Statistics about the map stage
         * @param {Object} summaryContext.reduceSummary - Statistics about the reduce stage
         * @since 2015.2
         */
        const summarize = (summaryContext) => {

        }

        return { getInputData, reduce, summarize }

    });

Leave a comment

Your email address will not be published. Required fields are marked *