Wednesday, July 31, 2013

N:N Manual Recursive Relationship


So, this week there was a special requirement from the client, a manual N:N recursive relationship for the Territory entity, which is a system entity. The client also wanted that when creating the relationship entity records, CRM could recognize if I was creating a child or a parent record, so the corresponding lookup was disabled and the other cleared up.

Since the "Add new related" button on a subgrid sets both lookups to the original record, a problem arose.

I posted the question in here where it was promptly answered, and with some tweaking, it was completely implemented.

1. After creating the relationship entity, I used the Visual Ribbon Editor tool to create the two new buttons, one to create children, and another one to create parents:

2. Configured the actions to call the specific functions:
One for the AddChild button

One for the AddParent button
3. I had to add custom parameters to the relationship entity form since the Territory entity did not let me passing parameters based on the lookup fields names:
The id parameters are of type UniqueIdentifier, the rest are SafeString.

4. Then, the JScript functions were created:
function AddChild() {
    var parameters = {};

    //Set the Parent field value to the current record.
    parameters["parameter_parentid"] = Xrm.Page.data.entity.getId(); //id of primary entity
    parameters["parameter_parentname"] = Xrm.Page.getAttribute("name").getValue(); //the name field of primary entity
    parameters["parameter_parenttype"] = "territory"; //the primary entity schema name

    // Open the window.
    Xrm.Utility.openEntityForm("new_zonesubzones", null, parameters);
}

function AddParent() {
    //debugger;
    var parameters = {};

    //Set the Parent field value to the current record.
    parameters["parameter_childid"] = Xrm.Page.data.entity.getId(); //id of primary entity
    parameters["parameter_childname"] = Xrm.Page.getAttribute("name").getValue(); //the name field of primary entity
    parameters["parameter_childtype"] = "territory"; //the primary entity schema name


    // Open the window.
    Xrm.Utility.openEntityForm("new_zonesubzones", null, parameters);
}

5. Finally, on the onload event of the relationship entity form, the following function is invoked to retrieve and assign the values passed through the custom parameters.
function OnLoad() {
    if (Xrm.Page.ui.getFormType() == 1) {
        var param = Xrm.Page.context.getQueryStringParameters();
        if (param["parameter_parentid"] != null) {
            var parentId = param["parameter_parentid"];
            var parentName = param["parameter_parentname"];
            var parentType = param["parameter_parenttype"];
            Xrm.Page.getAttribute("new_zoneid").setValue([{ id: parentId, name: parentName, entityType: parentType}]);
            Xrm.Page.getControl("new_zoneid").setDisabled(true);

        }
        if (param["parameter_childid"] != null) {
            var childId = param["parameter_childid"];
            var childName = param["parameter_childname"];
            var childType = param["parameter_childtype"];
            Xrm.Page.getAttribute("new_subzoneid").setValue([{ id: childId, name: childName, entityType: childType}]);

            Xrm.Page.getControl("new_subzoneid").setDisabled(true);
        }
    } else {
        Xrm.Page.getControl("new_subzoneid").setDisabled(true);
        Xrm.Page.getControl("new_zoneid").setDisabled(true);
    }
}

And that's it!, when each button is clicked, it opens the new relationship entity form, with the lookup fields set according to each button.

Happy Coding!

Why not a blog?

Hello.

I've been developing for Dynamics CRM for almost two years now, and I've had some experiences with different requirements and approaches, some of them were found on the net, others were developed collaboratively with my coworkers, others were desperate attempts to give the client what he wanted, but all of them were learning experiences.

From today on I'll share my experiences as I can, hoping that the solutions that we've found will somehow help colleagues.

Happy coding!