Exemplos de código JavaScript em workflows

Estes exemplos mostram como é possível usar o código JavaScript em um workflow:

Saiba mais sobre métodos SOAP estáticos e não estáticos.

Nesses exemplos, a extensão ECMAScript for XML (E4X) é usada. Com esta extensão, é possível combinar chamadas de JavaScript e primitivos de XML no mesmo script.

Para experimentar estes exemplos, siga estas etapas:

  1. Crie um workflow e adicione essas atividades ao workflow:

    1. Iniciar atividade
    2. Atividade de código JavaScript
    3. Finalizar atividade

    Saiba mais sobre a criação de workflows.

  2. Adicione o código JavaScript a uma atividade. Saiba mais.

  3. Salve o workflow.

  4. Teste os exemplos:

    1. Inicie o workflow. Saiba mais.
    2. Abra o journal. Saiba mais.

Exemplo 1: gravar no banco de dados

Para gravar no banco de dados, é possível usar o método estático Write no schema xtk:session:

  1. Componha uma solicitação de gravação em XML.

  2. Grave o registro:

    1. Chame o método Write no schema xtk:session.

      IMPORTANTE

      Se estiver usando o Adobe Campaign v8, recomendamos o uso do mecanismo de preparo com as APIs de Assimilação e Atualização/exclusão de dados para o método Write em uma tabela Snowflake. Leia mais.

    2. Transmita o código XML como argumento para a solicitação de gravação.

Etapa 1: compor uma solicitação de gravação

É possível adicionar, atualizar e excluir registros.

Inserir um registro

Visto que insert é a operação padrão, não é necessário especificá-la.

Especifique essas informações como atributos XML:

  • O schema da tabela a ser modificada
  • Os campos a serem preenchidos na tabela

Exemplo:

var myXML = <recipient xtkschema="nms:recipient"
    firstName="Isabel"
    lastName="Garcia"
    email="isabel.garcia@mycompany.com"/>

Atualizar um registro

Use a operação _update. Saiba mais.

Especifique essas informações como atributos XML:

  • O schema da tabela a ser modificada
  • Os campos a serem atualizados na tabela
  • O argumento principal necessário para identificar o registro a ser atualizado

Exemplo:

var myXML = <recipient xtkschema="nms:recipient"
    status="Client"
    email="isabel.garcia@mycompany.com"
    operation="_update"
    _key="@email"/>

Excluir um registro

Use o método DeleteCollection. Saiba mais.

Especifique estas informações:

  • O schema da tabela a ser modificada
  • A cláusula where necessária para identificar o registro a ser atualizado, na forma de um elemento XML

Exemplo:

xtk.session.DeleteCollection(
    "nms:recipient",
    <where>
        <condition expr="[@email] = 'isabel.garcia@mycompany.com'"/>
    </where>,
    false
    )

Etapa 2: gravar o registro

Chame o método Write não estático no schema xtk:session:

xtk.session.Write(myXML)

Nenhum valor é retornado para este método.

Adicione o código completo a uma atividade de código JavaScript no workflow:

var myXML = <recipient xtkschema="nms:recipient"
    firstName="Isabel"
    lastName="Garcia"
    email="isabel.garcia@mycompany.com"/>

xtk.session.Write(myXML)

Este vídeo mostra como gravar no banco de dados:

Exemplo 2: consultar o banco de dados

Para consultar o banco de dados, é possível usar o método da instância xtk:queryDef não estático:

  1. Componha uma consulta em XML.
  2. Crie um objeto de consulta.
  3. Execute a consulta.

Etapa 1: compor uma consulta

Especifique o código XML para uma entidade queryDef.

Sintaxe:

<queryDef schema="nms:recipient" operation="">
    <!-- select, where, and orderBy clauses as XML elements -->
</queryDef>

Especifique estas informações:

  • O schema da tabela a ser lida
  • A operação
  • As colunas a serem retornadas, em uma cláusula select
  • As condições, em uma cláusula where
  • Os critérios de filtragem, em uma cláusula orderBy

É possível usar estas operações:

Operação Resultado
select Zero ou mais elementos são retornados como uma coleção.
getIfExists Um elemento é retornado. Se nenhum elemento correspondente existir, um elemento vazio será retornado.
get Um elemento é retornado. Se nenhum elemento correspondente existir, um erro será retornado.
count O número de registros correspondentes é retornado na forma de um elemento com um atributo count.

Insira as cláusulas select, where e orderBy como elementos XML:

  • Cláusula select

    Especifique as colunas a serem retornadas. Por exemplo, para selecionar o nome e sobrenome da pessoa, insira este código:

    <select>
        <node expr="@firstName"/>
        <node expr="@lastName"/>
    </select>
    

    Com o schema nms:recipient, os elementos são retornados desta forma:

    <recipient firstName="Bo" lastName="Didley"/>
    
  • Cláusula where

    Para especificar condições, use uma cláusula where. Por exemplo, para selecionar os registros localizados na pasta Treinamento, é possível inserir este código:

    <where>
        <condition expr="[folder/@label]='Training'"/>
    </where>
    

    Ao combinar várias expressões, use o operador booleano na primeira expressão. Por exemplo, para selecionar todas as pessoas chamadas Isabel Garcia, é possível inserir este código:

    <condition boolOperator="AND" expr="@firstName='Isabel'"/>
    <condition expr="@lastName='Garcia'"/>
    
  • Cláusula orderBy

    Para classificar o conjunto de resultados, especifique a cláusula orderBy como um elemento XML com o atributo sortDesc. Por exemplo, para classificar os sobrenomes em ordem crescente, é possível inserir este código:

    <orderBy>
        <node expr="@lastName> sortDesc="false"/>
    </orderBy>
    

Etapa 2: criar um objeto de consulta

Para criar uma entidade a partir do código XML, use o método create(content):

var query = xtk.queryDef.create(
    <queryDef schema="nms:recipient" operation="select">
    …
    </queryDef>)

Prefixe o método create(content) com o schema da entidade a ser criada.

O argumento content é um argumento de sequência, e é opcional. Esse argumento contém o código XML que descreve a entidade.

Etapa 3: executar a consulta

Siga estas etapas:

  1. Chame o método ExecuteQuery na entidade queryDef:

    var res = query.ExecuteQuery()
    
  2. Processe os resultados:

    1. Repita os resultados da operação select, usando uma construção de loop.
    2. Teste os resultados usando a operação getIfExists.
    3. Conte os resultados usando a operação count.

Resultados de uma operação select

Todas as correspondências são retornadas como uma coleção:

<recipient-collection>
    <recipient email="jane.smith@mycompany.com">
    <recipient email="john.harris@mycompany.com">
</recipient-collection>

Para repetir os resultados, use o loop for each:

for each (var rcp in res:recipient)
    logInfo(rcp.@email)

O loop inclui uma variável de recipient local. Para cada recipient que é retornado na coleção de recipients, o email do recipient é impresso. Saiba mais sobre a função logInfo.

Resultados de uma operação getIfExists

Cada correspondência é retornada como um elemento:

<recipient id="52,378,079">

Se não houver correspondência, um elemento vazio será retornado:

<recipient/>

É possível consultar o nó primário da chave, como por exemplo, o atributo @id:

if (res.@id !=undefined)
    { // match was found
    …
    }

Resultado de uma operação get

Uma correspondência é retornada como um elemento:

<recipient id="52,378,079">

Se não houver correspondência, um erro será retornado.

DICA

Caso saiba que há uma correspondência, use a operação get. Caso contrário, use a operação getIfExists. Ao utilizar esta prática recomendada, os erros revelarão problemas inesperados. Caso utilize a operação get, não use a instrução try…catch. O problema é tratado pelo processo de tratamento de erros do workflow.

Resultado de uma operação count

Um elemento com o atributo count é retornado:

<recipient count="200">

Para usar o resultado, consulte o atributo @count:

if (res.@count > 0)
    { // matches were found
    …
    }

Para a operação select, adicione este código a uma atividade de código JavaScript no workflow:

var myXML =
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@firstName"/>
        <node expr="@lastName"/>
    </select>
</queryDef>

var query = xtk.queryDef.create(myXML)

var res = query.ExecuteQuery()

for each (var rcp in res.recipient)
    logInfo(rcp.@firstName + " " + rcp.@lastName)

Visto que select é a operação padrão, não é necessário especificá-la.

Este vídeo mostra como ler a partir do banco de dados:

Acionar um workflow

É possível acionar workflows programaticamente, por exemplo, em workflows técnicos ou para processar informações que um usuário inseriu em uma página de aplicativo web.

O acionamento do workflow funciona por meio do uso de eventos. É possível usar estes recursos para eventos:

  • Para publicar um evento, é possível usar o método estático PostEvent. Saiba mais.
  • Para receber um evento, é possível usar a atividade External signal. Saiba mais.

É possível acionar workflows de diferentes maneiras:

  • É possível acionar um workflow em linha, ou seja, a partir do script principal de uma atividade JavaScript code.
  • É possível acionar um workflow ao concluir outro:
    • Adicione um script de inicialização à atividade End do workflow inicial.

    • Adicione a atividade External signal no início do workflow desejado.

      Após a conclusão do workflow inicial, um evento é postado. A transição de saída é ativada e as variáveis do evento são preenchidas. Em seguida, o evento é recebido pelo workflow desejado.

      DICA

      Como prática recomendada, ao adicionar um script a uma atividade, coloque o nome da atividade entre hifens duplos. Por exemplo: -- end --. Saiba mais sobre as práticas recomendadas de workflow.

Sintaxe do método PostEvent:

PostEvent(
    String     //ID of the target workflow
    String     //Name of the target activity
    String     //Name of the transition to be activated in case of multiple transitions
    XML        //Event parameters, in the <variables/> element
    Boolean    //To trigger the target workflow only once, set this parameter to true.
)

Neste exemplo, após a conclusão do workflow, um texto curto é passado para a atividade de sinal do workflow wkfExampleReceiver:

var strLabel = "Adobe Campaign, Marketing that delivers"
xtk.workflow.PostEvent(
    "wkfExampleReceiver",
    "signal",
    "",
    <variables strLine={strLabel}/>,
    false)

Como o último parâmetro é definido como false, o workflow wkfExampleReceiver é acionado toda vez que o workflow inicial é concluído.

Ao acionar workflows, lembre-se dos seguintes princípios:

  • O comando PostEvent é executado de forma assíncrona. O comando é colocado na fila do servidor. O método retorna após a publicação do evento.
  • O workflow desejado deve ser iniciado. Caso contrário, um erro será gravado no arquivo de log.
  • Se o workflow desejado for suspenso, o comando PostEvent é enfileirado até que o workflow seja retomado.
  • A atividade acionada não requer que uma tarefa esteja em andamento.

Este vídeo mostra como usar métodos de API estáticos:

Este vídeo mostra como acionar workflows:

Interagir com o banco de dados

Estes exemplos mostram como executar essas ações:

  • Use os métodos get e create em schemas para usar métodos SOAP não estáticos
  • Criar métodos que executam consultas SQL
  • Use o método write para inserir, atualizar e excluir registros

Siga estas etapas:

  1. Defina a consulta:

    • Recupere uma entidade usando o método create no schema correspondente, como por exemplo, o schema xtk:workflow. Saiba mais.
    • Use o método queryDef para emitir uma consulta SQL.
  2. Execute a consulta usando o método ExecuteQuery. Saiba mais.

    Use o loop for each para recuperar os resultados.

Sintaxe do método queryDef com uma cláusula select

<queryDef schema="schema_key" operation="operation_type">
    <select>
        <node expr="expression1">
        <node sql="expression2">
    </select>
    <where>
        <condition expr="expression1"/>
        <condition sql="expression2"/>
    </where>
    <orderBy>
        <node expr="expression1">
        <node sql="expression2">
    </orderBy>
    <groupBy>
        <node expr="expression1">
        <node sql="expression2">
    </groupBy>
    <having>
        <condition expr="expression1"/>
        <condition sql="expression2"/>
    </having>
</queryDef>

Método Create

Exemplo 1: selecionar registros e gravar no journal

Os nomes internos dos workflows localizados na pasta wfExamples são selecionados. Os resultados são classificados por nome interno, em ordem crescente, e gravados no journal.

var query = xtk.queryDef.create(
    <queryDef schema="xtk:workflow" operation="select">
        <select>
            <node expr="@internalName"/>
        </select>
        <where>
            <condition expr="[folder/@name]='wfExamples'"/>
        </where>
        <orderBy>
            <node expr="@internalName" sortDesc="false"/>
        </orderBy>
    </queryDef>
    )

var res = query.ExecuteQuery()
for each (var w in res.workflow)
    logInfo(w.@internalName)

Exemplo 2: excluir registros

O nome, sobrenome, email e a ID de todos os recipients que se chamam Chris Smith são selecionados. Os resultados são classificados por email, em ordem crescente, e gravados no journal. A operação delete é usada para excluir os registros selecionados.

// Build the query, create a query object and hold the object in a variable
var query = xtk.queryDef.create(
        <queryDef schema="nms:recipient" operation="select">
            <select>
                <node expr="@firstName"/>
                <node expr="@lastName"/>
                <node expr="@email"/>
                <node expr="@id"/>
            </select>
            <where>
                <condition expr="[folder/@label]='Recipients'"/>
                <condition expr="[@lastName]='Smith'"/>
                <condition expr="[@firstName]='Chris'"/>
            </where>
            <orderBy>
                <node expr="@email" sortDesc="false"/>
            </orderBy>
        </queryDef>
)

//Run the query using the ExecuteQuery method against the created object
var res = query.ExecuteQuery()

//Loop through the results, print out the person's name and email, then delete the records
for each (var rec in res.recipient)
    {
     logInfo("Delete record = Email: " + rec.@email + ', ' + rec.@firstName + ' ' + rec.@lastName)
     xtk.session.Write(<recipient xtkschema="nms:recipient" _operation="delete" id={rec.@id}/>)
    }

Exemplo 3: selecionar registros e gravar no journal

Neste exemplo, um método não estático é usado. O email e o ano de nascimento de todos os recipients cujas informações estão armazenadas na pasta 1234 e cujo nome de domínio de email começe com “adobe” são selecionados. Os resultados são classificados por data de nascimento, em ordem decrescente. O email dos recipients é gravado no journal.

var query = xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@email"/>
        <node sql="sEmail"/>
        <node expr="Year(@birthDate)"/>
    </select>
    <where>
        <condition expr="[@folder-id] = 1234 and @domain like 'adobe%'"/>
        <condition sql="iFolderId = 1234 and sDomain like 'adobe%'"/>
    </where>
    <orderBy>
        <node expr="@birthDate" sortDesc="true"/>
    </orderBy>
</queryDef>
)

var res = query.ExecuteQuery()
for each (var w in res.recipient)
    logInfo(w.@email)

Método Write

É possível inserir, atualizar e excluir registros. É possível usar o método Write em qualquer schema no Adobe Campaign. Como esse método é estático, não é necessário criar um objeto. É possível usar estas operações:

  • A operação update

  • A operação insertOrUpdate, com o argumento _key para identificar o registro a ser atualizado

    Se não especificar a pasta Recipients, e houver uma correspondência, o registro será atualizado em qualquer subpasta. Caso contrário, o registro será criado na pasta raiz de Recipients.

  • A operação delete

IMPORTANTE

Caso utilize o Adobe Campaign v8, recomendamos utilizar o mecanismo de preparo com as APIs de Assimilação e Atualização/exclusão de dados para o método Write em uma tabela Snowflake. Leia mais.

Exemplo 1: inserir ou atualizar um registro

xtk.session.Write(
<recipient
    xtkschema="nms:recipient"
    _operation="insertOrUpdate" _key="@email"
    lastName="Lennon"
    firstName="John"
    email="johnlennon@thebeatles.com"
/>
)

Exemplo 2: excluir registros

Este exemplo combina um método estático com um não estático.

var query=xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
    <select>
        <node expr="@Id"/>
    </select>
    <where>
        <condition expr="[@email]='johnlennon@thebeatles.com'"/>
    </where>
</queryDef>
);

var res = query.ExecuteQuery()
for each (var w in res.recipient) {
xtk.session.Write(
    <recipient xtkschema="nms:recipient" _operation="delete" id={w.@id}/>
);
}

Este vídeo mostra como usar métodos de API não estáticos:

Este vídeo mostra um exemplo de uso de um método de API não estático em um workflow:

Tópicos relacionados

Documentação da API

Nesta página