sexta-feira, 26 de março de 2010

>> CRM 4.0 - Exibição de Relatórios no IFRAME (OnLine e OffLine Access)

Sem dúvida alguma, um dos grandes recursos do Dynamics CRM para o desenvolvedor é a possibilidade de integração do [Reporting Services] no produto. Inclusive, o processo de publicação dos relatórios desenvolvidos no Dynamics CRM fica fácil, pois utilizamos a própria interface do produto para isto.

Pensando nisto, imagine o desenvolvimento de um relatório para o Dynamics CRM, porém, com a necessidade de visualização deste relatório em um [IFrame]; e mais, o relatório deve funcionar para as versões do Dynamics CRM [OnLine] e para [Outlook OFFLine]!.

Pois bem, segue uma forma [simples] de resolver esta questão:

1 - Desenvolva normalmente seu relatório (usando, é claro, as FilteredViews);
2 - Efetue o Upload do relatório no Dynamics CRM;
3 - Adicione o [IFrame] na entidade que deseja visualizar o relatório;

A idéia agora é preencher o IFrame dinamicamente, no [OnLoad] do formulário.

Usando o importante recurso do Dynamics CRM chamado [URL Addressable Forms], também podemos nos utilizar disto para os relatórios.

Portanto, no [OnLoad] do formulário, adicione o seguinte código:


var reportID = getReportIDByName("NOMEDOSEURELATORIO");

var urlReport = SERVER_URL + "/crmreports/viewer/viewer.aspx?action=run&id=" + reportID + "&context=records&recordstype=1&records=" + crmForm.ObjectId + "&helpID=NOMEDOSEURELATORIO.rdl";

crmForm.all.IFRAME_report.src=urlReport;

function getReportIDByName(reportname)
{
return ExecFetchXML('report', 'reportid', 'name', 'eq', reportname);
}

function ExecFetchXML(entityName, column, conditionAttribute, operator, value)
{
var guid = "";
var fetchMapping = "logical";
var filterType = "and";
var authenticationHeader = GenerateAuthenticationHeader();

// Prepare the SOAP message.
var xml = "<?xml version='1.0' encoding='utf-8'?>"+
"<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"+
" xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'"+
" xmlns:xsd='http://www.w3.org/2001/XMLSchema'>"+
authenticationHeader+
"<soap:Body>"+
"<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+
"<fetchXml><fetch mapping='"+fetchMapping+"'>"+
"<entity name='"+entityName+"'>"+
"<attribute name='"+column+"'/>"+
"<filter type='"+filterType+"'>"+
"<condition attribute='"+conditionAttribute+"'"+
" operator='"+operator+"' value='"+value+"'/>"+
"</filter>"+
"</entity>"+
"</fetch></fetchXml>"+
"</Fetch>"+
"</soap:Body>"+
"</soap:Envelope>";
// Prepare the xmlHttpObject and send the request.
var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xHReq.setRequestHeader("SOAPAction","http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xHReq.setRequestHeader("Content-Length", xml.length);
xHReq.send(xml);
// Capture the result.
var resultXml = xHReq.responseXML;

// Check for errors.
var errorCount = resultXml.selectNodes('//error').length;
if (errorCount == 0)
{
// Capture the result and UnEncode it.
var resultSet = new String();
resultSet = resultXml.text;

// Create an XML document that you can parse.
var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
oXmlDoc.async = false;
// Load the XML document that has the UnEncoded results.
oXmlDoc.loadXML(resultSet);

if (oXmlDoc.getElementsByTagName('result') != null)
guid = oXmlDoc.getElementsByTagName('result')[0].selectSingleNode('./' + column).nodeTypedValue;
}

return guid;
}


Note o uso dos seguintes recursos:

- Obtenção do [ID] do relatório adicionado no CRM, através da função [getReportIDByName];

- URL de relatórios do CRM: [/crmreports/viewer/viewer.aspx]. Note os parâmetros preenchidos para a execução dinâmica do relatório;

- O relatório será também executado no modo OFFLINE (através do uso da variável Global [SERVER_URL] do CRM);

- E a utilização de um FetchXML (função ExecFetchXML) para busca de informação na Entidade [ReportBase] do CRM.

Segue exemplo, em uma Conta, da execução de um relatório em um IFrame:



That´s It!

Abraços.