Entendendo melhor a diferença entre as formas de obtermos informações de um objeto do tipo Entity. Na imagem abaixo, são apresentadas duas formas de obtermos o valor do campo firstname da entidade contato.
Em determinados cenários, o resultado final de ambas será igual, por exemplo, em um create/update onde este campo este foi preenchido e vira preenchido dentro do target. Porém, em determinadas situações, como em um update, onde o campo firstname não foi atualizado, a primeira linha irá gerar uma exceção, pois o objeto contato não possuirá este atributo. Caso estejamos fazendo o uso do método GetAttributeValue<T>("attributeLogicalName"), juntamente com um atributo cujo tipo e nullable, o retorno será null e nenhuma exceção será gerada.
E quando estivermos trabalhando com tipos de atributos non-nullable, como DateTime, int, bool, entre outros? Nestes casos, o próprio método se encarrega de fazer uma tratativa. A primeira linha abaixo é a minha chamada, a segunda linha, é o que de fato (implicitamente) será executado.
O método GetValueOrDefault(), como o próprio nome já diz, retorna o valor do campo e, quando não encontrado, retorna o valor padrão para aquele tipo de atributo.
Um último ponto a ser explorado no método GetValueOrDefault() é referenete a sua sobrecarga, onde você pode passar um valor padrao para sua variável. Continuando o exemplo com o tipo DateTime que se encaixa bem neste cenário. O valor default para data é 01/01/0001. Esta não é uma data válida para as tabelas do CRM. Sabendo disso, poderíamos fazer a tratativa de duas formas.
Primeiramente, usando uma condição para setar um valor padrão para data, caso o valor retornado seja igual a MinValue.
Ou, podemos usar sua sobrecarga e passarmos um valor padrão que, além de evitarmos exceções, diminuem a quantidade de linhas de código.
Dynamics CRM
Fell free to comment or contact me at bruno.willian.ads@gmail.com.
Who's Bruno Willian

- Bruno Willian
- I'm Bruno, I've been working as a Dynamics CRM consultant since 2012. This blog is intended to share acknowledgement not only about Dynamics, but also any technology we use to extend the platform.
Monday, February 5, 2018
Monday, January 29, 2018
TIP #1 - OutArgument Workflow Customizado
Workflows customizados são muito úteis, principalmente quando possuem um baixo acoplamento, permitindo que sua lógica seja reaproveitada por outros componentes (Workflows, Real-time Workflows, JavaScript, entre outros).
No código abaixo, temos um workflow customizado bem simples e útil, que retorna o usuário que está executando o workflow, muito usado em cenários de aprovação, onde é preciso popular algum lookup do tipo systemuser com o usuário que está aprovando/reprovando determinado processo.
A dica é referente ao retorno do workflow (CurrentUser) do tipo EntityReference. Conhecendo essa classe, sabemos que a mesma possui três propriedades principais (ID, LogicalName e Name), porém quando utilizado como um argumento de saída de um workflow customizado, conseguimos extrair mais informações que apenas as citadas acima. Na verdade, ele se comporta como se estivéssemos retornando um Entity com todos seus atributos.
No imagem abaixo, é possível perceber que quando selecionamos esse parâmetro em um workflow real-time, usado para setar um campo systemuser, obtemos não apenas a referência do usuário, mas sim todos campos de sua tabela.
No código abaixo, temos um workflow customizado bem simples e útil, que retorna o usuário que está executando o workflow, muito usado em cenários de aprovação, onde é preciso popular algum lookup do tipo systemuser com o usuário que está aprovando/reprovando determinado processo.
A dica é referente ao retorno do workflow (CurrentUser) do tipo EntityReference. Conhecendo essa classe, sabemos que a mesma possui três propriedades principais (ID, LogicalName e Name), porém quando utilizado como um argumento de saída de um workflow customizado, conseguimos extrair mais informações que apenas as citadas acima. Na verdade, ele se comporta como se estivéssemos retornando um Entity com todos seus atributos.
No imagem abaixo, é possível perceber que quando selecionamos esse parâmetro em um workflow real-time, usado para setar um campo systemuser, obtemos não apenas a referência do usuário, mas sim todos campos de sua tabela.
Como não encontrei nenhuma documentação descrevendo esse comportamento, achei que valeria a pena compartilhar.
Saturday, January 13, 2018
Regras de Negocio - Escopo Entidade
Introdução
As regras de negócio foram introduzidas na versão 2013 do Dyamics CRM, desde então, é possível economizar tempo e complexidade de desenvolvimento fazendo seu uso para substituir alguns comportamentos que, ate então, só eram possíveis com JavaScript.Até então, só era possível criarmos regras que rodassem apenas no lado do cliente, porém desde a versão 2015 do Dynamics, onde foi introduzido nas regras de negócio mais um tipo de escopo, chamado Entidade, e possível criarmos regras que são executadas tanto no lado do cliente (Client Side) como no lado do servidor (Server Side).
Bem, para muitas pessoas, não está claro o que exatamente isso significa, afinal, a maioria da documentação encontrada cita apenas que as regras também seriam aplicadas na importação de registros.
Procurando ir um pouco mais a fundo e desmistificando esse conceito, procurei um material que me ajudou a compreender melhor os impactos dessa nova funcionalidade.
Explicação
Quando falamos em regras de negócio que serão executadas também no lado do servidor, queremos dizer que, registros importados, criados ou modificados via SDK, também serão afetados, porém alguns comportamentos ainda estão obscuros quando falamos em ações no lado do cliente e no lado do servidor. Para tentar simplificar, iremos listar os resultados de algumas ações em ambos contextos.- Exibir mensagem de erro: Vamos supor que foi criada uma regra de negócio que, caso o primeiro nome do contato possua a palavra 'estupido', seja exibida uma mensagem de erro dizendo que o primeiro nome não pode conter devida palavra.
- Client Side: Mensagem definida na regra de negócio apresentada com sucesso.
- Server Side: Quando tentamos incluir um novo registro via SDK, é retornada uma exceção com a mesma mensagem definida na regra de negócio.
- Obrigatoriedade do campo: Caso algum campo seja definido como obrigatório via regra de negócio e o mesmo não seja preenchido no momento da criação:
- Client Side: Mensagem configurada na regra de negocio e apresentada e o usuário e impossibilitado de salvar o registro.
- Server Side: Mensagem configurada na regra de negócio é retornada como exceção no momento na criação do registro.
- Desabilitar campo: Neste cenário, vamos criar uma regra de negócio que bloqueia o campo Sobrenome do contato na criação do registro.
- Client Side: Campo desabilitado, impossibilitando o usuário de inserir alguma informação.
- Server Side: Via SDK conseguimos definir o campo com o valor desejado e o registro foi criado com sucesso.
Conclusão
Além de entender um pouco melhor como se comportam as regras de negócio configuradas com escopo a nível Entidade, podemos perceber que, em alguns casos, podemos até mesmo substituir workflows e plugins por essa nova funcionalidade.
Thursday, September 28, 2017
Ferramentas - Desenvolvedor
Farei aqui uma lista das principais ferramentas, plugins e outros itens que ajudam na produtividade na hora do desenvolvimento.
Vale ressaltar que cada tipo de desenvolvimento requer ferramentas específicas, que podem não ser ideal para os demais. Eu desenvolvo em .Net e extendo a plataforma na qual trabalho (Microsoft Dynamics CRM) utilizando sua biblioteca que é construída em C#, logo, esse será o foco da lista.
- Fiddler - Captura tráficos HTTP e HTTPS. Muito útil no debug de WCFs
Monday, May 23, 2016
Dynamics CRM - Performance TIPs
In this post I will give you a few performance tips that may be the water divison between a good and a bad performance. I've recently been on a client where most of development was done without any performance caring, which has degraded CRM performance significantly, I'm pretty sure that many of you are aware of those practices but for those who don't, here it goes.
Well, without further ado, let's get straight to the point.
- The addition of lookup fields and option sets to a Quick Find can slow system performance and should be avoided especially on large datasets
- Too many fields on Quick Find - How much more fields added slower the search will be performed.
- Retrieve all attributes when performing a query against the database - Try to narrow fields searched only for those you are going to use.
- Plugins on update stage should not be triggered for all fields, only those that make sense.
- Plugins on Retrive and RetriveMultiple message may cause significant delay performance
- For each entityreference field you retrieve a join is made, so avoid it when possible.
- How many more linked entities or joins you make, slower your query will be processed, sometimes it' better to split up the query for performance improvement.
There it is, if you have any tip besides those I've described, please fell free to share!
Curiosity: In Dynamics CRM 2015 the image field is not retrieved when using all attributes tag.
Further information at: http://crmtipoftheday.com/2016/05/05/use-all-attributes-and-miss-some-of-the-data/
References: https://www.google.com/url?hl=pt-BR&q=https://mbs.microsoft.com/customersource/Global/CRM/learning/documentation/user-guides/PerformanceOptimizationsCRMOnlineSuccess&source=gmail&ust=1464145030739000&usg=AFQjCNFdcz7mGhcLYAOnYf6DoiDGPQ_6Ug
Tuesday, March 22, 2016
Dynamics CRM Business Rules TOP 10 Important Points
Here are some important points we should be aware about business rules.
- Dynamics CRM 2015 has introduced a new scope level “Entity”. Setting the scope of the business rule at an entity level, forces the business rule to be executed on both server and all clients side.
- For instance, if Contoso only does business in the United States, a simple business rule can be implemented that on creation of an incoming lead, the country/region is automatically set to U.S.A. If we try through plugin or workflow to create a lead and set country/region different than U.S.A there will be an error and the transaction will be rolled back.
- Setting up lookup fields using business rules.
- If you define a rule to set a lookup to a contact that has the Full Name of ‘Henrique’, this text is the Name you will see in the lookup when it is set by your business rule even if someone later changes the Full Name of the contact to ‘Henrique2’. The lookup Id value will be correctly set to the expected record, but the Name (which is not saved) will reflect the rule definition value rather than the current Full Name value of the record it references. To fix that, you will need then to update the business rule.
- Updated business rules will only be applied on mobile apps when it's re-opened.
- Javascript OnChange event handlers are not triggered if a field value is changed by a business rule.
- You cannot call a Javascript method from a business rule
- Actions cannot apply to fields from related entities.
- Business rules which don’t run due to fields not included on the form will not cause an error, it just won’t run.
- Business rules run only when the form loads and when field values change. They do not run when a record is saved.
- Whole Number fields that use the formats for TimeZone, Duration, or Language will not appear in the rule editor for conditions or actions, so they cannot be used with business rules.
- Business rules cannot show/hide sections or tabs
References
- https://crmbusiness.wordpress.com/2014/10/27/crm-2013-business-rule-workings-limitations-and-exam-notes/
- https://adisys.wordpress.com/2014/12/15/crm2015businessrules/
- https://technet.microsoft.com/en-us/library/dn531086.aspx#BKMK_ServerSideBR
Monday, March 21, 2016
Angular JS - Powerful framework
Hi everyone,
In the today's post, I will give you an example of how powerful is Angular framework.
The link below will lead you to an angular project I have made. It is a simple not-well-structured project, my intention here is not showing you Angular good practices, but give you and idea of how angular might speed up application development.
Project download link: https://www.dropbox.com/s/cy159kheqpxncfa/Angularjs.rar?dl=0
After you have downloaded the project, open it up, check out the basic features within it, try to realize how you would accomplish the same functionalities in .Net, also how much time would you have spent doing that?
I am not an angular expert, however it took me two hours to get it working the way it is right now.
Well, that's it!
Thank you, till next post!
In the today's post, I will give you an example of how powerful is Angular framework.
The link below will lead you to an angular project I have made. It is a simple not-well-structured project, my intention here is not showing you Angular good practices, but give you and idea of how angular might speed up application development.
Project download link: https://www.dropbox.com/s/cy159kheqpxncfa/Angularjs.rar?dl=0
After you have downloaded the project, open it up, check out the basic features within it, try to realize how you would accomplish the same functionalities in .Net, also how much time would you have spent doing that?
I am not an angular expert, however it took me two hours to get it working the way it is right now.
Well, that's it!
Thank you, till next post!
Subscribe to:
Posts (Atom)