Atualizar valores e rótulos de picklist do Salesforce
Introdução
Este documento apresenta uma alternativa ao uso do conector do Salesforce como destino para atualizar valores e rótulos de picklist no Salesforce. O Salesforce classifica rótulos e valores de picklist como metadados, e não como dados de campo. Como o conector do Salesforce é baseado na API Enterprise, ele não pode atualizar metadados.
O Salesforce fornece duas APIs para manipulação de metadados:
A API de Ferramentas é menos complicada e é o núcleo da solução. Existem duas etapas para usar a API de Ferramentas para este caso de uso, descritas abaixo.
Etapa 1: Recuperar metadados e valores de picklist
A primeira etapa é recuperar o DurableId do campo de picklist. Para este caso de uso, utilizamos uma atividade de consulta do Salesforce para consultar o objeto EntityDefinition usando uma subconsulta em Fields:
SELECT (SELECT Id, DeveloperName, DurableId, QualifiedApiName, Label, DataType FROM Fields WHERE DataType = 'Picklist'), DeveloperName, QualifiedApiName, NewUrl FROM EntityDefinition WHERE QualifiedApiName = '<picklist object name>'
Em seguida, você constrói um dicionário ($dict.picklist.field_id) com uma chave do QualifiedApiName e valor do DurableId. Este ID é composto por duas partes, separadas por um ponto (.). Estamos interessados na parte que segue o ponto.
var = root$transaction.response$body$queryResponse$result$records.EntityDefinition$Fields.DurableId$;
AddToDict($dict.picklist.field_id,root$transaction.response$body$queryResponse$result$records.EntityDefinition$Fields.QualifiedApiName$,
Mid(var,Index(var,".") + 1,Length(var) - Index(var,".")));
Este dicionário será usado para procurar o ID de um campo com base no nome do campo. Exemplo: Account__c=>"00N8A00000JUypw".
Passo 2: Construir uma solicitação HTTP patch
O segundo passo é construir a solicitação. O esquema necessário para a solicitação está listado abaixo. Esta API irá sobrescrever a definição de metadados e, portanto, todo o esquema é enviado, incluindo os campos nulos e arrays vazios. (Um refinamento adicional deste caso de uso seria usar o primeiro passo para recuperar os metadados existentes e atualizar apenas os campos relevantes. Nesse caso, o objeto seria muito básico e não é mostrado aqui.)
Como uma transformação não gerará um array vazio, um script é usado para substituir o valor nulo retornado no campo valueSettings por um array vazio:
$io = Replace($io,'"valueSettings": null','"valueSettings": []');
O conector HTTP é configurado da seguinte forma:
- URL Base: Insira a URI base, no formato
http://<domínio>/services/data/<vXX.X>/tooling/(veja a documentação do Salesforce Recursos da API Tooling REST). - Verbo HTTP: Selecione Personalizado e insira
PATCH. - Caminho: Insira
/sobjects/CustomField/<field id>. - Cabeçalhos da Solicitação: Especifique um Nome de
Authorization Bearere um Valor do ID da sessão, que pode ser derivado usando a funçãoSalesforceLogin.
O esquema para a API Tooling:
{
"FullName": "<objectname.fieldname>",
"Metadata": {
"businessOwnerGroup": null,
"businessOwnerUser": null,
"businessStatus": null,
"caseSensitive": null,
"complianceGroup": null,
"customDataType": null,
"defaultValue": null,
"deleteConstraint": null,
"deprecated": null,
"description": null,
"displayFormat": null,
"displayLocationInDecimal": null,
"encryptionScheme": null,
"escapeMarkup": null,
"externalDeveloperName": null,
"externalId": false,
"formula": null,
"formulaTreatBlanksAs": null,
"inlineHelpText": null,
"isAIPredictionField": null,
"isConvertLeadDisabled": null,
"isFilteringDisabled": null,
"isNameField": null,
"isSortingDisabled": null,
"label": "Test",
"length": null,
"lookupFilter": null,
"maskChar": null,
"maskType": null,
"metadataRelationshipControllingField": null,
"populateExistingRows": null,
"precision": null,
"readOnlyProxy": null,
"referenceTargetField": null,
"referenceTo": null,
"relationshipLabel": null,
"relationshipName": null,
"relationshipOrder": null,
"reparentableMasterDetail": null,
"required": false,
"restrictedAdminField": null,
"scale": null,
"securityClassification": null,
"startingNumber": null,
"stripMarkup": null,
"summarizedField": null,
"summaryFilterItems": null,
"summaryForeignKey": null,
"summaryOperation": null,
"trackFeedHistory": false,
"trackHistory": false,
"trackTrending": false,
"translateData": null,
"type": "Picklist",
"unique": null,
"urls": null,
"valueSet": {
"controllingField": null,
"restricted": false,
"valueSetDefinition": {
"sorted": false,
"value": [
{
"color": null,
"default": false,
"description": null,
"isActive": null,
"label": "<labeldata>",
"urls": null,
"valueName": "<picklistvaluedata>"
},
{
"color": null,
"default": false,
"description": null,
"isActive": null,
"label": "<labeldata>",
"urls": null,
"valueName": "<picklistvaluedata>"
},
{
"color": null,
"default": false,
"description": null,
"isActive": null,
"label": "<labeldata>",
"urls": null,
"valueName": "<picklistvaluedata>"
}
]
},
"valueSetName": null,
"valueSettings": []
},
"visibleLines": null,
"writeRequiresMasterRead": null
}
}