Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: Project Operations Integrated com ERP, Project Operations Core.
O Dynamics 365 Project Operations suporta a capacidade de copiar um projeto e reverter quaisquer atribuições para os recursos genéricos que representam o papel. Use esta funcionalidade para construir modelos básicos de projetos.
Quando seleciona Copiar Projeto, o sistema atualiza o estado do projeto-alvo. Utilize Razão do Estado para determinar quando a ação da cópia está concluída. Selecionar Copiar Projeto também atualiza a data de início do projeto para a data de início atual se o sistema não detetar uma data-alvo na entidade do projeto-alvo.
Para adicionar mais colunas a copiar da entidade Projeto, adicione essas colunas à vista Copiar Colunas do Projeto na entidade Projeto e, em seguida, execute a API CopyProjectEntityAttributesRequest através de um plug-in ou fluxo. Esta API copia os dados nas colunas na vista Copiar Colunas do Projeto do projeto de origem especificado para o projeto de destino. Deve chamar esta API separadamente da chamada à API CopyProjectV3 ou V4.
Para adicionar mais colunas para copiar dos atributos de Tarefa de Projeto, adicione essas colunas na vista Copiar Colunas de Tarefa de Projeto na tabela de Tarefas de Projeto para garantir que as colunas sejam copiadas para as novas Tarefas de Projeto quando executar CopyProjectV3 ou V4.
Ação personalizada Copiar Projeto v3
Nome
msdyn_CopyProjectV3
Parâmetros de entrada
Existem três parâmetros de entrada:
ReplaceNamedResources ou ClearTeamsAndAssignments – Defina apenas uma destas opções. Não defina ambas.
- {"ReplaceNamedResources":true} – O comportamento padrão para Project Operations. Substitui quaisquer recursos nomeados por recursos genéricos. A única exceção é que as atribuições ao Gestor de Projetos no projeto de origem são atribuídas ao Gestor de Projetos do projeto de destino (é necessário um recurso nomeado, e não um recurso genérico).
- {"ClearTeamsAndAssignments":true} – O comportamento predefinido para o Project for the Web. Remove todas as atribuições e todos os membros da equipa.
SourceProject – A referência da entidade do projeto de origem a copiar. Não definas este parâmetro como nulo.
Target – A referência da entidade do projeto de destino para onde copiar. Não definas este parâmetro como nulo.
A tabela seguinte apresenta um resumo dos três parâmetros.
| Parâmetro | Tipo | valor |
|---|---|---|
| ReplaceNamedResources | booleano | Verdadeiro ou Falso |
| ClearTeamsAndAssignments | booleano | Verdadeiro ou Falso |
| SourceProject | Referência de Entidade | O projeto de origem |
| Target | Referência de Entidade | O projeto de destino |
Para mais predefinições sobre ações, consulte Utilizar ações API Web.
Validações
O sistema realiza as seguintes validações:
Verifica valores nulos e recupera os projetos de origem e destino para confirmar que ambos os projetos existem na organização.
Valida que o projeto-alvo é válido para cópia, verificando as seguintes condições:
- O projeto é novo e não tem qualquer atividade anterior, incluindo a seleção do separador Tarefas .
- O projeto não tem uma cópia anterior, não foi solicitada qualquer importação para este projeto, e o projeto não tem um estado de Falhado .
A operação não é chamada utilizando HTTP.
Ação personalizada Copiar Projeto v4
Nome
msdyn_CopyProjectV4
Parâmetros de entrada
Use cinco parâmetros de entrada:
SourceProject – A referência da entidade do projeto de origem a copiar. Não definas este parâmetro como nulo.
Target – A referência da entidade do projeto de destino para onde copiar. Não definas este parâmetro como nulo.
TeamMemberOption – A opção para copiar membros da equipa para o projeto de destino. Não definas este parâmetro como nulo.
- 0 — Não copiar membros da equipa.
- 1 — Copie membros da equipa como recursos genéricos (comporta-se da mesma forma que na V3).
- 2 – Copiar membros da equipa para recursos nomeados ou genéricos especificados.
TeamMembers – A coleção de entidades dos membros da equipa nomeada ou genéricos para substituir os membros da equipa existentes. Defina este parâmetro para nulo se selecionar 0 ou 1 para o parâmetro TeamMemberOption . Não definas este parâmetro para nulo se selecionares 2.
TeamMembersMapping – O dicionário de cadeia JavaScript Object Notation (JSON) que mapeia os membros da equipa do projeto de origem para o projeto de destino. Por cada entrada, a chave é o valor ProjectTeamID do membro da equipa do projeto de origem e o valor é o valor ProjectTeamID do membro da equipa do projeto de destino. Todas as atribuições no projeto de origem do membro da equipa do projeto de origem identificado são atribuídas ao membro da equipa do projeto de destino identificado no projeto de destino. Vários membros da equipa do projeto de origem podem ser mapeados para um membro da equipa do projeto de destino. Defina este parâmetro para nulo se selecionar 0 ou 1 para o parâmetro TeamMemberOption . É opcional se escolheres dois.
A tabela seguinte apresenta um resumo dos cinco parâmetros.
| Parâmetro | Tipo | valor |
|---|---|---|
| SourceProject | Referência de Entidade | O projeto de origem |
| Target | Referência de Entidade | O projeto de destino |
| TeamMemberOption | Conjunto de Opções | 0, 1 ou 2 |
| TeamMembers | Coleção de Entidades | Membros da equipa nomeados ou genéricos para o projeto de destino |
| TeamMembersMapping | Cadeia Json | O dicionário que mapeia os membros da equipa do projeto de origem para o projeto de destino |
Para mais predefinições sobre ações, consulte Utilizar ações API Web.
Validações
O sistema realiza as seguintes validações:
Verifica valores nulos e recupera os projetos de origem e destino para confirmar que ambos os projetos existem na organização.
Valida que todos os membros da equipa tanto no parâmetro TeamMembers como no parâmetro TeamMemberMapping são válidos.
Valida que o projeto-alvo é válido para cópia, verificando as seguintes condições:
- O projeto é novo e não tem qualquer atividade anterior, incluindo a seleção do separador Tarefas .
- O projeto não tem nenhuma cópia anterior, não foi solicitada importação para este projeto, e o projeto não tem o estado de Falhado .
Verifica se a operação não é chamada usando HTTP.
Especificar campos a copiar
Quando chama a ação, Copiar Projeto verifica a vista do projeto Copiar Colunas do Projeto para determinar os campos a copiar quando o projeto é copiado.
Example
O exemplo que se segue mostra como chamar a ação personalizada CopyProjectV3 com o parâmetro removeNamedResources definido.
{
using System;
using System.Runtime.Serialization;
using Microsoft.Xrm.Sdk;
using Newtonsoft.Json;
public class CopyProjectSample
{
private IOrganizationService organizationService;
public CopyProjectSample(IOrganizationService organizationService)
{
this.organizationService = organizationService;
}
public void SampleRun()
{
// Example source project GUID
Guid sourceProjectId = new Guid("11111111-1111-1111-1111-111111111111");
var sourceProject = new Entity("msdyn_project", sourceProjectId);
Entity targetProject = new Entity("msdyn_project");
targetProject["msdyn_subject"] = "Example Project - Copy";
targetProject.Id = organizationService.Create(targetProject);
CallCopyProjectAPI(sourceProject.ToEntityReference(), targetProject.ToEntityReference(), copyOption, true, false);
Console.WriteLine("Done ...");
}
private void CallCopyProjectAPI(EntityReference sourceProject, EntityReference TargetProject, bool replaceNamedResources = true, bool clearTeamsAndAssignments = false)
{
OrganizationRequest req = new OrganizationRequest("msdyn_CopyProjectV3");
req["SourceProject"] = sourceProject;
req["Target"] = TargetProject;
if (replaceNamedResources)
{
req["ReplaceNamedResources"] = true;
}
else
{
req["ClearTeamsAndAssignments"] = true;
}
OrganizationResponse response = organizationService.Execute(req);
}
}
}
Example
O exemplo que se segue mostra como chamar a ação personalizada CopyProjectV4 onde o parâmetro TeamMemberOption é definido como 2, e são enviados os valores TeamMembers e TeamMembersMapping.
/* To simplify, the sample code below does not contain code to setup source project, create target project, etc.
* The sample code demonstrates calling Copy Project V4 with option to pass in team members for creation and mapping.
*
* IN THE BELOW CODE EXAMPLE:
* sourceProjectRef is the EntityReference of the source project to copy.
* targetProjectRef is the target project, target project must be created before calling the API.
* Target project should be created empty without doing any further setup like adding team members, tasks, etc.
* toBeCreatedTargetTeamMembers is an EntityCollection of team members to be created in the target project
* as part of the copy and mapping.
* teamMembersMapping is a Dictionary<Guid, Guid> of the team member mapping between source and target project.
* Key is the ID of a source team member; Value is the ID of the target team member.
* */
var request = new OrganizationRequest("msdyn_CopyProjectV4");
request["Target"] = targetProjectRef;
request["SourceProject"] = sourceProjectRef;
request["TeamMemberOption"] = new OptionSetValue(2); // 0: None, 1: CopyAsGeneric, 2: Specify
request["TeamMembers"] = toBeCreatedTargetTeamMembers;
request["TeamMembersMapping"] = SerializeJson(teamMembersMapping); // See implementation of SerializeJson() method below
OrganizationService.Execute(request);
/* Sample serialized json for team member mapping:
'[
{"Key":"a2cee002-cca1-41a4-8821-09d8327741e9","Value":"32c55ac0-06d6-4809-bcdb-566635576e1e"},
{"Key":"b2cee002-cca1-41a4-8821-09d8327741e0","Value":"42c55ac0-06d6-4809-bcdb-566635576e10"},
]'
*/
string SerializeJson<T>(T obj)
{
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
using (Stream stream = new MemoryStream())
{
serializer.WriteObject(stream, obj);
stream.Position = 0;
StreamReader streamReader = new StreamReader(stream);
return streamReader.ReadToEnd();
}
}
/* Optional code to wait for the copy to complete as the main work is done in Async service.
* To see details on error, go to PSS Error Logs and/or Settings > System Jobs.
* */
EnsureProjectCopySuccessful(targetProjectRef);
void EnsureProjectCopySuccessful(EntityReference project)
{
var start = DateTime.Now;
do
{
Thread.Sleep(TimeSpan.FromSeconds(10));
var updatedProject = OrganizationService.Retrieve(Project.EntityLogicalName, project.Id, new ColumnSet(Project.AttributeStatuscode))
.ToEntity<Project>();
if (updatedProject.statuscode.Value == (int)project_statuscode.Projectcopyfailed)
{
throw new Exception("Project Copy failed.");
}
else if (updatedProject.statuscode.Value == (int)project_statuscode.Active)
{
break;
}
if (DateTime.Now > start + TimeSpan.FromMinutes(5))
{
throw new TimeoutException("Copy Project timed out");
}
}
while (true);
}