2016-06-15 5 views
0

契約レコードのフィールドをPOレコードから変更するためのusereventスクリプトがあります。スクリプトは正常に動作しています。しかし、契約記録を編集して提出しようとすると、「別のユーザーが編集を開始してからこのレコードを更新しました。レコードを閉じてもう一度開いて変更を加えてください」というエラーが表示されます。Netsuite Userevent Script

この理由はわかりますか?

/*--------------------------------------------------------------------------------------------------------------- 

Description  : Whenever the PO vendor is changed(due to Split vendor) that should replace the same in Contract page record automatically. 
Script type   : User Event Script 
Script id   : customscript452 
Version    : 1.0 
Applied to   : Contract 
----------------------------------------------------------------------------------------------------------------*/ 

function srchfield() 
    { 
     var stRecordid = nlapiGetRecordId(); //returns the contract id 
     if(stRecordid== undefined || stRecordid== null || stRecordid==' ') 
      { 

      } 
       else 
       { 
        var stRecordtype = nlapiGetRecordType(); //returns the contract record type = jobs 

        var stRecord = nlapiLoadRecord(nlapiGetRecordType(), stRecordid); 
        nlapiLogExecution('debug','Load Object',stRecord); 

        var stContractID = stRecord.getFieldValue('entityid'); //returns the value of the field contractid whose fieldid is = entityid 
        nlapiLogExecution('debug','stContractID',stContractID); 

        var stCompanyName = stRecord.getFieldValue('companyname'); //returns the value of the field company name whose fieldid is = companyname 
        nlapiLogExecution('debug','stCompanyName',stCompanyName); 

        var stConcatenate = stContractID+" : "+stCompanyName; //Concatenate the two Fields to get the result which needs to be found in PO 

        var arrFilters = new Array(); // This is Array Filters all the Purchase Order Record Search 
        arrFilters.push(new nlobjSearchFilter('type', null, 'anyof', 
         [ 
          'PurchOrd' 
         ])); 
        arrFilters.push(new nlobjSearchFilter('mainline', null, 'is', 'T')); //This is to exclude line level results 
        arrFilters.push(new nlobjSearchFilter('custbodycontract', null, 'is', stRecordid)); //This is Filters in Contracts Search 

        var arrColumns = new Array(); 
        arrColumns.push(new nlobjSearchColumn('entity')); //This is Search Column Field in Records 
        var arrSearchresults = nlapiSearchRecord('purchaseorder', null, arrFilters, arrColumns); //This is Filters in Search Result Purchase Order 

        if(arrSearchresults== undefined || arrSearchresults== null || arrSearchresults==' ') 
         { 

         } 
          else 
          { 
           var length = arrSearchresults.length; 
          } 

        if(length== undefined || length== null || length==' ') 
         { 

         } 
          else 
           { 
            for (var i = 0; arrSearchresults != null && i < arrSearchresults.length; i++) 
             { 
              var objResult = arrSearchresults[i]; 
              var stRecId = objResult.getId(); 
              var stRecType = objResult.getRecordType(); 
              var stCntrctName = objResult.getValue('entity'); //This is Value are Get Purchase Order Records and Field for Vendor = entity 
             } 
           } 
        //var record = nlapiLoadRecord(nlapiGetRecordType(), stRecordid, stCntrctName); 

        if (stCntrctName =='custentityranking_vendor_name') 
         { 

         } 
          else 
           { 
            var stChangeName = stRecord.setFieldValue('custentityranking_vendor_name', stCntrctName); //This is Value are the Set in Main Vendor Field = custentityranking_vendor_name 

            nlapiSubmitRecord(stRecord, null, null); // Submit the Field Value in Record Type 

           } 
       } 
    } 

答えて

1

ユーザーレコードスクリプトは、契約レコードがデータベースに保存されるときに実行されます。同時に、データベースからレコードの2番目のコピーをロードし、コピーを提出しようとしています。これはあなたが見ているエラーの原因です。

これは、nlapiSetFieldValueを使用して契約の適切なフィールドを設定するだけで解決します。

JavaScript Guide over at MDNをご覧になると、JavaScriptに詳しいことをお勧めします。特に、Boolean descriptionを見て、JavaScriptがブール式をどのように評価するかを理解してください。これは、多くの条件文が不要なので、ここで書いたコードの量を大幅に減らすのに役立ちます。

0

あなたにはどのような特典がありますか?使用しているユーザーイベントとAPIのタイプに応じて発生します。あなたのコードを見ると、すでにデータベースで更新されている契約レコードをロードしようとしています。だからあなたはあなたの問題に対処するために以下を検討するかもしれません。それが役に立てば幸い。

送信前の場合は、スクリプトがデプロイされている場所でレコードをロードする必要はありません。
値を取得および設定するには、nlapiGet *およびnlapiSet *を使用してください。また、変更を反映するためにnlapiSubmitRecordを使用する必要もありません。送信前に、レコードがデータベースに保存される前に実行されます。あなたの変更はまだ反映されます。
それが送信後であれば、レコードがデータベースに保存された後に実行されるため、必要に応じて次のAPIを使用できます。実際には、これを解決するためのベストプラクティスです。

  • nlapiGetNewRecord - スクリプトはヘッダのみとサブリストから情報を取得する必要がある場合にのみ、これを使用しています。設定するものは何もありません。
  • nlapiLookupField - スクリプトがヘッダーに値/ sを取得する必要があり、行から何も取得する必要がない場合は、これを使用します。
  • nlapiSubmitField - ヘッダーのみが変更された場合、スクリプトはレコードをロードして送信する必要はありません。このAPIを使用するだけです。
  • nlapiLoadRecordとnlapiSubmitRecord-スクリプトが行に変更を加え、後者のAPIを使用してデータベースでコミットする場合は前者を使用します。
0

あなたが示したコードは、パフォーマンスを考慮すると非常に良くありません。ここで

あなたはstRecordid = nlapiGetRecordId()

VARをマージすることができますサンプルです。 //契約IDを返します

// Every record has an internal id associated with it. No need to add condition explicitly to check if its null 
var stRecordtype = nlapiGetRecordType(); 

var fields = ['entityid','companyname']; 
var columns = nlapiLookupField(stRecordtype, stRecordid, fields); 

var stContractID = columns.entityid; 
var stCompanyName = columns.companyname; 

nlapiLogExecution('debug','stContractID/stCompanyName',stContractID+'/'+stCompanyName); 

var stConcatenate = stContractID+" : "+stCompanyName; //Concatenate the two Fields to get the result which needs to be found in PO 
// 
//your code of search 
//you can improve that code also by using nlapilook up 

nlapiSubmitField(stRecordtype, stRecordid, 'custentityranking_vendor_name', 'name to be updated'); 
関連する問題