Создание отношения с персонализированным объектом Salesforce - PullRequest
3 голосов
/ 25 января 2012

Я также разместил это на досках развития отдела продаж ...


Привет, ребята ...

Я хочу создать два объекта и связать их через родительские дочерние отношения в C # с помощью API метаданных.

Я могу создавать объекты и «настраиваемые» поля для объектов через метаданные, но служба просто игнорирует поле def для отношения.

По фрагментам для полей:

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, чтобы это произошло?

Спасибо, ребята

ЛЬ

Ответы [ 3 ]

1 голос
/ 30 сентября 2016

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 в массив fields объекта CustomObject и передача этого CustomObject в API метаданных Salesforce.И это работает для большинства полей данных, но кажется, что оно не работает для полей отношений.

Вместо этого передайте CustomField напрямую в API метаданных Salesforce, не заключенный в CustomObject.

Эти приглушенные ошибки:

Оказывается, что возникают ошибки, и API метаданных Salesforce знает о них, но не беспокоится о них, когда они возникают для пользовательских полей, вложенных вCustomObject.

Передав CustomField непосредственно в API метаданных (не заключенный в CustomObject), вызов upsertMetadata все равно будет возвращен без генерируемого исключения (как это уже было сделано для вас), нона этот раз, если что-то пойдет не так, upsertResponse[0].success будет ложным вместо истинного, а upsertResponse[0].errors даст вам больше информации.

Другие ошибки

  • Необходимо указать referenceTo, и если он не совпадает с именем существующего встроенного или пользовательского объекта, сообщение об ошибке будет таким же, как если бы вы имелине указано referenceTo вообще.

  • fullName должно заканчиваться на __c, а не __r.__r для имен отношений, но помните, что fullName задает имя поля , а не имя отношения .

  • relationshipName- Я заработал, не включая __r в конце и не включая имя пользовательского объекта в начале.Я не проверял, чтобы убедиться, что другие способы не работают, но учтите, что, по крайней мере, вам не нужно , чтобы иметь эти дополнительные компоненты в relationshipName.

  • Как правило, помните, что все, что имеет label в названии, вероятно, предназначено для отображения пользователям в пользовательском интерфейсе, и, следовательно, может содержать пробелы в удобном формате, ожидаемом пользователями.

Salesforce ... действительно ???

(мини-предупреждение)

API метаданных Salesforce не интуитивно понятен и плохо документирован.Вот почему вы застряли на такой простой вещи.Вот почему никто не знал ответа на ваш вопрос.Вот почему четыре года спустя я застрял на одном и том же.Создание отношений - это одна из главных вещей, которую вы хотели бы сделать с API метаданных Salesforce, и все же это было так трудно понять, так долго.Давай, Salesforce, мы знаем, что ты - коммерческая компания, а не техническая компания, но ты зарабатываешь миллионы долларов и с радостью это демонстрируешь - инвестируй немного больше в лучший API-интерфейс для разработчиков, которые вкладывают средства в изучение своегоплатформы.

0 голосов
/ 26 ноября 2018
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')
0 голосов
/ 25 января 2012

Я сам не создавал их через API метаданных, как этот, но я бы предложил:

relationshipName = "LJUTestObject__c.LJUTestObject_Id__c

Должно быть:

relationshipName = "LJUTestObject__c.Id

, поскольку Id является стандартным полем, суффикс __c используется только для пользовательских полей (не стандартных полей для пользовательских объектов). Кроме того, может случиться так, что полное имя отношения должно заканчиваться __c, а не __r, но сначала попробуйте изменить выше и посмотреть, как вы идете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...