2017-08-22 4 views
0

Meine Firma führt mehrere verschiedene Arten von Projekten aus und möchte den Projektdatensatz abhängig vom Typ des Projekts, das im ausgewählten Projektdatensatz ausgeführt wird, unterschiedlich anzeigen.Suitescript 2.0 Verschiedene Formulare für verschiedene Arten von Projekten verwenden

Ich habe das Feld, das das zu verwendende Formular mit dem Titel "benutzerdefiniertes Formular" (dies ist ein Auswahlfeld) und ein Feld, dass unsere Mitarbeiter den Typ des Projekts "custentityjt_fie_pro_projecttype" (auch ein Auswahlfeld) auswählen.

ich erstellt habe folgende vor der Benutzerereignisskript laden, um zu versuchen, dies zu erreichen:

/** 
* @NApiVersion 2.x 
* @NScriptType UserEventScript 
* @NModuleScope SameAccount 
*/ 
define(["N/record"], function(r) { 
function beforeLoad(context) { 
    var currentRecord = context.newRecord; 
    var projectType = currentRecord.getValue({ 
     fieldId: "custentityjt_fie_pro_projecttype", 
    }); 

    currentRecord.setValue({ 
     fieldID: 'customform', 
     value: projectType 
     }) 

} 

return { 
    beforeLoad: beforeLoad, 
} 

}) 

Wenn das Projekt Datensatz im Bearbeitungsmodus geladen, die benutzerdefinierten Formular Auswahl nicht ändert, und wenn das Projekt Datensatz zu laden im Ansichtsmodus, erhalte ich folgende:

{"type":"error.SuiteScriptError","name":"UNEXPECTED_ERROR","message":null,"stack":["anonymous(N/recordService)","beforeLoad(/SuiteScripts/setForm.js:13)"],"cause":{"type":"internal error","code":"UNEXPECTED_ERROR","details":null,"userEvent":"beforeload","stackTrace":["anonymous(N/recordService)","beforeLoad(/SuiteScripts/setForm.js:13)"],"notifyOff":false},"id":"","notifyOff":false} 

ich bin sehr neu für NetSuite und Programmierung im allgemeinen so bitte sanft sein :)

Antwort

0

Sie müssen verwenden Client-Skript, um das benutzerdefinierte Formular zu ändern. Am besten wäre es, es an zwei Stellen zu machen: pageInit() und fieldChanged(). Ein anderes potenzielles Problem wäre, den benutzerdefinierten Formularwert auf einen Wert zu setzen, der im getValue Ihres Felds custentityjt_fie_pro_projecttype abgerufen wurde. Der Wert, der von currentRecord.getValue() aus Ihrem Beispiel zurückgegeben wird, ist die interne ID des benutzerdefinierten Listenwerts für den dort festgelegten Projekttyp (kehren Sie zu Ihrer benutzerdefinierten Liste zurück und Sie sehen die internen ID-Werte aufgelistet). Dies ist ein Problem, da Sie beim Festlegen des Werts des Feldes "Benutzerdefiniertes Formular" auf die interne ID des benutzerdefinierten Formulars verweisen müssen, das Sie verwenden möchten. Es wäre bemerkenswert, wenn die interne ID des referenzierten Projekttyps jemals mit der internen ID des benutzerdefinierten Formulars übereinstimmt. Meine Empfehlung wäre, eine Hash-Tabelle in Ihrem Code zu erstellen, um die Referenzen zu speichern (vorausgesetzt, Ihre Liste der Projekttypen hat sich nicht häufig geändert). Probieren Sie es aus (stellen Sie nur sicher, dass Sie die Werte in der Lookup-Variablen aktualisieren, wenn diese erstellt werden.)

/** 
*@NApiVersion 2.x 
*@NScriptType ClientScript 
*/ 
define([ 
    'N/record' 
], 
    function (
    nsRecord 
) { 
    // 
    // lookup table where the object property represents the internal IDs of the 
    // custom list values, and the value of each property represents the 
    // internal id's of the Custom Forms you wish to associate with each list value. 
    // 
    var lookup = { 
     1: 122, 
     2: 123, 
     3: 125, 
     4: 136 
    }; 

    function fieldChanged(context) { 
     var field = context.fieldId; 
     var rec = context.currentRecord; 
     var projId; 

     if (field === 'custentityjt_fie_pro_projecttype' && rec.getValue('custentityjt_fie_pro_projecttype')) { 
      projId = rec.getValue('custentityjt_fie_pro_projecttype'); 

      if (lookup[projId]) { 
       rec.setValue({ 
        fieldId: 'customform', 
        value: lookup[projId], 
        ignoreFieldChange: true, 
        fireSlavingSync: true 
       }); 
      } 
     } 
    } 

    function pageInit(context) { 
     var rec = context.currentRecord; 
     var mode = context.mode; 
     var projId; 
     var formId; 

     if (mode !== 'create') { 
      formId = rec.getValue('customform'); 
      projId = rec.getValue('custentityjt_fie_pro_projecttype'); 

      if (lookup[projId] && lookup[projId] !== formId) { 
       rec.setValue({ 
        fieldId: 'customform', 
        value: lookup[projId], 
        ignoreFieldChange: true, 
        fireSlavingSync: true 
       }); 
      } 
     } 
    } 

    return { 
     fieldChanged: fieldChanged, 
     pageInit: pageInit 
    }; 
}); 
+0

Vielen Dank für Ihre Hilfe. Habe ich Recht, dass dies nur im Bearbeitungsmodus funktioniert? gibt es eine Möglichkeit, es zu arbeiten, wenn das Projekt im Ansichtsmodus anzeigen? – jtux

+0

Ich sollte auch erwähnen, dass im benutzerdefinierten Modus die benutzerdefinierte Formularauswahl ändert sich zwar korrekt, aber das eigentliche Formular selbst ändert sich nicht. Es scheint, als ob Sie normalerweise müsste auf die Auswahl klicken, anstatt nur den Wert des Feldes zu ändern, damit die Änderung tatsächlich ausgeführt werden kann. Kann dies behoben werden, indem ein neuer Seitenwechsel nach Änderung hinzugefügt wird? – jtux

+0

@jtux Sie sind richtig, dies funktioniert nur in Bearbeitungsmodus Ich glaube auch, dass es nur als Client-Skript und nicht auf eine vor dem Laden funktioniert Benutzerereignisskript –

Verwandte Themen