Использование SuiteScript для заполнения заказа на перемещение

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

function OLDcreateTO() //(request, response)
{
    for ( var i = 1; i < lines + 1 ; i++ )
    {
        nlapiLogExecution('DEBUG','<Before Load Script> type: '+type,"line # " + i);
        arrayName[i] = PORecord.getLineItemValue('item', 'item', i ); 
        nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, arrayName[i]);
    }

    nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, lines + ' lines');


    var TOrecord = nlapiCreateRecord ('transferorder');
    var TOrecordID = TOrecord.getId();
    TOrecord.setFieldValue('customform',128);
    //subsidiaries CC bedford id is 2
    TOrecord.setFieldValue('subsidiary',2);
    //testing for location and transfer location, 144 & 145
    TOrecord.setFieldValue('location',144);
    TOrecord.setFieldValue('transferlocation',145);

    nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, 'break 4');
    // add new lines to a sublist
    nlapiSelectNewLineItem('item');
    // set the item and location values on the currently selected line
    nlapiSetCurrentLineItemValue('item', 'item', arrayName[1]);
    nlapiSetCurrentLineItemValue('item', 'location', 6);
    // commit the line to the database
    nlapiCommitLineItem('item');
    nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, 'break 5');

    var TOResult = nlapiSubmitRecord(TOrecord, true, true);
    var TOTranID= nlapiLookupField('transferorder', TOResult, 'tranid');
     nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, 'break 6');
    var poURL = nlapiResolveURL('RECORD', 'transferorder', TOResult);

    nlapiSetRedirectURL('RECORD','transferorder', TOResult);


     }

Поэтому я пытаюсь, чтобы элементы заказа на покупку заполняли поле элементов в новом заказе на передачу с помощью кнопки на заказе на поставку. Оттуда пользователь может вносить любые изменения в запись перед ее отправкой и созданием TO. Основная проблема в том, что я не знаю, как заполнить пустой TO из скрипта. У меня он перенаправляется туда через строку URL, но я уверен, что есть лучший способ сделать это.

В итоге.

-Пользователь нажимает кнопку «Создать КОМУ» в заказе на покупку.

- переводит пользователя на страницу «Создать ТО», где все элементы (и некоторая различная информация) предварительно заполняются в зависимости от ЗП.

-Пользователь редактирует запись, а затем отправляет ее.

SuiteScript 1.0 //create_to_button

var newId ;
var newType ;
function beforeload(type)
{
    if(nlapiGetContext().getRole() == '3')
    {
        if(type =='view' || type == 'edit')
        {
            newId = nlapiGetRecordId();
            newType = nlapiGetRecordType();

                if(newType == 'purchaseorder')
                {

                    var strURL = "https://system.na2.netsuite.com/app/accounting/transactions/trnfrord.nl"
                    var scriptbutton = 'window.open(' + String.fromCharCode(39) + strURL + String.fromCharCode(39) + ')' ;
                    //nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, 'URL: '+strURL + '&id=' + newId);
                    form.addButton('custpage_createpo', 'Create TO', scriptbutton);

                }

        }
    }
}

function loadTO() //(request, response)
{
    nlapiLogExecution('DEBUG','<Before Load Script> type: '+type, 'hello');
     nlapiLoadRecord(newType, newId);
}

Любые идеи или советы приветствуются. -Брэндон


person Brandon Reale    schedule 07.05.2018    source источник


Ответы (1)


Если вы знаете, что ТО будет сохранено, вы должны открыть Suitelet, который заполнит ТО. Сохраните его и перенаправьте на новый TO с помощью nlapiSetRedirect с URL-адресом из nlapiResolveURL.

Если TO не может быть сохранен, добавьте некоторые параметры в URL-адрес ссылки на задачу, который вы уже используете, и добавьте свою логику заполнения в функцию инициализации на стороне клиента TO. Возможно, вам потребуется добавить некоторые настраиваемые поля в TO с помощью сценария пользовательского события beforeLoad, чтобы предоставить информацию, необходимую клиентскому сценарию. (Ваш клиентский скрипт также может просматривать параметры строки запроса, но в зависимости от того, что вы делаете, поиск на стороне сервера может быть быстрее).

person bknights    schedule 07.05.2018
comment
Это имеет смысл. Одна странная проблема, с которой я сталкиваюсь, заключается в том, что какой бы скрипт я ни прикрепил к кнопке, он будет запускать этот скрипт при загрузке без нажатия кнопки. Но вся цель кнопки состоит в том, чтобы активировать скрипт только при нажатии. form.addButton('custpage_purchaseorder', 'Создать TO', loadTO()); У вас есть идеи, почему это происходит? Спасибо. - person Brandon Reale; 08.05.2018
comment
Я думаю так. NS ожидает "window.open('"+href +"')", т.е. используйте двойные кавычки для создания сценария и одинарные кавычки для цитирования строк. - person bknights; 08.05.2018
comment
Я немного запутался. Как window.open поможет мне запустить функцию при нажатии кнопки? Кажется, мне нужно было бы иметь весь скрипт в window.open . будет ли формат чем-то вроде window.open("entire function " + 'function call') ? - person Brandon Reale; 08.05.2018
comment
Хорошо, я думаю, что получил эту часть. var steve = "alert(\'Button was clicked from \' + nlapiGetRecordType() + \' in VIEW mode\');";, а затем form.addButton('custpage_purchaseorder', 'Create TO', steve); - person Brandon Reale; 08.05.2018
comment
Кавычки забавны из-за того, как они встраивают действие кнопки. На самом деле ожидается, что вы загрузите клиентский скрипт и используете один из его открытых методов. - person bknights; 09.05.2018
comment
последняя проблема, с которой я сталкиваюсь, — это ошибка моего сценария, и я не совсем понимаю, почему. Я добавляю новый элемент, устанавливаю его и фиксирую, но по-прежнему получаю сообщение об ошибке «Вы должны ввести хотя бы один элемент строки для этой транзакции». Скрипт в основном посте. - person Brandon Reale; 09.05.2018
comment
Вы используете вызовы API на стороне клиента или в динамическом режиме для серверной/нединамической стороны. TOrecord.setLineItemValue('item', 'item', arrayName[1], 1); - person bknights; 09.05.2018