Esconder opção do menu flutuante do Dynamics CRM

by Pedro Azevedo 28. January 2015 21:15

Boas pessoal,

Para mexermos no sitemap podemos usar a ferramenta SiteMapEditor eu aqui faço referência a esta ferramenta ou usarmos neste momento a minha favorita a XrmToolBox (prometo fazer uma série de posts a falar sobre os vários plugins desta ferramenta) que tem um plugin com o SiteMap Editor. Com estas ferramentas conseguimos criar mais áreas ou novos menus dentro de uma área.

Caso queiramos esconder um menu de um utilizador teremos que utilizar as roles para que esse utilizador não tenha acesso a essa entidade e assim ele não aparecer no menu flutuante.

E se quisermos esconder um menu com base num valor do formulário, por exemplo esconder as atividades quando o registo está num determinado estado, bem é o que faz o seguinte código:

function hideNavigationButton() {
    var menuSelect = window.top.$("#TabNode_tab0Tab");
 
    if(menuSelect.length == 0)    {
        setTimeout(function () { hideNavigationButton(); }, 1000);
        return;
    }
 
    menuSelect.on("mouseover", hideActivities);
}
 
function hideActivities() {
    var activities = window.top.$("#Node_navActivities");
    if(activities.length == 0) {
        setTimeout(function () { hideActivities(); }, 1000);
        return;
    }
    activities.parent().hide();
}

Neste caso não estou a verificar nenhum dado mas facilmente vocês colocam esse código, para isto funcionar terão que no OnLoad do formulário da entidade chamar o método hideNavigationButton.

Até a próxima.

Tags: , , ,

Enviar email ao antigo owner de um registo

by Administrator 23. January 2015 22:47

Boas pessoal,

Mais um desafio do fórum, desta vez, não fui o primeiro a responder. A pergunta era se era possível enviar um email quando a mudança de owner de um registo, através de Workflow (Fluxo de Trabalho) ou Javascript. Bom a primeira resposta sugere que o melhor é recorrer a plugins e confesso que a primeira vez que li concordei com a afirmação, eu até diria que seria a única hipótese.

Velhos vícios, o mal de ter começado com o CRM 4 e com isso que ainda mantenha algumas soluções dessa altura. Como tenho defendido aqui no blog, deve-se sempre optar por uma solução configurável em vez de uma solução programável, isto porque através de configurações “toda” a gente consegue ler, quer seja uma pessoa técnica ou funcional e na altura de upgrades estes objetos costumam ser mais fáceis de migrar.

Pois bem depois de ter lido esta pergunta uma segunda vez, fez-se um click na minha cabeça e porque não realizar isto com os Fluxos de Trabalho? Pois bem com o CRM 2013 foram introduzidos os Fluxos de Trabalho síncronos, que nos possibilitou por exemplo tratar da numeração automática como podem ver neste post. Com este tipo de Fluxo de Trabalho conseguimos aceder ao valor antigo e ao valor novo e com isso enviar um email ao novo\antigo proprietário.

Vamos ver na prática como o fazemos. Primeiro passo é criar um Fluxo de Trabalho síncrono:

image

Reparem que tiramos o pisco (que por defeito está selecionado) que fazia com que o Fluxo de Trabalho corresse assincronamente. Assim o Fluxo de trabalho torna-se síncrono. Avançando com o processo podemos então criar a notificação ao novo e antigo owner. Caso esqueçamos de retirar o pisco não faz mal porque dentro do Fluxo de Trabalho temos a hipótese de transformar o Fluxo de Trabalho em síncrono e vice-versa.

Mas primeiro temos que dizer ao Fluxo de Trabalho que ele pode correr quando houver alteração de um campo, neste caso como se trata do proprietário, podemos escolher quando o registo é atribuído e informamos que ele deve correr antes de guardar o registo e assim apanhar o valor antigo:

image
Pode parecer estranho mas o nosso Fluxo de Trabalho já está configurado, agora basta criar o email e no campo para enviar vamos colocar o proprietário pois configuramos o Fluxo de Trabalho para correr antes de ser assignado outro proprietário:

image

Uma solução que prometia mais trabalho que se tornou simples por utilizarmos a última novidades da plataforma.

Até a próxima

Tags: , ,

Alterar o owership de uma entidade após a criação

by Pedro Azevedo 13. January 2015 13:15

Boas pessoal,

Recentemente fui confrontado com uma situação de alterar o ownership de uma entidade já criada de organização para utilizador. Bom se estou com trabalho a escrever um post devem imaginar que não é tão simples como ir a entidade e mudar esta propriedades, pois não esta é uma daquelas propriedades que depois da entidade criada já não dá para editar, bom a primeira solução poderia passar em apagar a entidade criada e criar outra já com esta propriedade correta o problema é que já tinha muitas customizações, bem como alguns formulários, por isso teria que seguir outro caminho.

Então fui explorar se conseguia modificar o XML da solução e assim fiz. Inspirado por um post recente do Hosk que explica muito bem esta problemática, ele também propõe uma solução que seria criar uma nova entidade com propriedade utilizador\equipa e transpor todas as customizações já efetudas na entidade de organização para esta nova entidade. O meu objetivo será mostrar quais as diferenças no ficheiro customizations.xml entre uma entidade em que a propriedade seja organização e outra utilizador\equipa.

Primeiro é necessário uma solução que contenha a entidade de propriedade Organização e que queremos transformar numa entidade de propriedade Utilizador\Equipa. Exportamos a solução e depois de descompactar abrimos o ficheiro customizations.xml e façam as seguintes alterações:

Primeiro vamos identificar onde está declarado que a entidade está com propriedade, Organização e está neste atributo:

<OwnershipTypeMask>OrgOwned</OwnershipTypeMask>

Vamos substituir o valor por UserOwned ficando o atributo com este aspeto:

<OwnershipTypeMask>UserOwned</OwnershipTypeMask>

Agora necessitamos de procurar os campos que terão que existir para suportar esta alteração, no xml e dentro da entidade que está com a propriedade Organização existe um nó com esta estrutura:

<attribute PhysicalName="OrganizationId">
  <Type>lookup</Type>
  <Name>organizationid</Name>
  <LogicalName>organizationid</LogicalName>
  <RequiredLevel>none</RequiredLevel>
  <ImeMode>auto</ImeMode>
  <ValidForReadApi>1</ValidForReadApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>1</IsAuditEnabled>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <ReferencedEntityObjectTypeCode>1019</ReferencedEntityObjectTypeCode>
  <LookupTypes />
  <displaynames>
    <displayname description="ID da Organização" languagecode="2070" />
  </displaynames>
  <Descriptions>
    <Description description="Identificador exclusivo para a organização" languagecode="2070" />
    <Description description="Identificador exclusivo da organização" languagecode="1046" />
  </Descriptions>
</attribute>

Devem substituir este atributo pelos 5 atributos a seguir para que seja possível colocar um utilizador ou equipa como proprietário de um registo desta entidade:

<attribute PhysicalName="OwnerId">
  <Type>owner</Type>
  <Name>ownerid</Name>
  <LogicalName>ownerid</LogicalName>
  <RequiredLevel>systemrequired</RequiredLevel>
  <DisplayMask>ValidForAdvancedFind|ValidForForm|ValidForGrid|RequiredForForm</DisplayMask>
  <ImeMode>auto</ImeMode>
  <ValidForUpdateApi>1</ValidForUpdateApi>
  <ValidForReadApi>1</ValidForReadApi>
  <ValidForCreateApi>1</ValidForCreateApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>1</IsAuditEnabled>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <LookupStyle>single</LookupStyle>
  <LookupTypes>
    <LookupType id="00000000-0000-0000-0000-000000000000">8</LookupType>
    <LookupType id="00000000-0000-0000-0000-000000000000">9</LookupType>
  </LookupTypes>
  <displaynames>
    <displayname description="Proprietário" languagecode="2070" />
  </displaynames>
  <Descriptions>
    <Description description="ID do Proprietário" languagecode="2070" />
  </Descriptions>
</attribute>
 
<attribute PhysicalName="OwnerIdName">
  <Type>nvarchar</Type>
  <Name>owneridname</Name>
  <LogicalName>owneridname</LogicalName>
  <RequiredLevel>systemrequired</RequiredLevel>
  <ImeMode>auto</ImeMode>
  <ValidForReadApi>1</ValidForReadApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>0</IsAuditEnabled>
  <IsLogical>1</IsLogical>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <Format>text</Format>
  <MaxLength>100</MaxLength>
  <Length>320</Length>
  <Descriptions>
    <Description description="Nome do proprietário" languagecode="2070" />
  </Descriptions>
</attribute>
 
<attribute PhysicalName="OwnerIdType">
  <Type>int</Type>
  <Name>owneridtype</Name>
  <LogicalName>owneridtype</LogicalName>
  <RequiredLevel>systemrequired</RequiredLevel>
  <DisplayMask>ObjectTypeCode</DisplayMask>
  <ImeMode>disabled</ImeMode>
  <ValidForUpdateApi>1</ValidForUpdateApi>
  <ValidForReadApi>1</ValidForReadApi>
  <ValidForCreateApi>1</ValidForCreateApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>1</IsAuditEnabled>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <Format></Format>
  <MinValue>-2147483648</MinValue>
  <MaxValue>2147483647</MaxValue>
  <Descriptions>
    <Description description="Tipo de ID de Proprietário" languagecode="1046" />
    <Description description="Tipo de ID do Proprietário" languagecode="2070" />
  </Descriptions>
</attribute>
 
<attribute PhysicalName="OwnerIdYomiName">
  <Type>nvarchar</Type>
  <Name>owneridyominame</Name>
  <LogicalName>owneridyominame</LogicalName>
  <RequiredLevel>systemrequired</RequiredLevel>
  <ImeMode>auto</ImeMode>
  <ValidForReadApi>1</ValidForReadApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>0</IsAuditEnabled>
  <IsLogical>1</IsLogical>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <Format>text</Format>
  <MaxLength>100</MaxLength>
  <Length>320</Length>
  <YomiOf>OwnerIdName</YomiOf>
  <Descriptions>
    <Description description="Nome Yomi do proprietário" languagecode="1046" />
    <Description description="Nome yomi do proprietário" languagecode="2070" />
  </Descriptions>
</attribute>
 
<attribute PhysicalName="OwningBusinessUnit">
  <Type>lookup</Type>
  <Name>owningbusinessunit</Name>
  <LogicalName>owningbusinessunit</LogicalName>
  <RequiredLevel>none</RequiredLevel>
  <ImeMode>auto</ImeMode>
  <ValidForReadApi>1</ValidForReadApi>
  <IsCustomField>0</IsCustomField>
  <IsAuditEnabled>0</IsAuditEnabled>
  <IsSecured>0</IsSecured>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <IsRenameable>1</IsRenameable>
  <CanModifySearchSettings>1</CanModifySearchSettings>
  <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
  <CanModifyAdditionalSettings>1</CanModifyAdditionalSettings>
  <SourceType>0</SourceType>
  <ReferencedEntityObjectTypeCode>10</ReferencedEntityObjectTypeCode>
  <LookupStyle>single</LookupStyle>
  <LookupTypes />
  <displaynames>
    <displayname description="Unidade de Negócio Proprietária" languagecode="2070" />
    <displayname description="Unidade de Negócios Proprietária" languagecode="1046" />
  </displaynames>
  <Descriptions>
    <Description description="Identificador exclusivo da unidade de negócios proprietária do registro" languagecode="1046" />
    <Description description="Identificador rtwexclusivo para a unidade de negócio proprietária do registo" languagecode="2070" />
  </Descriptions>
</attribute>

Criados os campos agora necessitamos de criar as relações para as entidades respetivas, aqui temos que ter cuidado com determinados valores (está assinalado amarelo os valores que temos que ter em consideração), a primeira coisa a fazer é procurar a relação entre a nossa entidade e a entidade Organização que tem a seguinte estrutura:

<EntityRelationship Name="organization_new_entityorganization">
  <EntityRelationshipType>OneToMany</EntityRelationshipType>
  <IsCustomizable>1</IsCustomizable>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsHierarchical>0</IsHierarchical>
  <ReferencingEntityName>new_entityorganization</ReferencingEntityName>
  <ReferencedEntityName>Organization</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OrganizationId</ReferencingAttributeName>
  <RelationshipDescription>
    <Descriptions>
      <Description description="Identificador exclusivo para a organização" languagecode="2070" />
      <Description description="Identificador exclusivo da organização" languagecode="1046" />
    </Descriptions>
  </RelationshipDescription>
  <field name="organizationid" requiredlevel="none" imemode="auto" format="">
    <IsCustomizable>1</IsCustomizable>
    <IsRenameable>1</IsRenameable>
    <CanModifySearchSettings>1</CanModifySearchSettings>
    <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
    <IsSecured>0</IsSecured>
    <IsAuditEnabled>1</IsAuditEnabled>
    <displaynames>
      <displayname description="ID da Organização" languagecode="2070" />
    </displaynames>
  </field>
</EntityRelationship>

Temos que substituir a relação acima com as seguintes relações, atenção que novamente amarelo estão valores que terão que modificar mediante a vossa realidade:

<EntityRelationship Name="owner_new_entityorganization">
  <EntityRelationshipType>OneToMany</EntityRelationshipType>
  <IsCustomizable>1</IsCustomizable>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsHierarchical>0</IsHierarchical>
  <ReferencingEntityName>new_entityorganization</ReferencingEntityName>
  <ReferencedEntityName>Owner</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwnerId</ReferencingAttributeName>
  <RelationshipDescription>
    <Descriptions>
      <Description description="ID do Proprietário" languagecode="2070" />
    </Descriptions>
  </RelationshipDescription>
  <field name="ownerid" requiredlevel="systemrequired" imemode="auto" lookupstyle="single" lookupbrowse="0" format="" lookuptypes="8, 9">
    <IsCustomizable>1</IsCustomizable>
    <IsRenameable>1</IsRenameable>
    <CanModifySearchSettings>1</CanModifySearchSettings>
    <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
    <IsSecured>0</IsSecured>
    <DisplayMask>ValidForAdvancedFind|ValidForForm|ValidForGrid|RequiredForForm</DisplayMask>
    <IsAuditEnabled>1</IsAuditEnabled>
    <displaynames>
      <displayname description="Proprietário" languagecode="2070" />
    </displaynames>
  </field>
</EntityRelationship>
 
<EntityRelationship Name="team_new_entityorganization">
  <EntityRelationshipType>OneToMany</EntityRelationshipType>
  <IsCustomizable>1</IsCustomizable>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsHierarchical>0</IsHierarchical>
  <ReferencingEntityName>new_entityorganization</ReferencingEntityName>
  <ReferencedEntityName>Team</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwningTeam</ReferencingAttributeName>
  <RelationshipDescription>
    <Descriptions>
      <Description description="Identificador exclusivo para a equipa proprietária do registo." languagecode="2070" />
      <Description description="Identificador exclusivo da equipe que possui o registro." languagecode="1046" />
    </Descriptions>
  </RelationshipDescription>
  <field name="owningteam" requiredlevel="none" imemode="auto" lookupstyle="single" lookupbrowse="0" format="">
    <IsCustomizable>1</IsCustomizable>
    <IsRenameable>1</IsRenameable>
    <CanModifySearchSettings>1</CanModifySearchSettings>
    <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
    <IsSecured>0</IsSecured>
    <IsAuditEnabled>0</IsAuditEnabled>
    <displaynames>
      <displayname description="Equipa Proprietária" languagecode="2070" />
      <displayname description="Equipe Proprietária" languagecode="1046" />
    </displaynames>
  </field>
</EntityRelationship>
 
<EntityRelationship Name="user_new_entityorganization">
  <EntityRelationshipType>OneToMany</EntityRelationshipType>
  <IsCustomizable>1</IsCustomizable>
  <IntroducedVersion>1.0.0.0</IntroducedVersion>
  <IsHierarchical>0</IsHierarchical>
  <ReferencingEntityName>new_entityorganization</ReferencingEntityName>
  <ReferencedEntityName>SystemUser</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwningUser</ReferencingAttributeName>
  <RelationshipDescription>
    <Descriptions>
      <Description description="Identificador exclusivo para o utilizador proprietário do registo." languagecode="2070" />
      <Description description="Identificador exclusivo do usuário proprietário do registro." languagecode="1046" />
    </Descriptions>
  </RelationshipDescription>
  <field name="owninguser" requiredlevel="none" imemode="auto" lookupstyle="single" lookupbrowse="0" format="">
    <IsCustomizable>1</IsCustomizable>
    <IsRenameable>1</IsRenameable>
    <CanModifySearchSettings>1</CanModifySearchSettings>
    <CanModifyRequirementLevelSettings>1</CanModifyRequirementLevelSettings>
    <IsSecured>0</IsSecured>
    <IsAuditEnabled>0</IsAuditEnabled>
    <displaynames>
      <displayname description="Utilizador Proprietário" languagecode="2070" />
      <displayname description="Usuário Proprietário" languagecode="1046" />
    </displaynames>
  </field>
</EntityRelationship>

Estas são as alterações que tem que fazer para mudar a propriedade de uma entidade.

Até a próxima.

Tags: , ,

Sou um Microsoft MVP!!!!!

by Administrator 3. January 2015 17:16

Boas pessoal,

Este ano não poderia ter começado melhor, confesso que não estava a espera, mas fui nomeado Microsoft MVP para o produto Dynamics CRM. Foi com uma grande alegria que recebi esta nomeação que recebo com todo o agrado. E um ótimo incentivo para continuar a colaborar com a comunidade.

Foi engraçado que no primeiro dia do ano não estava nada a espera e fui comemorar o ano novo para a casa dos meus pais. Quando cheguei a casa a noite a primeira coisa foi ver o twitter e comecei a dar os parabéns a muitas pessoas que estão conectadas comigo. Quando vou verificar o email nem acredito que tenho este email na minha caixa de correio:

Posso-vos garantir que ainda estou a tremer. Quero agradecer a toda a comunidade e um abraço especial aos meus amigos Diogo Rito e Thiago Lima que sei que me nomearam diretamente.

 

Já agora BOM ANO para todos vocês.

 

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