Dynamics CRM 2011: Rolling up subgrid totals to a form field
MSCRM does require a little bit of coding when we try to add form field values. A common scenario is the addition of two inputted field values to make a third calculated value. This is easily achieved by using the method "Xrm.Page.getAttribute('ATTRIBUTE NAME').
For example the following method, when invoked in a form's OnSave event will add two floating point fields "new_firstvalue" and "new_secondvalue" and set the value of the field "new_calculatedthirdvalue":
function calculateThirdValue ()
{
var FirstValue = Xrm.Page.data.entity.attributes.get("new_firstvalue").getValue();
var SecondValue = Xrm.Page.data.entity.attributes.get("new_secondvalue").getValue();
varCalculatedThirdValue = parseFloat(FirstValue )+parseFloat(SecondValue);
Xrm.Page.data.entity.attributes.get("new_calculatedthirdvalue").setValue(varCalculatedThirdValue);
}
Lately I needed to do something a little different. I wanted to roll up values from a subgrid view embedded in my form. So after a little experimentation, I came up with this method which can be re-used for different subgrid columns. So in my OnLoad even I invoke a method like this:
function calculateRolledUpTotals()
{
//Calculate total of column 1
var col1Total = aggregateGridFields('new_column1');
Xrm.Page.getAttribute('new_column1total').setValue(parseInt(col1Total ));
Xrm.Page.getAttribute('new_column1total').setSubmitMode('always'); ...
}
and this re-usueable method then totals the subgrid values for the column pass to is by name:
function aggregateGridFields (columnName)
{
var gridControl = document.getElementById('queryset').control;
var ids= gridControl.get_allRecordIds();
var aggCount=0;
for(i = 0; i < ids.length; i++)
{
var cellValue = gridControl.getCellValue(columnName,ids[i]);
if (parseInt(cellValue))
{
aggCount+=parseInt(cellValue, 10);
}
}
return aggCount;
}