Composition Setup |
---|
import.css=/download/attachments/108660318/wfLogixStyles.css |
Nota |
---|
As rotinas são executadas via Web Services, portanto é necessário que estas execuções estejam ligadas e configuradas no servidor TOTVS Tec. |
Objetivo
A partir dos eventos de workflow do
...
Fluig é possível efetuar a execução de
...
rotinas no Logix permitindo envio
...
de parâmetros e retornos da regra de negócio para o processo.
...
Nota |
---|
As funções de regra de negócio do Logix são executadas via webservices, portanto é necessário que as execuções webservices estejam ligadas no servidor TOTVS Tec. |
Deck of Cards |
---|
id | EXECUCAO |
---|
history | false |
---|
effectType | fade |
---|
|
Card |
---|
default | true |
---|
label | Execução da rotina no Fluig |
---|
|
|
...
| Para realizar a execução de uma |
|
...
Bloco de código |
---|
language | javascript |
---|
linenumbers | true |
---|
|
|
...
a partir de um evento é necessário seguir os passos abaixo: - Utilizar o Dataset customizado LogixExecServiceDS.
- Enviar os parâmetros abaixo como constraints para o Dataset:
- Código da empresa que será utilizado na regra de negócio;
- Rotina do workflow que será executada; e
- Valores que serão utilizados na execução da rotina*.
- Recuperar o resultado da execução da rotina através da função padrão getValue do objeto Dataset*.
* Os valores que devem ser enviados e o resultado da rotina obedecem o formato JSON string.
Exemplo Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
|
|
|
function afterProcessFinish(processId) {
|
| var values, company, c1, c2, c3, dataset, result;
//Recupera os valores do |
| result;
{
"clientes" : {
"num_cgc_cpf" "componente": {
"cod_empresa": new String(hAPI.getCardValue("cod_empresa")),
"cod_item_compon": new String(hAPI.getCardValue("cod_item_compon")),
"cod_grade_compon_1_orig": new String(hAPI.getCardValue("cod_grade_compon_1_orig")),
"cod_grade_compon_2_orig": new String(hAPI.getCardValue("cod_grade_compon_2_orig")),
"cod_grade_compon_3_orig": new String(hAPI.getCardValue("cod_grade_compon_3_orig")),
"cod_grade_compon_4_orig": new String(hAPI.getCardValue("cod_grade_compon_4_orig")),
"cod_grade_compon_5_orig": new String(hAPI.getCardValue("cod_grade_compon_5_orig")),
"acao": new String(hAPI.getCardValue("acao")),
"cod_item_compon_dest": new String(hAPI.getCardValue("cod_item_compon_dest")),
"cod_grade_compon_1_dest": new String(hAPI.getCardValue(" |
| num_cgc_cpfcod_grade_compon_1_dest")),
|
| "cod_cliente" "cod_grade_compon_2_dest": new String(hAPI.getCardValue("cod_grade_compon_2_dest")),
"cod_grade_compon_3_dest": new String(hAPI.getCardValue("cod |
| _cliente "nom_cliente" "cod_grade_compon_4_dest": new String(hAPI.getCardValue("cod_grade_compon_4_dest")),
"cod_grade_compon_5_dest": new String(hAPI.getCardValue(" |
| nom_clientecod_grade_compon_5_dest")),
"justificativa": new String(hAPI.getCardValue("justificativa"))
|
| }
result = callLogixFunction('vdp10000_create_clientes', values);
};
//Recupera o valor definido para o código da empresa.
company = values.componente.cod_empresa;
//Converte o objeto JSON para JSON string.
values = JSON.stringify(values);
log.info("[LOGIX][WFMAN002] Valores do formulario recuperados: " + values + ".");
log.info("[LOGIX][WFMAN002] Iniciando execucao da rotina WFMAN002.");
c1 = DatasetFactory.createConstraint("company", company, null, ConstraintType.MUST);
c2 = DatasetFactory.createConstraint("fn", "wfman002_process_finish", null, ConstraintType.MUST);
c3 = DatasetFactory.createConstraint("values", values, null, ConstraintType.MUST);
dataset = DatasetFactory.getDataset("LogixExecServiceDS", null, [c1, c2, c3], null);
result = service.getValue(0, "result");
log.info("[LOGIX][WFMAN002] Rotina WFMAN002 executada, resultado enviado: " + result + ".");
//Converte o JSON string para objeto JSON.
result = JSON.parse(result);
if (result) {
|
| '' info'"[LOGIX][WFMAN002] Nao foi possivel concluir |
| acriacao de cliente [' processo: " + result.msg + |
| ']' |
O formato do objeto Json enviado para a função callLogixFunction deve seguir os padrões abaixo:
Padrões JSON String de envio |
|
code | linenumbers | truetabelasRECORD "clientes
"cod_cliente" : "AM",
"nom_cliente" : "ARINE MORCIANI"
"cod_empresa": "24",
"cod_item_compon": "ITEM-TESTE",
"cod_grade_compon_1_orig": "BRANCO",
"cod_grade_compon_2_orig": "",
"cod_grade_compon_3_orig": "",
"cod_grade_compon_4_orig": "",
"cod_grade_compon_5_orig": "",
"acao": "1",
"cod_item_compon_dest": "ITEM-TESTE-NOVO",
"cod_grade_compon_1_dest": "PRETO",
"cod_grade_compon_2_dest": "",
"cod_grade_compon_3_dest": "",
"cod_grade_compon_4_dest": "",
"cod_grade_compon_5_dest": "",
"justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
}
}
//Para registros |
| tabelasARRAY OF RECORD "clientes {
"cod_cliente" : "AM",
"nom_cliente" : "ARINE MORCIANI"
},
{
"cod_cliente" : "A1",
"nom_cliente" : "DIEGO VENTURI"
}
]
} |
---|
...
{
"cod_empresa": "24",
"cod_item_compon": "ITEM-TESTE",
"cod_grade_compon_1_orig": "BRANCO",
"cod_grade_compon_2_orig": "",
"cod_grade_compon_3_orig": "",
"cod_grade_compon_4_orig": "",
"cod_grade_compon_5_orig": "",
"acao": "1",
"cod_item_compon_dest": "ITEM-TESTE-NOVO",
"cod_grade_compon_1_dest": "PRETO",
"cod_grade_compon_2_dest": "",
"cod_grade_compon_3_dest": "",
"cod_grade_compon_4_dest": "",
"cod_grade_compon_5_dest": "",
"justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE BRANCO PARA ITEM-TESTE-NOVO PRETO."
},
{
"cod_empresa": "24",
"cod_item_compon": "ITEM-TESTE-NOVO",
"cod_grade_compon_1_orig": "PRETO",
"cod_grade_compon_2_orig": "",
"cod_grade_compon_3_orig": "",
"cod_grade_compon_4_orig": "",
"cod_grade_compon_5_orig": "",
"acao": "1",
"cod_item_compon_dest": "ITEM-TESTE",
"cod_grade_compon_1_dest": "BRANCO",
"cod_grade_compon_2_dest": "",
"cod_grade_compon_3_dest": "",
"cod_grade_compon_4_dest": "",
"cod_grade_compon_5_dest": "",
"justificativa": "ALTERACAO DO COMPONENTE ITEM-TESTE-NOVO PRETO PARA ITEM-TESTE BRANCO."
}
]
} |
|
Card |
---|
label | Execução da Rotina no Logix |
---|
| Para que seja possível a execução da rotina no Logix é necessário seguir os passos abaixo: - Criar a rotina 4GL sem parâmetros.
- Os valores enviados devem ser recuperados através da função _ADVPL_WfGetParameterValue.
- Para recuperar a quantidade dos campos filhos nos valores enviados, utilizar a função _ADVPL_WfGetParameterLength.
- A função deve retornar uma variável RECORD com no mínimo dois atributos*:
|
|
...
- : do tipo SMALLINT, deverá ter o valor TRUE ou FALSE para indicar se a rotina foi executada com sucesso; e
- msg: do tipo CHAR, deverá ter uma curta mensagem para que a mesma seja exibida para o usuário no arquivo de LOG do Fluig ou em tela.
* A variável RECORD de retorno poderá ter outros atributos conforme necessidade do processo.
Exemplo |
|
Bloco de código |
---|
language | none |
---|
linenumbers | true |
---|
|
#----------------------------------------- |
| --vdp10000createclientes_wfprocesscomponentes()
#------------------------------------- |
| ------ msg CHAR(300)
END RECORD
DEFINE lr_comp_orig,
lr_comp_dest RECORD
cod_item_compon LIKE estrut_grade.cod_item_compon,
cod_grade_comp_1 LIKE estrut_grade.cod_grade_comp_1,
cod_grade_comp_2 LIKE estrut_grade.cod_grade_comp_2,
cod_grade_comp_3 LIKE estrut_grade.cod_grade_comp_3,
cod_grade_comp_4 LIKE estrut_grade.cod_grade_comp_4,
cod_grade_comp_5 LIKE estrut_grade.cod_grade_comp_5
END RECORD
|
| lr_clientesla_item_pai ARRAY[100] OF RECORD
|
| num_cgc_cpf LIKE clientes.num_cgc_cpfcod_item_pai LIKE estrut_grade.cod_item_pai,
cod_grade_1 LIKE estrut_grade.cod_grade_1,
cod_grade_2 LIKE estrut_grade.cod_grade_2,
cod_grade_3 LIKE estrut_grade.cod_grade_3,
cod_grade_4 LIKE estrut_grade.cod_grade_4,
cod_ |
| clienteclientes_cliente,
_grade_5,
qtd_necessaria LIKE estrut_grade.qtd_necessaria,
dat_validade_ini LIKE estrut_grade.dat_validade_ini,
dat_validade_fim LIKE estrut_grade.dat_validade_fim,
|
| numero INTEGERLIKE estrut_grade.num_sequencia
END RECORD |
|
DEFINE l_justificativa CHAR(300),
l_acao CHAR(001),
l_altera_item CHAR(001)
DEFINE l_ind,
l_item_ind,
l_item_count SMALLINT
IF LOG_initApp("MANENG") > 0 THEN
LET lr_return.status = FALSE
LET lr_return.msg = "Usuário ",p_user CLIPPED," sem permissão para acessar a rotina."
RETURN lr_return
END IF
LET lr_comp_ |
| clientesnumcgccpfAdvPLADVPL_WfGetParameterValue( |
| 'clientes','num_cgc_cpf'"componentes","cod_item_compon_orig")
LET lr_comp_ |
| clientesclienteAdvPLADVPL_WfGetParameterValue( |
| 'clientes','cod_cliente')
"componentes","cod_grade_comp_1_orig")
LET lr_comp_orig.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_orig")
LET lr_comp_orig.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_orig")
LET lr_comp_orig.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_4_orig")
LET lr_comp_orig. |
|
cod_grade_comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_orig")
LET lr_comp_dest.cod_item_compon = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_dest")
LET lr_ |
| return.status = TRUEcomp_dest.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_dest")
LET lr_comp_ |
| return.msg = 'Cliente "',lr_clientes.cod_cliente CLIPPED,'" informado com sucesso.'
RETURN lr_return
END FUNCTION |
É possível incluir mais informações de retorno para o workflow além das duas citadas acima. Este retorno é convertido para Json e utilizado da maneira abaixo:
dest.cod_grade_comp_2 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_2_dest")
LET lr_comp_dest.cod_grade_comp_3 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_3_dest")
LET lr_comp_dest.cod_grade_comp_4 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_4_dest")
LET lr_comp_dest.cod_grade_comp_5 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_5_dest")
LET l_justificativa = _ADVPL_WfGetParameterValue("componentes","justificativa")
LET l_acao = _ADVPL_WfGetParameterValue("componentes","slct_acao")
#Verifica os códigos da grade de origem.
IF lr_comp_orig.cod_grade_comp_1 IS NULL THEN
LET lr_comp_orig.cod_grade_comp_1 = " "
END IF
IF lr_comp_orig.cod_grade_comp_2 IS NULL THEN
LET lr_comp_orig.cod_grade_comp_2 = " "
END IF
IF lr_comp_orig.cod_grade_comp_3 IS NULL THEN
LET lr_comp_orig.cod_grade_comp_3 = " "
END IF
IF lr_comp_orig.cod_grade_comp_4 IS NULL THEN
LET lr_comp_orig.cod_grade_comp_4 = " "
END IF
IF lr_comp_orig.cod_grade_comp_5 IS NULL THEN
LET lr_comp_orig.cod_grade_comp_5 = " "
END IF
#Verifica os códigos da grade de destino.
IF lr_comp_dest.cod_grade_comp_1 IS NULL THEN
LET lr_comp_dest.cod_grade_comp_1 = " "
END IF
IF lr_comp_dest.cod_grade_comp_2 IS NULL THEN
LET lr_comp_dest.cod_grade_comp_2 = " "
END IF
IF lr_comp_dest.cod_grade_comp_3 IS NULL THEN
LET lr_comp_dest.cod_grade_comp_3 = " "
END IF
IF lr_comp_dest.cod_grade_comp_4 IS NULL THEN
LET lr_comp_dest.cod_grade_comp_4 = " "
END IF
IF lr_comp_dest.cod_grade_comp_5 IS NULL THEN
LET lr_comp_dest.cod_grade_comp_5 = " "
END IF
LET l_item_ind = 0
LET l_item_count = _ADVPL_WfGetParameterLength("item_pai")
FOR l_ind = 1 TO l_item_count
LET l_altera_item = _ADVPL_WfGetParameterValue("item_pai","altera_item",l_ind)
IF l_altera_item = "S" THEN
LET l_item_ind = l_item_ind + 1
LET la_item_pai[l_item_ind].cod_item_pai = _ADVPL_WfGetParameterValue("item_pai","cod_item_pai",l_ind)
LET la_item_pai[l_item_ind].cod_grade_1 = _ADVPL_WfGetParameterValue("item_pai","cod_grade_1",l_ind)
LET la_item_pai[l_item_ind].cod_grade_2 = _ADVPL_WfGetParameterValue("item_pai","cod_grade_2",l_ind)
LET la_item_pai[l_item_ind].cod_grade_3 = _ADVPL_WfGetParameterValue("item_pai","cod_grade_3",l_ind)
LET la_item_pai[l_item_ind].cod_grade_4 = _ADVPL_WfGetParameterValue("item_pai","cod_grade_4",l_ind)
LET la_item_pai[l_item_ind].cod_grade_5 = _ADVPL_WfGetParameterValue("item_pai","cod_grade_5",l_ind)
LET la_item_pai[l_item_ind].qtd_necessaria = _ADVPL_WfGetParameterValue("item_pai","qtd_necessaria",l_ind)
LET la_item_pai[l_item_ind].dat_validade_ini = _ADVPL_WfGetParameterValue("item_pai","dat_validade_ini",l_ind)
LET la_item_pai[l_item_ind].dat_validade_fim = _ADVPL_WfGetParameterValue("item_pai","dat_validade_fim",l_ind)
LET la_item_pai[l_item_ind].num_sequencia = _ADVPL_WfGetParameterValue("item_pai","num_sequencia",l_ind)
#Verifica os códigos da grade do item pai.
IF la_item_pai[l_item_ind].cod_grade_1 IS NULL THEN
LET la_item_pai[l_item_ind].cod_grade_1 = " "
END IF
IF la_item_pai[l_item_ind].cod_grade_2 IS NULL THEN
LET la_item_pai[l_item_ind].cod_grade_2 = " "
END IF
IF la_item_pai[l_item_ind].cod_grade_3 IS NULL THEN
LET la_item_pai[l_item_ind].cod_grade_3 = " "
END IF
IF la_item_pai[l_item_ind].cod_grade_4 IS NULL THEN
LET la_item_pai[l_item_ind].cod_grade_4 = " "
END IF
IF la_item_pai[l_item_ind].cod_grade_5 IS NULL THEN
LET la_item_pai[l_item_ind].cod_grade_5 = " "
END IF
END IF
END FOR
{
Regra de negócio 4GL.
}
LET lr_return.status = TRUE
LET lr_return.msg = "Item componente alterado com sucesso."
RETURN lr_return
END FUNCTION |
Padrão JSON String de retorno Bloco de código |
---|
theme | Eclipse |
---|
language | javascript |
---|
| {
"success": true|false,
"msg": "Mensagem retornada pela rotina." |
|
|
Bloco de código |
---|
language | javascript |
---|
firstline | 13 |
---|
linenumbers | true |
---|
|
result = callLogixFunction('vdp10000_create_clientes', values);
if (result) {
if (result.status) {
log.info('[LOGIX] ' + result.msg);
} else {
log.info('[LOGIX] Nao foi possivel concluir a criacao de cliente [' + result.msg + ']');
} |