Friday, July 27, 2012

CRM 4 how to retrieve custom attribute value in C#

DynamicEntity someEntity;
TargetRetrieveDynamic retrieveTarget = new TargetRetrieveDynamic();

retrieveTarget.EntityId = <id of entity>;
retrieveTarget.EntityName = EntityName.<entity name>.ToString();
RetrieveRequest retrieveRequest = new RetrieveRequest();
retrieveRequest.ColumnSet = new ColumnSet(new string[] { "your_custom_attribute" });
retrieveRequest.ReturnDynamicEntities = true;
retrieveRequest.Target = retrieveTarget;

RetrieveResponse retrieveResponse = (RetrieveResponse)service.Execute(retrieveRequest);
someEntity = retrieveResponse.BusinessEntity as DynamicEntity;

String result = (String)someEntity["your_custom_attribute"];
String value = result.Value.ToString();

CRM 4 Workflow error message details

In CRM 4 to get more info from workflow error than "An error has occurred" run this command against CRM database:


select Message from AsyncOperationBase
order by CreatedOn desc

Thursday, January 5, 2012

CRM 2011 Create a new Case (incident) using C#

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Discovery;
using System.Runtime.Serialization;
namespace CreateIncident
{
    class Program
    {
        static void Main (string[] args)
        {
            try
            {
ClientCredentials credentials = new ClientCredentials();
credentials.Windows.ClientCredential = new System.Net.NetworkCredential
("username", "passw", "domain");

Uri organizationUri = new Uri("http://crmservername:port/orgname/XRMServices/2011/Organization.svc");
 
Uri homeRealmUri = null;
OrganizationServiceProxy orgService = new OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null); 
IOrganizationService _service = (IOrganizationService)orgService;
                              
Entity incident = new Entity(); 
incident.LogicalName = "incident";
 
incident["title"] = "Case subject..";
 
// Set customerid with some existing contact guid 
Guid customerid = new Guid("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}");
 
// Set customerid as contact to field "customerid" 
EntityReference CustomerId = new EntityReference("contact", customerid); 
incident["customerid"] = CustomerId;
 
// Set contactid with some existing contact guid 
Guid contactid = new Guid("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}");
 
// Set contactid as contact to field "casecontactid" 
EntityReference primaryContactId = new EntityReference("contact", contactid); 
incident["casecontactid"] = primaryContactId;
                                                      
_service.Create(incident);

            }
            catch (Exception e)
            {
                Console.Write(e.ToString());
            }
        }
    }
}

Monday, January 2, 2012

CRM 2011 Custom Email with Pdf report attachment

After migration from CRM 4 to CRM 2011 my plugin written for custom email with PDF report won't work anymore so i rebuild my previous solution from CRM 4 with necessary changes for new CRM 2011:

using System;
using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Crm.Sdk.Messages;
using SendReport.ReportService;
using Microsoft.Crm.Sdk;
using Microsoft.Xrm.Sdk.Query;


namespace SendReport
{
    public class SendReport : CodeActivity
    {

        protected override void Execute(CodeActivityContext executionContext)
        {
            try
            {

                IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
                IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                Guid incidentId = context.PrimaryEntityId;

                byte[] result = null;

                ReportService.ReportExecutionService rs = new ReportExecutionService();
                rs.Credentials = new System.Net.NetworkCredential("username", "password", "domain");
                rs.Url = "http://crmserver/ReportServer/ReportExecution2005.asmx";

                string reportPath = "/Reports/reportname";
                string format = "PDF";
                string historyID = null;
                string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>";

                ParameterValue[] parameters = new ParameterValue[1];
                parameters[0] = new ParameterValue();
                parameters[0].Name = "incidentid";
                parameters[0].Value = incidentId.ToString();


                DataSourceCredentials[] credentials = null;
                string showHideToggle = null;
                string encoding;
                string mimeType;
                string extension;
                Warning[] warnings = null;
                ParameterValue[] reportHistoryParameters = null;
                string[] streamIDs = null;

                ExecutionInfo execInfo = new ExecutionInfo();
                ExecutionHeader execHeader = new ExecutionHeader();
                rs.ExecutionHeaderValue = execHeader;
                execInfo = rs.LoadReport(reportPath, historyID);
                rs.SetExecutionParameters(parameters, "en-us");
                String SessionId = rs.ExecutionHeaderValue.ExecutionID;

                try
                {
                result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out
                streamIDs);
                }

                catch (Exception err)
                {
                    throw new Exception(err.Message.ToString());
                }

                Entity email = new Entity();
                email.LogicalName = "email";

                EntityReference regardingObject = new EntityReference("incident", incidentId);
                email.Attributes.Add("regardingobjectid", regardingObject);

                Guid senderUserId = Sender.Get<EntityReference>(executionContext).Id;
                Guid recieverUserId = Recipient.Get<EntityReference>(executionContext).Id;
                Guid recieverCCUserId = RecipientCC.Get<EntityReference>(executionContext).Id;
               
                EntityReference from = new EntityReference("systemuser", senderUserId);
                EntityReference to = new EntityReference("contact", recieverUserId);
                EntityReference cc = new EntityReference("contact", recieverCCUserId);

                Entity fromParty = new Entity("activityparty");
                fromParty.Attributes.Add("partyid", from);

                Entity toParty = new Entity("activityparty");
                toParty.Attributes.Add("partyid", to);

                Entity ccParty = new Entity("activityparty");
                ccParty.Attributes.Add("partyid", cc);

                EntityCollection collFromParty = new EntityCollection();
                collFromParty.EntityName = "systemuser";
                collFromParty.Entities.Add(fromParty);

                EntityCollection collToParty = new EntityCollection();
                collToParty.EntityName = "systemuser";
                collToParty.Entities.Add(toParty);

                EntityCollection collccParty = new EntityCollection();
                collccParty.EntityName = "systemuser";
                collccParty.Entities.Add(ccParty);

                var entity = service.Retrieve("incident", incidentId, new ColumnSet(new[] { "ticketnumber", "customerid", "title"}));
                var ticket = entity.GetAttributeValue<string>("ticketnumber");
                var customer = entity.GetAttributeValue<EntityReference>("customerid");
                var customername = customer.Name;
                var title = entity.GetAttributeValue<string>("title");

                email.Attributes.Add("from", collFromParty);
                email.Attributes.Add("to", collToParty);
                email.Attributes.Add("cc", collccParty);

                email.Attributes.Add("subject", "Here goes subject message.. : " + ticket);

                email.Attributes.Add("description", "Here goes description text..");

                Guid emailID = service.Create(email);

                // Attaching Pdf report
                CrmNumber crmNextActorID = new CrmNumber();

                RetrieveEntityRequest request = new RetrieveEntityRequest();
                request.LogicalName = "email";

                RetrieveEntityResponse response = (RetrieveEntityResponse)service.Execute(request);
                int objecttypecode = response.EntityMetadata.ObjectTypeCode.Value;               

                Entity attachment = new Entity("activitymimeattachment");

                attachment.Attributes.Add("subject", "Report");
                attachment.Attributes.Add("filename", "Report.pdf");
                attachment.Attributes.Add("body", Convert.ToBase64String(result));
                attachment.Attributes.Add("filesize", new CrmNumber(Convert.ToInt32(result.Length.ToString())));
                attachment.Attributes.Add("mimetype", "text/plain");
                attachment.Attributes.Add("attachmentnumber", crmNextActorID.Value);

                attachment.Attributes.Add("objectid", new EntityReference("email", new Guid(email.Id.ToString())));
                attachment.Attributes.Add("objecttypecode", objecttypecode);

                service.Create(attachment);

                SendEmailRequest reqSendEmail = new SendEmailRequest();
                reqSendEmail.EmailId = emailID;
                reqSendEmail.TrackingToken = "";
                reqSendEmail.IssueSend = true;

                SendEmailResponse res = (SendEmailResponse)service.Execute(reqSendEmail);

            }


            catch (Exception err)
            {
                throw new Exception(err.ToString());
            }

        }

        [RequiredArgument]
        [Input("Sender input")]
        [ReferenceTarget("systemuser")]
        public InArgument<EntityReference> Sender { get; set; }

        [RequiredArgument]
        [Input("Recipient input")]
        [ReferenceTarget("contact")]
        public InArgument<EntityReference> Recipient { get; set; }

        [RequiredArgument]
        [Input("RecipientCC input")]
        [ReferenceTarget("contact")]
        public InArgument<EntityReference> RecipientCC { get; set; }

    }
}
 


 

Wednesday, October 19, 2011

CRM 4.0 migration to CRM 2011

Backup CRM 4.0 SQL Server database

1. Open SQL Studio Manager
2. Connect to CRM 4.0 database
3. Expand Databases
4. Right-click on xxxxxx_MSCRM database, Tasks -> Back Up
5. Back Up to Disk (dbname.bak)

Restore CRM 4.0 database in CRM 2011 SQL Server

1. Open SQL Studio Manager
2. Connect to CRM 2011 database
3. Right-click on Databases, Restore Database
4. To Database - type in new crm database name, From Disk - select backup you created (dbname.bak) from CRM 4.0 SQL Server

Import new database with CRM 2011 Deployment Manager

1. Run CRM 2011 Deployment Manager (Start->All Programs->Microsoft Dynamics CRM->Deployment Manager)
2. Organizations -> Import Organization
3. Select database you restored in CRM 2011 SQL Server
4. Type in Display name and Unique Database Name (of your choice)
5. Type in CRM 2011 Report Server URL
6. Select "Automatically Map Users" (if you are in the same domain)
7. If some user doesn't exist in new CRM 2011 you can create them in Active Directory and then map them or just ignore this and go further.
8. System checks all prerequisites for Import.
9. *.If there are no errors you can click Import (Import can take up to some hours, depending on your db size and customizations etc).

*. If you see warning "Fragmented indexes were detected in the Microsoft Dynamics CRM database", you can ignore this message and go further but i would suggest you to do following as it greatly can impact the overall import process time: This error message says that there are fragmented indexes. To rebuild these indexes you can use this link:

http://crrm.ru/articles/2011/05/index-optimization-before-in-place-upgrade-to-crm-2011 (In Russian)
 
1. Download all 3 files from this link above (IndexOptimize.sql, CommandExecute.sql, DatabaseSelect.sql)
2. Open them via SQL Studio Manager and execute them: At very begining of each script add these two lines to select your CRM 4.0 database for creating these stored procedures -
  
   USE <xxxxx_MSCRM>
   GO

3. And finally run this script to rebuild indexes:
   
   EXECUTE dbo.IndexOptimize @Databases = 'orgname_MSCRM',
    @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
    @FragmentationMedium = 'INDEX_REORGANIZE',
    @FragmentationLow = NULL

4. And then proceed with Import.