Salesforce自定义对象关系创建
我想创建两个对象,并使用元数据API通过C#中的父子关系将它们链接起来 我可以通过元数据为对象创建对象和“自定义”字段,但服务只是忽略关系的字段定义 由snipet提供的字段如下所示:Salesforce自定义对象关系创建,salesforce,Salesforce,我想创建两个对象,并使用元数据API通过C#中的父子关系将它们链接起来 我可以通过元数据为对象创建对象和“自定义”字段,但服务只是忽略关系的字段定义 由snipet提供的字段如下所示: CustomField[] fields = new CustomField[] { new CustomField() { type = FieldType.Text, label = "FirstName", length = 50, lengthSpecified =
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
ID,
FirstName, Text(50)
LastName, Text(50)
LJUTestChildObject
ID,
Postcode, Text(50)
我想将父对象链接到子对象,这样一个“LJUTestObject”就可以有多个“LJUTestChildObjects”
要实现这一点,FieldType、RelationshipName和RelationshipOrder需要哪些值?我自己并没有通过元数据API创建这些值,但我建议:
relationshipName = "LJUTestObject__c.LJUTestObject_Id__c
应该是:
relationshipName = "LJUTestObject__c.Id
由于Id是标准字段,因此
\uu c
后缀仅用于自定义字段(而不是自定义对象上的标准字段)。此外,可能关系全名应以\uu c
结尾,而不是\uu r
,但请先尝试上面的更改,然后再查看您的操作方式。TL;医生:
将此作为完成所需内容的模板:
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的字段
数组中,并将该CustomObject传递给Salesforce元数据API。这确实适用于大多数数据字段,但似乎不适用于关系字段
相反,将CustomField直接传递给Salesforce元数据API,而不是包装在CustomObject中
那些静音错误:
事实证明,错误正在发生,Salesforce元数据API知道这些错误,但对于嵌套在CustomObject中的CustomFields,当这些错误发生时,不会告诉您
通过将CustomField直接传递给元数据API(未包装在CustomObject中),对upsertMetadata
的调用仍将返回,而不会引发异常(正如它已经为您所做的那样),但这一次,如果出现问题,upsertResponse[0]。成功
将是false而不是true,和upsertResponse[0]。错误将提供更多信息
其他问题
- 必须指定
referenceTo
,如果它与现有内置或自定义对象的名称不匹配,则错误消息将与未指定referenceTo
的错误消息相同
fullName
应以“c not”结尾__r表示关系名称,但请记住,fullName
指定的是字段名称,而不是关系名称
relationshipName
-我通过在末尾不包含_\r,在开头不包含自定义对象名来实现它。我还没有测试过其他方法是否有效,但请注意,至少在relationshipName
中不需要额外的组件
- 通常请记住,任何名称中带有
标签的内容都可能是为了在UI中显示给用户,因此其中的空格可以按照用户期望的方式很好地格式化
销售人员。。。真的吗?
(小型警报)
Salesforce元数据API不直观,文档记录也不完整。这就是为什么你在这么简单的事情上被卡住了。这就是为什么没有人知道你问题的答案。这就是为什么,四年后,我被困在同一件事上。创建关系是您希望使用Salesforce元数据API所做的主要事情之一,但长期以来一直很难弄清楚这一点。来吧,Salesforce,我们知道你是一家销售公司,而不是一家技术公司,但是你赚了数不清的钱,并且很乐意炫耀——为那些投资学习你的平台的开发人员多投资一点,为他们提供更好的API体验
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')