Thursday, January 30, 2014

Managed VS Unmanaged Solutions!!!

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.


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

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!?

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!!




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------------------*/