Microsoft CRM Customization & Programmierung – Closed Activity

 

von  Igor Kudryashov

 

Alba Spectrum Technologies

Deutschland (0177) 8349 806, Moskau (095) 918 3314, USA 1-866-528-0577

help@albaspectrum.com  

Microsoft CRM ist eine CRM – Lösung von Microsoft Business Solution und ein Versuch eine größere Marktanteil von Siebel, Oracle und anderen traditionellen CRM- Softwarehersteller zu gewinnen. Microsoft CRM basiert auf Microsoft Technologien und  nutzt seine Programme, wie .Net, Microsoft Exchange, Microsoft Outlook, Windows Active Directory, SQL Server, WebService, Replikaktionen, Indexes, Sicherheitssystems des Windows 2000/2003, XML,   

XLTP, und basiert auf folgenden Sprachen: JavaScript, C#, VB.Net, HTML.

 

 

Wie kann man geschlossene Activity bilden, lesen Sie hier.

 

Eine von Funktion des Exchange Event Handler erlaubt Close Activity - Bildung in MS CRM auf Basis der bearbeiteten Emails. Um das zu erreichen gibt es zwei Möglichkeiten: über MS CRM SDK (Bearbeitung von einganglichten und ausganglichten XML Datei ) oder über direkte Zugang zu MS CRM- Datenbank. Hier sprechen wir Closed Activity detailliert ab:

 

  1. Zuerst  sollen wir entscheiden für welche Grund wird Activity gebildet. Der Grund kann Account, Lead oder Contact sein. In unseren Beispiel Emailadresse:

 

   if ((crmAccount = crmConnector.GetAccount(mailboxFrom)) != null) {

}

   else if ((crmContact = crmConnector.GetContact(mailboxFrom)) != null) {

}

else if ((crmLead = crmConnector.GetLead(mailboxFrom)) != null) {

}

 

  1. Nachdem sollen wir GUID- Indikator für Systembenutzer kriegen:

 

   crmUser = crmConnector.GetUser(crmAccount.GetOwnerId());

 

  1. Nächster Schritt ist Closed Activity – Bildung:

 

emailId = crmConnector.CreateEmailActivity(

              crmUser.GetId(),

              Microsoft.Crm.Platform.Types.ObjectType.otAccount, crmAccount.GetId(),

              Microsoft.Crm.Platform.Types.ObjectType.otSystemUser, crmUser.GetId(),

              crmAccount.GetEmailAddress(), crmUser.GetEmailAddress(), sSubject, sBody);

 

  1. Closed Activity – Verfahren:

   public Guid CreateEmailActivity(Guid userId, int fromObjectType, Guid fromObjectId, int toObjectType, Guid toObjectId, string mailFrom, string mailTo, string subject, string body) {

          try    {

                 log.Debug("Prepare for Mail Activity Creating");

 

                 // BizUser proxy object

                 Microsoft.Crm.Platform.Proxy.BizUser bizUser = new Microsoft.Crm.Platform.Proxy.BizUser();

         

                 ICredentials credentials = new NetworkCredential(sysUserId, sysPassword, sysDomain);

 

                 bizUser.Url = crmDir + "BizUser.srf";

                 bizUser.Credentials = credentials;

                 Microsoft.Crm.Platform.Proxy.CUserAuth userAuth = bizUser.WhoAmI();

 

                 // CRMEmail proxy object

                 Microsoft.Crm.Platform.Proxy.CRMEmail email = new Microsoft.Crm.Platform.Proxy.CRMEmail();

                 email.Credentials = credentials;

                 email.Url = crmDir + "CRMEmail.srf";

 

                 // Set up the XML string for the activity

                 string strActivityXml = "<emailactivity>";

                 strActivityXml += "<messagesubject><![CDATA[" + subject + "]]></messagesubject>";

                 strActivityXml += "<messagebody><![CDATA[" + body.Replace("\n", "<br>") + "]]></messagebody>";

                 strActivityXml += "<ownerid type=\"" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() +"\">";

                 strActivityXml += userId.ToString("B") + "</ownerid>";

                 strActivityXml += "</emailactivity>";

 

                 // Set up the XML string for the activity parties

                 string strPartiesXml = "<activityparties>";

                 strPartiesXml += "<activityparty>";

                 strPartiesXml += "<addressused>" + mailTo + "</addressused>";

 

                 if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + "</partyobjecttypecode>";

                 }

                 else if (toObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + "</partyobjecttypecode>";

                 }

 

                 strPartiesXml += "<partyid>"+ toObjectId.ToString("B") + "</partyid>";

                 strPartiesXml += "<participationtypemask>";

                 strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_TO_RECIPIENT.ToString();

                 strPartiesXml += "</participationtypemask>";

                 strPartiesXml += "</activityparty>";

                 strPartiesXml += "<activityparty>";

                 strPartiesXml += "<addressused>" + mailFrom + "</addressused>";

 

                 if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otSystemUser) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otSystemUser.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otAccount) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otAccount.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otContact) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otContact.ToString() + "</partyobjecttypecode>";

                 }

                 else if (fromObjectType == Microsoft.Crm.Platform.Types.ObjectType.otLead) {

                        strPartiesXml += "<partyobjecttypecode>" + Microsoft.Crm.Platform.Types.ObjectType.otLead.ToString() + "</partyobjecttypecode>";

                 }

 

                 strPartiesXml += "<partyid>"+ fromObjectId.ToString("B") + "</partyid>";

                 strPartiesXml += "<participationtypemask>";

                 strPartiesXml += Microsoft.Crm.Platform.Types.ACTIVITY_PARTY_TYPE.ACTIVITY_PARTY_SENDER.ToString();

                 strPartiesXml += "</participationtypemask>";

                 strPartiesXml += "</activityparty>";

                 strPartiesXml += "</activityparties>";

 

                 log.Debug(strPartiesXml);

 

                 // Create the e-mail object

                 Guid emailId = new Guid(email.Create(userAuth, strActivityXml, strPartiesXml));

                 return emailId;

          }

          catch (System.Web.Services.Protocols.SoapException e)  {

                 log.Debug("ErrorMessage: " + e.Message + " " + e.Detail.OuterXml + " Source: " + e.Source);

          }

          catch (Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

 

          return new Guid();

   }

 

  1. Unbedingte Voraussetzung für korrekte Widerspiegelung in Activity ist Activity- Einstellung gemäß der MS CRM- Standarten:

   public void UpdateActivityCodes(Guid emailId) {

          try {

                 OleDbCommand command = conn.CreateCommand();

 

                 command.CommandText = "UPDATE ActivityBase SET DirectionCode = (?), StateCode = (?), PriorityCode = (?) WHERE ActivityId = (?)";

                 command.Prepare();

                 command.Parameters.Add(new OleDbParameter("DirectionCode", Microsoft.Crm.Platform.Types.EVENT_DIRECTION.ED_INCOMING));

                 command.Parameters.Add(new OleDbParameter("StateCode", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));

                 command.Parameters.Add(new OleDbParameter("PriorityCode", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));

                 command.Parameters.Add(new OleDbParameter("ActivityId", emailId));

 

                 log.Debug("Prepare to update activity code " + emailId.ToString("B") + " in ActivityBase");

 

                 command.ExecuteNonQuery();

          }

          catch(Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

   }

   public void UpdateActivityQueueCodes(Guid emailId, Guid queueId) {

          try {

                 OleDbCommand command = conn.CreateCommand();

 

                 command.CommandText = "UPDATE QueueItemBase SET Priority = (?), State = (?), QueueId = (?) WHERE ObjectId = (?)";

                 command.Prepare();

                 command.Parameters.Add(new OleDbParameter("Priority", Microsoft.Crm.Platform.Types.PRIORITY_CODE.PC_MEDIUM));

                 command.Parameters.Add(new OleDbParameter("State", Microsoft.Crm.Platform.Types.ACTIVITY_STATE.ACTS_CLOSED));

                 command.Parameters.Add(new OleDbParameter("QueueId", queueId));

                 command.Parameters.Add(new OleDbParameter("ObjectId", emailId));

 

                 log.Debug("Prepare to update activity queue code " + emailId.ToString("B") + " in QueueItemBase");

 

                 command.ExecuteNonQuery();

          }

          catch(Exception e) {

                 log.Debug(e.Message + "\r\n" + e.StackTrace);

          }

   }

 

Wir wünschen Ihnen viel Erfolg bei der Softwareimplementierung und Berichterstellung. Falls sich Ihrerseits Fragen bzw. Problemstellungen ergeben sollten, stehen wir Ihnen jederzeit unter der Rufnummer in Deutschland (0177) 8349 806, in Moskau (095) 918 3314, in USA 1-866-528-0577  oder unter help@albaspectrum.com zur Verfügung.

 

Igor Kudryashov ist ein zertifizierter Navision Spezialist von Ronix Systems ( http://www.ronix.ru ) eines Microsoft Business Solution Partners und die Europäische Abteilung von Alba Spectrum Technologies, USA ( http://www.albaspectrum.com ). Wir sind in Deutschland (in Köln, Bonn, Düsseldorf und Dortmund), in Russland, USA und Brasil tätig. Diese weltweit autorisierte Unternehmung spezialisierte sich auf Navision, Great Plains und den Microsoft CRM Kundenservice.