Salesforce自定义对象关系创建

时间:2012-01-25 09:41:49

标签: salesforce

我还在销售队伍开发板上发布了这个......


嗨,大家好......

我想创建两个对象,并使用Metadata API通过C#中的父子关系链接它们。

我可以通过元数据为对象创建对象和“自定义”字段,但服务只是忽略关系字段def。

通过snipet的字段如下:

CustomField[] fields = new CustomField[] { new CustomField() 
{ 
  type = FieldType.Text,
  label = "FirstName",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestObject__c.FirstName__c"
},
new CustomField() 
{
  type = FieldType.Text,
  label = "LastName",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestObject__c.Lastname__c"
},
new CustomField() 
{
  type = FieldType.Text,
  label = "Postcode",
  length = 50,
  lengthSpecified = true,
  fullName = "LJUTestChildObject__c.Postcode__c"
},
new CustomField() 
{
  type = FieldType.MasterDetail,
  relationshipLabel = "PostcodeLookup",
  relationshipName = "LJUTestObject__c.LJUTestObject_Id__c",
  relationshipOrder = 0,
  relationshipOrderSpecified = true,
  fullName = "LJUTestChildObject__c.Lookup__r"
}
};

父对象看起来像

LJUTestObject
  ID,
  FirstName, Text(50)
  LastName, Text(50)

孩子的目标看起来像是

LJUTestChildObject
  ID,
  Postcode, Text(50)

我想将父级链接到子级,因此一个“LJUTestObject”可以有很多“LJUTestChildObjects”

FieldType,RelationshipName和RelationshipOrder需要什么值来实现这一目标?

谢谢你们

LJU

3 个答案:

答案 0 :(得分:1)

<强> TL; DR:

将此作为模板来实现您的目标:

var cf = new CustomField();
cf.fullName = "ChildCustomObject__c.ParentCustomField__c";
cf.type = FieldType.MasterDetail;
cf.typeSpecified = true;
cf.label = "Parent Or Whatever You Want This To Be Called In The UI";
cf.referenceTo = "ParentCustomObject__c";
cf.relationshipName = "ParentOrWhateverYouWantThisToBeCalledInternally";
cf.relationshipLabel = "This is an optional label";

var aUpsertResponse = smc.upsertMetadata(metadataSession, null, null, new Metadata[] { cf });

关键区别:

自然诱惑是将CustomField实例放入CustomObject的fields数组中,并将该CustomObject传递给Salesforce Metadata API。这适用于大多数数据字段,但它似乎不适用于关系字段。

相反,将CustomField直接传递给Salesforce Metadata API,而不是包装在CustomObject中。

那些静音错误:

事实证明正在发生错误,并且Salesforce Metadata API了解它们,但是当CustomFields嵌套在CustomObject中时,它们不会告诉您这些错误。

通过将CustomField直接传递给Metadata API(未包装在CustomObject中),对upsertMetadata的调用仍将返回而不会抛出异常(因为它已经为您做了),但这一次,如果出现问题,upsertResponse[0].success将为false而非true,upsertResponse[0].errors将为您提供更多信息。

其他问题

  • 必须指定referenceTo,如果它与现有内置或自定义对象的名称不匹配,则错误消息将与您未指定{{ 1}}。

  • referenceTo应该以__c而不是__r结尾。 __r用于关系名称,但请记住fullName指定字段名称,而不是关系名称。

  • fullName - 我的工作原理是不在最后包含__r,并且在开头不包括自定义对象名称。我还没有通过测试确定其他方法无法正常工作,但请注意,至少,您 需要才能在{ {1}}。

  • 一般记住,名称中包含relationshipName的内容可能是为了向UI中的用户显示,因此可以在其中包含空格,以便按用户期望的方式进行格式化。

    < / LI>

Salesforce ......真的???

(迷你咆哮警告)

Salesforce Metadata API不直观且文档记录不足。这就是为什么你被困在这么简单的事情上的原因。这就是为什么没有人知道你问题的答案的原因。这就是为什么,四年后,我陷入了同样的困境。创建关系是您希望使用Salesforce Metadata API做的主要事情之一,但是这很难弄清楚。 C&#39; mon Salesforce,我们知道你是一家销售公司,而不仅仅是一家科技公司,但是你可以获得数百美元的折扣,并乐于展示它们 - 为开发者提供更多的API体验。投资学习你的平台。

答案 1 :(得分:0)

我自己没有通过这样的元数据API创建这些,但我建议:

relationshipName = "LJUTestObject__c.LJUTestObject_Id__c

应该是:

relationshipName = "LJUTestObject__c.Id

由于Id是标准字段,__c后缀仅用于自定义字段(不是自定义对象上的标准字段)。此外,关系全名可能会以__c而不是__r结尾,但请先尝试上面的更改,看看你是如何进行的。

答案 2 :(得分:-1)

SELECT 
    Id,
    OwnerId,
    WhatId,
    Reminder_Date_Time__c, 
    WhoId, 
    Record_Type_Name__c, 
    Task_Type__c,
    Assigned_Date__c, 
    Task_Status__c, 
    ActivityDate, 
    Subject, 
    Attended_By__c,
    Is_Assigned__c 
FROM Task 
WHERE 
    (NOT Task_Status__c LIKE 'Open') AND 
    ActivityDate >= 2017-12-13 AND 
    (NOT Service__r.Service_State__c LIKE 'Karnataka')