Relatório Wizard - Limpar registos sem registos filho

by Pedro Azevedo 27. March 2014 02:54

Boas pessoal,

Hoje escrevo um post em resposta a uma dúvida do fórum de Dynamics CRM, como era difícil responder coloco aqui a resposta.

O objectivo é criar um relatório onde é listado por cliente as respectivas ordens de serviço. Este relatório é bastante simples e muito fácil de fazer através do wizard.

Vejam a configuração:

Nos ecrãs anteriores escolhi como registo primário o Cliente e como registo secundário o Incidente.

O problema é que o relatório coloca todos os clientes mesmo aqueles que não têm ordens de serviço e o objectivo é se o cliente não tiver ordens de serviço não aparecer no relatório. Vejam o resultado neste caso com incidentes.

Como podem verificar apenas o último cliente tem um incidente criado, como podemos limpar estes clientes sem incidentes. A solução foi simples:

Com isto previno que sejam mostrados clientes que não tenham tickets criados, não esquecer de colocar os mesmos critérios ao nível do cliente:

Uma solução simples e eficaz.

Até a próxima

Tags: , , ,

CRM 2011 - Listar todas as opções num WebResource (Recurso Web)

by Pedro Azevedo 12. December 2013 01:39

Boas pessoal,

Foi colocada uma questão nos fóruns da Microsoft. Basicamente a questão era como obter todos os estados de uma entidade e listar em um Recurso Web. Como o código e os passos eram bastantes decidi colocar aqui no blog e ajudar futuramente outros programadores.

No final deste desenvolvimento como resultado teremos um Recurso Web a listar num OptionSet todas as opções de um OptionSet criado no CRM. Para isso teremos que aceder aos Metadados do CRM. Neste caso vou usar directamente uma mensagem SOAP para obter estes dados, usando a mensagem RetrieveAttributeRequest. Mas chamando através do Javasript.

O primeiro passo foi criar o Recurso Web no tipo HTML, neste Recurso Web coloquei o seguinte código:

<HTML xmlns:b xmlns:a xmlns:soapenv>
	<HEAD>
         </HEAD>
	<BODY>
		<SELECT id=myList/>
	</BODY>
</HTML>

Até agora nada de especial, vamos colocar algum código Javascript, como vamos estar em um Recurso Web vamos ter que obter informação do contexto para isso teremos que referenciar este aspx ClientGlobalContext.js.aspx (já está no CRM não é necessário referenciar por exemplo noutro Recurso Web).

Com esta referência poderemos então obter o contexto desta maneira:

var context = GetGlobalContext();
var serverUrl = context.getServerUrl();

NOTA: O método getServerUrl encontra-se deprecated com a vinda do UR12, para rollups superiores deve-se usar o método getClientUrl.

Agora "basta" construirmos o pedido SOAP para obter a informação que pretendemos:

var SoapPath = serverUrl + "/XRMServices/2011/Organization.svc/web";
var MetadataId = "00000000-0000-0000-0000-000000000000";
				
var request = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body>"
request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
request += "<request i:type=\"a:RetrieveAttributeRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
request += "<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>EntityLogicalName</b:key>";
request += "<b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + entityLogicalName + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>MetadataId</b:key>";
request += "<b:value i:type=\"ser:guid\"  xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + MetadataId + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>RetrieveAsIfPublished</b:key>";
request += "<b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + retrieveAsIfPublished + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<b:key>LogicalName</b:key>";
request += "<b:value i:type=\"c:string\"   xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + attributeLogicalName + "</b:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "</a:Parameters>";
request += "<a:RequestId i:nil=\"true\" /><a:RequestName>RetrieveAttribute</a:RequestName></request>";
request += "</Execute>";
request += "</soapenv:Body></soapenv:Envelope>";
				
var req = new XMLHttpRequest();
req.open("POST", SoapPath, false);
req.setRequestHeader("Accept", "application/xml, text/xml, */*");
req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
req.send(request);

Com este pedido podemos aceder a todas as opções do OptionSet escolhido. A seguir vou colocar todo o código, inclusivé o que permite fazer parsing dos resultados e que coloca noutra OptionSet.

<HTML xmlns:b xmlns:a xmlns:soapenv><HEAD>
<SCRIPT src="ClientGlobalContext.js.aspx"></SCRIPT>

<SCRIPT type=text/javascript>
			function getOptionSet (entityLogicalName, attributeLogicalName, retrieveAsIfPublished) {				
				var context = GetGlobalContext();
                var serverUrl = context.getServerUrl();
	            var SoapPath = serverUrl + "/XRMServices/2011/Organization.svc/web";
				var MetadataId = "00000000-0000-0000-0000-000000000000";
				
                var request = " <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body>"
				request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
				request += "<request i:type=\"a:RetrieveAttributeRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\">";
				request += "<a:Parameters xmlns:b=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
				request += "<a:KeyValuePairOfstringanyType>";
				request += "<b:key>EntityLogicalName</b:key>";
				request += "<b:value i:type=\"c:string\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + entityLogicalName + "</b:value>";
				request += "</a:KeyValuePairOfstringanyType>";
				request += "<a:KeyValuePairOfstringanyType>";
				request += "<b:key>MetadataId</b:key>";
				request += "<b:value i:type=\"ser:guid\"  xmlns:ser=\"http://schemas.microsoft.com/2003/10/Serialization/\">" + MetadataId + "</b:value>";
				request += "</a:KeyValuePairOfstringanyType>";
				request += "<a:KeyValuePairOfstringanyType>";
				request += "<b:key>RetrieveAsIfPublished</b:key>";
				request += "<b:value i:type=\"c:boolean\" xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + retrieveAsIfPublished + "</b:value>";
				request += "</a:KeyValuePairOfstringanyType>";
				request += "<a:KeyValuePairOfstringanyType>";
				request += "<b:key>LogicalName</b:key>";
				request += "<b:value i:type=\"c:string\"   xmlns:c=\"http://www.w3.org/2001/XMLSchema\">" + attributeLogicalName + "</b:value>";
				request += "</a:KeyValuePairOfstringanyType>";
				request += "</a:Parameters>";
				request += "<a:RequestId i:nil=\"true\" /><a:RequestName>RetrieveAttribute</a:RequestName></request>";
				request += "</Execute>";
				request += "</soapenv:Body></soapenv:Envelope>";
				
				var req = new XMLHttpRequest();
				req.open("POST", SoapPath, false);
				req.setRequestHeader("Accept", "application/xml, text/xml, */*");
				req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
				req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
				req.send(request);

				if (req.responseXML != null) {
					var attributeData = req.responseXML.selectSingleNode("//b:value");
					if (attributeData != null) {
						var attributeType = attributeData.selectSingleNode("c:AttributeType").text;
						switch (attributeType) {
							case "Picklist":
								return attributeData;
								break;
							default:
								break;
						}
					}
				}
			}
		</SCRIPT>

<META charset=utf-8></HEAD>
<BODY contentEditable=true><SELECT id=myList></SELECT>
<SCRIPT>
	var optionSet = getOptionSet("ret_accao", "ret_estadocadastro", true);
	var options = optionSet.selectSingleNode("c:OptionSet//c:Options");
    var myPickList = document.getElementById("myList");
	for (var i = 0; i < options.childNodes.length; i++) {
		var textPick = options.childNodes[i].selectSingleNode("c:Label").selectSingleNode("a:UserLocalizedLabel").selectSingleNode("a:Label").text;
        var option = document.createElement("option");
        option.text = textPick;
        myPickList.add(option, myPickList.options[null]);
	}
</SCRIPT>
</BODY></HTML>

Se não quiserem andarem a fazer copy paste do código tenho aqui a solution que contém este código. É fazer download e importá-lo na vossa organização e lançar num botão por exemplo.

NOTA: Atenção ao cache dos web resources, façam iisreset e caso não resulte forcem o reload (CTRL+F5) na própria páguina que contiver este web resource

ListadeEstados_1_0_0_0.zip (3,29 kb)

Tags: , , , ,

Video e Slides da 38ª Reunião NetPonto

by Pedro Azevedo 23. July 2013 23:15

Boas pessoal,

Como referi neste post realizei a minha primeira apresentação pública denominada “X(C)RM como plataforma de desenvolvimento rápido” na comunidade netponto.

Penso que poderia ter corrido muito melhor estava super nervoso e nem tudo saía fluido (ter passado a noite sem dormir deve ter ajudado) como tinha imaginado.

Agora tenho a noção que fui demasiado ambicioso para o tempo que tinha disponível.

Foi publicado o vídeo e eu aproveitei para fazer upload também dos slides apresentados, vejam abaixo os vários links:

 

Mas estamos sempre aprender e entretanto realizei outra palestra e esta correu muito melhor. Por isso espero que outra oportunidade na comunidade NetPonto para me redimir Smile.

 

 

 

Até a próxima.

Tags: , , ,

Reconhecimento como MCC – Microsoft Community Contributor

by Pedro Azevedo 11. July 2013 19:50

Boas pessoal,

Hoje foi com muita alegria que recebi um email da Microsoft a reconhecer todas as minhas contribuições na comunidade Dynamics CRM, fui nomeado como MCC (Microsoft Community Colaborator), para saber mais informações sobre esta distinção podem ver aqui.

Segue o email que recebi:

  

Não tem qualquer benefício, recebe-se o email acima e no nosso perfil dos fóruns da Microsoft aparece esta distinção. Nunca foi um objectivo mas é sempre bom ver o nosso esforço reconhecido. Mas mais que ajudar eu estou aprender e muito. Obrigado a todos.

 

Até a próxima.

Tags: , ,

Slides do 1º evento presencial da comunidade Portugal-a-Programar

by Pedro Azevedo 29. June 2013 17:00

Boas pessoal,

Realizei a apresentação e o workshop no primeiro evento da comunidade Portugal-a-Programar, primeiro queria felicitar toda a organização que permitiu realizar este evento. Havia uma grande mistura entre profissionais e estudantes.

A apresentação correu muito melhor que a minha anterior experiência, não tão nervoso e o discurso a sair mais fluído. Infelizmente a minha gravação não foi disponibilizada pois sei que havia alguns problemas com os equipamentos de gravação, mas ficam os meus slides:

 

O workshop não funcionou tão bem devido a falta de internet na sala. Mas deu para ser uma sessão mais descontraída e com muito interacção com os participantes. Podem ver aqui os resultados do evento.

E da minha participação:

 

 

 

Até a próxima.

Tags: , ,

Criar uma conta CRM Online

by Pedro Azevedo 23. May 2013 22:35

Boas pessoal,

Hoje vou fazer um guia de como criar uma conta online. Isto também no âmbito do workshop que vou realizar na comunidade Portugal a Programar.

A primeira coisa a fazer é aceder ao seguinte URL: http://crm.dynamics.com/pt-pt/on-demand nesta página como podemos visualizar na imagem a seguir tem várias informações e um botão (Guia de Introdução) que permite testar o CRM Online gratuitamente durante 30 dias:

A seguir carregue em “Experimentar Agora!”:

 

Para aceder ao CRM temos que criar uma conta Office 365:

Aqui é um registo simples mas aqui queria ressaltar o facto de esta versão gratuita de 30 dias inclui 25 licenças e um armazenamento até 5 GB. Muito bom.

 

Mais algumas informações pessoais e depois um campo importante que vai definir o nome de utilizador pelo qual nos autenticamos e a respectiva password. Depois deste preenchimento é carregar no botão “Criar a minha conta”.

Depois a Microsoft prepara a nossa organização, por isso temos que esperar um pouco:

Quando o processo é terminado recebemos um email com as informações de como autenticar na organização. Se acedermos ao portal do Office 365 já podemos ver o botão para aceder ao CRM.

Aqui também podemos ver quantos dias temos até ao final da subscrição:

Ao acedermos pela primeira vez a instância do CRM temos informações sobre a nossa organização e depois um ecrã para configurar a organização:

 

Depois disto tudo podemos finalmente entrar na nossa organização do CRM Online, já agora vejam o vídeo de introdução:

E temos o CRM ONLINE:

Até a próxima.

 

Tags: , , , , ,

Participação no 1º evento presencial Portugal-a-Programar

by Pedro Azevedo 1. May 2013 12:20

Boas pessoal,

Depois de uma apresentação pública na Comunidade NetPonto e a minha desilusão de não ter conseguido atingir todos os objectivos, foi aceite mais uma participação pública na comunidade. Desta vez para a Portugal a Programar, uma comunidade mais genérica mas muito activa e que vai realizar o primeiro evento presencial.

Vou então fazer uma sessão e um workshop. A sessão terá como título “CRM? Como escolher? De raiz ou sistema já desenvolvido?” Onde apresentarei o que é um CRM, quais as opções no mercado e o que se ganha ao escolher um solução proprietária em vez de uma solução de raiz, sempre claro puxando sempre mais para a solução Microsoft Dynamics CRM.

No workshop o objectivo é visualizarmos a versão online do Microsoft Dynamics CRM percebermos como funciona e no fim como nos podemos comunicar com este sistema via Java ou .Net.

 

Até a próxima.

Tags: , ,

Convergence 2013

by Pedro Azevedo 23. March 2013 01:07

Boas pessoal,

Quem foi ao Convergence 2013 entre 18 e 21 de Março em New Orleans? Estou com tanta inveja. Mais um evento fantástico e com muitas novidades na calha.

Utilizei principalmente e cada vez mais o twitter para acompanhar o evento (foram milhares de tweets, não esquecer que este evento é sobre o Microsoft Dynamics).

A primeira grande novidade surgiu no segundo dia com o anúncio da compra da NetBreeze por parte da Microsoft. A NetBreeze é uma empresa Suíça de análise as redes sociais. Vem reforçar a parte social do Dynamics CRM depois da compra do Yammer apesar de propósitos diferentes. Uma das grandes vantagens realçadas do NetBreeze é fazer uma análise semântica em 28 línguas, isto em contraponto com os concorrentes que traduzem o texto para determinar o sentimento de um determinado post. Já agora o grande concorrente seria o Radian6 da Salesforce.

E já existem imagens sobre o próximo produto:

 

 

Para além de determinar o sentimento de cada post. Podemos ver esses mesmos posts e responder directamente. Para além disso podemos configurar alertas para quando por exemplo o sentimento tiver muito baixo. Como podemos ver na primeira imagem temos a tendência da marca.

Outra das novidades foram imagens do MarketingPilot com o aspecto do Orion (que vamos falar mais adiante) depois da compra em Novembro de 2012:

Supostamente será a configuração de uma campanha de marketing com recurso a um componente gráfico. Muito bom. Pelo que percebi esta ferramenta já pode ser usada nos estados unidos. Como referi no post anterior (eXtreame CRM) esta ferramenta será uma aplicação a parte e terá integração com o Dynamics CRM e o conector está aqui.

Uma das demos existentes foi a aplicação para Windows 8, neste caso num Surface, diga-se de passagem que parece muito bonita:

 

Outro produto que está a ter visibilidade é o Yammer pode-se ver a seguir a sua integração no activity feed.

O que falta falar, nada mais nada menos que o roadmap (adoro estas imagens):

Podemos ver o rollup do Gemini um rollup online que tem as novidades do Marketing Pilot que vimos anteriormente. Outra coisa a notar é o Orion que vamos falar a seguir.

 

Em relação ao Orion, parece que não se falou muito, algumas imagens mas sem grande pormenor, primeiro o que o Orion nos tem para oferecer:

Depois a sua interface que vem consolidar o aspecto flat do Polaris e com uma novidade que já tínhamos visto no Marketing Pilot que é uma barra no topo, que pelo que percebo será uma barra de navegação, na segunda imagem podemos ver o drop down quando seleccionamos sobre o nome Microsoft Dynamics CRM.

 

Não deixem de ver os vídeos que dão muita informação. Já agora uma imagem engraçada que tirei de um dos tweets, numa apresentação da Microsoft:

 

Até a próxima,

 

Fontes:

http://yellowduckguy.wordpress.com/category/convergence-2013/

https://community.dynamics.com/crm/b/crmconnection/archive/2013/03/19/netbreeze.aspx

http://community.dynamics.com/crm/b/crmconnection/archive/2013/03/19/marketingpilot15.aspx

Tags: , , , , ,

eXtreme CRM 2013 Roma

by Pedro Azevedo 9. February 2013 00:38

Boas pessoal,

Estou aqui com um post rápido porque infelizmente as informações não foram muitas do evento eXtreme CRM e se não fosse o Jukka Niiranen e ainda tinha sido pior. Lá estou eu a reclamar Cool.

Decorreu entre os dias 3 e 6 de Fevereiro o eXtreme CRM 2013 em Roma. Para além dos habituais roadmaps, fica uma coisa a reter o release apelidado por Orion afinal não vai ser uma major release como o Polaris, será uma nova versão em princípio será o Microsoft Dynamics 2013. Nesta nova versão será o fim dos chamados “classic forms”, ou seja, vamos ter o ambiente flat para todas as entidades.

Outra das novidades foi a introdução de mais um release com o nome Gemini que trará novidades ao nível do Marketing e será consequência da aquisição da empresa Marketing Pilot. Este release está programado para sair no segundo trimestre de 2013.

Pelo que percebi será uma aplicação a parte mas com integração com o Dynamics CRM.

Para além do Gemini existe outra constelação a chegar (sim todos estes nomes têm surgido de constelações) é o Leo que está programado para o final de 2013.

 

Até a próxima

 

Fonte:

http://niiranen.eu/crm/2013/02/extreme-crm-2013-rome-takeaways/

http://blog.dorrekens.com/index.php/list/155-microsoft-crm-2013-roadmap

Tags: , , , ,

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List