Как использовать функции более высокого порядка вместо цикла FOR для позиций в распечатках Suitelet (Netsuite)? - PullRequest
0 голосов
/ 01 июля 2019

мой старший распорядился распечатать значения позиций с использованием функций более высокого порядка (.filter/.map/.reject/.reduce).Я запутался, как написать функцию более высокого порядка вместо цикла for (для печати значений строк в Распечатке счетов-фактур).Мне нужно печатать строку только тогда, когда кол-во больше 3. Я стажер и не знаю, как это будет работать, любезно помогите.

Ссылка на фрагмент кода: https://drive.google.com/file/d/1uVQQb0dsg_bo53fT3vk9f0G8WwZomgQg/view?usp=sharing

Я всегда использовал условие для печати строки только тогда, когда поле количества имеет значение больше 3. Я даже знаю, как .фильтр, но яне знаю, как это назвать и где это назвать.Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Я не верю, что Array.from работает в коде на стороне сервера.Если это так, то используйте это.Я использовал следующие функции.Они не соответствуют указанным функциям более высокого порядка, но работают с синтаксисом Netsuite и имеют большое значение для упрощения обработки подсписков и инкапсуляции кода:

//SS2.x
//I have this as a snippet that can be included in server side scripts
function iter(rec, listName, cb){
    var lim = rec.getLineCount({sublistId:listName});
    var i = 0;
    var getV = function (fld){
        return rec.getSublistValue({sublistId:listName, fieldId:fld, line:i});
    };
    for(; i< lim; i++){
        cb(i, getV);
    }
}
// to use it:
iter(ctx.newRecord, 'item', function(idx, getV){
  if(parseInt(getV('quantity')) >3){
   ...
  }
});

или для сценариев SS1. У меня есть следующее, позволяющее выполнять коддля совместного использования между сценариями UserEvent и Scheduled или Suitelets

function forRecordLines(rec, machName, op, doReverse) {
    var i, pred, incr;
    var getVal = rec ? function(fld) {
            return rec.getLineItemValue(machName, fld, i);
        } : function(fld) {
            return nlapiGetLineItemValue(machName, fld, i);
        };
    var getText = rec ? function(fld) {
            return rec.getLineItemText(machName, fld, i);
        } : function(fld) {
            return nlapiGetLineItemText(machName, fld, i);
        };
    var setVal = rec ? function(fld, val) {
            rec.setLineItemValue(machName, fld, i, val);
        } : function(fld, val) {
            nlapiSetLineItemValue(machName, fld, i, val);
        };
    var machCount = rec ? rec.getLineItemCount(machName) : nlapiGetLineItemCount(machName);

    if(!doReverse){
        i = 1;
        pred = function(){ return i<= machCount;};
        incr = function(){ i++;};
    }else{
        i = machCount;
        pred = function(){ return i>0;};
        incr = function(){ i--;};
    }

    while(pred()){
        var ret = op(i, getVal, getText, setVal);
        incr();
        if (typeof ret != 'undefined' && !ret) break;
    }

}

// User Event Script:
forRecordLines(null, 'item', function(idx, getV, getT, setV){
  if(parseInt(getV('quantity')) >3){
   ...
  } 
});

// in a Scheduled Script:
forRecordLines(nlapiLoadRecord('salesorder', id), 'item', function(idx, getV, getT, setV){
  if(parseInt(getV('quantity')) >3){
   ...
  } 
});
1 голос
/ 01 июля 2019

Обычно это прямая задача, но, поскольку вы получаете длину и, исходя из того, что вы выполняете итерацию, вы можете использовать Array.from.Его подпись:

Array.from (ArrayLikeObject, mapFunction);

var tableData = Array.from({ length: countItem}, function(index) {
  vendorBillRec.selectLineItem('item', index);
  var item = vendorBillRec.getCurrentLineItemText('item', 'item');
  var description = nlapiEscapeXML(vendorBillRec.getCurrentLineItemValue('item', 'description'));
  var quantity = parseFloat(nullNumber(vendorBillRec.getCurrentLineItemValue('item', 'quantity')));
  return { item, description, quantity}
});

var htmlData = tableData.filter(...).map(getRowMarkup).join('');

function getRowMarkup(data) {
const { itemName, descript, quantity } = data;
return  '<tr>' +
          '<td colspan="6">' +
            '<p>' + itemName + ' ' + descript + '</p>'+
          '</td>' +
          '<td colspan="2" align="right">' + quantity + '</td>' +
        '</tr>';
}

Или, если вы хотите использовать более функциональный подход:

  • Создайте функцию, которая читает и выдает вам все данные в формате массива.,Вы можете использовать эти данные для любой задачи.
  • Создать функцию, которая будет принимать объект с указанными свойствами и возвращать разметку.
  • Передавать данные в эту разметку после любого условия фильтра.

Идея состоит в том, чтобы изолировать обе задачи: - Получение данных, которые должны быть обработаны - Логика представления и код, связанный со стилем

var htmlString = Array.from({ length: countItem}, function(index) {
  vendorBillRec.selectLineItem('item', index);
  var item = vendorBillRec.getCurrentLineItemText('item', 'item');
  var description = nlapiEscapeXML(vendorBillRec.getCurrentLineItemValue('item', 'description'));
  var qty = parseFloat(nullNumber(vendorBillRec.getCurrentLineItemValue('item', 'quantity')));
  return getRowMarkup(item, description, qty)
}).join('');

function getRowMarkup(itemName, descript, quantity) {
return  '<tr>' +
          '<td colspan="6">' +
            '<p>' + itemName + ' ' + descript + '</p>'+
          '</td>' +
          '<td colspan="2" align="right">' + quantity + '</td>' +
        '</tr>';
}
...