Criar um Iterador de Transformação Dinamicamente¶
Caso de Uso¶
Um cenário de integração comum é onde os dados de origem são planos e o destino é hierárquico. Se mapeado um para um, a transformação usará como gerador o número de registros de entrada e o nó um para muitos não será preenchido corretamente. A transformação deve ser instruída a gerar várias instâncias do mesmo registro. Isso pode ser feito usando condições de transformação e as funções SetInstances()
e GetInstances()
.
Nota
Este padrão de design usa Design Studio como um exemplo; você pode aplicar os mesmos conceitos em Cloud Studio usando etapas semelhantes.
Exemplos¶
CSV para Arquivo Simples¶
Essa operação cria dados de teste, lê a saída, passa por uma transformação e grava em um arquivo temporário. O script 'Read Output' pode ser usado para visualizar o arquivo.
Embora a transformação use o NetSuite WSDL, ela não executa uma ação Upsert e nenhum endpoint NetSuite (ou credenciais) é necessário para executar a operação.
Os dados de amostra a seguir têm informações de contato principal e de cobrança (nomes e e-mails). Cada um tem seus próprios campos, mas o destino usa linhas repetidas para informações de contato. Estas capturas de tela mostram a passagem pelos registros:
Observe que, quando a operação é testada, o destino possui dois registros contactRoles da única origem.
Um iterador dinâmico é criado usando o SetInstances()
e GetInstances()
funções e passando uma matriz de valores.
Existem vários pré-requisitos:
- Condições (não scripts) são adicionadas ao destino de transformação para usar SetInstances() e GetInstances().
- A função SetInstance() deve estar dentro da condição do pai imediato de um nó filho.
- O filho deve ter uma cardinalidade de 0 para muitos ou de 1 para muitos (E*).
Script de exemplo para nó pai (contactRolesList)
primaryContactArray = Array(); // Instantiate the array. The array will be re-instantiated for each record
Set(primaryContactArray, Primary_Contact, -1); // Append the primary contact and primary email to array
Set(primaryContactArray, Primary_Email, -1);
billingContactArray = Array(); // Similar to the above
Set(billingContactArray,Bill_To_Name,-1);
Set(billingContactArray,Billing_Email,-1);
// Since the array contains two rows, the transformation generator will build two output children nodes
rolesArray = Array();
Set(rolesArray, primaryContactArray,-1);
Set(rolesArray, billingContactArray,-1);
SetInstances('contactRoles', rolesArray); // Must include the child node name.
// This stores the instance array to be used with GetInstances
/*
Example data at this point (Primary Contact, Billing Contact):
{{Judith Hall,sbishop0@pinterest.com},{Scott Bishop,sbishop0@mediafire.com,}}
Since the array contains two rows, the transformation generator will build two output nodes
*/
true // Since this is a condition, returned value must be true or else the record is skipped.
Script de exemplo para condição de nó filho (contactRoles)
// Assign a global variable to the contents of GetInstance
$instanceReference = GetInstance();
// As this is a condition node, it must return true or else the record is skipped.
true
Script de exemplo para campo de nó filho (e-mail)
// Simply get the array value. This will get the email column in the array records
$instanceReference[1]
Script de exemplo para campo de nó filho (nome)
// Simply get the array value. This will get the name column in the array records
$instanceReference[0]
Arquivo Simples para Banco de Dados¶
O segundo exemplo é semelhante ao primeiro, exceto que o destino agora é um banco de dados:
Isso usa um banco de dados PostgreSQL local. As tabelas são eliminadas e recriadas no primeiro script para facilitar a implantação. A transformação cria várias linhas para cada linha nos dados de origem:
Os scripts são muito semelhantes ao texto (primeiro) exemplo. SetInstances() está na condição do nó pai e GetInstances() está na condição do nó filho. O nó pai deve usar o nome do nó filho: SetInstances('ContactAddress', rolesArray)
Exibindo a tabela no PostgreSQL, vemos que a tabela ContactAddress mostra 400 linhas: a fonte tem 200 linhas e 2 entradas são criadas para cada linha.