It’s always a good thing to make the user experience as nice as possible. One thing missing from CRM is the ability to mask fields. You’ve probably seen this online on sites that ask for your phone number or social security number where the text box already contains the hyphens in the necessary spots. This clues the user in as to what format you’re expecting from them and leads to cleaner data.
Recently I had a client that needed all their zip codes to be entered along with the carrier code, which is the 4 number suffix at the end of a zip code. I figured this would be a great opportunity to implement some field masking.
Using a JQuery masking plugin written by Josh Bush. I was able to add a single line function to define my masking. To do the same, download and upload it to your CRM system as a web resource.
Next, jump onto the form that you want to add a field mask to and add the JQuery and JQuery Mask library.
sc_jquery1.6.2.min
sc_Jquery_mask
sc_global
A list of the necessary libraries
You’ll also notice that I have my own Global javascript file in the list. This file contains a reference to a Mask function that will call the JQuery Mask plugin. You can choose to register each field mask function call individually or you can place them all on a single function. I’ve shown both examples below.
function Mask(field, format)
{
$("#"+field).mask(format);
}
function maskFields()
{
Mask("address1_postalcode", "99999-9999");
Mask("telephone1", "(999) 999-9999");
Mask("telephone2", "(999) 999-9999");
Mask("fax", "(999) 999-9999");
}
The next step is to define an OnLoad function call. We’ll be calling the Mask function above and passing it in the schema name of the field and the mask value we want applied.
Finally, the function call
You’ll also need to register one more function call on the OnSave. The reason for this is that the JQuery plugin doesn’t save the value to the CRM form. We need to take care of this. We do this by comparing the value in the html to the value on the field. If they’re different, then this means the user changed the field. Insert the following into your global and register it in the OnSave.
function formatFields(){
formatField("address1_postalcode");
formatField("fax");
formatField("telephone1");
formatField("telephone2");
}
function formatField(fieldName){
if(Xrm.Page.getAttribute(fieldName).getValue() != $("#"+fieldName).val())
Xrm.Page.getAttribute(fieldName).setValue($("#"+fieldName).val());
}
And that’s all there is to it. Here are the results.
The JQuery plugin allows us to define all sorts of field masks and you can add dynamic logic to change the mask based on the country. Happy CRMing!
UPDATE:
To get optional formatting, take a look at examples on the jquery plugin page: http://digitalbush.com/projects/masked-input-plugin/
Refer http://taoofcrm.com/2011/05/19/crm-field-masking-with-jquery/
This blog aims to provide some technical tips about Microsoft Dynamics CRM 4.0 to D365, SQL Server and .Net.
Thursday, April 25, 2013
Friday, April 19, 2013
Microsoft CRM Services
What is a web
service in Microsoft CRM?
A web service is a programming interface exposed by an application. It follows industry standards that allow it to be consumed ( used ) by any software technology that understands the web service standards defined by W3C.
A web service is a programming interface exposed by an application. It follows industry standards that allow it to be consumed ( used ) by any software technology that understands the web service standards defined by W3C.
CRM Live exposes
two web services: CrmService & CrmMetadataService
CrmService is used to fetch data, set data, make programmatic configuration
changes, etc.
CrmMetadataService is used to query about the metadata. The metadata describes the entities, attributes, relationships, and so on, of the organization.
CrmMetadataService is used to query about the metadata. The metadata describes the entities, attributes, relationships, and so on, of the organization.
The WSDL, which
stands for web service description language, can be fetched from your CRM
system via the Settings-Download WSDL. You use this to create your web
reference’s.
The endpoint URL
for each of these in an internet facing deployment of CRM can be discovered
thru the CrmDiscoveryService Web Service. You’ll also use the
CrmDiscoveryService for policy
information during the authentication process.
The reference for the discovery
service is at
https://MyOrgName/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx
https://MyOrgName/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx
Then in your
code set the URL for the CrmService and CrmMetadataService using the endpoint
returned from the discovery services. The URLs can be retrieved from your
ticket response object.
Example :
// STEP 1: Retrieve a policy from the Discovery Web service.
CrmDiscoveryService discoveryService = new CrmDiscoveryService();
discoveryService.Url = String.Format("https://{0}/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx",_hostname);
CrmDiscoveryService discoveryService = new CrmDiscoveryService();
discoveryService.Url = String.Format("https://{0}/MSCRMServices/2007/Passport/CrmDiscoveryService.asmx",_hostname);
RetrievePolicyRequest policyRequest = new
RetrievePolicyRequest();
RetrievePolicyResponse policyResponse = (RetrievePolicyResponse)discoveryService.Execute(policyRequest);
RetrievePolicyResponse policyResponse = (RetrievePolicyResponse)discoveryService.Execute(policyRequest);
// STEP 2: Retrieve a Passport ticket from the Passport service.
LogonManager lm = new LogonManager();
string passportTicket = lm.Logon(UserID, Password, _partner, policyResponse.Policy, _environment);
LogonManager lm = new LogonManager();
string passportTicket = lm.Logon(UserID, Password, _partner, policyResponse.Policy, _environment);
// STEP 3: Retrieve a CrmTicket from the Discovery Web service.
RetrieveCrmTicketRequest crmTicketRequest = new RetrieveCrmTicketRequest();
crmTicketRequest.OrganizationName = _organization;
crmTicketRequest.PassportTicket = passportTicket;
RetrieveCrmTicketResponse crmTicketResponse = (RetrieveCrmTicketResponse)discoveryService.Execute(crmTicketRequest);
RetrieveCrmTicketRequest crmTicketRequest = new RetrieveCrmTicketRequest();
crmTicketRequest.OrganizationName = _organization;
crmTicketRequest.PassportTicket = passportTicket;
RetrieveCrmTicketResponse crmTicketResponse = (RetrieveCrmTicketResponse)discoveryService.Execute(crmTicketRequest);
// STEP 4: Create and configure an instance of the CrmService Web
service.
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = AuthenticationType.Passport;
token.CrmTicket = crmTicketResponse.CrmTicket;
token.OrganizationName = crmTicketResponse.OrganizationDetail.OrganizationName;
CrmService crmService = new CrmService();
crmService.Url = crmService.CrmAuthenticationTokenValue = token;
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = AuthenticationType.Passport;
token.CrmTicket = crmTicketResponse.CrmTicket;
token.OrganizationName = crmTicketResponse.OrganizationDetail.OrganizationName;
CrmService crmService = new CrmService();
crmService.Url = crmService.CrmAuthenticationTokenValue = token;
// STEP 5:
Invoke the desired CrmService Web service methods.
lead newlead = new lead();
newlead.description = "Lead Test";
newlead.subject = "My Lead";
newlead.firstname ="Sai";
newlead.lastname = "Krishna";
lead newlead = new lead();
newlead.description = "Lead Test";
newlead.subject = "My Lead";
newlead.firstname ="Sai";
newlead.lastname = "Krishna";
// Call the
Create method to create an lead
Guid leadID = crmService.Create(newlead);
Guid leadID = crmService.Create(newlead);
When using the CRM Web Services, there are times when you
need to work with custom entities that aren't described in the current WSDL
that you have. The DynamicEntity lets you program against types that you don't
have the full description in the WSDL. This can be very helpful when you don't
have access to fetch the systems current WSDL files.
Let's look at a code snippet to do this.
Here at the steps .
1. Create all the attribute values
2. Create Dynamic Entity
3. Set the attribute properties
4. Create the Target
5. Execute the Request
Let's look at a code snippet to do this.
Here at the steps .
1. Create all the attribute values
2. Create Dynamic Entity
3. Set the attribute properties
4. Create the Target
5. Execute the Request
I'll show how to create a Customer entity and associate an
existing account id to the new entity. The CRM SDK support a variety of
property type objects. Be sure to use the correct object type with the
definition of the attribute. Mismatching this is a common error. I'll save you
some time with this tip: Use LookUpProperty instead of Guid type when relating
entities together. Even though the value you set will be a GUID, it only works
with the LookupProperty object.
// Create Properties
LookupProperty accountid = new LookupProperty();
accountid.Name = "new_accountid";
accountid.Value = new Lookup();
accountid.Value.Value = new Guid("260FB27F-25E6-DC11-BEDA-0013210AC0BE");
accountid.Value.type = EntityName.account.ToString();
StringProperty name = new StringProperty();
name.Name = "new_CustomerName";
name.Value = "Krishna";
LookupProperty accountid = new LookupProperty();
accountid.Name = "new_accountid";
accountid.Value = new Lookup();
accountid.Value.Value = new Guid("260FB27F-25E6-DC11-BEDA-0013210AC0BE");
accountid.Value.type = EntityName.account.ToString();
StringProperty name = new StringProperty();
name.Name = "new_CustomerName";
name.Value = "Krishna";
DateTime userTime = new DateTime();
userTime = dtExpDate;
CrmService.CrmDateTime LaunchDate = new CrmService.CrmDateTime();
LaunchDate.Value = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:s}", userTime);
CrmDateTimeProperty LaunchDate = new CrmDateTimeProperty();
LaunchDate.Name = "new_LaunchDate";
LaunchDate.Value = LaunchDate;
// Create the DynamicEntity object.
DynamicEntity AcmeEntity = new DynamicEntity();
// Set the name of the entity type.
AcmeEntity.Name = "new_Customer";
// Set the properties
KeyEntity.Properties = new Property[] { name, accountid, LaunchDate };
// Create the target.
TargetCreateDynamic targetCreate = new TargetCreateDynamic();
targetCreate.Entity = KeyEntity;
// Create the request object.
CreateRequest create = new CreateRequest();
// Set the properties of the request object.
create.Target = targetCreate;
// Execute the request.
CreateResponse created = (CreateResponse)crmService.Execute(create);
That's it. Now we have an instance of the entity type new_Customer that is related to the account id. Don't forget to check out the SDK for complete samples and descriptions of all the property objects. Also, if you get errors, the first to check is that the attribute type matches the property object that you are using.
userTime = dtExpDate;
CrmService.CrmDateTime LaunchDate = new CrmService.CrmDateTime();
LaunchDate.Value = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:s}", userTime);
CrmDateTimeProperty LaunchDate = new CrmDateTimeProperty();
LaunchDate.Name = "new_LaunchDate";
LaunchDate.Value = LaunchDate;
// Create the DynamicEntity object.
DynamicEntity AcmeEntity = new DynamicEntity();
// Set the name of the entity type.
AcmeEntity.Name = "new_Customer";
// Set the properties
KeyEntity.Properties = new Property[] { name, accountid, LaunchDate };
// Create the target.
TargetCreateDynamic targetCreate = new TargetCreateDynamic();
targetCreate.Entity = KeyEntity;
// Create the request object.
CreateRequest create = new CreateRequest();
// Set the properties of the request object.
create.Target = targetCreate;
// Execute the request.
CreateResponse created = (CreateResponse)crmService.Execute(create);
That's it. Now we have an instance of the entity type new_Customer that is related to the account id. Don't forget to check out the SDK for complete samples and descriptions of all the property objects. Also, if you get errors, the first to check is that the attribute type matches the property object that you are using.
Wednesday, April 17, 2013
Automatic flow for Visits in CRM
Since workflow normally waits for a future date so let me give you a simple solution for this.
- Create a custom field at contact named next Visit
- Create two workflows:
#1 Update Next Visit (This workflow sets the next Visit first time and will not execute thereafter)
Fire this workflow on create of contact/account or on change of Visit field.
If Visit contains data Then
Update Contact Next Visit Field by adding 3 Months in Visit field
2) Birthday Reminder (This workflow sends reminder emails and updates Next Visit Field after each execution by adding 3 months)
If Next Visit contains data Then
Wait untill 5 days Before Visit
Send Email reminder to user - Receptionist
Update Next Visit= After 3 months of Current Visit
- Create a custom field at contact named next Visit
- Create two workflows:
#1 Update Next Visit (This workflow sets the next Visit first time and will not execute thereafter)
Fire this workflow on create of contact/account or on change of Visit field.
If Visit contains data Then
Update Contact Next Visit Field by adding 3 Months in Visit field
2) Birthday Reminder (This workflow sends reminder emails and updates Next Visit Field after each execution by adding 3 months)
If Next Visit contains data Then
Wait untill 5 days Before Visit
Send Email reminder to user - Receptionist
Update Next Visit= After 3 months of Current Visit
Calling external JS files from MS CRM 4.0 form
function LoadFunction() { }
//create a Script loader object + function to be called when the script has
//finished loading
window.ScriptLibrary = new ScriptLoader(LoadFunction);
//url , false - cache, true - no cache
ScriptLibrary.Load('//FileName.js', true);
Another Example:
//create the function which will load the file
function LoadExternalScript(scriptFile)
{
var netRequest = new ActiveXObject("Msxml2.XMLHTTP");
netRequest.open("GET", scriptFile, false);
netRequest.send(null);
eval(netRequest.responseText);
}
//call the above function by passing your file name(absolute path)
LoadExternalScript("/ISV/js/filename.js");
//now call the OnLoad function, which has defined in the external JS file
//also you can define and call other function, in the external JS files
OnLoad();
//create a Script loader object + function to be called when the script has
//finished loading
window.ScriptLibrary = new ScriptLoader(LoadFunction);
//url , false - cache, true - no cache
ScriptLibrary.Load('//FileName.js', true);
Another Example:
//create the function which will load the file
function LoadExternalScript(scriptFile)
{
var netRequest = new ActiveXObject("Msxml2.XMLHTTP");
netRequest.open("GET", scriptFile, false);
netRequest.send(null);
eval(netRequest.responseText);
}
//call the above function by passing your file name(absolute path)
LoadExternalScript("/ISV/js/filename.js");
//now call the OnLoad function, which has defined in the external JS file
//also you can define and call other function, in the external JS files
OnLoad();
Wednesday, March 6, 2013
Wednesday, February 27, 2013
Change the sa password in SQL Server
Login into SQL Server using Windows Authentication.
In Object Explorer, open Security folder, open Logins folder. Right Click on SA account and go to Properties.
The Simple trick is to check the box “Map to credential” as shown below after providing a new password and click Okay.
In Object Explorer, open Security folder, open Logins folder. Right Click on SA account and go to Properties.
The Simple trick is to check the box “Map to credential” as shown below after providing a new password and click Okay.
SQL Server 2008 Designer Behavior Change: Saving Changes Not Permitted
The Save (Not Permitted) dialog box warns you that saving changes is not permitted because the changes you have made require the listed tables to be dropped and re-created.
The following actions might require a table to be re-created:
The following actions might require a table to be re-created:
- Dropping a column
- Changing column nullability
- Changing the order of the columns
- Changing the data type of a column
To change this option, on the Tools menu, click Options, expand Designers, and then click Table and Database Designers. Select or clear the Prevent saving changes that require the table to be re-created check box.
Subscribe to:
Posts (Atom)