Microsoft Dynamics CRM 4.0 | Daten einer Entität manuell als XML Datei exportieren (1/4)

 

In meiner neuen Serie von 4 Beiträgen möchte ich Euch mit den Export-Möglichkeiten via WebService-Calls und XMLWriter-Klasse/Objekte vertraut machen. Als Ausgangsbasis dient uns im Beispiel eine Entität, in der wir all unsere Informationen sammeln, die wir in eine XML-Datei überführen möchten. Diesen Vorgang wollen wir durch eine Selektion verschiedener Datensätze im Grid durchführen. Unsere Routine startet sich also über einen ISV-Button, der in der Grid-Ansicht hinzugefügt ist und eine im ISV-Ordner befindliche .htm-Seite aufruft.

Wie diese Button-Integration vorzunehmen ist, werde ich an dieser Stelle nicht näher erleutern, da schon in zahlreichen Beispielen die Vorgehensweise zu finden ist.

Im 1. Teil möchte ich Euch mit den Funktionen vertraut machen, die uns in diesem Projekt weiterhelfen:

Als 1. Funktion stelle ich Euch “IsRoleAllowed(allowedRoles)” vor, mit deren Hilfe wir den in der Grid-Ansicht geschaffenen ISV-Button über die im CRM integrierten Sicherheitsrollen “absichern”. Wir erlauben also nur Benutzern, denen eine oder mehrere benannte Sicherheitsrollen zugewiesen sind, die folgenden Routinen (Hole Dateninformationen und exportiere diese in eine XML-Datei) zu aktivieren.

Die Funktion selbst, habt Ihr vielleicht schon einmal gesehen, denn Sie findet sich auf diversen Blog-Seiten und im SDK. Initiiert wird Sie durch


   // Define the role names you wish to allow
   var allowedRoles = [ "Vertriebsmitarbeiter", "Systemadministrator" ];
    
   // Check to see if the user's role matches one of the defined allowed roles
   var roleAllowed = IsRoleAllowed(allowedRoles);

   // If the role is not allowed, then hide the tab(s)
   if (! roleAllowed)
   {
    placeholder.innerText = "\n"+"  Sie sind nicht berechtigt."+"\n"+"  Bitte wenden Sie sich an die Systemadministration."
    return
   }
  
            // Hier folgt die weitere Programm-Logik

 

Die Funktion “IsRoleAllowed(allowedRoles)” hat noch eine Sub-Funktion “RetrieveUserRoles()” die über einen WebService Call die Benutzer-Rechte-Rollen ausliest und diese wiederum eine Sub-Funktion “GetUserId()”, die uns zunächst die GUID des aktuellen Users zurückliefert.

function IsRoleAllowed(allowedRoles)
{
  // Find the user security roles
  var res = RetrieveUserRoles();
  var foundResult = false;
 
  // Loop through the allowed role list checking if the user belongs to one of the roles.
  for (i=0;i<=allowedRoles.length;i++)
  {
    if (res.indexOf(allowedRoles[i]) > -1 )
    {
      foundResult = true;
      break;
    }
  }
 
  return foundResult;
}

// Method to return the user's security roles
function RetrieveUserRoles()
{
  // Define URL to CRM API service
  var serverUrl = "/mscrmservices/2007/crmservice.asmx";

  // Set up XMLHTTP request
  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  xmlhttp.open("POST", serverUrl, false);
  xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8")

  // Specify correct SOAP action in the header
  xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple")

// Define the retrievemultiple message
  var message =
  [
    "<?xml version='1.0' encoding='utf-8'?>",
    "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">",
    "<soap:Header>",
    "<CrmAuthenticationToken  xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">",
 "<AuthenticationType xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">0</AuthenticationType>",
 // Change MicrosoftCRM for your Organization name here.
 "<OrganizationName  xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">MicrosoftCRM</OrganizationName>",
 "<CallerId xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">00000000-0000-0000-0000-000000000000</CallerId>",
 "</CrmAuthenticationToken>",
 "</soap:Header>",
    "<soap:Body>",
    "<RetrieveMultiple xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>",
    "<query xmlns:q1='http://schemas.microsoft.com/crm/2006/Query' xsi:type='q1:QueryExpression'>",
    "<q1:EntityName>role</q1:EntityName>",
    "<q1:ColumnSet xsi:type='q1:ColumnSet'><q1:Attributes><q1:Attribute>name</q1:Attribute></q1:Attributes></q1:ColumnSet>",
    "<q1:Distinct>false</q1:Distinct>",
    "<q1:LinkEntities>",
    "<q1:LinkEntity>",
    "<q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>",
    "<q1:LinkFromEntityName>role</q1:LinkFromEntityName>",
    "<q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>",
    "<q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>",
    "<q1:JoinOperator>Inner</q1:JoinOperator>",
    "<q1:LinkEntities>",
    "<q1:LinkEntity>",
    "<q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>",
    "<q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>",
    "<q1:LinkToEntityName>systemuser</q1:LinkToEntityName>",
    "<q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>",
    "<q1:JoinOperator>Inner</q1:JoinOperator>",
    "<q1:LinkCriteria>",
    "<q1:FilterOperator>And</q1:FilterOperator>",
    "<q1:Conditions>",
    "<q1:Condition>",
    "<q1:AttributeName>systemuserid</q1:AttributeName>",
    "<q1:Operator>Equal</q1:Operator>",
    "<q1:Values>",
    "<q1:Value xmlns:q2='http://microsoft.com/wsdl/types/' xsi:type='q2:guid'>",
    GetUserId(),
    "</q1:Value>",
    "</q1:Values>",
    "</q1:Condition>",
    "</q1:Conditions>",
    "</q1:LinkCriteria>",
    "</q1:LinkEntity>",
    "</q1:LinkEntities>",
    "</q1:LinkEntity>",
    "</q1:LinkEntities>",
    "</query>",
    "</RetrieveMultiple>",
    "</soap:Body>",
    "</soap:Envelope>"
  ].join("");

// Submit to the CRM API web service and receive a response
  xmlhttp.send(message);
  return xmlhttp.responseXML.text;
}

// Method to return the current user's systemuserid
function GetUserId()
{
  // Define URL to CRM API service
  var serverUrl = "/mscrmservices/2007/crmservice.asmx";

  // Set up XMLHTTP request
  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  xmlhttp.open("POST", serverUrl, false);
  xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8")

  // Specify correct SOAP action in the header
  xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Execute")

// Define the execute message
  var message =
  [
    "<?xml version='1.0' encoding='utf-8'?>",
    "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">",
    "<soap:Header>",
    "<CrmAuthenticationToken  xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">",
 "<AuthenticationType xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">0</AuthenticationType>",
 // Change MicrosoftCRM for your Organization name here.
 "<OrganizationName  xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">MicrosoftCRM</OrganizationName>",
 "<CallerId xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">00000000-0000-0000-0000-000000000000</CallerId>",
 "</CrmAuthenticationToken>",
 "</soap:Header>",
    "<soap:Body>",
    "<Execute xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>",
    "<Request xsi:type='WhoAmIRequest' />",
    "</Execute>",
    "</soap:Body>",
    "</soap:Envelope>"
  ].join("");

// Submit to the CRM API web service and receive a response
  xmlhttp.send(message);
  var result = xmlhttp.responseXML.xml;

// Create a new DOM document and load the response XML
  var doc = new ActiveXObject("MSXML2.DOMDocument");
  doc.async = false;
  doc.loadXML(result);

  // Return the userid node

  var returnNode = doc.selectSingleNode("//UserId");
  if( returnNode != null )
  {
    // If the userid node exists, return its value
    return returnNode.text;
  }
  else
  {
    return null;
  }
}

 

Mit dieser Logik lassen sich all Eure ISV-Buttons über die Kopplung an Sicherheitsrollen absichern. Daher verwende ich diese Routine eigentlich sehr häufig, um auszuschließen, dass der ISV-Button bzw. die dahinterliegende Funktion nur von berechtigten Personen ausgeführt wird. Zugegeben die “Alert-Meldung” ist natürlich auch noch ausführlicher darstellbar und soll hier nur ein Beispiel geben.

In meinem nächsten Teil, mache ich Euch mit den weiteren Funktionen, wie “listselecteditems()” und “GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,fieldToDisplayIsText)” vertraut, bevor wir dann zur Ausgabe in eine XML-Datei und der Vorstellung eines “XMLWriter-Objektes” kommen.

 

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s