terça-feira, 10 de janeiro de 2012

CRM 2011 >> SubGrid - Totalização de Valor (via JScript)

No CRM 2011 temos a possibilidade de explorar muito bem desenvolvimentos em JScript, jQuery, jSon (ou REST OData).

Seguindo esta linha, segue um código, pequeno inclusive, que faz uma Totalização de Valores, buscando as informações em um SubGrid!

Para a execução do código, basta adicioná-lo no formulário, e chamá-lo no método OnLoad.
Importante adicionar os JScripts prontos da Microsoft, para execução de chamadas jQuery, sendo eles [jquery1.4.1.min.js] e [jqueryrestdataoperationfunctions.js].

Importante também adicionar o campo de moeda do CRM (TransactionCurrencyId), quando existir na tela do CRM algum campo do tipo moeda. Neste caso usaremos e o script abaixo preenche o campo automaticamente.

Estes arquivos podem ser encontrados no SDK do CRM (quando descompactado em qualquer diretório), no caminho [\SDK\samplecode\js\restendpoint\jqueryrestdataoperations\jqueryrestdataoperations\scripts].

Segue Script:


var timeOutVar;
function PrepareAddUpValue() {
var grid = document.getElementById('GRIDNAME');
if (grid == null)
{
// delay one second and try again.
timeOutVar = setTimeout(PrepareAddUpValue, 1000);
return;
}
clearTimeout(timeOutVar);
grid.attachEvent("onrefresh", AddUpValue);
}

function AddUpValue(){
var gridControl = document.getElementById("GRIDNAME").control;
var ids = gridControl.get_allRecordIds();
var new_total = 0.0;

for(var i = 0; i < ids.length; i++)
{
str_value = gridControl.getCellValue("NOME_COLUNA_GRID", ids[i]).replace("R$", "").replace(" ", "");
new_total += parseFloatString(str_value);
}

Xrm.Page.getAttribute("new_total").setValue(new_total);
Xrm.Page.data.entity.save();
}

function parseFloatString(str){
str = String(str);
var strNew = "";
for(var i=0; i < str.length; i++){
if (isNaN(parseInt(str.charAt(i))) == false) strNew +=str.charAt(i);
}

return parseFloat(strNew);
}

function SetCurrency(){
if (Xrm.Page.getAttribute("transactioncurrencyid") != null) return;
var filter = "?$select=TransactionCurrencyId,CurrencyName";
retrieveMultiple("TransactionCurrencySet", filter, retrieveMultipleCurrencyCompleted, null);
}

function retrieveMultipleCurrencyCompleted(data, textStatus, XmlHttpRequest){
if (data == null) return;
var idValue = data[0].TransactionCurrencyId;
var textValue = data[0].CurrencyName;
var thisEntityType = 'transactioncurrency';
Xrm.Page.getAttribute("transactioncurrencyid").setValue([{ id: idValue, name: textValue, entityType: thisEntityType }]);
}

SetCurrency();

Veja uma tela de exemplo. Note que, ao adicionar um novo registro, o Script é acionado, totalizando o valor em um campo do formulário. Isto acontece porque o Script atua no evento [OnRefresh] do SubGrid do CRM.