Adding custom menu and button to custom entity through ISV.CONFIG


To add custom menu and button to Entity form,

Go to Customizations-Export Customizations-Select ISV.CONFIG.

Open the customizations.xml file and add the following xml tags to it

<Entity name=new_customentity>

          <MenuBar>

            <CustomMenus>

              <Menu>

                <Titles>

                  <Title LCID=1033 Text=My Custom Menu>

                  </Title>

                </Titles>

                <MenuItem Url=http://www.microsoft.com PassParams=0 WinMode=1>

                  <Titles>

                    <Title LCID=1033 Text=Coming Soon ..>

                    </Title>

                  </Titles>

                </MenuItem>

              </Menu>

            </CustomMenus>

          </MenuBar>

          <ToolBar>

            <Button AvailableOffline=false ValidForCreate=1 ValidForUpdate=1 Url=http://www.google.co.in>

              <Titles>

                <Title LCID=1033 Text=My Custom Button… />

              </Titles>

              <ToolTips>

                <ToolTip

                 LCID=1033

                 Text=My custom button tooltip     />

              </ToolTips>

            </Button>

          </ToolBar>

        </Entity>

That’s it ..

Using Siebel CRM On Demand Web Services in Microsoft.NET


1) Create a new windows application.

2) Put the following code in the form load

private void Form1_Load(object sender, EventArgs e)

{

string loginUrlString = https://servername/Services/Integration?command=login&#8221;;

String sessionID = ManageSession.Login(loginUrlString, @”orgname-devusername”, “password”);

}

3) Define the login method within ManageSession class in the following manner


public static string SessionID = “”;

public static String Login(String loginUrlString, String userName, String password)

{

try

{

// create a http request and set the headers for authentication

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(loginUrlString);

HttpWebResponse myResponse;

myRequest.Method = “POST”;

// passing username and password in the http header

// username format if it includes slash should be the forward slash /

myRequest.Headers[“UserName”] = userName;

myRequest.Headers[“Password”] = password;

myResponse = (HttpWebResponse)myRequest.GetResponse();

Stream sr = myResponse.GetResponseStream();

// retrieve session id

char[] sep = { ‘;’ };

String[] headers = myResponse.Headers[“Set-Cookie”].Split(sep);

for (int i=0; i <= headers.Length-1; i++)

{

if (headers[i].StartsWith(“JSESSIONID”))

{

sep[0] = ‘=’;

SessionID = headers[i].Split(sep)[1];

break;

}

}

sr.Close();

myResponse.Close();

}

catch (WebException webException)

{

}

catch (Exception ex)

{

}

// send back the session id that should be passed to subsequent calls

// to webservices

return SessionID;

}

That’s it..

The remote server returned an error: (500) Internal Server Error while using Siebel CRM On Demand Web Services.


I got this error while trying to Logging In to the Web Services Session using .NET. Spent whole day for finding out what could be the reason behind the issue. Finally came to know the issue was because of the username being not passed correctly.

 

The username that we were passing was in this particular format that we would normally do

 

 ‘orgname-devusername’

 

Whereas it was expecting it in this format

 

‘orgname-dev/username’

 

i.e. forward slash instead of the back slash.

 

I hope it helps!

SetState for CustomEntity in CRM


For every new custom entity created in CRM corresponding SetStateCustomEntityNameRequest and SetStateCustomEntityNameResponse class gets created which we can use to set their status.

 

In the below example we have set the status inactive for our custom country entity records.

 

 

 SetStateNew_CountryRequest myCountryRequest = new SetStateNew_CountryRequest();

                // guid of the record to be deactivated

                myCountryRequest.EntityId = new Guid(“3AE10D22-60E4-DD11-9D85-00164145E126”);

                // statecode – 1 , statecodename- Inactive, statuscode – 2, statuscodename – Inactive

                // statecode – 0 , statecodename- Inactive, statuscode – 1, statuscodename – Inactive

                myCountryRequest.New_CountryState = New_CountryState.Inactive;

                myCountryRequest.New_CountryStatus = 2;

                SetStateNew_CountryResponse myCountryResponse = (SetStateNew_CountryResponse)crmService.Execute(myCountryRequest);

 

Bye ..

Programmatically updating the status of workflow logs using TargetUpdateWorkflowLog class in CRM 4.0


I was just trying out if changing the status for the workflow is possible programmatically. Well this is something I tried.

Created a function which would take primary key(guid) of the entity intance and would return all the workflow logs for that entity instance having status as “In Progress” and changing their status to “Failed”

 

The function to retrieve all the workflowlog id

 

private ArrayList   GetInProgressWorkflowLogIDForEntity(CrmService crmService, string EntityId)

        {

            QueryExpression myQuery = new QueryExpression();

            ColumnSet myCols = new ColumnSet();

            // to retireve workflowlogid

            myCols.Attributes = new String[] { “workflowlogid” };

            myQuery.ColumnSet = myCols;

            myQuery.EntityName = EntityName.workflowlog.ToString();

          

            ConditionExpression myCondtionExpression1 = new ConditionExpression();

            // entityinstance id against which workflowlog is running

            myCondtionExpression1.AttributeName = “regardingobjectid”;

            myCondtionExpression1.Operator = ConditionOperator.Equal;

            myCondtionExpression1.Values = new object[] {EntityId };

            // Status of workflowlog

            // Failed – 3

            // Succeeded – 2

            // In Progress – 1

            ConditionExpression myCondtionExpression2 = new ConditionExpression();

            myCondtionExpression2.AttributeName = “In Progress”;

            myCondtionExpression2.Operator = ConditionOperator.Equal;

            myCondtionExpression2.Values = new object[] { “1” };

 

            FilterExpression myFilterExpression = new FilterExpression();

            myFilterExpression.FilterOperator = LogicalOperator.And;

            myFilterExpression.Conditions = new ConditionExpression[] { myCondtionExpression1, myCondtionExpression2 };

 

            myQuery.Criteria = myFilterExpression;

 

            BusinessEntityCollection myBE=crmService.RetrieveMultiple(myQuery);

 

            ArrayList myWFLogList = new ArrayList();

            foreach (BusinessEntity myBusinessEntity in myBE.BusinessEntities)

            {

                workflowlog myWFLogId = (workflowlog)myBusinessEntity;

                myWFLogList.Add(myWFLogId.workflowlogid.Value.ToString());

 

            }

            return myWFLogList;    

        }

 

 

 

 

Using TargetUpdateWorkflowLog class

 

 

ArrayList myWorkflowLog=GetInProgressWorkflowLogIDForEntity(crmService, “55B93CBB-99E3-DD11-9D85-00164145E126”);

 

                foreach (String wfLogId in myWorkflowLog)

                {

                    TargetUpdateWorkflowLog myUpdateWorkflow = new TargetUpdateWorkflowLog();

                    myUpdateWorkflow.WorkflowLog = new workflowlog();

                    myUpdateWorkflow.WorkflowLog.workflowlogid = new Key();

                    // workflowlogid of workflow having status as In Progress

                    // to be changed to Failed – 3

                    myUpdateWorkflow.WorkflowLog.workflowlogid.Value = new Guid(wfLogId);

 

                    // Failed – 3

                    // Succeeded – 2

                    // In Progress – 1

                    myUpdateWorkflow.WorkflowLog.status = new Picklist();

                    myUpdateWorkflow.WorkflowLog.status.name = “Failed”;

                    myUpdateWorkflow.WorkflowLog.status.Value = 3;

 

                    UpdateRequest myRequest = new UpdateRequest();

                    myRequest.Target = myUpdateWorkflow;

 

                    UpdateResponse myRes = (UpdateResponse)crmService.Execute(myRequest);

                }

           

Understanding inputparameters and outputparameters of plugin context in CRM4.0


I was wondering what inputparameters and outparameters are passed by the platform to the IPluginExecutionContext’s context. Just created a simple plugin and registered it for (Pre/Post)Create,Update, Delete event of lead. And debugged it in visual studio to know the values for these parameters

InputParameters will have the parameters of the request message whi ch triggered the event i.e Represents the data that was passed along with the request to the platform. It will have two keys Target and OptionalParameters

Target property will be passed as a DynamicEntity and represents the image of the data passed.

OutputParameters is populated by the platform and only contains valid data during the After

Operation stage. This will contain the properties of the response message. The most common property returned is an “id” entry that will represent the Guid. In that example, it works exactly the same way the Request will produce a Response object with an id property. You would use this value to do subsequent processing that you need the entity Id value to be able to relate data.

OutputParameters will have the properties of the response message which is returned as part of pipeline execution. It will have one key OptionalParameters.

For PreCreate

Inputparameters – Two key – Target and OptionalParameters

Target – It had 35 properties basically one for all the attributes with its corresponding values

For optional parameters it had following value
CreateDuplicatesOptionalParameters with the value as false.

For PostCreate.

InputParameters – Target – same 35 properties for each attribute.

OutputParameters – Had one key – id with values of the newly created lead.

For PreUpdate

InputParameters – It had attributes whose values have been modified , leadid (primarykey of lead) as well those attributes that have forceSubmit true.

CreateDuplicatesOptionalParameters with the value as false.

Outputparameters – Nothing in output parameters

For PostUpdate

InputParameters – It had attributes whose values have changed, leadid (primarykey of lead), as well those attributes that have forceSubmit true.

CreateDuplicatesOptionalParameters with the value as false.

Outputparameters – Nothing in output parameters.

For PreDelete

Target was of type -Microsoft.Crm.Sdk.Moniker having Id of the record to be deleted and name as entity name – lead

For create,update message Target property was -Microsoft.Crm.Sdk.DynamicEntity.

Nothing in OptionalParameters

Outputparameters – Nothing in output parameters.

For PostDelete

Target was of type –Microsoft.Crm.Sdk.Moniker having Id of the record to be deleted and name as lead

Nothing in OptionalParameters

Outputparameters – Nothing in output parameters.

 

To know more about inputparameters and outputparameters

http://www.patrickverbeeten.com/pages/ContentItemPage.aspx?id=12&item=53&p=true

Bye..

Advertisements