Donnerstag, 3. April 2008

Pickliste unter CRM 4.0 - Create (Teil 1)

Seit CRM 4.0 kann man mit Hilfe des MetadataService Picklisten bearbeiten. Eine Pickliste ist eine Liste von Options die in einer Entität verankert ist (es ist wichtig zu wissen, dass eine Picklist immer zu einer Entität gehört).
Am ehesten lässt sich eine Pickliste mit einer Auswahlliste vergleichen. Eine Option spiegelt den einzelenen Eintrag innerhalb einer Pickliste wieder, wobei die Option aus einer laufenden Nummer und einem Label besteht.
Das Label selbst ist der einzelene "Eintrag" den man später in der Pickliste auswählen kann + (!) einem Ländercode (Anmerkung: dieser Ländercode muss in unserem CRM aber auch bekannt sein!).
Das heißt: je nach eingestellter Sprache wird dann entsprechend die Pickliste später eine Auswahl bereitstellen.

Für uns interessante Ländercodes:
Deutsch = 1031
Englisch = 1033

Beschäftigt man sich mit dem SDK, findet man ein Beispiel "MultiLanguagePicklist.cs", das sollte einem schon einmal einen guten Einstieg geben in diese neue Thematik.

Man sollte sich nicht verwirren lassen, dass man ähnliche Funktionalitäten finden kann, sowohl unter dem MetadataService als auch dem CRMService und dem SDK.
Wir wollen eine Pickliste bearbeiten also -> MetadataService!

Das Create funktioniert an sich sehr einfach. Hat man erstmal die Metadaten für die Pickliste erzeugt, kann man das schön und einfach wegkapseln:

   1:  //the service instance
   2:  private CRMPicklist.MetadataService.MetadataService _serviceMeta;
   3:   
   4:  public Guid CreatePicklist(CRMPicklist.MetadataService.PicklistAttributeMetadata pam, CrmSdk.EntityName inEntity)
   5:  {
   6:      CRMPicklist.MetadataService.CreateAttributeRequest createRequest = new CRMPicklist.MetadataService.CreateAttributeRequest();
   7:      createRequest.EntityName = inEntity.ToString();
   8:      createRequest.Attribute = pam;
   9:   
  10:      try
  11:      {
  12:          CRMPicklist.MetadataService.CreateAttributeResponse createResponse;
  13:   
  14:          // execute the request
  15:          createResponse = (CRMPicklist.MetadataService.CreateAttributeResponse)_serviceMeta.Execute(createRequest);
  16:   
  17:          // return GUID
  18:          return createResponse.AttributeId.Value;
  19:      }
  20:      catch (System.Net.WebException wex)
  21:      {
  22:          // Exception-Handling
  23:      }
  24:      catch (System.Web.Services.Protocols.SoapException sex)
  25:      {
  26:          // Exception-Handling
  27:      }
  28:   
  29:      return Guid.Empty; // nothing created
  30:  }

Zum besseren Verständnis sind die Namespaces ausgeschrieben.
Eine Anmerkung zum Code noch: Es ist ganz guter Stil WebException und SoapExceptions an dieser Stelle abzufangen und weiter zu verarbeiten, anstatt immer generell alles mit Exception zu erschlagen auf unterster Ebene. Das Bedarf natürlich zu verstehen was man tut und was dies für Auswirkungen haben kann im worst case.

Nach dem Create benötigt man noch ein Publish, denn ohne Publish ist die Pickliste nicht für die Entität verfügbar, obwohl enthalten. Es ist, anders gesagt, ein "release die neue Version unserer Pickliste" wenn das verständlicher sein sollte.

   1:  // our crm service
   2:  private CRMPicklist.CrmService.CrmService _service;
   3:  static private IFormatProvider _provider = System.Globalization.CultureInfo.CurrentCulture;
   4:   
   5:  // publishing
   6:  static private string _pubHeader = "<importexportxml>";
   7:  static private string _pubEntity = "<entities><entity>{0}</entity></entities>";
   8:  static private string _pubFooter = "<nodes/></importexportxml>";
   9:   
  10:  public void PublishPicklist(CrmSdk.EntityName inEntity)
  11:  {
  12:      CRMPicklist.CrmService.PublishXmlRequest pubRequest = new CRMPicklist.CrmService.PublishXmlRequest();
  13:      string xml = _pubHeader + string.Format(_provider, _pubEntity, new object[]{inEntity.ToString()}) + _pubFooter;
  14:      pubRequest.ParameterXml = xml;
  15:   
  16:      try
  17:      {
  18:          CRMPicklist.CrmService.PublishXmlResponse pubResponse = (CRMPicklist.CrmService.PublishXmlResponse)_service.Execute(pubRequest);
  19:      }
  20:      catch (System.Net.WebException wex)
  21:      {
  22:          // Exception-Handling
  23:      }
  24:      catch (System.Web.Services.Protocols.SoapException sex)
  25:      {
  26:          // Exception-Handling
  27:      }
  28:  }


Anmerkung 1: Das erzeugen des XML für das Publishing kann man sicherlich schöner machen und dient hier nur der Demonstration.
Anmerkung 2: Wir wollen die neue Version der Entität "publishen", daher verwenden wir den CRM Service jetzt!

Damit sind wir auch schon fertig mit dem Anlegen unserer neuen Pickliste.

Keine Kommentare: