{"id":4437,"date":"2017-08-21T15:01:10","date_gmt":"2017-08-21T15:01:10","guid":{"rendered":"https:\/\/answers.gurussolutions.com\/answers\/how-to-implement-dynamic-dependent-dropdowns-in-netsuite-using-client-side-scripting-2\/"},"modified":"2026-07-28T18:26:46","modified_gmt":"2026-07-28T18:26:46","slug":"comment-mettre-en-oeuvre-des-menus-deroulants-dynamiques-dependants-dans-netsuite-a-laide-de-scripts-cote-client","status":"publish","type":"qa_entry","link":"https:\/\/answers.gurussolutions.com\/fr\/answers\/comment-mettre-en-oeuvre-des-menus-deroulants-dynamiques-dependants-dans-netsuite-a-laide-de-scripts-cote-client\/","title":{"rendered":"Comment mettre en \u0153uvre des menus d\u00e9roulants dynamiques d\u00e9pendants dans NetSuite \u00e0 l&rsquo;aide de scripts c\u00f4t\u00e9 client"},"content":{"rendered":"","protected":false},"template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","ga_subtitle":"Dans les cas complexes o\u00f9 l'exploitation native des champs NetSuite s'av\u00e8re insuffisante, l'utilisation de scripts c\u00f4t\u00e9 client permet de filtrer dynamiquement les options des menus d\u00e9roulants en exploitant des champs d'interface utilisateur temporaires.","ga_short_answer":"Pour cr\u00e9er des menus d\u00e9roulants dynamiques et d\u00e9pendants dans NetSuite destin\u00e9s \u00e0 des cas d\u2019utilisation complexes, l\u2019utilisation de scripts c\u00f4t\u00e9 client est n\u00e9cessaire. Cela implique d\u2019ajouter un champ d\u2019interface utilisateur temporaire au formulaire, de remplir ses options de mani\u00e8re dynamique, puis de transf\u00e9rer la valeur s\u00e9lectionn\u00e9e vers un champ stock\u00e9 de mani\u00e8re permanente lors de l\u2019enregistrement de l\u2019enregistrement et de la recharger lors de l\u2019affichage ou de la modification de celui-ci.","ga_scenario":"Les utilisateurs de NetSuite ont souvent besoin d\u2019un filtrage dynamique des options des menus d\u00e9roulants en fonction des s\u00e9lections effectu\u00e9es dans d\u2019autres champs. Bien que NetSuite propose des fonctionnalit\u00e9s natives de recherche et de filtrage pour de nombreux sc\u00e9narios courants impliquant des menus d\u00e9roulants d\u00e9pendants, certaines exigences complexes peuvent n\u00e9cessiter une approche de script plus personnalis\u00e9e afin d\u2019obtenir le comportement dynamique souhait\u00e9.","ga_solution":"Bien que les fonctionnalit\u00e9s natives de \u00ab Sourcing & Filtering \u00bb de NetSuite sur les champs personnalis\u00e9s de liste\/enregistrement permettent, dans de nombreux cas d\u2019utilisation courants, d\u2019obtenir des menus d\u00e9roulants d\u00e9pendants sans recourir \u00e0 des scripts, il existe des sc\u00e9narios complexes o\u00f9 la configuration seule peut s\u2019av\u00e9rer insuffisante. La solution pour ces sc\u00e9narios complexes consiste \u00e0 utiliser des scripts c\u00f4t\u00e9 client afin de filtrer les valeurs disponibles dans une liste d\u00e9roulante. Il est important de noter que les scripts ne peuvent pas filtrer directement les options des champs NetSuite standard ou personnalis\u00e9s qui stockent des valeurs. En revanche, les scripts peuvent uniquement ajouter ou supprimer des options dans des champs d\u2019objets d\u2019interface utilisateur temporaires, qui sont en lecture seule et ne stockent pas de valeurs. Par cons\u00e9quent, outre le script qui filtre dynamiquement les options, des scripts compl\u00e9mentaires sont n\u00e9cessaires pour g\u00e9rer le flux de donn\u00e9es : copier la valeur s\u00e9lectionn\u00e9e depuis le champ d\u2019interface utilisateur temporaire vers un champ \u00ab r\u00e9el \u00bb permanent lors de la soumission de l\u2019enregistrement, et recharger la valeur du champ \u00ab r\u00e9el \u00bb dans le champ d\u2019interface utilisateur temporaire lorsque l\u2019enregistrement est consult\u00e9 ou modifi\u00e9. Cette approche n\u00e9cessite g\u00e9n\u00e9ralement une combinaison de scripts client, utilisant les fonctions de l\u2019API SuiteScript 1.0 comme le montrent les exemples ci-dessous. Il est important de noter que SuiteScript 2.x constitue actuellement la meilleure pratique en mati\u00e8re de d\u00e9veloppement NetSuite, offrant une approche modulaire et orient\u00e9e objet ; ses signatures de fonctions pour les points d\u2019entr\u00e9e des scripts (par exemple, beforeLoad, pageInit, fieldChanged, beforeSubmit) acceptent g\u00e9n\u00e9ralement un objet de contexte plut\u00f4t que des param\u00e8tres individuels. Les scripts n\u00e9cessaires peuvent \u00eatre r\u00e9sum\u00e9s comme suit :\n1. Un script beforeLoad pour ajouter le champ d\u2019interface utilisateur temporaire \u00e0 l\u2019\u00e9cran.\n2. Un script pageInit pour initialiser les options dans la liste d\u00e9roulante et copier la valeur du champ \u00ab r\u00e9el \u00bb dans le champ d\u2019interface utilisateur temporaire, le cas \u00e9ch\u00e9ant.\n3. Une logique c\u00f4t\u00e9 client (par exemple, dans fieldChanged) pour g\u00e9rer la modification dynamique des options dans le champ d\u2019interface utilisateur temporaire.\n4. Un script beforeSubmit pour copier la valeur du champ d\u2019interface utilisateur temporaire dans le champ \u00ab r\u00e9el \u00bb avant l\u2019enregistrement de l\u2019enregistrement.\n\nDes exemples de scripts sont fournis ci-dessous \u00e0 titre de r\u00e9f\u00e9rence.\n\nAjoutez le champ d\u00e9roulant \u00e0 la page :\n```\njavascript\nfunction beforeLoad(type, form, request) {\n\/\/maybe check the type. Typically, we only need to do this for \u2018edit\u2019\nform.addField('custpage_myfield','select','My dropdown');\n}\n```\n\nLors de l\u2019ex\u00e9cution de pageInit, v\u00e9rifiez si une valeur est stock\u00e9e dans le champ \u00ab r\u00e9el \u00bb et d\u00e9finissez le champ d\u2019interface utilisateur temporaire en cons\u00e9quence :\n```\njavascript\nfunction pageInit(type){\n    setDropdownValues(); \/\/here we populate the possible options of the dropdown\n    if(nlapiGetFieldValue('myrealfield')!'' &&\nnlapiGetFieldValue('myrealfield')!null){\n        nlapiSetFieldValue('custpage_myfield',\nnlapiGetFieldValue('myrealfield'));\n    }\n}\n```\n\nExemple de fonction qui d\u00e9finit les options possibles en fonction des r\u00e9sultats d\u2019une recherche :\n```\njavascript\nfunction setDropdownValues() {\n  var customer  nlapiGetFieldValue(\u2018entity\u2019);\n  var date  nlapiGetFieldValue(\u2018trandate\u2019);\n  var columns  [];\n  columns.push(new nlobjSearchColumn(\u2018name\u2019);\n  var filters  [];\n  filters.push(new nlobjSearchFilter(\u2018custrecord_entity\u2019,null,\u2019is\u2019,customer);\n  filters.push(new nlobjSearchFilter(\u2018custrecord_date\u2019,null,\u2019is\u2019,date);\n  var results  nlapiSearchRecord(\u2018custrecord_bobo\u2019,null,columns, filters);\n  if(results!null){\n    nlapiRemoveSelectOption(\u2018custpage_myfield\u2019);\n    for(var i0; i<results.length; i++){\n      nlapiInsertSelectOption(\u2018custpage_myfield\u2019,results[i].getId(),results[i].getValue(\u2018name\u2019),false);\n    }\n  }\n}\n```\n\nExemple de code permettant de modifier les options de la liste d\u00e9roulante en fonction des modifications apport\u00e9es \u00e0 d\u2019autres champs :\n```\njavascript\nfunction fieldChanged(machine, name){\n    if (name  'entity' || name  'trandate') {\n        setDropdownValues();\n    }\n}\n```\n\nFonction permettant de copier la valeur du champ temporaire de l\u2019interface utilisateur dans le champ \u00ab r\u00e9el \u00bb avant la soumission :\n```\njavascript\nfunction beforeSubmit(type){\n    if(type!'delete'){\n        nlapiSetFieldValue('myrealfield',\nnlapiGetFieldValue('custpage_myfield'));\n    }\n}\n```","ga_source_author":"","ga_source_author_email":"","ga_date_original":"2017-08-21T11:01:10-04:00","ga_date_verified":"2026-07-05","ga_source_subject":"Using Dynamic Dropdowns","ga_ans_id":"ANS-0778","ga_publish_decision":"publish_with_edits","ga_staleness_risk":"high","ga_review_priority":"spot_check","ga_tier2_verdict":"partially_outdated","ga_tier2_concerns":"The script uses SuiteScript 1.0 API functions (e.g., nlapiGetFieldValue, nlapiSetFieldValue, nlapiSearchRecord, nlobjSearchColumn, nlobjSearchFilter, nlapiRemoveSelectOption, nlapiInsertSelectOption, form.addField), which are considered legacy. SuiteScript 2.x (2.0\/2.1) is the current best practice for NetSuite development.; The claim that 'configuration will not work' for dynamic filtering of dropdowns in many scenarios is partially outdated. NetSuite's native 'Sourcing & Filtering' capabilities on custom List\/Record fields can achieve dependent dropdowns without scripting in many common use cases.; The function signatures for script entry points (e.g., beforeLoad, pageInit, fieldChanged, beforeSubmit) have changed in SuiteScript 2.x, now typically accepting a 'context' object rather than individual parameters.","ga_final_category":"SuiteScript Development","footnotes":""},"ga_category":[108,23,108],"ga_audience":[10],"ga_difficulty":[94],"class_list":["post-4437","qa_entry","type-qa_entry","status-publish","hentry","ga_category-developpement-suitescript","ga_category-suitescript-development","ga_audience-developer-suitescript","ga_difficulty-avance"],"taxonomy_info":{"ga_category":[{"value":108,"label":"D\u00e9veloppement SuiteScript"},{"value":23,"label":"SuiteScript Development"},{"value":108,"label":"D\u00e9veloppement SuiteScript"}],"ga_audience":[{"value":10,"label":"Developer\/SuiteScript"}],"ga_difficulty":[{"value":94,"label":"Avanc\u00e9"}]},"featured_image_src_large":[],"author_info":[],"comment_info":"","_links":{"self":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/4437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry"}],"about":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/types\/qa_entry"}],"version-history":[{"count":1,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/4437\/revisions"}],"predecessor-version":[{"id":6358,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/4437\/revisions\/6358"}],"wp:attachment":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=4437"}],"wp:term":[{"taxonomy":"ga_category","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_category?post=4437"},{"taxonomy":"ga_audience","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_audience?post=4437"},{"taxonomy":"ga_difficulty","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_difficulty?post=4437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}