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.
Tem como eu remover a barra de ferramentas do relatorio? exportação, paginas e etc?
ResponderExcluir