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.
Para realizar a execução de uma rotina Logix 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
function afterProcessFinish(processId) { var values, company, c1, c2, c3, dataset, result; //Recupera os valores do processo. values = { "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("cod_grade_compon_1_dest")), "cod_grade_compon_2_dest": new String(hAPI.getCardValue("cod_grade_compon_2_dest")), "cod_grade_compon_3_dest": new String(hAPI.getCardValue("cod_grade_compon_3_dest")), "cod_grade_compon_4_dest": new String(hAPI.getCardValue("cod_grade_compon_4_dest")), "cod_grade_compon_5_dest": new String(hAPI.getCardValue("cod_grade_compon_5_dest")), "justificativa": new String(hAPI.getCardValue("justificativa")) } }; //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) { if (result.status) { log.info("[LOGIX][WFMAN002] " + result.msg); } else { log.error("[LOGIX][WFMAN002] Nao foi possivel concluir o processo: " + result.msg + "."); } } }
Padrões JSON String de envio
//Para registros mestres (objeto). { "componente": { "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 de detalhes (listas). { "componentes": [ { "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." } ] }
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*:
- status: 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
#-------------------------------------# FUNCTION wfman002_alterar_componentes() #-------------------------------------# DEFINE lr_return RECORD status SMALLINT, 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 DEFINE la_item_pai ARRAY[100] OF RECORD cod_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_grade_5 LIKE estrut_grade.cod_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, num_sequencia LIKE 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_orig.cod_item_compon = _ADVPL_WfGetParameterValue("componentes","cod_item_compon_orig") LET lr_comp_orig.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("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_comp_dest.cod_grade_comp_1 = _ADVPL_WfGetParameterValue("componentes","cod_grade_comp_1_dest") LET lr_comp_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
{ "success": true|false, "msg": "Mensagem retornada pela rotina." }
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas