Hi!
Are you also a little confused about the managed/unmaged solutions in Microsoft Dynamics CRM? Here's my little conclusions after a discussion on Microsoft CRM group @ Facebook:
My Conclusion/Guideline based on answers above: (MS CRM 2011/2013)
Managed:
If your are a ISV’s or making 3.partys components to multiple customers or are a implementation partner in a customer project with several (3+) involved partners – Managed is recommended.
Main reason why:
Easily and controlled update/deletion/install of solution with possibility to lock down parts of customization.
Main Concerns:
You will have to move the whole solution between environments, meaning ALL customizations HAVE to be ready for deployments at the same time. (No half completed customizations OR controlled half customizations not showed to customer)
Unmanaged:
If you are an implementation partner and doing customizations for single customers with max a few (2-3) other implementation partners and the solution should not be updated and distributed between several customers – Unmanaged in recommended.
Main reason why:
You have the flexibility to refresh development environment and move parts of customizations between environments.
Main Concern:
Require good practice when moving customizations between environments.
Thursday, January 30, 2014
Tuesday, January 28, 2014
I'm going to CRM EXTREM - Stay tuned!
I'll post some news from the CRM extreme 9-12 feb. 2014
I'll also take a certification in Click Dimention, so Stay tuned to get some updates!
Inge-Andre
I'll also take a certification in Click Dimention, so Stay tuned to get some updates!
Inge-Andre
Monday, January 27, 2014
Picklist/Optionset OR lookup field CRM 2013
Hi!
Have you ever though about when to use a picklist/optionset, or might even a lookup?
There are many consultancy who are scared of creating too many entities in MS CRM projects. There are several times lookups to a entity with just a name might be better then using a picklist/option set!
A few senarios when you should think of this:
1. When you need the field to locked to certain options, but at the same time easy for super users to update/create new options.
2. When you are integrating two systems, and the master system have a dynamic value, but you want to be "semi"-locked and easy to seach for in MS CRM. (G.ex: A text field in ERP, integrated as a "list of records" in a specific entity in MS CRM. Makes it easier to search for a specific criteria)
3. When you are creating a "generic" solution/field where several options based on customers might bee needed.
4. When you have dependencies on a few fields on the same FORM it could be used.
5. When you want several fields to get information based on a single field. (g.Ex: You create a custom "opportunity line item" entity. On that entity you want to be able to sell 3 products, and based on the product chosen the opportunity linje should get "prize" and "product conditions". Why not create 2 custom enities ("Opporutiniy line item" AND "product") and store "prize" and "product conditions" on the product entity. Then you chose a product in the lookup (N:1) on "opportunity line item" you get "prize" and "product conditions" from the product enity.
+++
Think about it! Are you a "entity/lookup-scared" consultancy/developer!?
Have you ever though about when to use a picklist/optionset, or might even a lookup?
There are many consultancy who are scared of creating too many entities in MS CRM projects. There are several times lookups to a entity with just a name might be better then using a picklist/option set!
A few senarios when you should think of this:
1. When you need the field to locked to certain options, but at the same time easy for super users to update/create new options.
2. When you are integrating two systems, and the master system have a dynamic value, but you want to be "semi"-locked and easy to seach for in MS CRM. (G.ex: A text field in ERP, integrated as a "list of records" in a specific entity in MS CRM. Makes it easier to search for a specific criteria)
3. When you are creating a "generic" solution/field where several options based on customers might bee needed.
4. When you have dependencies on a few fields on the same FORM it could be used.
5. When you want several fields to get information based on a single field. (g.Ex: You create a custom "opportunity line item" entity. On that entity you want to be able to sell 3 products, and based on the product chosen the opportunity linje should get "prize" and "product conditions". Why not create 2 custom enities ("Opporutiniy line item" AND "product") and store "prize" and "product conditions" on the product entity. Then you chose a product in the lookup (N:1) on "opportunity line item" you get "prize" and "product conditions" from the product enity.
+++
Think about it! Are you a "entity/lookup-scared" consultancy/developer!?
Friday, January 24, 2014
Tired of writing your own plugins?
Hi again!
http://www.north52.com/ as their "Formula Manager" solution is life saving for all "none"-developing consultants! It make you create "excel-like" formulas who act as a plugin!
It's suuuuper easy to learn, extremely timesaving, very good ROI for you small customers , and give you the power of creating plugins in minutes without coding!!
I've used it in several projects (On-prem and On-dem) and the best thing, IT'S FREE UP TO A TOTAL OF 10 PLUGINS!
Also remember to take a look at the other cool solutions they have!!
Happy Xrm'ing!!
http://www.north52.com/ as their "Formula Manager" solution is life saving for all "none"-developing consultants! It make you create "excel-like" formulas who act as a plugin!
It's suuuuper easy to learn, extremely timesaving, very good ROI for you small customers , and give you the power of creating plugins in minutes without coding!!
I've used it in several projects (On-prem and On-dem) and the best thing, IT'S FREE UP TO A TOTAL OF 10 PLUGINS!
Also remember to take a look at the other cool solutions they have!!
Happy Xrm'ing!!
Tuesday, January 21, 2014
How to Update salesstage with javascript based on "processbar" in MS CRM 2013
Hi all, it's been a loooong time since i last updated this blog.. But here's a new nice tip :)
Microsoft have not given us the easiest way of updating fields on FORMS based on the new processbars feature on FORMS, but here's one way to do it With Javscript.. Supported!
Should work on opportunities.. AFTER YOU INSERT YOUR GUID's FOR
1. Field "processid"
2. Field "stageid"
3. Change name of "salesstage"
(Needed in setSalesStage function)
/* Script Entry Point */
function OnCrmPageLoad() {
var FormTypes =
{
Undefined: 0,
Create: 1,
Update: 2,
ReadOnly: 3,
Disabled: 4,
QuickCreate: 5,
BulkEdit: 6
}
runAlways();
switch (Xrm.Page.ui.getFormType()) {
case FormTypes.Create: OnNewFormLoad(); break;
case FormTypes.Update: OnUpdateFormLoad(); break;
case FormTypes.ReadOnly: OnReadOnlyFormLoad(); break;
case FormTypes.Disabled: OnDisabledFormLoad(); break;
case FormTypes.QuickCreate: OnQuickCreateFormLoad(); break;
case FormTypes.BulkEdit: OnBulkEditFormLoad(); break;
case FormTypes.Undefined: alert("Error"); break;
}
}
/* Implement each Form Type you wish to address */
function runAlways() {
onchange();
Xrm.Page.data.entity.addOnSave(addToOnSave);
}
function OnNewFormLoad() {
setSalesStage('new');
}
function OnUpdateFormLoad() {}
function OnReadOnlyFormLoad() { }
function OnDisabledFormLoad() { }
function OnQuickCreateFormLoad() { }
function OnBulkEditFormLoad() { }
/******************** OnChange and OnSave functions ***************************/
function onchange() {
//Add all fields who should have OnChange triggers
Xrm.Page.data.entity.attributes.get("prefix_fieldname").addOnChange(examplefunction);
}
function addToOnSave() {
//Check to see if stageid has changed
var attributes = Xrm.Page.data.entity.attributes.get();
for (var i in attributes) {
var attribute = attributes[i];
if (attribute.getIsDirty()) {
if (attribute.getName() == 'stageid') {
//Update Probability field - send a "dummy parameter"
setSalesStage('dummy');
}
}
}
}
/*************** End OnChange and OnSave functions ***************************/
/* --------------- Private functions ---------------------*/
function examplefunction() {
//No Operation
}
function setSalesStage(check) {
/*
UNIKE FOR EACH PROSESS AND CRM ORGANIZATION
Notes of GUID's steps in Prosess ID = 'bfc01b1c-9741-43b2-a016-3a41d91c234a' Display: "Solution Selling" on entity: opportunity
10% - 85bdfa9d-f067-42d4-82c3-0e1fd09f2b19
20% - 6a2020c4-7d10-28e3-1898-138b6c075259
40% - ae0c9ae4-55eb-cd1c-44ab-872d4aca4338
60% - 16b99584-143d-04ad-61c9-2b6a809e5608
80% - 93e08965-2e2a-4674-0e57-ec88633a0940
90% - 3a516491-d7cd-6cb1-a3e0-61be68c1857c
*/
var prosessId = Xrm.Page.getAttribute("processid");
var stageid = Xrm.Page.getAttribute("stageid");
var prob = Xrm.Page.getAttribute("salesstage");
//Check if new record
if (check == 'new') {
//sets first process name
prob.setValue('10% - Qualification');
}
//Not a new record, then it's an existing record
else {
if (prosessId.getValue() == 'bfc01b1c-9741-43b2-a016-3a41d91c234a') {
switch (stageid.getValue()) {
case '85bdfa9d-f067-42d4-82c3-0e1fd09f2b19':
//setter sannsynlighet
prob.setValue('10% - Qualification');
break;
case '6a2020c4-7d10-28e3-1898-138b6c075259':
prob.setValue('20% - Pain and Need');
break;
case 'ae0c9ae4-55eb-cd1c-44ab-872d4aca4338':
prob.setValue('40% - Proof of Concept');
break;
case '16b99584-143d-04ad-61c9-2b6a809e5608':
prob.setValue('60% - Closing');
break;
case '93e08965-2e2a-4674-0e57-ec88633a0940':
prob.setValue('80% - Offering accepted');
break;
case '3a516491-d7cd-6cb1-a3e0-61be68c1857c':
prob.setValue('90% - Contract signing');
break;
default:
alert("An error has occured!");
}
}
}
}
/* ------------ End Private functions------------------*/
Microsoft have not given us the easiest way of updating fields on FORMS based on the new processbars feature on FORMS, but here's one way to do it With Javscript.. Supported!
Should work on opportunities.. AFTER YOU INSERT YOUR GUID's FOR
1. Field "processid"
2. Field "stageid"
3. Change name of "salesstage"
(Needed in setSalesStage function)
/* Script Entry Point */
function OnCrmPageLoad() {
var FormTypes =
{
Undefined: 0,
Create: 1,
Update: 2,
ReadOnly: 3,
Disabled: 4,
QuickCreate: 5,
BulkEdit: 6
}
runAlways();
switch (Xrm.Page.ui.getFormType()) {
case FormTypes.Create: OnNewFormLoad(); break;
case FormTypes.Update: OnUpdateFormLoad(); break;
case FormTypes.ReadOnly: OnReadOnlyFormLoad(); break;
case FormTypes.Disabled: OnDisabledFormLoad(); break;
case FormTypes.QuickCreate: OnQuickCreateFormLoad(); break;
case FormTypes.BulkEdit: OnBulkEditFormLoad(); break;
case FormTypes.Undefined: alert("Error"); break;
}
}
/* Implement each Form Type you wish to address */
function runAlways() {
onchange();
Xrm.Page.data.entity.addOnSave(addToOnSave);
}
function OnNewFormLoad() {
setSalesStage('new');
}
function OnUpdateFormLoad() {}
function OnReadOnlyFormLoad() { }
function OnDisabledFormLoad() { }
function OnQuickCreateFormLoad() { }
function OnBulkEditFormLoad() { }
/******************** OnChange and OnSave functions ***************************/
function onchange() {
//Add all fields who should have OnChange triggers
Xrm.Page.data.entity.attributes.get("prefix_fieldname").addOnChange(examplefunction);
}
function addToOnSave() {
//Check to see if stageid has changed
var attributes = Xrm.Page.data.entity.attributes.get();
for (var i in attributes) {
var attribute = attributes[i];
if (attribute.getIsDirty()) {
if (attribute.getName() == 'stageid') {
//Update Probability field - send a "dummy parameter"
setSalesStage('dummy');
}
}
}
}
/*************** End OnChange and OnSave functions ***************************/
/* --------------- Private functions ---------------------*/
function examplefunction() {
//No Operation
}
function setSalesStage(check) {
/*
UNIKE FOR EACH PROSESS AND CRM ORGANIZATION
Notes of GUID's steps in Prosess ID = 'bfc01b1c-9741-43b2-a016-3a41d91c234a' Display: "Solution Selling" on entity: opportunity
10% - 85bdfa9d-f067-42d4-82c3-0e1fd09f2b19
20% - 6a2020c4-7d10-28e3-1898-138b6c075259
40% - ae0c9ae4-55eb-cd1c-44ab-872d4aca4338
60% - 16b99584-143d-04ad-61c9-2b6a809e5608
80% - 93e08965-2e2a-4674-0e57-ec88633a0940
90% - 3a516491-d7cd-6cb1-a3e0-61be68c1857c
*/
var prosessId = Xrm.Page.getAttribute("processid");
var stageid = Xrm.Page.getAttribute("stageid");
var prob = Xrm.Page.getAttribute("salesstage");
//Check if new record
if (check == 'new') {
//sets first process name
prob.setValue('10% - Qualification');
}
//Not a new record, then it's an existing record
else {
if (prosessId.getValue() == 'bfc01b1c-9741-43b2-a016-3a41d91c234a') {
switch (stageid.getValue()) {
case '85bdfa9d-f067-42d4-82c3-0e1fd09f2b19':
//setter sannsynlighet
prob.setValue('10% - Qualification');
break;
case '6a2020c4-7d10-28e3-1898-138b6c075259':
prob.setValue('20% - Pain and Need');
break;
case 'ae0c9ae4-55eb-cd1c-44ab-872d4aca4338':
prob.setValue('40% - Proof of Concept');
break;
case '16b99584-143d-04ad-61c9-2b6a809e5608':
prob.setValue('60% - Closing');
break;
case '93e08965-2e2a-4674-0e57-ec88633a0940':
prob.setValue('80% - Offering accepted');
break;
case '3a516491-d7cd-6cb1-a3e0-61be68c1857c':
prob.setValue('90% - Contract signing');
break;
default:
alert("An error has occured!");
}
}
}
}
/* ------------ End Private functions------------------*/
Etiketter:
CRM 2013,
Javascript CRM 2013
Subscribe to:
Posts (Atom)