Microsoft Dynamics CRM 4.0 | Aktivitäten aus Grid-Ansicht erstellen

 

Immer häufiger begegne ich der Anforderung aus der Grid-Ansicht heraus Aktivitäten hinzufügen zu können, um die Produktivität z.B. im Call-Center-Betrieb zu steigern. Hierzu gibt es mehrere Möglichkeiten der Herangehensweise. Zwei möchte ich nachfolgend für Euch vorstellen:

1. Besteht die Möglichkeit der Programmierung eigener .aspx-Seiten, die den notwendigen Code enthalten, um Aktivitäten aus der Grid-Ansicht heraus erstellen zu können. Ein gutes Beispiel hierfür ist das Codeplex-Projekt “CRMGridAction” von iCRM. Die Integration ist geübten Administratoren sehr schnell möglich.

Kommentar: Colin Freeland hat dieses Projekt weiterentwickelt und ein neues Modul ICRM One Click Activity daraus entwickelt.

 

2. Im SDK steht beschrieben, wie man die aktuell selektierte GUID eines Datensatzes aus der Grid-Ansicht auslesen kann. Wenn man jetzt noch mit Hilfe der Internet Explorer Entwicklertools die URL und erforderliche Parameter ermittelt, mit deren Hilfe Aktivitäten erstellt werden, dann lässt sich sehr leicht ein ISV-Button generieren, der in die jeweilige Grid-Ansicht integriert eine Aktivität erzeugt.

Nachfolgend am Beispiel der Anfragen-Grid-Ansicht für die Aktivitätsformen Telefon und Aufgabe der erforderliche Code:

Zunächst der Quellcode der CreateRelatedPhone.htm -Seite, die im /ISV/ Verzeichnis auf dem CRM-Server abgelegt wird

<html>
   <head>
      <title>Telefonanruf erstellen</title>
      <script type="text/jscript">
         function listselecteditems()
         {
            var placeholder = document.getElementById("test");
            var sGUIDValues = "";
            var selectedValues;
            //Make sure window.dialogArguments is available.
            if (window.dialogArguments)
            {
               selectedValues = new Array(window.dialogArguments.length -1);
            }
            else
            {
               placeholder.innerText = "window.dialogArguments is not available.";
               return
            }
            selectedValues = window.dialogArguments;
            if (selectedValues != null)
            {
               for (i=0; i < selectedValues.length; i++)
               {
                  //sGUIDValues += selectedValues[i] +"\n";
      
      var oIdstr = selectedValues[i];
      oIdstr = oIdstr.replace(/[{,}]/g, ""); 

        var sEntity = 'incident'
     var fieldToDisplay = 'customerid';
     var fieldToDisplay2 = 'title';
     var fieldToDisplayIsText = true;

      var myValue = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,fieldToDisplayIsText).result;
      if(myValue != '') {
       sGUIDValues+= myValue
      }
      var myValue1 = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,false).result;
      if(myValue1 != '') {
       sGUIDValues+= myValue1
      }
      var myValue2 = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay2,fieldToDisplayIsText).result;
      if(myValue2 != '') {
       sGUIDValues+= myValue2
      } 
      var type = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,false).type;
      
      
      if (type == 'account') {
      var partytype = 1}
      else {
      var partytype = 2}
      
      window.close()
      var URL = '/<yourorgnamehere>/activities/phone/edit.aspx?pId='+selectedValues[i]+'&amp;pType=112&amp;pName='+myValue2+'&amp;partyid='+myValue+'&amp;partytype='+partytype+'&amp;partyname='+myValue1+'&amp;partyaddressused=&amp;contactInfo='
      //window.open(URL,'Name')
      URL = encodeURI(URL);
      f_open_window_max(URL,'Name')
      
               }
               placeholder.innerText = sGUIDValues;
            }
            else
            {
               placeholder.innerText = "No records were selected.";
            }

         }
   
function f_open_window_max( aURL, aWinName )
{
   var wOpen;
   var sOptions;

   sOptions = 'status=yes,menubar=yes,scrollbars=yes,resizable=yes,toolbar=yes';
   sOptions = sOptions + ',width=' + (screen.availWidth - 10).toString();
   sOptions = sOptions + ',height=' + (screen.availHeight - 122).toString();
   sOptions = sOptions + ',screenX=0,screenY=0,left=0,top=0';

   wOpen = window.open( '', aWinName, sOptions );
   wOpen.location = aURL;
   wOpen.focus();
   wOpen.moveTo( 0, 0 );
   wOpen.resizeTo( screen.availWidth, screen.availHeight );
   return wOpen;
}


function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, isTextField) { 

var xml = "" +
"<?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 YOURORGNAMEHERE for your Organization name here.
"<OrganizationName  xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">YOURORGNAMEHERE</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=\"RetrieveRequest\" ReturnDynamicEntities=\"false\">" +
"    <Target xsi:type=\"TargetRetrieveDynamic\">" +
"     <EntityName>" + sEntityName + "</EntityName>" +
"     <EntityId>" + sGUID + "</EntityId>" +
"    </Target>" +
"    <ColumnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\">" +
"     <q1:Attributes>" +
"      <q1:Attribute>" + sAttributeName + "</q1:Attribute>" +
"     </q1:Attributes>" +
"    </ColumnSet>" +
"   </Request>" +
"  </Execute>" +
" </soap:Body>" +
"</soap:Envelope>" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Execute");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml); 

var result = null;
var type = null
try{
if(isTextField) {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).text;
} else {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute('name');
 type = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute('type');
} 

if (result == null) {
 return '';
} else
 return {result:result, type:type};
}
catch(e){}
}   
   

      </script>
   </head>
   <body onload="listselecteditems()">
   <div id="test"></div>
   </body>
</html>

Und hier der Quellcode der Seite CreateRelatedTask.htm – ebenfalls gespeichert im /ISV/-Verzeichnis des CRM Servers

<html>
   <head>
      <title>Aufgabe erstellen</title>
      <script type="text/jscript">
         function listselecteditems()
         {
            var placeholder = document.getElementById("test");
            var sGUIDValues = "";
            var selectedValues;
            //Make sure window.dialogArguments is available.
            if (window.dialogArguments)
            {
               selectedValues = new Array(window.dialogArguments.length -1);
            }
            else
            {
               placeholder.innerText = "window.dialogArguments is not available.";
               return
            }
            selectedValues = window.dialogArguments;
            if (selectedValues != null)
            {
               for (i=0; i < selectedValues.length; i++)
               {
                  //sGUIDValues += selectedValues[i] +"\n";
      
      var oIdstr = selectedValues[i];
      oIdstr = oIdstr.replace(/[{,}]/g, ""); 

        var sEntity = 'incident'
     var fieldToDisplay = 'customerid';
     var fieldToDisplay2 = 'title';
     var fieldToDisplayIsText = true;

      var myValue = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,fieldToDisplayIsText);
      if(myValue != '') {
       sGUIDValues+= myValue
      }
      var myValue1 = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay,false);
      if(myValue1 != '') {
       sGUIDValues+= myValue1
      }
      var myValue2 = GetAttributeValueFromID(sEntity,oIdstr,fieldToDisplay2,fieldToDisplayIsText);
      if(myValue2 != '') {
       sGUIDValues+= myValue2
      } 
      
      
      window.close()
      var URL = '/YOURORGNAMEHERE/activities/task/edit.aspx?pId='+selectedValues[i]+'&amp;pType=112&amp;pName='+myValue2
      URL = encodeURI(URL);

      //window.open(URL,'Name')
      f_open_window_max(URL,'Name')
      
               }
               placeholder.innerText = sGUIDValues;
            }
            else
            {
               placeholder.innerText = "Keine Datensätze ausgewählt.";
            }
         }
   
function f_open_window_max( aURL, aWinName )
{
   var wOpen;
   var sOptions;

   sOptions = 'status=yes,menubar=yes,scrollbars=yes,resizable=yes,toolbar=yes';
   sOptions = sOptions + ',width=' + (screen.availWidth - 10).toString();
   sOptions = sOptions + ',height=' + (screen.availHeight - 122).toString();
   sOptions = sOptions + ',screenX=0,screenY=0,left=0,top=0';

   wOpen = window.open( '', aWinName, sOptions );
   wOpen.location = aURL;
   wOpen.focus();
   wOpen.moveTo( 0, 0 );
   wOpen.resizeTo( screen.availWidth, screen.availHeight );
   return wOpen;
}

function GetAttributeValueFromID(sEntityName, sGUID, sAttributeName, isTextField) { 

var xml = "" +
"<?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 YOURORGNAMEHERE for your Organization name here.
"<OrganizationName  xmlns=\"http://schemas.microsoft.com/crm/2007/CoreTypes\">YOURORGNAMEHERE</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=\"RetrieveRequest\" ReturnDynamicEntities=\"false\">" +
"    <Target xsi:type=\"TargetRetrieveDynamic\">" +
"     <EntityName>" + sEntityName + "</EntityName>" +
"     <EntityId>" + sGUID + "</EntityId>" +
"    </Target>" +
"    <ColumnSet xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:ColumnSet\">" +
"     <q1:Attributes>" +
"      <q1:Attribute>" + sAttributeName + "</q1:Attribute>" +
"     </q1:Attributes>" +
"    </ColumnSet>" +
"   </Request>" +
"  </Execute>" +
" </soap:Body>" +
"</soap:Envelope>" +
"";

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Execute");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml); 

var result = null;
try{
if(isTextField) {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).text;
} else {
 result = xmlHttpRequest.responseXML.selectSingleNode("//q1:" + sAttributeName).getAttribute('name');
} 

if (result == null) {
 return '';
} else
 return result;
}
catch(e){}
}   
   

      </script>
   </head>
   <body onload="listselecteditems()">
   <div id="test"></div>
   </body>
</html>

Und damit wir die beiden Aktivitäten aus der Grid-Ansicht heraus via Button erstellen können, hier noch die Integration im ISV-Config.xml:

<Entity name="incident">
          <Grid>
            <MenuBar>
              <ActionsMenu />
              <Buttons>
                <Button Client="Web, Outlook" Icon="/_imgs/ico_16_134.gif" Url="/ISV/CreateRelatedTask.htm" WinMode="2">
                  <ToolTips>
                    <ToolTip LCID="1031" Text="Eine Aufgabe in Bezug zur Anfrage erstellen" />
                  </ToolTips>
                </Button>
                <Button Client="Web, Outlook" Icon="/_imgs/ico_16_137.gif" Url="/ISV/CreateRelatedPhone.htm" WinMode="2">
                  <ToolTips>
                    <ToolTip LCID="1031" Text="Einen Telefonanruf in Bezug zur Anfrage erstellen" />
                  </ToolTips>
                </Button>
              </Buttons>
            </MenuBar>
          </Grid>

So und nun seid Ihr wieder gefordert. Nutzt die IE Entwicklertools, um Euch die anderen URLs und notwendigen Parameter zu ermitteln und generiert Euren eigenen Quellcode, um Euch auch die anderen Aktivitätsformen aus der Grid-Ansicht heraus erzeugen zu können. Die beiden .htm-Seiten findet Ihr auch als Download auf meinem SkyDrive-Laufwerk http://cid-97768ec3728c1ff3.skydrive.live.com/embedrow.aspx/Public/Samples

 

Viel Erfolg – Euer Feedback ist wie immer herzlich willkommen.

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