Мне нужно, чтобы текст поля транзакции действовал как переменная в сохраненном поиске NetSuite, который создается через портлет - PullRequest
1 голос
/ 19 июня 2019

Я добавляю настраиваемый портлет списка в своей среде центра обслуживания клиентов, в которой используется настраиваемое поле, содержащее значение, представляющее внутренние идентификаторы всех товаров, купленных клиентом.Это значение будет использоваться в качестве фильтра в сохраненном поиске, данные которого будут заполнять портлет списка.

Текст поля выглядит как «123», «456» и т. Д.

Я могу успешно получить текст поля для моего отладчика, но когда я иду, чтобы передать значение поляв качестве переменной для моих фильтров выдается сообщение об ошибке:

Filter expecting numeric value was removed, as non-numeric value ... was provided.

Использование поискового экспорта NetSuite для воссоздания того, что я ищу, не динамически генерирует следующий код:

var customrecord_vcc_documentsSearchObj = search.create({
   type: "customrecord_vcc_documents",
   filters:
   [
     [["custrecord_vcc_customer_docs","anyof","@CURRENT@"],"AND",["custrecord_vcc_doc_type","noneof","1"]],
      "OR", 
      ["custrecord_vcc_doc_type","anyof","5"],
      "OR", 
      [["custrecord_vcc_doc_type","anyof","2","3","4","6","7"],"AND",["custrecord_vcc_doc_item","anyof","2291","3546","2279","1976"]]
   ],
   columns:
   [
      search.createColumn({
         name: "name",
         sort: search.Sort.ASC,
         label: "Name"
      }),
      search.createColumn({name: "custrecord_vcc_doc_type", label: "Type"}),
      search.createColumn({
         name: "formulatext",
         formula: "'<a href='||{custrecord_vcc_link_to_file}||'>Open</a>'",
         label: "Link"
      })
   ]
});

Когда я пытаюсь заменить:

["custrecord_vcc_doc_item","anyof","2291","3546","2279","1976"]

Чтобы заменить фиксированные идентификаторы, я использовал следующий код:


var transactionSearchObj = search.create({
   type: "transaction",
   filters:
   [
      ["name","anyof","@CURRENT@"]
   ],
   columns:
   [
      search.createColumn({
         name: "custbody_vcc_item_array_fixed",
         summary: "MAX",
         label: "Item Array Fixed"
      })
   ]
});

var itemarray=[];

transactionSearchObj.run().each(function(result){
    var itemarray1 = result.getValue({
        name: "custbody_vcc_item_array_fixed",
        summary: search.Summary.MAX
    });
    itemarray.push(itemarray1);
    log.debug({
        title: "Items",
        details: itemarray1
    });
    //return true;
});

var itemarraytext = itemarray.toString();

log.debug({
    title: "Item Array String",
    details: itemarraytext
});

log.debug({
    title: "Item Array ",
    details: itemarray
});

и введите itemarraytext вместо фиксированных идентификаторов.Значение itemarraytext для моего отладчика:

"2191","2046","1209","1209","1988","2092","295","1214","1988",...

, но сообщение об ошибке сохраняется и фильтр не применяется.

Это выполняется в центре обслуживания клиентов NetSuite, поэтому я не могу получить доступзапись клиента, потому что роль центра клиентов не имеет доступа к списку клиентов.Я также не могу получить доступ к внутренним идентификаторам предметов напрямую через сохраненные поиски, используя {item.internalid} по тем же причинам: разрешение.

Обходной путь - это динамическое поле, которое устанавливает статическое поле, которое я ищу с помощью поиска транзакции, текст статического поля должен быть текстом фильтра.

В идеале переменная itemarraytext будет проходить и фильтровать доступные документы, которые я ищу, на основе истории покупок каждого клиента.

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Если я правильно понимаю, вы создаете массив строк, разделенных запятыми:

[
    '"2191","2046","1209"',
    '"1209","1988","2092"',
    '"295","1214","1988"'
]

, а затем вызываете метод toString для создания:

'"2191","2046","1209","1209","1988","2092","295","1214","1988"'

и передаете егострока для вашего поискового фильтра:

["custrecord_vcc_doc_item","anyof",'"2191","2046","1209","1209","1988","2092","295","1214","1988"']

и фильтр не распознает '"2191","2046","1209","1209","1988","2092","295","1214","1988"' как число.

Вместо этого вам нужно заменить двойные кавычки и разбить переменную itemarraytext назапятая:

["custrecord_vcc_doc_item","anyof",itemarraytext.replace(/"/g,'').split(',')];

, которая должна быть эквивалентна:

["custrecord_vcc_doc_item","anyof",["2191","2046","1209","1209","1988","2092","295","1214","1988"]]
1 голос
/ 27 июня 2019

Обращаясь назад, чтобы опубликовать другое решение, которое я в итоге использовал.

Мне удалось обойти ошибку разрешения, изменив поле роли «Запуск от имени» сценария развертывания с текущей роли на «Администратор». Это позволило мне просто получить доступ к идентификаторам элементов из поиска и передать их в виде массива в другой фильтр.

Финальный код был:

var transactionSearchObj = search.create({
   type: "transaction",
   filters:
   [
      ["name","anyof","@CURRENT@"], 
      "AND", 
      ["item.type","anyof","InvtPart"]
   ],
   columns:
   [
      search.createColumn({
         name: "item",
         sort: search.Sort.ASC,
          summary: "GROUP",
         label: "Item"
      })
   ]
});




transactionSearchObj.run().each(function(result){
    var itemarray1 = result.getValue({
        summary: "GROUP",
        name: "item"
    })
    itemarray.push(itemarray1);
    log.debug({
        title: "Items",
        details: itemarray1
    });
    return true;
});





log.debug({
    title: "Item Array",
    details: itemarray
});







 var customrecord_vcc_documentsSearchObj = search.create({
   type: "customrecord_vcc_documents",
   filters:
   [
     [["custrecord_vcc_customer_docs","anyof","@CURRENT@"],"AND",["custrecord_vcc_doc_type","noneof","1"]],
      "OR", 
      ["custrecord_vcc_doc_type","anyof","5"],
      "OR", 
      [["custrecord_vcc_doc_type","anyof","2","3","4","6","7"],"AND",["custrecord_vcc_doc_item","anyof",itemarray]]
   ],
...