Exemplos de código JavaScript em workflows javascript-in-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:
-
Crie um workflow e adicione essas atividades ao workflow:
- Iniciar atividade
- Atividade de código JavaScript
- Finalizar atividade
Saiba mais sobre a criação de workflows.
-
Adicione o código JavaScript a uma atividade. Saiba mais.
-
Salve o workflow.
-
Teste os exemplos:
- Inicie o workflow. Saiba mais.
- Abra o journal. Saiba mais.
Exemplo 1: gravar no banco de dados write-example
Para gravar no banco de dados, é possível usar o método estático Write
no schema xtk:session
:
-
Componha uma solicitação de gravação em XML.
-
Grave o registro:
-
Chame o método
Write
no schemaxtk:session
.note important IMPORTANT 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. -
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 read-example
Para consultar o banco de dados, é possível usar o método da instância xtk:queryDef
não estático:
- Componha uma consulta em XML.
- Crie um objeto de consulta.
- 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:
select
getIfExists
get
count
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:
code language-xml <select> <node expr="@firstName"/> <node expr="@lastName"/> </select>
Com o schema
nms:recipient
, os elementos são retornados desta forma:code language-xml <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:code language-xml <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:
code language-xml <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 atributosortDesc
. Por exemplo, para classificar os sobrenomes em ordem crescente, é possível inserir este código:code language-xml <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 string, e é opcional. Esse argumento contém o código XML que descreve a entidade.
Etapa 3: executar a consulta
Siga estas etapas:
-
Chame o método
ExecuteQuery
na entidadequeryDef
:code language-javascript var res = query.ExecuteQuery()
-
Processe os resultados:
- Repita os resultados da operação
select
, usando uma construção de loop. - Teste os resultados usando a operação
getIfExists
. - Conte os resultados usando a operação
count
.
- Repita os resultados da operação
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 destinatário local. Para cada destinatário que é retornado na coleção de destinatários, o email do destinatário é 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.
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 trigger-example
É 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.
note tip TIP 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 interact-example
Estes exemplos mostram como executar essas ações:
- Use os métodos
get
ecreate
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:
-
Defina a consulta:
- Recupere uma entidade usando o método
create
no schema correspondente, como por exemplo, o schemaxtk:workflow
. Saiba mais. - Use o método
queryDef
para emitir uma consulta SQL.
- Recupere uma entidade usando o método
-
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 destinatários 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 destinatários 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 destinatários é 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 atualizadoSe não especificar a pasta Destinatários, e houver uma correspondência, o registro será atualizado em qualquer subpasta. Caso contrário, o registro será criado na pasta raiz de Destinatários.
-
A operação
delete
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: