2

住所をリードから連絡先に移行するアクティビティを作成しようとしています。CRM 展開ではデフォルトの Address1 と Address2 を使用していません (私の判断ではありません)。そのため、Qualification プロセスではリードに入力された住所が連絡先にコピーされますが、Address1 フィールドを使用してコピーされます。以下のコードを使用していますが、すべてが機能しているようです (登録エラーはなく、このアクティビティを使用するワークフローの実行エラーもありません)。1 つだけ問題があります... 何も起こりません。エラーはありませんが、アドレスは作成されません。私は CRM 管理者として実行しているので、これはアクセス許可の問題ではありませんが、セキュリティ例外が生成されるべきではない場合でも? これが機能しない理由はありますか?

public class MigrateLeadAddressToContactActivity : CodeActivity
{
    [Input("Contact input")]
    [ReferenceTarget("contact")]
    public InArgument<EntityReference> InContact { get; set; }

    protected override void Execute(CodeActivityContext executionContext)
    {
        // Get the tracing service                         
        var tracingService = executionContext.GetExtension<ITracingService>();

        if (InContact == null)
        {
            const string errorMessage = "Contact was not set for Address Migration Activity";
            tracingService.Trace(errorMessage);
            throw new InvalidOperationException(errorMessage);
        }

        // Get the context service.                         
        var context = executionContext.GetExtension<IWorkflowContext>();
        var serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();

        // Use the context service to create an instance of CrmService.             
        var service = serviceFactory.CreateOrganizationService(context.UserId);

        //Retrieve the contact id
        var contactId = this.InContact.Get(executionContext).Id;

        // Get The Lead if it exists
        var query = new QueryByAttribute
                    {
                        ColumnSet = new ColumnSet(
                            new[]
                            {
                                "address1_line1",
                                "address1_line2",
                                "address1_line3",
                                "address1_city",
                                "address1_stateorprovince",
                                "address1_postalcode",
                                "address1_country",
                            }
                        ),
                        EntityName = "lead"
                    };

        // The query will retrieve all leads whose associated contact has the desired ContactId
        query.AddAttributeValue("customerid", contactId); 

        // Execute the retrieval.
        var results = service.RetrieveMultiple(query);

        var theLead = results.Entities.FirstOrDefault();
        if (null == theLead)
        {
            tracingService.Trace("Activity exiting... Contact not sourced from Lead.");
            return;
        }

        var newAddress = new Entity("customeraddress");
        newAddress.Attributes["name"] = "business";
        newAddress.Attributes["objecttypecode"] = "contact";
        newAddress.Attributes["addresstypecode"] = 200000;
        newAddress.Attributes["parentid"] = new CrmEntityReference("contact", contactId);
        newAddress.Attributes["line1"] = theLead.Attributes["address1_line1"];
        newAddress.Attributes["line2"] = theLead.Attributes["address1_line2"];
        newAddress.Attributes["line3"] = theLead.Attributes["address1_line3"];
        newAddress.Attributes["city"] = theLead.Attributes["address1_city"];
        newAddress.Attributes["stateorprovince"] = theLead.Attributes["address1_stateorprovince"];
        newAddress.Attributes["postalcode"] = theLead.Attributes["address1_postalcode"];
        newAddress.Attributes["country"] = theLead.Attributes["address1_country"];

        service.Create(newAddress);
        tracingService.Trace("Address Migrated from Contact to Lead.");
    }
4

6 に答える 6

0

実際に例外がスローされないと仮定すると、そのコードのその他の出口はここにあります。

if (null == theLead)
{
    tracingService.Trace("Activity exiting... Contact not sourced from Lead.");
    return;
}

theLeadしたがって、この時点ではnullであり、ワークフローは正常に終了すると想定するのが妥当です。

これをテストするには、代わりに例外をスローします。例外がスローされたと仮定すると、なぜそれがnullであるかを調べることができます。おそらく、フィルタリングしている値が無効であるか、期待した値ではないか、フィールドが空です。

于 2013-03-05T19:47:41.680 に答える
0

このコードが CRM 2011 用に記述されている場合 (およびそのように見える場合)、addresstypecode 値を整数ではなく OptionSetValue オブジェクトで設定する必要があります。

newAddress.Attributes["addresstypecode"] = 200000; 

になる

newAddress.Attributes["addresstypecode"] = new OptionSetValue(200000);

私は実際にこれが例外をスローすることを期待しています。なぜそうではないのかわかりません。

于 2013-10-02T16:03:41.507 に答える
0

Service.Create から返された GUID をトレースして、その内容を確認してください。

何かのようなもの:

Guid addressId = service.Create(newAddress);
tracingService.Trace(string.format("Address ID Result: {0}", addressId));
于 2013-03-05T21:38:58.983 に答える
0

デフォルトでContactレコード用にすでに作成されている2つをバイパスして、Addressレコードを直接作成しようとしているようです(これら2つのレコードを使用するかどうか、およびそれらから「シャドウ」フィールドが必要かどうかに関係なく、常にこれら2つのレコードが作成されますお問い合わせフォームに表示されます)。あなたは何も起こらないと言っていますが、それは SQL テーブルまたは Contact レコードの「More Addresses」リンクで確認されていますか?

create から省略しているように見えることの 1 つは、アドレス番号を指定することです (理想的には、最初に連絡先に既に関連付けられているすべてのアドレスで最大の番号を見つけ、1 ずつインクリメントします)。これは、すべての場合で少なくとも 3 である必要があります。

Address エンティティの関連付けられたビューの定義を見ると、1 と 2 が連絡先の「一部」であり、「その他」が別のレコードであるという錯覚を与えるために、住所番号 > 2 の住所を含めるように明示的にフィルター処理されていることがわかります。 、実際には、1 と 2 を含むすべてのアドレスは、それ自体がアドレス エンティティ テーブルの行です。

そのため、値を null のままにしておくと、フィルタ基準を満たしていないため、アドレスが GUI に表示されないのではないかと思います。内部的にそのフィールドに大きく依存しているため、作成に失敗する場合と失敗しない場合があるため、「システムが必要」として扱い、列コレクションに必ず含めるようにします。

代替アプローチ:

フォームで Add_1 または Add_2 のフィールドをまったく使用しない場合でも、アドレス番号 2 の Address レコードを使用してリードからのデータを保存し、作成ではなくこの既存の (空の) レコードを更新することができます。

Address Associated ビューを変更してフィルターを変更し、ビューに Add_2 が含まれるようにします。これには、アドレス番号が 2 ではなく 1 を超えるフィルターを作成します。

これは、既に 1 つのアドレスがあり、address_3、4 など (2、3 などと見なされる可能性があります) の通常の機能でさらに追加できるように、ユーザーに表示されます。アドレス 1 は存在しますが、空であるため無視できます。

于 2013-03-06T11:22:30.840 に答える
0

私にはすべてが正しく見えます。クエリが正しく機能していることを確認するためだけに、リードが見つからない場合は例外をスローしてみます。例外が発生しない場合は、顧客アドレスの作成時に、作成されない原因となっている可能性のあるプラグインがないことを確認してください。

于 2013-03-05T19:21:20.043 に答える
0

ああ!クエリを逆方向に実行していることがわかります。(または、クエリはまったく必要ありません)

顧客 ID フィールドは、これが既存の顧客の見込み客であることをユーザーが指定した場合にのみ使用されます。その意図は、その顧客にリンクされた商談を作成することです。

見込み客を評価し、取引先責任者 (および/または取引先企業および/または商談) を作成すると、それらを結び付けるフィールドが新しく作成されたレコードにあり、3 つのエンティティすべての 3 つのケースすべてで「originatingleadid」と呼ばれます。これにより、リードの認定、認定解除、および再認定が何度もサポートされ、そうすることによって作成されたすべてのレコードは、それがどこから来たのかを知っていることに注意してください (「あなたのお父さんは誰ですか?」と考えてみてください。これを忘れることはありません!)。

リードは、関係が逆の場合にのみ、これらの最後のものを思い出すことができます.

したがって、コードのクエリ部分を修正するには、クエリを置き換えて、扱っている連絡先のルックアップ フィールドから originatingleadid を明示的に取得します。

私の他の答えは、作成ではなく更新を使用してこのプロセス全体を処理するためのより良い方法として依然として立っていますが、この答えは、最初に正しいリードレコードを使用する方法につながるはずです.

于 2013-03-06T11:29:45.183 に答える