我还在销售队伍开发板上发布了这个......
嗨,大家好......
我想创建两个对象,并使用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
答案 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中的用户显示,因此可以在其中包含空格,以便按用户期望的方式进行格式化。
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')