Create Multiple Sales Records Using a Map Reduce Script

The following sample shows how to use a map reduce script to create multiple sales records and log the record creation progress.

Note:

This script sample uses the define function, which is required for an entry point script (a script you attach to a script record and deploy). You must use the require function if you want to copy the script into the SuiteScript Debugger and test it. For more information, see SuiteScript 2.1 Global Objects.

          /**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */

define(['N/record', 'N/log'], (record, log) => {
    const ORDER_COUNT = 3;

    const getInputData = () => {
        log.audit({
            title: 'Get Input Data',
            details: `Creating input for ${ORDER_COUNT} sales orders`
        });

        return [1, 2, 3];
    };

    const map = (context) => {
        const orderNumber = Number(context.value);

        log.debug({
            title: 'Processing Order',
            details: {
                key: context.key,
                orderNumber
            }
        });

        const salesOrder = record.create({
            type: record.Type.SALES_ORDER,
            isDynamic: true
        });

        salesOrder.setValue({
            fieldId: 'entity',
            value: 2135
        });

        salesOrder.selectNewLine({
            sublistId: 'item'
        });

        salesOrder.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'item',
            value: 102
        });

        salesOrder.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'quantity',
            value: 3
        });

        salesOrder.commitLine({
            sublistId: 'item'
        });

        const salesOrderId = salesOrder.save();
        const percentComplete = (orderNumber * 100) / ORDER_COUNT;

        log.audit({
            title: 'Sales Order Created',
            details: {
                salesOrderId,
                progress: `${percentComplete}%`
            }
        });
    };

    const summarize = (summary) => {
        if (summary.inputSummary.error) {
            log.error({
                title: 'Get Input Data Error',
                details: summary.inputSummary.error
            });
        }

        summary.mapSummary.errors.iterator().each((key, error) => {
            log.error({
                title: `Map Error for Key ${key}`,
                details: error
            });
            return true;
        });

        log.audit({
            title: 'Map/Reduce Summary',
            details: {
                usage: summary.usage,
                concurrency: summary.concurrency,
                yields: summary.yields
            }
        });
    };

    return {
        getInputData,
        map,
        summarize
    };
}); 

        

General Notices