Saltar a contenido

Cómo crear una Definición del Proceso estándar

Visión general

El patrón de IU estándar de la Definición del Proceso permite crear ventanas de Parámetros definidas en el Diccionario de la Aplicación; la IU de estas ventanas se genera bajo demanda, por lo que, una vez definidos esos parámetros, el desarrollador solo necesita encargarse de la implementación del proceso.

Esta sección añadirá una nueva Definición del Proceso estándar y creará una entrada de menú para invocarla.

La implementación requiere experiencia en desarrollo. Consulte las siguientes páginas de conceptos para obtener información de base sobre los handlers de acción y el desarrollo JavaScript:

Módulo de ejemplo

Este procedimiento está respaldado por un módulo de ejemplo que muestra ejemplos del código mostrado y comentado.

El código del módulo de ejemplo puede descargarse desde el repositorio com.etendoerp.client.application.examples

Pasos para implementar el Proceso

Los procesos de Definición del Proceso estándar aprovechan los mismos conceptos base del Diccionario de la Aplicación, lo que permite definir parámetros para el proceso como metadatos que generan la UI cuando se requiere, sin necesidad de generar código, compilar o reiniciar tomcat para aplicar los cambios durante el desarrollo.

Este proceso de ejemplo tendrá los siguientes parámetros:

  • Cantidad mín. y máx.: dos campos enteros obligatorios.
  • Parte: una búsqueda que permite seleccionar varias partes al mismo tiempo.
  • Terceros: un selector estándar de terceros.

Cuando se hace clic en el botón Hecho, se ejecuta el proceso:

  • Verifica en backend que el campo max qty sea mayor que min qty. En caso de que no lo sean, se envía un error de validación al cliente solicitando al usuario que corrija los valores antes de continuar.
  • Si se cumple la validación anterior:
    • Se suma el importe total de todas las partes seleccionadas y se muestra en un mensaje en la ventana de Parámetro.
    • Si se selecciona un tercero, se abre la ventana Terceros dentro del seleccionado y se muestra un mensaje en esta ventana.

Definir el Proceso

  • Abra la ventana Definición del Proceso
  • Cree un nuevo registro
  • Defina el patrón de UI: Estándar (Parámetros definidos en el Diccionario)
  • Establezca el Handler: org.openbravo.client.application.examples.StandardProcessActionHandler. Esta es la clase Java que implementa el proceso y que se invocará cuando el usuario haga clic en el botón de acción.
  • Guarde

Añadir Parámetros

  • Parámetro Min Qty:
    • Vaya a la pestaña Parámetros
    • Cree un nuevo registro
    • Nombre: Min Qty. Este es el nombre que se mostrará en la UI para este parámetro.
    • Nombre interno: min. Es el nombre interno que se utilizará para recuperar el valor en la clase Java.
    • Número de secuencia: 10. Define la posición de este campo en la ventana de Parámetro en relación con el resto de campos.
    • Referencia: Entero. Define tanto el tipo de dato que contendrá el parámetro como la forma en que este parámetro se visualiza y se comporta en la UI.
    • Obligatorio: true. Forzará a que el parámetro tenga un valor antes de permitir enviar la información al proceso.
    • Valor por defecto: 0. Es el valor que tomará el parámetro por defecto. Es una expresión JavaScript evaluada en el lado servidor, como las Expresiones de filtrado por defecto usadas en los selectores.
  • Siga pasos similares para crear el campo Max Qty
  • Multiselector Parte
    • Cree un selector de múltiples partes
    • Cree un nuevo parámetro
    • Referencia: OBUISEL_Multi Selector Reference
    • Referencia clave: Multi Order Selector
  • El parámetro Terceros tiene OBUISEL_Selector Reference como Referencia y Terceros no filtrado por defecto por cliente/proveedor como Referencia clave

Añadirlo al Menú

Añadir un proceso al menú permite abrirlo desde el menú como una nueva pestaña.

  • En la ventana Menú cree una nueva entrada.
  • Acción: Definición del Proceso.
  • Definición del Proceso: Example Parameter Process.

Implementación Java

En el caso de un handler de acción de Definición del Proceso, extienda de BaseProcessActionHandler e implemente el método doExecute.

StandardProcessActionHandler.java
/*
  *************************************************************************
  * The contents of this file are subject to the Openbravo  Public  License
  * Version  1.1  (the  "License"),  being   the  Mozilla   Public  License
  * Version 1.1  with a permitted attribution clause; you may not  use this
  * file except in compliance with the License. You  may  obtain  a copy of
  * the License at http://www.openbravo.com/legal/license.html
  * Software distributed under the License  is  distributed  on  an "AS IS"
  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  * License for the specific  language  governing  rights  and  limitations
  * under the License.
  * The Original Code is Openbravo ERP.
  * The Initial Developer of the Original Code is Openbravo SLU
  * All portions are Copyright (C) 2013 Openbravo SLU
  * All Rights Reserved.
  * Contributor(s):  ______________________________________.
  ************************************************************************
  */
package org.openbravo.client.application.examples;
 
import java.math.BigDecimal;
import java.util.Map;
 
import org.apache.log4j.Logger;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.openbravo.client.application.process.BaseProcessActionHandler;
import org.openbravo.dal.service.OBDal;
import org.openbravo.erpCommon.utility.OBMessageUtils;
import org.openbravo.model.common.order.Order;
 
public class StandardProcessActionHandler extends BaseProcessActionHandler {
  private static final Logger log = Logger.getLogger(StandardProcessActionHandler.class);
 
  @Override
  protected JSONObject doExecute(Map<String, Object> parameters, String content) {
    try {
      JSONObject result = new JSONObject();
 
      JSONObject request = new JSONObject(content);
      JSONObject params = request.getJSONObject("_params");
 
      // Do validations on param values
      double min = params.getDouble("min");
      double max = params.getDouble("max");
 
      if (max < min) {
        // In case validations are not satisfied, show an error message and allow user to fix
        // parameters
        result.put("retryExecution", true);
 
        JSONObject msg = new JSONObject();
        msg.put("severity", "error");
        msg.put(
            "text",
            OBMessageUtils.getI18NMessage("OBEXAPP_MinGtMax", new String[] { Double.toString(min),
                Double.toString(max) }));
        result.put("message", msg);
        return result;
      }
 
      // Execute process and prepare an array with actions to be executed after execution
      JSONArray actions = new JSONArray();
 
      // 1. Sum amounts of all orders and show a message in process view
      JSONArray orders = params.getJSONArray("orders");
      BigDecimal totalAmnt = BigDecimal.ZERO;
      for (int i = 0; i < orders.length(); i++) {
        String orderId = orders.getString(i);
        Order order = OBDal.getInstance().get(Order.class, orderId);
        totalAmnt = totalAmnt.add(order.getGrandTotalAmount());
      }
      JSONObject msgTotal = new JSONObject();
      msgTotal.put("msgType", "info");
      // XXX: these two messages should be translatable, like OBEXAPP_MinGtMax above
      msgTotal.put("msgTitle", "Selected Orders");
      msgTotal.put("msgText", "Total amount: " + totalAmnt.toString());
 
      JSONObject msgTotalAction = new JSONObject();
      msgTotalAction.put("showMsgInProcessView", msgTotal);
 
      actions.put(msgTotalAction);
 
      // 2. If business partner is not null, open it in BP window and show a message in new tab
      if (!params.isNull("bp")) {
        String bpId = params.getString("bp");
        JSONObject recordInfo = new JSONObject();
        recordInfo.put("tabId", "220");
        recordInfo.put("recordId", bpId);
        recordInfo.put("wait", true);
 
        JSONObject openTabAction = new JSONObject();
        openTabAction.put("openDirectTab", recordInfo);
 
        actions.put(openTabAction);
 
        JSONObject msgInBPTab = new JSONObject();
        msgInBPTab.put("msgType", "success");
        msgInBPTab.put("msgTitle", "Process execution");
        msgInBPTab.put("msgText", "This record was opened from process execution");
 
        JSONObject msgInBPTabAction = new JSONObject();
        msgInBPTabAction.put("showMsgInView", msgInBPTab);
 
        actions.put(msgInBPTabAction);
      }
 
      result.put("responseActions", actions);
 
      return result;
    } catch (JSONException e) {
      log.error("Error in process", e);
      return new JSONObject();
    }
  }
}

Respuesta

El ActionHandler devuelve un JSONObject con las acciones que se deben realizar tras la ejecución.

Validaciones

Es posible realizar validaciones en el backend antes de ejecutar el proceso real; cuando estas validaciones no se satisfacen, se puede mostrar un mensaje en la UI para permitir que el usuario corrija los valores problemáticos.

Cuando las validaciones no se satisfacen, se incluye la propiedad "retryExecution": true en la respuesta. Esto permite al usuario corregir los datos y reenviar de nuevo. Adicionalmente, se puede añadir un mensaje para mostrar más información sobre el problema.

La respuesta tendría un aspecto similar a este:

{
  "retryExecution": true,
  "message": {
    "severity": "error",
    "text": "Min value (80.0) cannot be greater than Max value (10.0)"
  }
}
Devolver varias acciones

Tras ejecutar el proceso, es posible realizar una serie de acciones.

Info

Para más información, consulte extensión de proceso Pick & Execute.

La respuesta debería ser similar a:

{
  "responseActions": [{
    "showMsgInProcessView": {
      "msgType": "info",
      "msgTitle": "Selected Orders",
      "msgText": "Total amount: 3020482.63"
    }
  }, {
    "openDirectTab": {
      "tabId": "220",
      "recordId": "A6750F0D15334FB890C254369AC750A8",
      "wait": true
    }
  }, {
    "showMsgInView": {
      "msgType": "success",
      "msgTitle": "Process execution",
      "msgText": "This record was opened from process execution"
    }
  }, {
    "refreshGrid": {
    }
  }, {
    "refreshGridParameter": {
      "gridName": "gridParameterName"
    }
  }]
}
  • responseActions. Es el nombre del JSONArray que indica que se realizará una serie de acciones tras la ejecución. Cada uno de los elementos del array es una acción; se pueden ejecutar distintos tipos de acciones. También es posible ampliar mediante módulos las acciones posibles a realizar:
  • showMsgInProcessView. Muestra un mensaje en la misma pestaña desde la que se invocó el proceso. En caso de que el proceso se abra desde el menú, este mensaje se verá en la ventana donde se proporcionan los valores de los parámetros; si el proceso se invoca desde un botón en una pestaña, el mensaje se mostrará en esa pestaña.
  • openDirectTab. Abre una nueva pestaña. Con tabId, es posible indicar el registro a abrir en esa pestaña (recordId). La propiedad wait: true indica que la siguiente acción no se iniciará hasta que esta finalice. Opcionalmente, también puede incluir un objeto de criterios para añadir automáticamente un filtro eliminable a la pestaña abierta. Un criterio es un objeto que describe un filtro en un grid.

    Info

    Para más información, visite Smartclient.

  • showMsgInView. Muestra un mensaje en la pestaña abierta recientemente.

  • refreshGrid. Actualiza el grid donde está definido el botón del proceso. Los grids no se actualizan automáticamente tras invocar un proceso estándar; solo se actualiza el registro seleccionado. Si el proceso añade o elimina registros de ese grid, entonces debe añadir refreshGrid a la lista de acciones de respuesta para ver los datos actualizados en el grid.
  • refreshGridParameter. Actualiza el parámetro de grid con nombre gridName presente en la ventana de parámetros del proceso estándar. Este tipo de respuesta es especialmente útil para aquellas ventanas de parámetros que no se cierran tras la ejecución del handler de acción (los parámetros permanecen visibles tras la ejecución del proceso), por ejemplo, aquellas definiciones de proceso que se abren directamente desde el menú.
  • El método getResponseBuilder() está disponible para las clases que extienden BaseProcessActionHandler. Este método devuelve un asistente que puede utilizarse para construir el resultado del proceso con las acciones de respuesta estándar deseadas de forma sencilla. Por ejemplo:
@Override
protected JSONObject doExecute(Map<String, Object> parameters, String content) {
  ...
  ...
  return getResponseBuilder()
      .showMsgInProcessView(MessageType.INFO, "Message Title", "This is a sample message")
      .openDirectTab("220", false).build();
}

Prueba del Proceso

Ahora es necesario compilar y desplegar (porque se ha añadido una nueva clase Java; tenga en cuenta que esto no es necesario en caso de solo editar/añadir parámetros).

Después de compilar y desplegar, habrá una nueva entrada en el menú: Proceso de ejemplo de parámetros. Esta entrada abre la ventana de parámetros donde se muestran todos los parámetros definidos y se presenta un botón Hecho para enviar los valores establecidos para ellos. Cuando se ejecuta el proceso:

  • Si Cantidad máx. es mayor que Cantidad mín., se muestra un mensaje y el proceso puede enviarse de nuevo.
  • Se muestra un mensaje en la ventana de parámetros sumando los importes de todas las partes seleccionadas.
  • Si se selecciona un tercero, se abre en una nueva pestaña mostrando un mensaje en ella.

Temas avanzados

Invocar el proceso desde una solapa

Los procesos de Definición del Proceso estándar pueden abrirse como una solapa desde el menú o como un popup modal desde un botón en una solapa. Esta segunda opción puede lograrse añadiendo una columna adicional a la tabla utilizada en la solapa.

Info

Para más detalles sobre este proceso, visite Cómo crear un proceso Pick and Execute.

Solo lectura y lógica de visualización

Los parámetros en Definición del Proceso soportan lógica de visualización y de solo lectura. Esto permite mostrar u ocultar, y hacer editables o de solo lectura, los parámetros en función de los valores introducidos en otros parámetros.

Combos subordinados

Los datos que pueden seleccionarse dentro de un combo (selector) pueden restringirse en función de los valores que tomen otros parámetros usando Reglas de validación. La lógica de estas validaciones es un HQL que se añade a su datasource. Esto se escribe en JavaScript, siendo posible usar OBBindings, del mismo modo que se escribe el valor por defecto.

Agrupación de parámetros

Es posible agrupar parámetros en la UI usando la propiedad Grupo de campos al definir el parámetro.

Mostrar resultados en la propia ventana del proceso

Es posible mostrar el resultado de un proceso directamente en la propia ventana del proceso. Esto tiene sentido si la sección de parámetros es pequeña y desea mostrar el resultado directamente.

Para conseguirlo, el objeto data/json devuelto por el handler del servidor debe establecer el parámetro showResultsInProcessView a true. También tiene sentido establecer el parámetro retryExecution a true:

{
  "retryExecution": true,
  "showResultsInProcessView": true
}

El método javascript llamado obtiene un objeto con una propiedad processView que hace referencia a la vista general del proceso. Desde la vista del proceso puede acceder al resultLayout para mostrar el resultado. El resultLayout es un SmartclientHLayout.

Por ejemplo, una acción de retorno:

OB.Utilities.Action.set('openSaikuReport', function(paramObj) {
  var i, queries = paramObj.queries,
      processView = paramObj._processView,
      mainLayout = processView.resultLayout, reportView;
 
  reportView = isc.OBANALY_ShowSaikuReport.create({
    parameters: paramObj,
    queries: queries
  });
  mainLayout.addMember(reportView);

Colocar un parámetro en una columna concreta

El campo Número de columna de la solapa Parámetro permite especificar la columna donde debe colocarse el parámetro. Los parámetros de grid usan siempre las cuatro columnas del formulario, por lo que este campo no aplica a ellos.

Invocar una validación de lado del cliente antes de llamar al handler de acción

El campo Validación de lado del cliente de la solapa Definición del Proceso permite definir una función que se ejecutará antes de que se realice la petición al handler de acción. Esta función puede usarse para realizar Validación de lado del cliente.

Esta función debe aceptar 3 parámetros:

  • el objeto de la ventana de parámetros. Es decir, si nombra este parámetro vista, entonces el formulario de la ventana de parámetros será accesible mediante view.theForm. El valor de un parámetro concreto puede recuperarse usando view.theForm.getItem(parameter_name).getValue()
  • un callback de éxito de validación. Si los valores actuales del formulario pasan la validación, debe invocarse este callback
  • un callback de fallo de validación. Si los valores del formulario no satisfacen la validación, invoque este callback.

Por ejemplo:

OB.Utilities.TestClientSideValidation = function (view, actionHandlerCall, failureCallback) {
  var minNumber, maxNumber;
  minNumber = view.theForm.getItem('min_number').getValue();
  maxNumber = view.theForm.getItem('max_number').getValue();
  if (maxNumber >= minNumber) {
    // only execute the callback if the form values pass the validation
    actionHandlerCall();
  } else {
    failureCallback();
  }

Además, las funciones de validación de lado del cliente soportan un cuarto parámetro que contiene información adicional, como el botón pulsado:

OB.Utilities.TestClientSideValidation = function (view, actionHandlerCall, failureCallback, additionalInfo) {
  if (additionalInfo.buttonValue === 'OK') {
    // execute validations related to the 'OK' button
  } else {
    // do another validations
  }

Info

Para aprender a definir nuevos botones en una ventana de definición de proceso estándar, consulte Añadir nuevos botones.

Se puede añadir información adicional al payload que recibirá el proceso. Por ejemplo, este código añadiría un nuevo parámetro llamado myParam:

view.externalParams = { myParam:'value' };

Invocar una función cuando se cambia un parámetro que no es de grid

El campo Función 'On Change' de la solapa Parámetro permite definir una función que se ejecutará cuando se actualice un parámetro que no es de grid, después de que el parámetro pierda el foco. Esta función puede usarse para realizar validaciones o para implementar callouts del lado del cliente, entre otras cosas.

La función debe aceptar cuatro parámetros:

  • item: el elemento que se ha modificado
  • view: el objeto de la ventana de parámetros
  • form: el formulario que contiene el elemento

Cómo establecer el valor de parámetros que no son de grid de forma programática

Es posible ejecutar una Función 'On Change', además de cuando el parámetro pierde el foco, al establecer el valor del parámetro de forma programática.

Al establecer el valor de un parámetro desde código, se recomienda usar la función setValueProgrammatically(). De este modo, si el parámetro tiene una Función 'On Change', se ejecutará después de establecer el valor del parámetro.

var issotrx = form.getItem('issotrx');
// Set the value for the item
// If the 'issotrx' parameter has an 'On Change Function' it will be executed also
issotrx.setValueProgrammatically('Y');

Invocar una función cuando se han inicializado todos los parámetros que no son de grid

El campo Función 'On Load' de la solapa Definición del Proceso permite definir una función que se ejecutará una vez que los parámetros se hayan inicializado.

Invocar una función cuando el proceso necesita refrescarse

El campo Función On Refresh de la solapa Definición del Proceso permite definir una función que se ejecutará cuando se invoque la acción de refresco de la ventana de parámetros.

Por ejemplo, si el proceso tiene un proceso hijo, una vez que el proceso hijo finaliza, invocará un refresco del proceso padre.

Note

Dado que cada proceso tiene sus particularidades, debe definirse una función de refresco personalizada en caso de que el proceso sea susceptible de ser refrescado/recargado.

La función debe aceptar, al menos, un parámetro:

  • view: el objeto de la ventana de parámetros

Invocar cuando un parámetro de grid se carga por primera vez

La inicialización de los parámetros de grid se realiza de forma asíncrona, por lo que cuando se invoca la onLoadFunction general, no es seguro que todos los parámetros de grid se hayan cargado con sus datos iniciales. Si necesita ejecutar código justo después de que un grid se cargue por primera vez, use el campo Función 'On Grid Load'. La función usada aquí debe aceptar un parámetro: el propio grid.

Por ejemplo:

OB.Utilities.TestOnGridLoad = function (grid) {
  var nRecordsReceived = grid.getData().getLength(),
      messageBar = grid.view.messageBar;
  messageBar.setMessage('info', 'The grid has been loaded with ' + nRecordsReceived + ' records');
    }

Especificar el número de filas mostradas en un parámetro de grid

Puede establecer el número de filas que deben mostrarse la primera vez en un parámetro de grid usando el campo Número de filas mostradas. Este campo se usa únicamente para establecer la altura del grid; si el grid tiene realmente más filas que el Número de filas mostradas, se mostrará una barra de desplazamiento. El valor por defecto de este campo es 5.

Note

No es posible definir el colspan de los parámetros de grid, porque siempre usan las cuatro columnas disponibles del formulario.

Definir una lógica para mostrar para columna de grid para los campos de un parámetro de grid

El campo Lógica para mostrar para columna de grid en la solapa Campo permite definir una lógica de visualización para los campos de los parámetros de grid.

Por ejemplo, suponga que ha definido una ventana de parámetros con dos parámetros:

  • un booleano llamado Mostrar columnas avanzadas, nombre de columna showAdvancedColumns
  • un grid.

Supongamos que el grid tiene algunos campos que solo deben mostrarse si está marcada la opción Mostrar columna avanzada. El campo Lógica para mostrar para columna de grid de esos campos debería establecerse a:

@showAdvancedColumns@='Y'

Especificar un valor por defecto para el filtro de un campo de grid de parámetros

El campo Expresión de filtrado por defecto de la solapa Campo permite definir un valor por defecto para el filtro de un campo. Este valor por defecto puede ser una constante, depender de otro parámetro o usar OBBindings.

Ocultar el nombre del parámetro de un parámetro de grid

Aunque es posible definir varios parámetros de grid en una ventana de parámetros, es probable que la mayoría de las veces haya como máximo uno (por ejemplo, en ventanas de pick and execute). En esos casos, considere no mostrar el nombre del parámetro de grid. Hágalo desmarcando el indicador Mostrar título en la solapa Parámetro.

Añadir nuevos botones

Por defecto, las definiciones de proceso tienen un único botón Hecho (y uno de Cancelar en caso de que se muestren en un popup desde una ventana estándar). Es posible cambiar ese botón o añadir nuevos.

Para hacerlo:

  1. Cree una nueva Referencia con Lista de Botones como Referencia padre. En la solapa Lista valores añada tantos registros como botones deban mostrarse en el proceso. El nombre de estos elementos se verá en la etiqueta del botón, mientras que el Identificador es el valor que se enviará al Handler en el backend dentro del campo buttonValue.
  2. Añada un nuevo parámetro al proceso con Lista de Botones como referencia y la nueva referencia recién creada como Referencia clave.

Note

Debe haber, como máximo, un único parámetro de tipo Lista de Botones.

Proceso multi-registro

Un proceso estándar puede definirse como proceso multi-registro para poder ejecutarlo para más de un registro.

Subida de archivos

La referencia de archivo mejora las capacidades de Etendo habilitando la subida de archivos directamente dentro de las definiciones de proceso.

Esta funcionalidad puede usarse en Definición del Proceso, introduciendo un elemento de subida de archivos intuitivo en el formulario del proceso. Los usuarios pueden subir un único archivo para su procesamiento, que luego es gestionado por la lógica del proceso según se especifique en la definición del proceso.

Info

  • El tamaño máximo de archivo que los usuarios pueden subir está limitado por defecto a 10MB. Esto se configura en la preferencia Maximum file upload size (MB). Esta comprobación de tamaño de archivo se realiza tanto en el lado del cliente como en el lado del servidor.
  • Para más información sobre preferencias, visite la sección de Preferencias en la Guía de usuario.

Módulo de ejemplo

Este procedimiento está soportado por un módulo de ejemplo que demuestra cómo usar la referencia Subir archivo en un proceso basado en Java.

El código del módulo de ejemplo puede descargarse desde el repositorio com.etendoerp.client.application.examples

Referencia Subir archivo en Definición del Proceso

Para habilitar la subida de archivos en una definición de proceso, puede definirse una referencia Subir archivo como parámetro del proceso.

La referencia Subir archivo ya está proporcionada por el core de Etendo y no necesita ser creada ni extendida por el desarrollador.

Está implementada en Etendo con una Definición de Interfaz de Usuario que renderiza la entrada de archivo y envía la petición como un formulario multipart: org.openbravo.client.kernel.reference.ProcessFileUploadUIDefinition

El archivo subido queda disponible durante la ejecución del proceso a través del handler de Definición del Proceso (una clase Java que extiende BaseProcessActionHandler).

Definición de la referencia Subir archivo

Info

La imagen anterior muestra la referencia Subir archivo tal y como está definida en el core. Se incluye únicamente con fines de identificación y no requiere ninguna configuración o personalización adicional.

Puede seleccionarse cualquier archivo, ya que esta funcionalidad fue diseñada como una base para que los programadores la adapten a sus necesidades específicas.

Definición del Proceso

Este ejemplo se proporciona como parte del módulo User Interface Application Examples.

La Definición del Proceso ya está creada e incluida en el módulo y se muestra aquí para explicar cómo se configura la referencia Subir archivo.

Definición del Proceso con parámetro Subir archivo

En la ventana Definición del Proceso, pueden observarse los siguientes elementos:

  • Módulo: User Interface Application Examples indica que este proceso pertenece al módulo de ejemplo.
  • Identificador / Nombre: Identifica el proceso en la aplicación.
  • Handler: com.etendoerp.client.application.examples.ExampleUploadFile clase Java que implementa la lógica del proceso y extiende BaseProcessActionHandler.
  • Patrón de la Interfaz de Usuario: Estándar (Parámetros definidos en el Diccionario)
  • Acceso datos: Configurado según las necesidades del ejemplo.

Parámetro Subir archivo

La Definición del Proceso incluye un único parámetro configurado con la referencia Subir archivo.

  • Referencia: Subir archivo. Renderiza una entrada de archivo en la ventana de ejecución del proceso.
  • Nombre columna BD: Este valor se usa para recuperar el archivo subido desde el mapa de parámetros en el handler de acción del proceso.

Este parámetro permite al usuario subir un único archivo, que está disponible únicamente durante la ejecución del proceso.

Ejecutar el proceso

Para ejecutar el ejemplo, se define una entrada de Menú que apunta a la Definición del Proceso.

Esto permite buscar y ejecutar el proceso desde el menú de la aplicación usando el nombre Ejemplo de Subir archivo.

Cuando se abre el proceso, se muestra una ventana de ejecución simple con el parámetro Subir archivo renderizado como un selector de archivo.

Ventana de ejecución de Subir archivo

Info

En este ejemplo, el proceso espera que se suba un archivo .txt. La restricción del tipo de archivo forma parte de la lógica del ejemplo y no se aplica por la propia referencia Subir archivo.

Durante la ejecución:

  • La lógica del proceso solo acepta archivos de texto.
  • El contenido del archivo subido se lee durante la ejecución.
  • El texto contenido en el archivo se muestra de vuelta al usuario como resultado del proceso.

Procesar el archivo subido

Tras seleccionar un archivo .txt válido y ejecutar el proceso, el archivo se procesa mediante el handler de acción Java.

En este ejemplo, el proceso:

  • Valida que el archivo subido tenga una extensión .txt.
  • Lee el contenido del archivo desde el input stream.
  • Muestra el contenido del archivo como un mensaje de éxito en la interfaz de usuario.

Mensaje de resultado de Subir archivo

El mensaje mostrado al usuario contiene el texto completo leído del archivo subido, confirmando que el archivo se recibió y procesó correctamente.

Este ejemplo demuestra cómo se puede acceder a los archivos subidos, validarlos y procesarlos en una Definición del Proceso basada en Java usando la referencia Subir archivo.

Limitaciones

Referencias

Actualmente, no todas las referencias disponibles en las ventanas estándar están disponibles en Definición del Proceso. Las siguientes no se pueden usar como parámetros:

  • Botón: el mecanismo para añadir nuevos botones se describe en Añadir nuevos botones.
  • Imagen
  • Cadena enmascarada
  • Tabla
  • TableDir
  • Árbol
  • PAttribute

Lógica de la UI

Los callouts no están implementados para los parámetros.

Migración de procesos antiguos

Las Definiciones del Proceso admiten varios parámetros. Para implementar este soporte, se cambió la forma en que el valor del parámetro de grid se envía al backend y se añadió un nuevo indicador Compatibilidad con parámetros de grid antiguos.

Para migrar procesos compatibles con grids antiguos al nuevo formato, establezca Compatibilidad con parámetros de grid antiguos en false y, dependiendo del caso:

  • Si el Patrón de la Interfaz de Usuario del proceso es Manual, no se necesita ningún otro cambio.
  • Si el proceso no tiene ningún parámetro, no se necesita ningún otro cambio.
  • Si el proceso tiene un parámetro (de grid), el JSON que recibe el método doExecute cambia; estas son las modificaciones necesarias:

Ejemplo:

Código antiguo
JSONObject gridInfo = new JSONObject(content);
JSONArray gridSelection = gridInfo.getJSONArray("_selection");
JSONArray gridAllRows = gridInfo.getJSONArray("_allRows");
Código nuevo
JSONObject params = new JSONObject(content).getJSONObject("_params");
// Sustituya aquí gridColumnName por el Nombre columna BD real de su parámetro de grid
JSONObject gridInfo = params.getJSONObject("gridColumnName");
JSONArray gridSelection = gridInfo.getJSONArray("_selection");
JSONArray gridAllRows = gridInfo.getJSONArray("_allRows");  


Este trabajo es una obra derivada de Cómo crear una Definición del Proceso estándar de Openbravo Wiki, utilizada bajo CC BY-SA 2.5 ES. Este trabajo está licenciado bajo CC BY-SA 2.5 por Etendo.