4D v16 R6 introdujo un nuevo concepto de comunicación entre procesos: ¡variables de objetos y colecciones compartidas! Gracias a esto, podrá compartir fácilmente información entre procesos.
Hasta ahora, las selecciones de entidades no se podían compartir entre procesos. Sin embargo, eso ha cambiado… ¡nos complace anunciar que en 4D v18 R5 las selecciones de entidades son compartibles!
Se acabaron los días de construir una lista de claves primarias para mover una selección de entidades a otro proceso. Mejore su código multiproceso incluyendo las selecciones de entidades ORDA como objetos compartidos.
Siga leyendo para saber más.
HDI: Compartir selecciones de entidades ORDA
principio
Con 4D v18 R5, la mayoría de las selecciones de entidades son compartibles . Esto significa que
- no son modificables (no permiten añadir nuevas entidades).
- pueden ser compartidas entre varios procesos o trabajadores.
Algunas selecciones de entidades son no compartibles (por ejemplo, si han sido creadas con dataClass.newSelection() o Create entity selection()). Esto significa que
- son alterables (permiten añadir nuevas entidades)
- no pueden ser compartidas entre varios procesos
selecciones de entidades compartibles
A partir de 4D v18 R5, las selecciones de entidades más utilizadas (recuperadas con query(), all(), …) son compartibles.
Veamos un ejemplo para entenderlo mejor.
Ejemplo
En el siguiente ejemplo, construimos dos selecciones de entidades:
- una para las facturas pagadas.
- una para las facturas no pagadas.
Podríamos querer pasarlas a un trabajador para delegar el envío
- correos electrónicos de acuse de recibo para las facturas pagadas.
- correos electrónicos de recordatorio para las facturas impagadas.
Este es el código:
If Storage
End use
CALL WORKER Storageinfo(Storage.info=Null)
Use (Storage)
Storage .info:=New shared object()
End use
End if
Use (Storage.info)
//Put entity selections in a shared object
.info.paid:=ds.Invoices.query("status=:1"; "Paid")
Storage .info.unpaid:=ds.Invoices.query("status=:1"; "Unpaid") xml-ph-0034@de
Este es el método sendMails :
var $info; $1: Object
var $paid ; $unpaid: cs.InvoicesSelection
var $invoice : cs.InvoicesEntity
var $server ; $transporter; $email; $status: Object
//Prepare emails s
$server :=New object
$server .host:="exchange.company.com"
$server .user:="myName@company.com"
$server .password:="mi contraseña"
$transporter :=SMTP New transporter($server)
$email :=New object
$email .from:="myName@company.com"
//Get entity selections
$info:=$1
$paid:=$info.paid
$unpaid:=$info.unpaid
//Loops on entity selections
For each ($invoice; $paid)
$email .to:=$invoice.customer.address // email address of the customer
$email .subject:="Payment OK for invoice #"+String($invoice.number)
$status :=$transporter.send($email)
End for each
For each ($invoice; $unpaid)
$email .to:=$invoice.customer.address // email address of the customer
$email .subject:="Please pay invoice # "+String($invoice.number)
$status :=$transporter.send($email)
End for each
Como se puede ver, el trabajador puede ocuparse de las selecciones de entidades
yendo y viniendo entre las selecciones de entidades compartibles / no compartibles
En algunos casos, puede tener una selección de entidades no compartible. Si necesita compartirla con otro proceso, sólo tiene que utilizar la función new .copy() disponible en los objetos de selección de entidades.
Aquí hay un ejemplo de eso:
El Form.products es una nueva selección de entidad vacía obtenida con la función de clase newSelection(). Por lo tanto, no es compartible y acepta añadir una entidad.
Form.products:=ds.Products.newSelection()
//Form.product is entered by the user
Form .
products.add(Form.product)
Si intentas ponerlo «tal cual» en el objeto compartido $sharedObj, obtendrás un error:
var $sharedObj : Object
$sharedOb j:=New shared object()
Use ($sharedObj)
//Error "Not supported value type in a shared object or a shared collection"
$sharedObj.
products:=Form.products
End use
Desde que ORDA piensa en todo, hay una nueva .copy() disponible en los objetos de selección de entidades.
Devuelve una copia de la selección de entidades dada, por lo que podemos pedir que esta copia sea compartible o no.
var $sharedObj : Object
$sharedObj :=New shared object()
Use ($sharedObj)
//Returns a shareable copy of the Form.products entity selection
$sharedObj .products:=Form.products.copy(ck shared)
End use
Eso es todo.
Por supuesto, con esta nueva función de clase, también puede convertir una selección de entidad compartible en una no compartible omitiendo el parámetro opcional.
Tenga en cuenta que el comando OB Copy también ha sido actualizado:
- acepta una selección de entidades como parámetro.
- Las selecciones de entidades anidadas en el objeto a copiar también se copian según la opción pasada.
Descargue el IDH y consulte la documentación para obtener más información.