Informações para Workshop do Portugal a Programar

by Pedro Azevedo 22. May 2013 22:24

Boas Pessoal,

Dia 25 de Maio vou realizar uma apresentação e um workshop no primeiro evento da comunidade Portugal a Programar. Para aproveitarmos melhor este workshop deixo aqui um guia para criar uma conta CRM Online e o projecto Java para fazer download.

 

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: , ,

Customizar caixa de pesquisa de um lookup

by Pedro Azevedo 29. April 2013 00:49

Boas pessoal,

Uma das perguntas mais realizadas na comunidade é como modificar a janela de pesquisa de um lookup. Vamos ver as várias maneiras de customizar esta janela.

Por exemplo na entidade contacto temos um lookup para dizer qual o cliente que está afecto, podemos escolher entre a entidade cliente e contacto:

A entidade por defeito é o cliente e se quisermos que a entidade por defeito seja a entidade contacto, então podemos fazer isto:

document.getElementById("parentcustomerid").setAttribute("defaulttype", "2");

E o resultado é este:


Se quisermos dizer que a entidade contacto não faz sentido neste caso então podemos limitar a escolha a apenas a entidade cliente:

document.getElementById("parentcustomerid").setAttribute("lookuptypes", "1");

Vejam o resultado:

Agora imaginem que em vez de restringir quero colocar outra entidade, por exemplo o cliente potencial:

document.getElementById("parentcustomerid").setAttribute("lookuptypes", "1, 2, 4");

document.getElementById("parentcustomerid").setAttribute("lookuptypenames", "account:1,contact:2,lead:4");

document.getElementById("parentcustomerid").setAttribute("lookuptypeIcons", "/_imgs/ico_16_2.gif:/_imgs/ico_16_4.gif:/_imgs/ico_16_8.gif");

 

Neste caso estamos a dizer quais as entidades, os nomes das entidades e os respectivos icons, vejam o resultado:

 

Agora quero desabilitar a escolha de uma vista:

document.getElementById("parentcustomerid").setAttribute("disableViewPicker", "1");

Vejam o resultado:

Agora quero mudar qual a vista por defeito:

Xrm.Page.getControl("parentcustomerid").setDefaultView("00000000-0000-0000-00AA-000010001033");

Vejam o resultado:

 Todo este código pode ser colocado no evento onload do formulário.

 

Algumas perguntas poderão estar a ser feitas:

·         Que código são estes 1, 2 e 4?

São os códigos das entidades, eu neste post criei apenas para referência rápida sobre estes códigos.

·         Como posso obter o guid de uma vista?

Temos algumas hipóteses, abrir a vista para editar e copiar o id do URL. Estando a ver os registos de uma vista podemos carregar em “Copiar uma Hiperligação” e escolher opção “da Vista Actual”

Ainda existe outro método o addCustomView que está explicado neste post.

 

Espero que estas dicas rápidas sejam úteis.

 

Até a próxima

Tags: , , , ,

Bug - User does not have send-as privilege

by Pedro Azevedo 20. April 2013 23:26

Boas pessoal,

Esta semana perdi umas boas horitas atrás de um problema que ocorreu e que a sua resolução era muito fácil. Num cliente entrou um utilizador novo e as notificações geradas por aquele utilizador ficavam no estado rascunho.

Ao abrir a actividade esta estava no estado rascunho e ao tentar enviar novamente lançava um erro a dizer que não tinha permissões para o fazer e eu estava como administrador de sistema.

Uma visita ao trace do CRM deparei-me com a seguinte exceção:

“Crm Exception: Message: User does not have send-as privilege.”

A primeira verificação foi visualizar se as definições do utilizador, como por exemplo como estava configurado o acesso ao email e se tinha o email aprovado para poder enviar emails. Estava tudo bem. E no perfil deste utilizador não encontrei mais nada. Fui olhar para as roles que esse utilizador tinha e não consegui descobrir nenhuma que deve o tipo de permissão que o log referia.

Mas eu sabia que isto dava para colocar de alguma maneira. Por curiosidade fui ver o meu próprio perfil e confirmei que havia uma configuração para isto, vejam na imagem:

Mas atenção que caso o utilizador não tenha configurado o Email Router no Outgoing este setting não aparece como podem ver:

 

A solução então passava pelo utilizador ativar esta permissão, fui o que fiz e resultou.

Mas depois de resolver fui explorar melhor esta situação e aqui estou a documentar. Primeiramente quando é que isto acontece? Quando por exemplo fazemos um impersionate do utilizador e aí estamos a enviar um email por exemplo com um administrador mas quem vai oficialmente no enviar é outro utilizador. Isto também pode acontecer nos emails enviados em workflows.

Mas esta solução nem sempre é possível por isso explorei ao nível da base de dados onde estaria esta configuração. E com a query que apresento a seguir podemos dar esse previlégio a todos os utilizadores, ou para um utilizador especifico:

UPDATE UserSettings
SET IsSendAsAllowed = 1

Outra solução é a utilização de uma ferramenta que permite actualizar os settings dos utilizadores a ferramenta é esta.

Até a próxima.

Tags: , ,

Orador na 38ª Reunião da Comunidade NetPonto

by Administrator 12. April 2013 21:55

Boas pessoal

No próximo dia 20 de Abril irei falar sobre Microsoft Dynamics CRM 2011 na habitual reunião mensal da Comunidade NetPonto. Será a minha primeira aventura de falar em público por isso será um bom teste.

 

O título da minha sessão será: X(C)RM como plataforma de desenvolvimento rápido. Terá como objectivo apresentar o Microsoft Dynamics CRM 2011, a sua arquitectura e principais funcionalidade que podem tornar como uma plataforma de desenvolvimento rápido. Esta plataforma tem um nome: xRM.

No mesmo dia o Glauco Godoi irá fazer uma apresentação sobre ASP .NET SignalR. Sem dúvida que valerá o esforço de acordar cedo no sábado de manhã. Vejam aqui mais informações sobre as duas sessões e como se podem inscrever.

Até a próxima.

Tags: , ,

Referência Rápida - Códigos de Entidade

by Pedro Azevedo 7. April 2013 23:34

Boas pessoal,

Hoje vou criar um post que principalmente me vai ser muito útil já que de vez em quando procuro por esta informação. Todas as entidades no CRM têm um código que representa essa entidade. Uma maneira de descobrir o código é ver no URL o código que vem a seguir ao texto:

&etc=<entity_type_code>

Outra maneira de aceder a este código é realizar por exemplo uma query directa a base de dados:

select Name, ObjectTypeCode from EntityView order by ObjectTypeCode

Obtém-se a seguinte lista:

Entity Name

Object Type Code

Account

1

Contact

2

Opportunity

3

Lead

4

Annotation

5

BusinessUnitMap

6

Owner

7

SystemUser

8

Team

9

BusinessUnit

10

PrincipalObjectAccess

11

RolePrivileges

12

SystemUserLicenses

13

SystemUserPrincipals

14

SystemUserRoles

15

AccountLeads

16

ContactInvoices

17

ContactQuotes

18

ContactOrders

19

ServiceContractContacts

20

ProductSalesLiterature

21

ContactLeads

22

TeamMembership

23

LeadCompetitors

24

OpportunityCompetitors

25

CompetitorSalesLiterature

26

LeadProduct

27

RoleTemplatePrivileges

28

Subscription

29

FilterTemplate

30

PrivilegeObjectTypeCodes

31

SalesProcessInstance

32

SubscriptionSyncInfo

33

SubscriptionTrackingDeletedObject

35

ClientUpdate

36

SubscriptionManuallyTrackedObject

37

TeamRoles

40

PrincipalEntityMap

41

SystemUserBusinessUnitEntityMap

42

PrincipalAttributeAccessMap

43

PrincipalObjectAttributeAccess

44

PrincipalObjectAccessReadSnapshot

90

RecordCountSnapshot

91

Incident

112

Competitor

123

DocumentIndex

126

KbArticle

127

Subject

129

BusinessUnitNewsArticle

132

ActivityParty

135

UserSettings

150

ActivityMimeAttachment

1001

Attachment

1002

InternalAddress

1003

CompetitorAddress

1004

CompetitorProduct

1006

Contract

1010

ContractDetail

1011

Discount

1013

KbArticleTemplate

1016

LeadAddress

1017

Organization

1019

OrganizationUI

1021

PriceLevel

1022

Privilege

1023

Product

1024

ProductAssociation

1025

ProductPriceLevel

1026

ProductSubstitute

1028

SystemForm

1030

UserForm

1031

Role

1036

RoleTemplate

1037

SalesLiterature

1038

SavedQuery

1039

StringMap

1043

UoM

1055

UoMSchedule

1056

SalesLiteratureItem

1070

CustomerAddress

1071

SubscriptionClients

1072

StatusMap

1075

DiscountType

1080

KbArticleComment

1082

OpportunityProduct

1083

Quote

1084

QuoteDetail

1085

UserFiscalCalendar

1086

SalesOrder

1088

SalesOrderDetail

1089

Invoice

1090

InvoiceDetail

1091

SavedQueryVisualization

1111

UserQueryVisualization

1112

RibbonTabToCommandMap

1113

RibbonContextGroup

1115

RibbonCommand

1116

RibbonRule

1117

RibbonCustomization

1120

RibbonDiff

1130

ReplicationBacklog

1140

FieldSecurityProfile

1200

FieldPermission

1201

SystemUserProfiles

1202

TeamProfiles

1203

 

As entidades nativas têm um valor abaixo do 10000 e as customizadas acima deste valor.

Mantenham este post nos vossos favoritos.

 

Até a próxima.

Tags: , , ,

CRM 2011 - UR13

by Pedro Azevedo 30. March 2013 00:23

 Boas pessoal,

Está disponível o Update Rollup 13 (UR13), descarreguem aqui. Todas as informações estão disponíveis aqui com todos os dados e todas as novidades.

Tenho a realçar como nova funcionalidade o suporte ao Microsoft SQL Server 2012, ficou também disponível como poderemos então migrar para esta versão do SQL Server.

 

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: , , , , ,

Novidades sobre UR12 e Polaris

by Pedro Azevedo 22. February 2013 01:43

 

Boas Pessoal,

Hoje venho falar de mais recente rollup este é um major release apelidado de Polaris, vem ultrapassar uma das grandes queixas dos utilizadores e das equipas de TI era a necessidade de utilização do Internet Explorer. Vem ultrapassar esta dificuldade mas na minha opinião vem criar uma entropia com a mudança de alguns formulários, tais como, Clientes Potenciais, Contactos, Contas, Oportunidades e Incidentes.

A disponibilização deste rollup não foi fácil com uma primeira saída (10 de Janeiro) a não correr bem tendo sido retirado e ter que esperar mais algum tempo (29 de Janeiro) para podermos usar a nova versão no ambiente on-premise pois na versão online foi colocada em 21 de Janeiro.

Os browsers que vão passar a ser compatíveis são: Firefox, Chrome e Safari no Mac. Para além de suportar múltiplos browsers e da nova interface também traz como novidades ao nível do suporte para o Office 2013, integração nativa com skype (parece ser a ferramenta de eleição para comunicação) e mapas do bing.

Para saber todas as novidades do Polaris sugiro vivamente a ver os slides do Jukka Niiranen.

Existe uma diferença que eu gostava de esclarecer e que para mim também foi confuso, Polaris e UR12, pode parecer a mesma coisa mas não é, pois o Polaris é o nome do novo release para o CRM Online e o UR12 é o novo update rollup do CRM 2011. Aliás o “único” ponto em comum será a compatibilidade multi-browser.

Comparando com o que tinha sido previsto deixou-se cair a compatibilidade com iPad e adicionou-se a compatibilidade com o Windows 8.1:

 

E o que muda para nós programadores, MUITO. Para garantirmos a compatibilidade entre browsers temos que esquecer definitivamente a utilização do object model do javascript para o CRM 4.0 bem como a chamada SOAP feitas com ActiveXObject. Para validar este tipo de código podemos recorrer a esta ferramenta.

Existem também várias limitações nos novos formulários do UR12 já que por exemplo a impossibilidade de usar Javascript neste novos formulários. Uma das alternativas é voltar aos classic forms, veja aqui como. Para ver a totalidade de limitações pode ver neste blog.

Este rollup está disponível aqui sendo que este é o KB.

 

Até a próxima

 

Fontes:

http://niiranen.eu/crm/2013/01/whats-new-in-microsoft-dynamics-crm-polaris-release-slides/

http://blogs.msdn.com/b/crminthefield/archive/2013/01/29/podcast-and-overview-microsoft-dynamics-crm-2011-update-rollup-12.aspx

http://support.microsoft.com/kb/2784954

https://community.dynamics.com/crm/b/mscrmshop/archive/2013/03/15/how-to-switch-between-classic-and-new-process-flow-forms-in-crm-polaris.aspx

Tags: , , ,

Como modificar o filtro de um lookup no Dynamics CRM 2011

by Pedro Azevedo 11. February 2013 10:50

Boas pessoal,

Foi-me reportado um problema na escolha dos produtos no pipeline de vendas, aquando da escolha do produto estavam aparecer produtos inativos, ou seja, listava todos os produtos sem filtro. Bem este será o mote para apresentar várias soluções que segui para poder resolver este problema.

 

Aparentemente este problema seria de fácil resolução, primeira tentativa modificar a vista que esta associado por defeito ao lookup. Para acedermos a esta configuração, vamos a customização do formulário e duplo click no lookup e aparece a caixa em baixo. Mas esta (como podem verificar) encontrava-se bloqueada, vejam na imagem:

 

A segunda opção foi modificar esta vista e colocar mais um critério que seria o produto estar activo. Para isso teremos que ir a entidade produto e escolher a vista, infelizmente não é possível editar os critérios de pesquisa, veja na imagem:

Mais uma vez a solução não poderá ser aplicada. Tinha na manga uma última solução, para isso teria que recorrer ao Javascript.

O objectivo será adicionarmos uma nova vista por intermédio do Javascript com os critérios que queremos e depois colocar essa vista como defeito, já que não conseguimos seleccionar a vista.

 

O primeiro passo é criar este filtro no Advanced Find:

Quando abrimos o XML temos este aspecto: 

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="product">
    <attribute name="name" />
    <attribute name="productnumber" />
    <attribute name="ret_codigofinanceiro" />
    <attribute name="productid" />
    <order attribute="name" descending="false" />
    <filter type="and">
      <condition attribute="statecode" operator="eq" value="0" />
    </filter>
  </entity>
</fetch>

 

De seguida temos que definir qual o layout da nossa vista:

<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>
  <row name='result' id='productid'>
    <cell name='name' width='300' />
    <cell name='productnumber' width='100' />
    <cell name='ret_codigofinanceiro' width='100' />
  </row>
</grid>

 

Agora teremos que aplicar dois métodos que nos vai possibilitar inserir a vista e coloca-la como a vista por defeito.

Para adicionar uma nova vista utilizamos a função addCustomView que tem a seguinte assinatura:

controlObj.addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, isDefault)

 

Vejam aqui mais detalhes sobre esta função.

Para colocar esta vista como a vista por defeito teremos que utilizar a função setDefaultView (já agora para podermos obter a vista por defeito temos a função getDefaultView) com a seguinte assinatura:

controlObj.setDefaultView(viewGuid)

 

Vejam aqui mais detalhes.

Vejam a seguir todo o código:

NOTA: Quando vamos colocar o FetchXML em código Javascript devemos substituir as aspas por plicas:

 

var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
                        "<entity name='product'>" +
                            "<attribute name='name' />" +
                            "<attribute name='productnumber' />" +
                            "<attribute name='ret_codigofinanceiro' />" +
                            "<attribute name='productid' /> " +
                            "<order attribute='name' descending='false' />" +
                            "<filter type='and'>" +
                                "<condition attribute='statecode' operator='eq' value='0' />" +
                            "</filter>" +
                        "</entity>" +
                   "</fetch>";
 
var layoutXml = "<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
                        "<row name='result' id='productid'>" +
                            "<cell name='name' width='300' />" +
                            "<cell name='productnumber' width='100' />" +
                            "<cell name='ret_codigofinanceiro' width='100' />" +
                        "</row>" +
                    "</grid>";
 
var viewId = "{1DFB2B35-B07C-44D1-868D-258DEEAB88E2}";
var entityName = "product";
var viewDisplayName = "Produtos Activos";
 
Xrm.Page.getControl("productid").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, true);
Xrm.Page.getControl("productid").setDefaultView(viewId);

 

NOTA: Esta abordagem pode ser reutilizada em outras situações, imaginem que podem por exemplo filtrar um lookup com base noutro valor do formulário. Para isso bastava por exemplo no FetchXml substituir o 0 por uma expressão válida.

 

Até aqui tudo bem o problema é que a história não terminou por aqui, como no lookup a seleção da vista está desativa o código acima não vai fazer nada, porque o controlo está disabled. A solução passa por habilitar este campo momentaneamente e executar o nosso código e coloca-la novamente no seu estado anterior.

Para isso recorri ao jQuery para realizar esta operação. Não se esqueçam que têm que adicionar a biblioteca do jQuery como WebResource e depois referenciá-la no formulário, há tempos escrevi um post de como adicionar esta e outras bibliotecas, vejam aqui.

Complementem o código anterior com isto:

 

//…
//o mesmo código
 
$("#productid").attr("disableViewPicker", "0");
Xrm.Page.getControl("productid").addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, true);
Xrm.Page.getControl("productid").setDefaultView(viewId);
$("#productid").attr("disableViewPicker", "1");

 

Para finalizar pegamos no código completo e colocámos o mesmo dentro de uma função de depois dentro de um WebResource. Nas propriedades do formulário (que contém o lookup) acrescentamos este WebResource e depois adicionamos um novo processamento no evento OnLoad do formulário para executar o método.

Até a próxima.

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