Objetivo
A partir de los eventos de workflow del Fluig es posible efectuar la ejecución de rutinas en el Logix permitiendo el envío de parámetros y retornos de la regla de negocio para el proceso.
Para realizar la ejecución de una rutina Logix a partir de un evento es necesario seguir los pasos a continuación:
- Utilizar el Dataset personalizado LogixExecServiceDS.
- Enviar
los parámetros a continuación como constraints para
el Dataset:
- El código de la empresa que será utilizado en la regla de negocio;
- Rutina del workflow que será ejecutada; y
- Valores que se utilizarán en la ejecución de la rutina*.
- Recuperar el resultado de la ejecución de la rutina a través de la función estándar getValue del objeto Dataset*.
* Los valores que se deben enviar y el resultado de la rutina obedecen el formato JSON string.
Ejemplo
function afterProcessFinish(processId) { var values, company, c1, c2, c3, dataset, result; //Recupera los valores del proceso. 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 el valor definido para el código de la empresa. company = values.componente.cod_empresa; //Convierte el objeto JSON para JSON string. values = JSON.stringify(values); log.info("[LOGIX][WFMAN002] Valores del formulario recuperados: " + values + "."); log.info("[LOGIX][WFMAN002] Iniciando ejecución de la rutina 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 + "."); //Convierte el 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] No fue posible concluir el proceso: " + result.msg + "."); } } }
Estándares JSON String de envío
//Para registros maestros (objeto). { "componente": { "cod_empresa": "24", "cod_item_compon": "ÍTEM-PRUEBA", "cod_grade_compon_1_orig": "BLANCO", "cod_grade_compon_2_orig": "", "cod_grade_compon_3_orig": "", "cod_grade_compon_4_orig": "", "cod_grade_compon_5_orig": "", "acción": "1", "cod_item_compon_dest": "ÍTEM-PRUEBA-NUEVO", "cod_grade_compon_1_dest": "NEGRO", "cod_grade_compon_2_dest": "", "cod_grade_compon_3_dest": "", "cod_grade_compon_4_dest": "", "cod_grade_compon_5_dest": "", "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA BLANCO PARA ÍTEM-PRUEBA-NUEVO NEGRO." } } //Para registros de detalles (listas). { "componentes": [ { "cod_empresa": "24", "cod_item_compon": "ÍTEM-PRUEBA", "cod_grade_compon_1_orig": "BLANCO", "cod_grade_compon_2_orig": "", "cod_grade_compon_3_orig": "", "cod_grade_compon_4_orig": "", "cod_grade_compon_5_orig": "", "acción": "1", "cod_item_compon_dest": "ÍTEM-PRUEBA-NUEVO", "cod_grade_compon_1_dest": "NEGRO", "cod_grade_compon_2_dest": "", "cod_grade_compon_3_dest": "", "cod_grade_compon_4_dest": "", "cod_grade_compon_5_dest": "", "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA BLANCO PARA ÍTEM-PRUEBA-NUEVO NEGRO." }, { "cod_empresa": "24", "cod_item_compon": "ÍTEM-PRUEBA-NUEVO", "cod_grade_compon_1_orig": "NEGRO", "cod_grade_compon_2_orig": "", "cod_grade_compon_3_orig": "", "cod_grade_compon_4_orig": "", "cod_grade_compon_5_orig": "", "acción": "1", "cod_item_compon_dest": "ÍTEM-PRUEBA", "cod_grade_compon_1_dest": "BLANCO", "cod_grade_compon_2_dest": "", "cod_grade_compon_3_dest": "", "cod_grade_compon_4_dest": "", "cod_grade_compon_5_dest": "", "justificación": "MODIFICACIÓN DEL COMPONENTE ÍTEM-PRUEBA-NUEVO NEGRO PARA ÍTEM-PRUEBA BLANCO." } ] }
Para que sea posible la ejecución de la rutina en Logix es necesario seguir los pasos a continuación:
- Crear la rutina 4GL sin parámetros.
- Los valores enviados deben ser recuperados a través de la función _ADVPL_WfGetParameterValue.
- Para recuperar la cantidad de los campos filhos en los
valores enviados, utilizar la función _ADVPL_WfGetParameterLength.
- La función debe retornar una variable RECORD con como
mínimo dos atributos*:
- estatus: del tipo SMALLINT, deberá tener el valor TRUE o FALSE para indicar si la rutina fue ejecutada con éxito; y
- msg: del tipo CHAR, deberá tener un corto mensaje para que la misma sea exhibida para el usuario en el archivo de LOG del Fluig o en pantalla.
* La variable RECORD de retorno podrá tener otros atributos conforme a la necesidad del proceso.
Ejemplo
#-------------------------------------# 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_ítem_padre ARRAY[100] OF RECORD cód_ítem_padre LIKE estruct_grilla.cód_ítem_padre, cód_grilla_1 LIKE estruct_grilla.cód_grilla_1, cód_grilla_2 LIKE estruct_grilla.cód_grilla_2, cód_grilla_3 LIKE estruct_grilla cód_grilla_3, cód_grilla_4 LIKE estruct_grilla.cód_grilla_4, cód_grilla_5 LIKE estruct_grilla.cód_grilla_5, cant_necesaria LIKE estruct_grilla.cant_necesaria, fecha_validez_ini LIKE estruct_grilla.fecha_validez_ini, fecha_validez_fin LIKE estruct_grilla.fecha_validez_fin, num_secuencia LIKE estruct_grilla.num_secuencia END RECORD DEFINE l_justificación CHAR(300), l_acción CHAR(001), l_altera_ítem CHAR(001) DEFINE l_ind, l_ítem_ind, l_ítem_count SMALLINT IF LOG_initApp("MANENG") > 0 THEN LET lr_return.status = FALSE LET lr_return.msg = "Usuario ",p_user CLIPPED," sin permiso para acceder la rutina." RETURN lr_return END IF LET lr_comp_orig.cód_ítem_compon = _ADVPL_WfGetParameterValue("componentes","cód_ítem_compon_orig") LET lr_comp_orig.cód_grilla_comp_1 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_1_orig") LET lr_comp_orig.cód_grilla_comp_2 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_2_orig") LET lr_comp_orig.cód_grilla_comp_3 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_3_orig") LET lr_comp_orig.cód_grilla_comp_4 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_4_orig") LET lr_comp_orig.cód_grilla_comp_5 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_5_orig") LET lr_comp_dest.cód_ítem_compon = _ADVPL_WfGetParameterValue("componentes","cód_ítem_compon_dest") LET lr_comp_dest.cód_grilla_comp_1 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_1_dest") LET lr_comp_dest.cód_grilla_comp_2 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_2_dest") LET lr_comp_dest.cód_grilla_comp_3 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_3_dest") LET lr_comp_dest.cód_grilla_comp_4 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_4_dest") LET lr_comp_dest.cód_grilla_comp_5 = _ADVPL_WfGetParameterValue("componentes","cód_grilla_comp_5_dest") LET l_justificación = _ADVPL_WfGetParameterValue("componentes","justificación") LET l_acción = _ADVPL_WfGetParameterValue("componentes","slct_acción") #Verifica los códigos de la grilla de origen. IF lr_comp_orig.cód_grilla_comp_1 IS NULL THEN LET lr_comp_orig.cód_grade_comp_1 = " " END IF IF lr_comp_orig.cód_grilla_comp_2 IS NULL THEN LET lr_comp_orig.cód_grilla_comp_2 = " " END IF IF lr_comp_orig.cód_grilla_comp_3 IS NULL THEN LET lr_comp_orig.cód_grilla_comp_3 = " " END IF IF lr_comp_orig.cód_grilla_comp_4 IS NULL THEN LET lr_comp_orig.cód_grilla_comp_4 = " " END IF IF lr_comp_orig.cód_grilla_comp_5 IS NULL THEN LET lr_comp_orig.cód_grilla_comp_5 = " " END IF #Verifica los códigos de la grilla de destino. IF lr_comp_dest.cód_grilla_comp_1 IS NULL THEN LET lr_comp_dest.cód_grilla_comp_1 = " " END IF IF lr_comp_dest.cód_grilla_comp_2 IS NULL THEN LET lr_comp_dest.cód_grilla_comp_2 = " " END IF IF lr_comp_dest.cód_grilla_comp_3 IS NULL THEN LET lr_comp_dest.cód_grilla_comp_3 = " " END IF IF lr_comp_dest.cód_grilla_comp_4 IS NULL THEN LET lr_comp_dest.cód_grilla_comp_4 = " " END IF IF lr_comp_dest.cód_grilla_comp_5 IS NULL THEN LET lr_comp_dest.cód_grilla_comp_5 = " " END IF LET l_ítem_ind = 0 LET l_ítem_count = _ADVPL_WfGetParameterLength("ítem_pai") FOR l_ind = 1 TO l_ítem_count LET l_altera_ítem = _ADVPL_WfGetParameterValue("ítem_padre","modif_ítem",l_ind) IF l_modif_ítem = "S" THEN LET l_ítem_ind = l_ítem_ind + 1 LET la_ítem_padre[l_ítem_ind].cód_ítem_padre = _ADVPL_WfGetParameterValue(ítem_padre","cód_ítem_padre",l_ind) LET la_ítem_padre[l_ítem_ind].cód_grilla_1 = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_1",l_ind) LET la_ítem_padre[l_ítem_ind].cód_grilla_2 = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_2",l_ind) LET la_ítem_padre[l_ítem_ind].cód_grilla_3 = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_3",l_ind) LET la_ítem_padre[l_ítem_ind].cód_grilla_4 = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_4",l_ind) LET la_ítem_pai[l_ítem_ind].cód_grilla_5 = _ADVPL_WfGetParameterValue("ítem_padre","cód_grilla_5",l_ind) LET la_ítem_padre[l_ítem_ind].cant_necesaria = _ADVPL_WfGetParameterValue("ítem_padre","cant_necesaria",l_ind) LET la_ítem_padre[l_ítem_ind].fecha_validez_ini = _ADVPL_WfGetParameterValue("ítem_padre","fecha_validez_ini",l_ind) LET la_ítem_padre[l_ítem_ind].fecha_validez_fin = _ADVPL_WfGetParameterValue("ítem_padre","fecha_validez_fin",l_ind) LET la_ítem_padre[l_ítem_ind].num_secuencia = _ADVPL_WfGetParameterValue("ítem_padre","num_secuencia",l_ind) #Verifica los códigos de la grilla del ítem padre. IF la_ítem_padre[l_ítem_ind].cód_grilla_1 IS NULL THEN LET la_ítem_padre[l_ítem_ind].cód_grilla_1 = " " END IF IF la_ítem_padre[l_ítem_ind].cód_grilla_2 IS NULL THEN LET la_ítem_padre[l_ítem_ind].cód_grilla_2 = " " END IF IF la_ítem_padre[l_ítem_ind].cód_grilla_3 IS NULL THEN LET la_ítem_padre[l_ítem_ind].cód_grilla_3 = " " END IF IF la_ítem_padre[l_ítem_ind].cód_grilla_4 IS NULL THEN LET la_ítem_padre[l_ítem_ind].cód_grilla_4 = " " END IF IF la_ítem_padre[l_ítem_ind].cód_grilla_5 IS NULL THEN LET la_ítem_padre[l_ítem_ind].cód_grilla_5 = " " END IF END IF END FOR { Regla de negocio 4GL. } LET lr_return.status = TRUE LET lr_return.msg = "Ítem componente modificado con éxito." RETURN lr_return END FUNCTION
Estándar JSON String de retorno
{ "success": true|false, "msg": "Mensaje retornada por la rutina." }
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas