Dynamics crm 如何在Dynamics 365中将活动(邮件、笔记等)从一个联系人转移到另一个联系人

Dynamics crm 如何在Dynamics 365中将活动(邮件、笔记等)从一个联系人转移到另一个联系人,dynamics-crm,microsoft-dynamics,dynamics-365,Dynamics Crm,Microsoft Dynamics,Dynamics 365,由于我们内部用户的一些不良做法。我们需要将所有活动(邮件、笔记等)从一个联系人转移到另一个联系人。我试图通过UI实现这一点,但我找不到一种方法来实现 这可能吗?我正在寻找任何方法来实现这一点,无论是CRMTool、SSIS、UI还是任何其他方法。只有管理员会这样做,所以我们不需要任何花哨的东西,因为每年可能会做4次来清理一些数据 非常感谢:) 尝试使用UI,但没有成功。我可以想出两种方法来进行这些更新 第一种方法是选择列出所有者(即所有电话)的活动视图并导出到Excel。这将下载一个XLSX,其

由于我们内部用户的一些不良做法。我们需要将所有活动(邮件、笔记等)从一个联系人转移到另一个联系人。我试图通过UI实现这一点,但我找不到一种方法来实现

这可能吗?我正在寻找任何方法来实现这一点,无论是CRMTool、SSIS、UI还是任何其他方法。只有管理员会这样做,所以我们不需要任何花哨的东西,因为每年可能会做4次来清理一些数据

非常感谢:)


尝试使用UI,但没有成功。

我可以想出两种方法来进行这些更新

第一种方法是选择列出所有者(即所有电话)的活动视图并导出到Excel。这将下载一个XLSX,其开头有一些隐藏列,记录的ID保存在这些列中。然后用新的所有者更新“所有者”列(注意复制准确的全名),然后再次导入Excel电子表格。您需要为每种活动类型(电话、电子邮件等)重复此导出/导入步骤。因此,如果您有大量的日期,这可能是不切实际的,因为需要重复,而且您可以导出的记录数量最多

另一种方法是使用一些.NET代码。当然,要做到这一点,您需要使用VisualStudio2019

如果是这样的话,这将实现以下目的:

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Tooling.Connector;

namespace ChangeActivitiesOwner
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "AuthType=Office365;Url=<TODO:URL>;Username=<TODO:User>;Password=<TODO:Pass>;";
            string oldUserFullname = ""; // TODO: place here fullname for the user you want to overwrite
            string newUserFullname = ""; // TODO: place here fullname for the user you want to overwrite with

            CrmServiceClient client = new CrmServiceClient(connectionString);
            IOrganizationService service = client.OrganizationWebProxyClient != null ? client.OrganizationWebProxyClient : (IOrganizationService)client.OrganizationServiceProxy;

            QueryByAttribute qbyaOldUser = new QueryByAttribute("systemuser");
            qbyaOldUser.AddAttributeValue("fullname", oldUserFullname);
            Guid olduserid = (Guid)service.RetrieveMultiple(qbyaOldUser)[0].Attributes["systemuserid"];
            QueryByAttribute qbyaNewUser = new QueryByAttribute("systemuser");
            qbyaNewUser.AddAttributeValue("fullname", newUserFullname);
            Guid newuserid = (Guid)service.RetrieveMultiple(qbyaNewUser)[0].Attributes["systemuserid"];

            foreach (string activity in new string[]{ "task", "phonecall", "email", "fax", "appointment", "letter", "campaignresponse", "campaignactivity" }) // TODO: Add other activities as needed!!!
            {
                QueryExpression query = new QueryExpression(activity)
                {
                    ColumnSet = new ColumnSet("activityid", "ownerid")
                };
                query.Criteria.AddCondition(new ConditionExpression("ownerid", ConditionOperator.Equal, olduserid));

                foreach (Entity e in service.RetrieveMultiple(query).Entities)
                {
                    e.Attributes["ownerid"] = new EntityReference("systemuser", newuserid);
                    service.Update(e);
                }
            }
        }
    }
}
使用系统;
使用Microsoft.Xrm.Sdk;
使用Microsoft.Xrm.Sdk.Query;
使用Microsoft.Xrm.Tooling.Connector;
命名空间ChangeActivitiesOwner
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串连接string=“AuthType=Office365;Url=;用户名=;密码=;”;
字符串oldUserFullname=“”;//TODO:将要覆盖的用户的全名放在此处
字符串newUserFullname=“”;//TODO:将要覆盖的用户的全名放在此处
CrmServiceClient=新的CrmServiceClient(connectionString);
IOOrganizationService服务=client.OrganizationWebProxyClient!=null?client.OrganizationWebProxyClient:(IOOrganizationService)client.OrganizationServiceProxy;
QueryByAttribute qbyaOldUser=新的QueryByAttribute(“系统用户”);
qbyaOldUser.AddAttributeValue(“全名”,oldUserFullname);
Guid olduserid=(Guid)服务。检索多个(qbyaOldUser)[0]。属性[“systemuserid”];
QueryByAttribute qbyaNewUser=新的QueryByAttribute(“系统用户”);
qbyaNewUser.AddAttributeValue(“全名”,newUserFullname);
Guid newuserid=(Guid)服务。检索多个(qbyaNewUser)[0]。属性[“systemuserid”];
foreach(新字符串[]中的字符串活动{“任务”、“电话”、“电子邮件”、“传真”、“约会”、“信函”、“活动响应”、“活动活动”})//TODO:根据需要添加其他活动!!!
{
QueryExpression query=新建QueryExpression(活动)
{
ColumnSet=新列集(“活动ID”、“所有者ID”)
};
query.Criteria.AddCondition(新的ConditionExpression(“ownerid”,ConditionOperator.Equal,olduserid));
foreach(服务中的实体e.RetrieveMultiple(查询).Entities)
{
e、 属性[“ownerid”]=新的EntityReference(“systemuser”,newuserid);
服务.更新(e);
}
}
}
}
}
请用您的信息填写标有“TODO”的行

您需要将包Microsoft.CrmSdk.CoreSassemblies、Microsoft.CrmSdk.Deployment、Microsoft.CrmSdk.Workflow、Microsoft.CrmSdk.XrmTooling.CoreSembly、Microsoft.IdentityModel.Clients.ActiveDIrectory和Newtonsoft.Json添加到解决方案中,并使用.NET Framework 4.6.2


希望这有帮助。

这个问题和这个问题一样吗?看起来是同一个问题,但我没有回答这个问题。你最终得到了什么?这取决于活动。对于任务、注释和其他,所有者是活动所指的联系人/人员。对于电话,这取决于通话的方向。从OP的描述来看,在我看来,它指的是所有者,因为它提到了一个内部用户。在任何情况下,让我们等待OP的反馈。第一个选项(导出/导入到XLSX)在所有情况下都可以使用,代码可以修改以设置其他属性,但会更长。活动方并不是那么简单。此外,如果不重新打开已完成的活动,则无法对其进行编辑。我可以确认您也可以更新已关闭的活动,并将其导出和重新导入。显然,记录的只读状态仅来自它的表单。我使用系统管理员用户进行测试可能也很重要。非常感谢您对Luc和@Arun的回复。当然,我不需要更改这些活动的所有者。我确实需要将收件人、与会者从一个联系人更改为另一个联系人。我确实尝试导出和导出电子邮件活动以更新“发件人”和“收件人”字段,但除非电子邮件处于草稿状态,否则我无法更新参与方。如果我将其状态更改为draft,则数据导入工具不支持PartyList类型的字段。@MANUELAN00让我检查是否可以从已关闭活动的代码更改联系人。