#Proceso empresarial

0 Seguidores · 12 Publicaciones

El Lenguaje del   Proceso Empresarial (BPL) de InterSystems Ensemble es un lenguaje que se utiliza para describir procesos empresariales ejecutables dentro de un documento estándar XML.

Documentación.

Pregunta Kurro Lopez · oct 21, 2025

Hola comunidad,

Tengo un servicio que utiliza EnsLib.RecordMap.Service.FTPService para capturar ficheros en un directorio FTP.

Necesitaría que en lugar de cargarlos todos a la vez, los hiciera de uno en uno.

Tengo una clase que extiende de esta clase porque hace procesos previos, lo guarda todo en la clase RecordMap y luego los procesa todos los registros a la vez.

Cuando invoco al BP, lo hace a través del método set tStatus = ..SendRequest(message, 1)

He puesto el flag SynchronousSend = 1, pero sigue procesando todos a la vez.

4
0 37
Artículo Luis Angel Pérez Ramos · mayo 8, 2024 2m read

Hola a todos,

Cuando estamos diseñando un BP que necesita ser reutilizado, a menudo necesitamos desarrollar un componente con un objeto <call> configurable, donde establecemos el destino de la llamada al objeto.

@process.TargetConfigName

Sí, se puede lograr.

Aquí está el código completo:

2
0 119
Artículo Maria Nesterenko · mar 15, 2024 8m read

La Inteligencia Artificial (IA) está recibiendo mucha atención últimamente porque puede cambiar muchos aspectos de nuestras vidas. Una mayor potencia informática y más datos han ayudado a la IA a hacer cosas asombrosas, como mejorar las pruebas médicas y fabricar coches que se conducen solos. La IA también puede ayudar a las empresas a tomar mejores decisiones y a trabajar de forma más eficiente, por lo que cada vez es más popular y se utiliza más. ¿Cómo se pueden integrar las llamadas a la API OpenAI en una aplicación de interoperabilidad IRIS existente?

 

0
0 261
Comentarios Luis Angel Pérez Ramos · sep 11, 2023

Habitualmente recibimos quejas desde nuestros clientes a cerca de los refrescos automáticos de las páginas web de diseño de BPL y DTL. Esto suele ser un problema común no sólo de usuarios novatos, sino que también de programadores veteranos, es algo común que se olviden de grabar regularmente sus cambios y al cerrarse la sesión o recargarse automáticamente la página se pierda todo el trabajo realizado.

3
0 82
Artículo Ricardo Paiva · dic 28, 2022 4m read

  

Hace unos meses hablábamos Jose y yo sobre el vídeo Servicios de datos inteligentes (Visión & Demo), realizado por @Amir Samary y, durante la charla, empezamos a preguntarnos qué tipo de características sería bueno incluir en las futuras soluciones de IRIS. 

Una de las funcionalidades con las que sería bueno contar es una solución iPaaS para IRIS, como le pregunté a Amir en este comentario.

Estos últimos meses he tenido la oportunidad de trabajar con diferentes proyectos y tecnologías, así como familiarizarme con aplicaciones como Tray.io o Workato, y ahora puedo ver lo increíble que sería tener una solución iPaaS para IRIS.

La interoperabilidad que ofrece IRIS tiene mucho potencial, cuenta con un maravilloso motor oculto, y esto podría ser algo único que vale la pena analizar.

Pero esta funcionalidad conlleva una gran complejidad y requiere tener muchos conocimientos técnicos. ¿Qué pasaría si pudiéramos reducir dicha complejidad, ofreciendo al usuario una solución más sencilla, pero que mantenga la potente interoperabilidad de IRIS?  

Puede que te preguntes: ¡¿Dónde está la visión que mencionaba en el título de este artículo?! 

Bueno, para mí la Comunidad no es solo un lugar donde puedo encontrar respuestas a mis preguntas, o donde puedo conocer gente, es un sitio para ayudarnos mutuamente, para retarnos los unos a los otros, y quizás, un lugar donde podemos construir juntos algo mucho más grande que nosotros mismos. 

Para lograr esa visión, creo que necesitamos crear algo ASAP (As Simple As Possible, Lo más sencillo posible). Mientras usaba Tray.io vi algo realmente interesante, conectores prefabricados, pequeñas cajas que pueden ayudarte a hacer cualquier cosa, que se integran con una gran variedad de sistemas/aplicaciones, y lo hacen de una forma realmente sencilla.

Porque eliminar la complejidad de las soluciones debería ser nuestro objetivo principal. Aportar más ideas y contribuir a cada proyecto es parte de mi visión para conseguir una mejor aplicación.

@José Pereira y @Henry Pereira crearon el Editor de flujo, la nueva función que ofrecemos en el proyecto al que llamamos IRIS Megazord.

P.D.: Si no sabes lo que es un Megazord, puedes ver este video súper nostálgico (bueno, al menos para nosotros), de una serie de TV llamada Power Rangers.

Pero centrémonos en la parte más nueva de nuestro super increíble robot. 

Editor de flujo

 

El concepto que está detrás del Editor de flujo, como comentamos anteriormente, es tener un conjunto simple y muy útil de conectores (las cajas), que te permitan construir cosas como las que hace José en este video

Si quieres probar el mismo proceso que se muestra en el video, puedes seguir los siguientes pasos y configurar un bot de Telegram para utilizarlo en tu entorno.

Cómo configurar un bot de Telegram

Para utilizar un bot de Telegram, sigue estos pasos:

  • Crear un bot de Telegram
    • Accede al BotFather usando tu cuenta de Telegram (https://telegram.me/BotFather)
    • Introduce el comando /newbot
    • Elige un nombre para tu bot
    • Elige un nombre de usuario para tu bot
    • Después de esa información, el BotFather te dará un token personalizado para tu bot
  • Crear una credencial de Interoperabilidad de IRIS para almacenar el token de tu bot
    • Accede a la página Visualizador de credenciales
    • Elige un nombre para la credencial en el campo ID
    • Introduce el token de tu bot en el campo Contraseña
    • Guarda tu credencial
  • Configurar la producción
    • Accede a la página Configuración de la producción
    • Elige el business service FromTelegram
    • Busca el campo Credenciales en el panel de la derecha, en la pestaña Configuración, y selecciona las credenciales para tu bot de Telegram
    • Guarda los cambios haciendo clic en el botón "Aplicar"
  • Ahora puedes iniciar la producción. Accede a tu bot de Telegram y empieza a chatear. Si todos los pasos se hicieron correctamente, recibirás una respuesta del chatbot de producción después de unos pocos segundos.

    Agradecimientos

    Una vez más, queremos agradecer todo el apoyo que nos da la Comunidad para cada una de las aplicaciones que creamos.

    0
    0 85
    Artículo Ricardo Paiva · mar 11, 2022 8m read

    Este artículo es una continuación de esta publicación.

    En ese artículo, analizamos la creación de business operations a partir de los componentes necesarios para la integración del sistema.

    En este artículo, mostraré cómo crear un business process que llama a las dos business operations definidas en el orden de la secuencia.

    El business process actúa como coordinador (centro de mando) del proceso.

    Los ajustes en el proceso que se pueden implementar en la muestra son los siguientes:

    Paso 1: Proporcionar el nombre de la ciudad a una API web externa y solicitar información meteorológica.
    Paso 2: Registrar el resultado de la consulta (información meteorológica) del paso 1 y el nombre del producto comprado que se recibió al inicio de la producción.

    En el *business process* de muestra, esperaremos la respuesta al paso 1 y ajustaremos el paso 2 para que funcione.

    En el proceso de espera de una respuesta (es decir, de sincronización), por ejemplo, ¿qué ocurre si el paso 1) no responde durante unos días?

    Si se entregan nuevos mensajes al business process mientras se espera una respuesta durante unos días, los mensajes no serán descartados ya que se almacenan en una cola. Sin embargo, el business process no procesará nuevos mensajes y habrá un retraso en la operación.

    Nota: Los business processes y las business operations tienen colas.

    Por lo tanto, en producción, cuando hay una llamada sincronizada, hay dos maneras de que el business process pueda moverse: A) Hacer una sincronización perfecta, y B) Guardar el estado del propio business process en la base de datos y transferir el entorno de ejecución para que otros procesos puedan ejecutarse mientras esperan una respuesta.

    A) Cómo hacer una sincronización perfecta:

    Mientras se realiza una llamada sincronizada, el procesamiento del business process está en marcha, y esperando a que se procese el siguiente mensaje hasta que se complete todo el procesamiento.
    ➡Esta función se utiliza cuando se necesita garantizar el orden del procesamiento en el método "primero en entrar, primero en salir".

    B) El método para guardar el estado del propio *business process* en la base de datos y transferir el entorno de ejecución para que otros procesos puedan ejecutarse mientras esperan una respuesta es

    Cuando se realiza una llamada sincronizada, el proceso guarda su estado en la base de datos. Cuando se recibe un mensaje de respuesta, y es el momento de procesar el mensaje, se abre la base de datos y se ejecuta el siguiente proceso.
    (IRIS gestionará el almacenamiento y la reapertura de los business processes en la base de datos).
    ➡ Se utiliza cuando es aceptable cambiar el orden para procesar los mensajes (es decir, cuando se permiten procesar más y más mensajes diferentes recibidos mientras se espera una respuesta).

    En la muestra, se utiliza B).

    Hay dos tipos de editores para crear business processes: un Editor de Business Processes que permite colocar cuadros de procesamiento (actividades) e implementarlos mientras se define su ejecución, y un método para crearlos mediante ObjectScript en Studio o VSCode.

    Si utilizas el Editor de Business Processes, utilizarás la actividad de llamada para invocar al componente, pero esta actividad está implementada de la forma B). Por supuesto, también puedes implementar el métodoA) en el Editor de Business Processes, excepto que en ese caso no utilizará la actividad de llamada (utilizará la actividad del código).

    En esta sección, explicaré cómo crearla.

    Si se utiliza el Editor de Business Processes, deben escribirse en el Portal de Administración.

    También puedes abrir el business process desde la página de configuración de la producción. La siguiente imagen muestra el procedimiento.

    imagen

    Iconos como en este editor se llaman actividades, y las que están marcadas como son actividades que pueden invocar otros componentes.

    Este símbolo indica que se devolverá un mensaje de respuesta (es decir, se realizará una llamada sincronizada). La actividad se ajusta de forma predeterminada a la configuración de la llamada no sincronizada, que puede cambiarse según sea necesario.

    Ahora observemos los business processes, que son componentes que se invocan al recibir un mensaje de solicitud, así como las business operations.

    En la muestra, el mensaje de solicitud: Se pone en marcha cuando recibe un Start.Request y no devuelve un mensaje de respuesta.

    imagen

    En el business process, los mensajes aparecen en varias situaciones.

    Mensajes de solicitud que se envían a los business processes.

    Mensaje de solicitud (más un mensaje de respuesta) que se envía cuando se llama a otro componente usando la actividad.

    En el Editor de Business Processes, los nombres de los objetos que almacenan mensajes están claramente separados para poder ver qué mensaje se envió desde qué destino.

    imagen

    • solicitud(requisitos básicos)

    El mensaje que activó el inicio del business process, en nuestro ejemplo, es Start.Request (el mensaje que se debe especificar en la configuración de la Solicitud en la pestaña Contexto dentro del Editor de Business Processes)

    • respuesta(respuesta básica)

    Mensaje de respuesta para devolver a la persona que llama al business process (no se utiliza en el ejemplo) (mensaje que se debe especificar en la configuración de la respuesta que aparece en la pestaña Contexto en el Editor de Business Processes)

    • callrequest(mensaje de solicitud)

    Mensaje de solicitud que se envía al llamar al componente determinado por la actividad.

    • callresponse(mensaje de respuesta)

    Mensaje de respuesta devuelto desde el componente especificado por la actividad.

    callrequest y callresponse son objetos que se eliminarán cuando se complete el procesamiento de llamada de la actividad. Todos los demás objetos no desaparecerán hasta que finalice el business process.

    Ahora se presenta el problema cuando desaparece callresponse.

    Esto es porque, como se puede ver en este ejemplo, Cuando se llama a un componente, si se quiere utilizar el resultado de la respuesta de un componente llamado previamente, se perderá el mensaje de respuesta, y se borrará la información que se iba a utilizar en el siguiente componente.

    Es un problema 😓

    ¿Qué deberíamos hacer?・・・・・

    En este caso, se puede utilizar el objeto de contexto.

    El objeto de contexto, al igual que la solicitud/respuesta, es un objeto que sobrevive hasta el final del business process.

    Además, como el contexto es un objeto genérico, se puede definir en el editor de proceso.

    Además del contexto, también se puede utilizar el objeto de respuesta si tiene una propiedad que coincida con lo que guarda la información heredada.

    Ahora, vamos a repasar los pasos de nuevo.

    imagen

    El mensaje de respuesta en el globo azul claro: Start.Response es un objeto que se eliminará cuando termine el proceso.

    Como queremos utilizar el mensaje de respuesta (Start.Response) que contiene la información meteorológica como el mensaje que se enviará a la siguiente [Business Operation para la actualización de la base de datos], tenemos que implementar el objeto de contexto de tal forma que todos los valores de la propiedad del mensaje de respuesta (Start.Response) se puedan asignar a él.

    Entonces, ¿cuál es la configuración para la propiedad de contexto?

    Las propiedades se definen en "Context Properties" en la pestaña Context del Editor de business processes.

    En este caso, nos gustaría guardar todas las propiedades del mensaje de respuesta (Start.Response) en el objeto de contexto. Por lo tanto, la especificación del tipo de propiedad se establece en Start.Response.

    imagen

    A continuación, consulta la configuración en la actividad.

    imagen

    Los mensajes de solicitud y de respuesta tienen un botón llamado ○○ Builder.

    Al hacer clic en este botón se iniciará un editor de líneas que permite especificar lo que se quiere registrar en las propiedades de cada mensaje.

    imagen

    Después de esto, la business operation para solicitar una actualización de la base de datos (Start.SQLInsertOperation o Start.InsertOperation) se llama de la misma manera con la actividad, y todo estará listo.

    (Para más información, consulta Configuring para Business Processes).

    Cuando se haya completado la verificación, se podrá probar. El método de prueba es el mismo que se utiliza para probar las business operations (consulta este artículo).

    El seguimiento después de la prueba es el siguiente:

    imagen

    Como el business process es el coordinador, pudimos ver que invocaba de forma secuencial los componentes definidos, lo que mantiene la ejecución sincronizada.

    Nota 1: Este ejemplo solo se refiere a la actividad sobre las llamadas, pero hay otras actividades, como la transformación de datos.

    Nota 2: Los business processes creados únicamente por ObjectScript, distintos al Editor de Business Processes, se heredan de la clase Ens.BusinessProcess. Si se crea en el Editor de Business Processes, se hereda de la clase Ens.BusinessProcessBPL.

    El business process es el coordinador del proceso de integración del sistema.
    El Editor de Business Processes ofrece los siguientes tipos de variables para los mensajes (request/response/callrequest/callreponse/context).
    Un business process creado con el Editor de Business Processes puede funcionar de forma que no retrase otros mensajes, incluso si hay sincronización en la llamada del componente.

    En el próximo artículo, mostraré finalmente cómo desarrollar el último componente: los business services.

    0
    0 286
    Artículo Alberto Fuentes · nov 4, 2021 2m read

    Algunos de vosotros no conoceréis esta limitación o problema conocido que se produce en los Procesos de Negocio (Business Processes) basados en BPL.

    Aquellos que no estabais al tanto quizá os habéis encontrado esto:

    ERROR <Ens>ErrBPTerminated: Terminating BP <my_process_name> # due to error:
    
    ERROR #7201: Datatype value 'xxS6xxS6...xxS6' length longer than MAXLEN allowed of 5
    

    Y / o:

    ERROR #5802: Datatype validation failed on property '<my_process_class>.Thread1:%HandlerStack', with value equal to "xxS6xxS6...xxS6"
    

    Esta es la información que encontramos en la documentación al respecto:

    Restricción de la actividad «Scope» dentro de un bucle en BPL

    Bajo ciertas condiciones, los bucles que contienen actividades «Scope» (Ámbito) y tienen un gran número de repeticiones, pueden provocar un error. Si es posible, define la actividad «Scope» para que incluya el bucle en vez de que se defina dentro del bucle.

    Así que si tienes un bucle dentro de un BPL, e introduces un «Scope» (Ámbito) en él (y probablemente una actividad «Continue»), y tienes, por ejemplo, unas 15 o más iteraciones, se producirá el error anterior.

    Este es un ejemplo de este tipo de bucles:

    Así es como se vería el error:

    La solución, como se menciona en la documentación, es colocar el bucle dentro de la actividad «Scope», en vez de que el «Scope» esté dentro del bucle.

    Espero que esto ayude a cualquiera que se encuentre con este error.

    0
    0 106
    Artículo Daniel Franco · ago 19, 2020 2m read

    Ejecutar modelos predictivos de forma nativa en un "Business Process" ("Proceso Empresarial") de InterSystems IRIS siempre ha sido, por supuesto, el objetivo de nuestro soporte para PMML, pero de alguna forma nunca formó parte del paquete porque había algunas dependencias y elecciones que era necesario analizar y decidir. En cualquier caso, gracias a algunas presiones y al código ofrecido amablemente por  @Amir Samary (¡gracias de nuevo, Amir!), finalmente conseguimos empaquetarlo en un repositorio de GitHub para que lo disfruteis, lo valoreis y hagáis sugerencias.

    0
    0 187
    Artículo Alberto Fuentes · jun 12, 2020 3m read

    ¡Hola a todos! hoy veremos un truco para recorrer las actividades que forman parte de un Business Process. En función de lo que estemos desarrollando, es posible que en ocasiones necesitemos hacer introspección como por ejemplo, obtener las anotaciones que hemos incluido dentro de las actividades de un Business Process.

    Recorrer las actividades de un Business Process es algo que parece ineficiente si se realiza en tiempo de ejecución, por eso vamos a revisar la siguiente utilidad para recorrer el Business Process en tiempo de compilación y generar el código que nos interese.

    Este fragmento de código podemos reutilizarlo en diversas ocasiones para iterar sobre un BP simplemente añadiéndolo como una clase secundaria sobre la que herede proceso de negocio BPL - Business Process Language.

    Class isc.ens.ProcessUtils
    {
    
    /// Lista de nodos que pueden ser una actividad de un BP
    /// Obtenido usando:
    /// SELECT  parent, ID,  Name, Type
    /// FROM %Dictionary.CompiledProperty
    /// WHERE Parent %STARTSWITH 'Ens.BPL' AND Name='Activities'
    Parameter ActivityNodes = {$lb("Ens.BPL.Case", "Ens.BPL.CaseNode", "Ens.BPL.Catch", "Ens.BPL.CatchAll", "Ens.BPL.CompensationHandler", "Ens.BPL.Default", "Ens.BPL.Flow", "Ens.BPL.ForEach", "Ens.BPL.Message", "Ens.BPL.Request", "Ens.BPL.Response", "Ens.BPL.Scope", "Ens.BPL.Sequence", "Ens.BPL.Until", "Ens.BPL.While")};
    
    /// Obtener la anotación de una actividad a partir de su nombre
    ClassMethod GetAnnotation(name) As %String [ CodeMode = objectgenerator ]
    {
        set sc = $$$OK
        try {
            #; no ejecutar este método en la clase base
            quit:%compiledclass.Name="isc.ens.ProcessUtils"  
            quit:##class(%Dictionary.CompiledXData).%ExistsId(%class.Name_"||BPLERROR")
            
            #; encontrar el bloque XDATA llamado BPL
            if ##class(%Dictionary.CompiledXData).%ExistsId(%class.Name_"||BPL") {
                set index = %compiledclass.XDatas.FindObjectId(%class.Name_"||BPL")
            
                #; obtener XDATA como stream
                set stream = %compiledclass.XDatas.GetAt(index).Data
                do stream.Rewind()
        
                set parser=##class(Ens.BPL.Parser).%New()
            
                #; parsear stream and y obtener la raíz del árbol de parseo,
                #; Ens.BPL.Process
                #dim process As Ens.BPL.Process
                set sc = parser.ParseStream(stream,.process)
                quit:$$$ISERR(sc)
                
                #dim activities As Ens.BPL.ActivityList
                set activities = process.Sequence.Activities
                
                // colocar aquí código para ejecutar antes de iterar sobre las actividades
                do ..ParseActivities(activities)
                
                // colocar aquí código para ejecutar después de iterar sobre las actividades
                do %code.WriteLine(" quit """"")
            }
        } catch ex {
            set sc = ex.AsStatus()
        }
        quit sc
    }
    
    // iterar sobre todas las actividades
    ClassMethod ParseActivities(activities As Ens.BPL.ActivityList)
    {
        for i=1:1:activities.Count() {
            #dim activity As Ens.BPL.Activity
            set activity = activities.GetAt(i)
            set class = activity.%ClassName(1)
            if $lf(..#ActivityNodes, class) {
                do ..ParseActivities(activity.Activities)
            } elseif (class="Ens.BPL.If") {
                do ..ParseActivities(activity.True)
                do ..ParseActivities(activity.False)
            } elseif (class ="Ens.BPL.Switch"){
                do ..ParseActivities(activity.Cases)
            } else {
                set annotationText = $$$quote(activity.Annotation)
                
                // código que se ejecutará para cada actividad
                do:activity.Annotation'="" %code.WriteLine(" quit:name=""" _ activity.Name _ """ " _ annotationText)
            }
        }
    }
    
    }
    
    0
    0 149
    Artículo Dani Fibla · mar 24, 2020 4m read

    ¡Hola Comunidad!

    En este artículo describiré e incluiré un ejemplo de cómo incrustar un archivo PDF externo en un segmento HL7, concretamente en el segmento OBX() de un mensaje ADT_A01 versión 2.3.1  .  Esto puede ser útil para  insertar imágenes u otros datos externos en un mensaje HL7. En este ejemplo, el nombre del archivo PDF a incrustar nos llega en el mensaje HL7 entrante en el campo OBX(1):ObservationValue.

    Los requisitos básicos para este ejemplo son los siguientes:

    1
    0 594