Del via


Eksempel: Oprette afhængige OptionSets (valglister)

 

Udgivet: november 2016

Gælder for: Dynamics CRM 2015

Det er et almindeligt krav, at værdierne i én grupperet indstilling skal filtreres efter en værdi, der er valgt i et andet felt med en grupperet indstilling. I dette emne beskrives en metode til at gøre dette med et genbrugeligt JScript-bibliotek, formularhændelser og en XML-webressource.

Hvis du vil overvåge og kontrollere funktionaliteten i dette eksempel, kan du installere den administrerede DependentOptionSetsSample_1_0_0_2_managed.zip-løsning fra følgende placering i SDK-overførslen: SDK\SampleCode\JS\FormScripts

Hent SDK-pakken til Microsoft Dynamics CRM.

Mål for denne løsning

Denne løsning skal opfylde følgende krav:

  • Den giver et generelt, genbrugeligt JScript-bibliotek, der kan bruges til ethvert par felter af grupperet indstilling.

  • Det giver mulighed for en kæde af felter med afhængige grupperede indstillinger. Da indstillingerne for hvert afhængige felt med grupperet indstilling filtreres på grundlag af værdien af et andet felt, kan ekstra felter for grupperet indstilling filtreres efter den indstilling, der er valgt i feltet første afhængige felt for grupperet indstilling. Dette giver mulighed for en række hierarkisk afhængige felter for grupperet indstilling.

  • Filtrering af afhængige indstillinger angives i en XML-webressource. Dette giver mulighed for at ændre tilknytningerne uden at ændre koden. Redigering af en XML-webressourcen er lettere for en ikke-udvikler, der skal konfigurere indstillinger uden at ødelægge koden.

  • Løsningen understøtter flere sprog. Filtreringen er baseret udelukkende på dataværdien af indstillingerne i stedet for tekst i indstillingerne.

  • Filtrering fungerer på et hvilket som helst antal forekomster af et attributkontrolelement i formularen.

Eksempel

I dette afsnit beskrives en anvendelse af denne metode og fremgangsmåden for anvendelse af eksempelbiblioteket.

Ticket (sample_ticket)-objektformularen indeholder tre felter med grupperede indstillinger, der giver mulighed for kategorisering af produkter. I følgende tabel vises den ønskede filtrering af de grupperede indstillinger.

Kategori

(sample_category)

Underkategori

(sample_subcategory)

Type

(sample_type)

Værdi:727000000 Etiket: Software

Værdi:727000000 Etiket: Personal Productivity

Værdi:727000000 Etiket: Word Processor

Værdi:727000001 Etiket: Spreadsheet

Værdi:727000002 Etiket: Internet Browser

Værdi:727000003 Etiket: E-mail

Værdi:727000001 Etiket: Business Applications

Værdi:727000004 Etiket: Customer Relationship Management

Værdi:727000005 Etiket: Enterprise Resource Management

Værdi:727000006 Etiket: Human Resource Management

Værdi:727000002 Etiket: Operativsystemer

Værdi:727000007 Etiket: Windows Vista

Værdi:727000008 Etiket: Windows 7

Værdi:727000009 Etiket: Windows Server 2003

Værdi:727000010 Etiket: Windows Server 2008

Værdi:727000001 Etiket: Hardware

Værdi:727000003 Etiket: Desktop Computer

Værdi:727000011 Etiket: Workstation x1000

Værdi:727000012 Etiket: Workstation x2000

Værdi:727000013 Etiket: Workstation x3000

Værdi:727000014 Etiket: Workstation x4000

Værdi:727000004 Etiket: Laptop Computer

Værdi:727000015 Etiket: Laptop 1000 series

Værdi:727000016 Etiket: Laptop 2000 series

Værdi:727000017 Etiket: Laptop 3000 series

Værdi:727000018 Etiket: Laptop 4000 series

Værdi:727000005 Etiket: Monitor

Værdi:727000019 Etiket: CRT-XYZ 17 inch

Værdi:727000020 Etiket: LCD-XYZ 17 inch

Værdi:727000021 Etiket: LCD-XYZ 21 inch

Værdi:727000022 Etiket: LCD-XYZ 24 inch

Værdi:727000006 Etiket: Printer

Værdi:727000023 Etiket:Series 1000 Printer - Private

Værdi:727000024 Etiket: Series 2000 Color Printer - Private

Værdi:727000025 Etiket: Series 9000 Printer - Shared

Værdi:727000026 Etiket: Series 9000 Color Printer - Shared

Værdi:727000007 Etiket: Telephone

Værdi:727000027 Etiket: PSTN Phone

Værdi:727000028 Etiket: IP Phone

Værdi:727000029 Etiket: Mobile Phone

Aktivere filtrering

  1. Konverter den ønskede filtrering af indstillinger i følgende XML-dokument, og overfør det som en XML-webressource med titlen sample_TicketDependentOptionSetConfig.xml. Etiketværdierne er medtaget for at gøre det lettere at redigere dokumentet, men bruges ikke i det script, der filtrerer indstillingerne.

    
    <DependentOptionSetConfig entity="sample_ticket" >
     <ParentField id="sample_category"
                  label="Category">
      <DependentField id="sample_subcategory"
                      label="Sub Category" />
      <Option value="727000000"
              label="Software">
       <ShowOption value="727000000"
                   label="Personal Productivity" />
       <ShowOption value="727000001"
                   label="Business Applications" />
       <ShowOption value="727000002"
                   label="Operating Systems" />
      </Option>
      <Option value="727000001"
              label="Hardware">
       <ShowOption value="727000003"
                   label="Desktop Computer" />
       <ShowOption value="727000004"
                   label="Laptop Computer" />
       <ShowOption value="727000005"
                   label="Monitor" />
       <ShowOption value="727000006"
                   label="Printer" />
       <ShowOption value="727000007"
                   label="Telephone" />
      </Option>
     </ParentField>
     <ParentField id="sample_subcategory"
                  label="Sub Category">
      <DependentField id="sample_type"
                      label="Type" />
      <Option value="727000000"
              label="Personal Productivity">
       <ShowOption value="727000000"
                   label="Word Processor" />
       <ShowOption value="727000001"
                   label="Spreadsheet" />
       <ShowOption value="727000002"
                   label="Internet Browser" />
       <ShowOption value="727000003"
                   label="E-mail" />
      </Option>
      <Option value="727000001"
              label="Business Applications">
       <ShowOption value="727000004"
                   label="Customer Relationship Management" />
       <ShowOption value="727000005"
                   label="Enterprise Resource Management" />
       <ShowOption value="727000006"
                   label="Human Resource Managment" />
      </Option>
      <Option value="727000002"
              label="Operating Systems">
       <ShowOption value="727000007"
                   label="Windows Vista" />
       <ShowOption value="727000008"
                   label="Windows 7" />
       <ShowOption value="727000009"
                   label="Windows Server 2003" />
       <ShowOption value="727000010"
                   label="Windows Server 2008" />
      </Option>
      <Option value="727000003"
              label="Desktop Computer">
       <ShowOption value="727000011"
                   label="Workstation x1000" />
       <ShowOption value="727000012"
                   label="Workstation x2000" />
       <ShowOption value="727000013"
                   label="Workstation x3000" />
       <ShowOption value="727000014"
                   label="Workstation x4000" />
      </Option>
      <Option value="727000004"
              label="Laptop Computer">
       <ShowOption value="727000015"
                   label="Laptop 1000 series" />
       <ShowOption value="727000016"
                   label="Laptop 2000 series" />
       <ShowOption value="727000017"
                   label="Laptop 3000 series" />
       <ShowOption value="727000018"
                   label="Laptop 4000 series" />
      </Option>
      <Option value="727000005"
              label="Monitor">
       <ShowOption value="727000019"
                   label="CRT-XYZ 17 inch" />
       <ShowOption value="727000020"
                   label="LCD-XYZ 17 inch" />
       <ShowOption value="727000021"
                   label="LCD-XYZ 21 inch" />
       <ShowOption value="727000022"
                   label="LCD-XYZ 24 inch" />
      </Option>
      <Option value="727000006"
              label="Printer">
       <ShowOption value="727000023"
                   label="Series 1000 Printer - Private" />
       <ShowOption value="727000024"
                   label="Series 2000 Color Printer - Private" />
       <ShowOption value="727000025"
                   label="Series 9000 Printer - Shared" />
       <ShowOption value="727000026"
                   label="Series 9000 Color Printer - Shared" />
      </Option>
      <Option value="727000007"
              label="Telephone">
       <ShowOption value="727000027"
                   label="PSTN Phone" />
       <ShowOption value="727000028"
                   label="IP Phone" />
       <ShowOption value="727000029"
                   label="Mobile Phone" />
      </Option>
     </ParentField>
    </DependentOptionSetConfig>
    
  2. Opret en JScript-webressource med navnet sample_SDK.DependentOptionSetSample.js ved hjælp af følgende kode.

    
    
    //If the SDK namespace object is not defined, create it.
    if (typeof (SDK) == "undefined")
    { SDK = {}; }
    // Create Namespace container for functions in this library;
    SDK.DependentOptionSet = {};
    SDK.DependentOptionSet.init = function (webResourceName) {
     //Retrieve the XML Web Resource specified by the parameter passed
     var clientURL = Xrm.Page.context.getClientUrl();
    
     var pathToWR = clientURL + "/WebResources/" + webResourceName;
     var xhr = new XMLHttpRequest();
     xhr.open("GET", pathToWR, true);
     xhr.setRequestHeader("Content-Type", "text/xml");
     xhr.onreadystatechange = function () { SDK.DependentOptionSet.completeInitialization(xhr); };
     xhr.send();
    };
    SDK.DependentOptionSet.completeInitialization = function (xhr) {
     if (xhr.readyState == 4 /* complete */) {
         if (xhr.status == 200) {
             xhr.onreadystatechange = null; //avoids memory leaks
       var JSConfig = [];
       var ParentFields = xhr.responseXML.documentElement.getElementsByTagName("ParentField");
       for (var i = 0; i < ParentFields.length; i++) {
        var ParentField = ParentFields[i];
        var mapping = {};
        mapping.parent = ParentField.getAttribute("id");
        mapping.dependent = SDK.Util.selectSingleNode(ParentField, "DependentField").getAttribute("id");
        mapping.options = [];
        var options = SDK.Util.selectNodes(ParentField, "Option");
        for (var a = 0; a < options.length; a++) {
         var option = {};
         option.value = options[a].getAttribute("value");
         option.showOptions = [];
         var optionsToShow = SDK.Util.selectNodes(options[a], "ShowOption");
         for (var b = 0; b < optionsToShow.length; b++) {
          var optionToShow = {};
          optionToShow.value = optionsToShow[b].getAttribute("value");
          optionToShow.text = optionsToShow[b].getAttribute("label");
          option.showOptions.push(optionToShow);
         }
         mapping.options.push(option);
        }
        JSConfig.push(mapping);
       }
       //Attach the configuration object to DependentOptionSet
       //so it will be available for the OnChange events 
       SDK.DependentOptionSet.config = JSConfig;
       //Fire the onchange event for the mapped optionset fields
       // so that the dependent fields are filtered for the current values.
       for (var depOptionSet in SDK.DependentOptionSet.config) {
        var parent = SDK.DependentOptionSet.config[depOptionSet].parent;
        Xrm.Page.data.entity.attributes.get(parent).fireOnChange();
       }
      }
     }
    };
     // This is the function set on the onchange event for 
     // parent fields
    SDK.DependentOptionSet.filterDependentField = function (parentField, childField) {
     for (var depOptionSet in SDK.DependentOptionSet.config) {
      var DependentOptionSet = SDK.DependentOptionSet.config[depOptionSet];
      /* Match the parameters to the correct dependent optionset mapping*/
      if ((DependentOptionSet.parent == parentField) &amp;&amp; (DependentOptionSet.dependent == childField)) {
       /* Get references to the related fields*/
       var ParentField = Xrm.Page.data.entity.attributes.get(parentField);
       var ChildField = Xrm.Page.data.entity.attributes.get(childField);
       /* Capture the current value of the child field*/
       var CurrentChildFieldValue = ChildField.getValue();
       /* If the parent field is null the Child field can be set to null */
       if (ParentField.getValue() == null) {
        ChildField.setValue(null);
        ChildField.setSubmitMode("always");
        ChildField.fireOnChange();
    
        // Any attribute may have any number of controls
        // So disable each instance
        var controls = ChildField.controls.get()
    
        for (var ctrl in controls) {
         controls[ctrl].setDisabled(true);
        }
        return;
       }
    
       for (var os in DependentOptionSet.options) {
        var Options = DependentOptionSet.options[os];
        var optionsToShow = Options.showOptions;
        /* Find the Options that corresponds to the value of the parent field. */
        if (ParentField.getValue() == Options.value) {
         var controls = ChildField.controls.get();
         /*Enable the field and set the options*/
         for (var ctrl in controls) {
          controls[ctrl].setDisabled(false);
          controls[ctrl].clearOptions();
    
          for (var option in optionsToShow) {
           controls[ctrl].addOption(optionsToShow[option]);
          }
    
         }
         /*Check whether the current value is valid*/
         var bCurrentValueIsValid = false;
         var ChildFieldOptions = optionsToShow;
    
         for (var validOptionIndex in ChildFieldOptions) {
          var OptionDataValue = ChildFieldOptions[validOptionIndex].value;
    
          if (CurrentChildFieldValue == OptionDataValue) {
           bCurrentValueIsValid = true;
           break;
          }
         }
         /*
         If the value is valid, set it.
         If not, set the child field to null
         */
         if (bCurrentValueIsValid) {
          ChildField.setValue(CurrentChildFieldValue);
         }
         else {
          ChildField.setValue(null);
         }
         ChildField.setSubmitMode("always");
         ChildField.fireOnChange();
         break;
        }
       }
      }
     }
    };
    
    SDK.Util = {};
    //Helper methods to merge differences between browsers for this sample
     SDK.Util.selectSingleNode = function (node, elementName) {
      if (typeof (node.selectSingleNode) != "undefined") {
       return node.selectSingleNode(elementName);
      }
      else {
       return node.getElementsByTagName(elementName)[0];
      }
     };
     SDK.Util.selectNodes = function (node, elementName) {
      if (typeof (node.selectNodes) != "undefined") {
       return node.selectNodes(elementName);
      }
      else {
       return node.getElementsByTagName(elementName);
      }
     };
    
  3. Tilføj sample_SDK.DependentOptionSetSample.js-scriptwebressourcen i de JScript-biblioteker, der er tilgængelige i formularen.

  4. I Onload-hændelsen til formularen skal du konfigurere hændelseshandleren til at kalde funktionen SDK.DependentOptionSet.init og overføre navnet på XML-webressourcen som en parameter. Brug feltet i dialogboksen Egenskaber for handler til at angive: "sample_TicketDependentOptionSetConfig.xml" i feltet Kommasepareret liste over parametre, der overføres til funktionen.

  5. I OnChange-hændelsen for feltet Kategori skal du indstille Funktion til SDK.DependentOptionSet.filterDependentField.

    Brug tekstfeltet Kommasepareret liste over parametre, der overføres til funktionen til at indtaste: "sample_category", "sample_subcategory".

  6. I OnChange-hændelsen for feltet Underkategori skal du indstille Funktion til SDK.DependentOptionSet.filterDependentField.

    Brug tekstfeltet Kommasepareret liste over parametre, der overføres til funktionen til at indtaste: "sample_subcategory ", "sample_type".

  7. Gem og publicer alle tilpasninger.

Se også

Bruge Xrm.Page-objektmodel
Skrive kode til Microsoft Dynamics CRM 2015-formularer
Bruge JavaScript med Microsoft Dynamics CRM 2015
Tilpasning af objektformularer
Attributten Xrm.Page.data.entity (klientsidereference)
Kontrolelementet Xrm.Page.ui (klientsidereference)

© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret