Atualizar vários alvos de um único registro de origem no Jitterbit Design Studio
Caso de uso
Quando uma consultar ou payload de entrada contém dados que exigem várias atualizações de um único objeto de destino.
Exemplo
O SAP IDoc de entrada contém um único preço, e o sistema SFDC de destino tem uma ou mais entradas de livro de preços que precisam ser atualizadas. Este exemplo usa 3 Operações. A primeira recebe um Inbound IDoc do SAP, a segunda executa uma atualização no SFDC e a terceira executa um upsert.
A resposta do IDoc é mapeada para um arquivo simples. Observe que a fonte é hierárquica, enquanto o destino é simples. A linha preta escura do gerador é do nó mais baixo na fonte. Se a fonte tiver 1 registro no primeiro nível, dois registros no segundo nível e três registros no terceiro, seis registros serão gerados.
Cada nó no alvo atribui o valor a uma variável global. Este é o valor 'Key':
$key=OUTPUT$COND_A01.IDOC$E1KOMG$VAKEY$
Usando variáveis globais, podemos chamar operações individualmente por meio de scripts e passar os valores. Normalmente, operações desse tipo não têm fonte.
Como o Jitterbit executa ações com script no alvo sequencialmente, o script que chama as operações deve estar no último nó. Um método alternativo, e talvez preferido, é criar uma nova condição e executar as atribuições no nó de condição (não confunda com a Aba Condição). Nesse caso, a transformação original foi gravada em um arquivo de texto, e foi mais fácil fazer as atribuições de valor individualmente. (Se você usar um nó de condição, não se esqueça de passar um valor verdadeiro como saída, ou então ele pode nunca ser executado!)
Voltando ao script em Currency - há dois requisitos. Se um valor de condição for 923, execute o upsert. Se um valor de condição for 304, execute o update.
Primeiro, o valor para este registro é atribuído a uma variável global e gravado no log de operação. Em seguida, avalie se é 923 ou 304. Se for 923, executar uma operação. Se for 304, precisamos fazer mais processamento. Como pode haver mais de um livro de preços que precisa de uma atualização, precisamos consultar o SFDC para obter uma lista, que é atribuída a $pbeList. Este é um array, então, em seguida, iteramos pelo array e chamamos a operação de atualização. Observe que SFLookupAll retornará um array, enquanto SFLookup retorna um único valor.
$currency=OUTPUT$COND_A01.IDOC$E1KOMG$E1KONH.E1KONP.KONWA$;
writetooperationlog("Currency "+$currency);
if($ConditionValue == "923", RunOperation("<TAG>Operations/Jitterbit Connect™/Salesforce Upserts/Upsert Contracted Prices</TAG>"));
if($ConditionValue == "304",
$soql="SELECT Id from PricebookEntry WHERE Product2.ProductCode = '" + Right($material,4) + "' AND UseStandardPrice = TRUE";
$pbeList = SfLookupAll("<TAG>Salesforce Orgs/jitterbit@XXXXX.com.devpro1 (Sandbox)</TAG>",$soql);
WriteToOperationLog('PbeList=' + $pbeList);
$c = length($pbeList);
$i = 0;
while( $i < $c,
$pbeId = $pbeList[$i][0];
WriteToOperationLog('PbeList=' + $pbeId + ' Price=' + $price);
RunOperation("<TAG>Operations/Jitterbit Connect™/Salesforce Updates/Update Price Book Entries</TAG>");
$i++)
)
Operação Upsert
Quando esse upsert foi construído usando o wizard, no ponto em que uma fonte é selecionada, a escolha feita foi 'None' (é a última seleção e frequentemente esquecida). Isso constrói uma transformação que não lerá de um arquivo de fonte ou de um banco de dados, mas usará variáveis globais.
O cliente optou por usar SFLookup para obter os IDs de Conta e Produto. Script para SBQQ_Account__c:
$material;
$soql="select id from Account where SAP_Key__c='"+$material+"'";
SfLookup("<TAG>Salesforce Orgs/jitterbit@XXXXX.com.devpro1 (Sandbox)</TAG>",$soql)
A alternativa para isso é passar a variável global para os relacionamentos no mapeamento e deixar os campos em branco. Ou seja, abra SAP_Key__c e adicione $material. O SFDC executará a pesquisa para Account e Product automaticamente e preencherá os campos Account__c e Product__c. (Você verá que no Jitterbit, geralmente há mais de uma maneira de fazer a mesma coisa!)
Operação de atualização
Isso é muito parecido com o exemplo anterior. Como é uma atualização, o ID é necessário.
Veja também: Processando registros de destino condicionalmente