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

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

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