ORDA – Partager une sélection d’entités entre processus

Traduit automatiquement de Deepl

4D v16 R6 a introduit un nouveau concept de communication entre les processus: les variables d’objets et de collections partagées! Grâce à cela, vous êtes en mesure de partager facilement des informations entre les processus.

Jusqu’à présent, les sélections d’entités n’étaient pas partageables entre les processus. Mais cela a changé… nous avons le plaisir de vous annoncer que dans 4D v18 R5, les sélections d’entités sont partageables !

Fini le temps où il fallait construire une liste de clés primaires pour déplacer une sélection d’entités vers un autre processus. Améliorez votre code multi-processus en incluant les sélections d’entités ORDA comme objets partagés.

Continuez à lire pour en savoir plus.

HDI : Partager les sélections d’entités ORDA

principe

Avec 4D v18 R5, la plupart des sélections d’entités sont partageables. Cela signifie :

  • qu’elles ne sont pas modifiables (ne permet pas l’ajout de nouvelles entités).
  • elles peuvent être partagées entre plusieurs processus ou workers.

Certaines sélections d’entités sont non partageables (par exemple, si elles ont été créées avec dataClass.newSelection() ou Create entity selection()). Cela signifie

  • elles sont modifiables (permettent l’ajout de nouvelles entités)
  • elles ne peuvent pas être partagées entre plusieurs processus

Sélections d’entités partageables

A partir de 4D v18 R5, les sélections d’entités les plus utilisées (récupérées avec query(), all(), …) sont partageables.

Prenons un exemple pour mieux comprendre.

Exemple

Dans l’exemple ci-dessous, nous construisons deux sélections d’entités :

  • une pour les factures payées.
  • une pour les factures impayées.

Nous pourrions vouloir les passer à un travailleur pour déléguer l’envoi des

  • des emails d’accusé de réception pour les factures payées.
  • des emails de rappel pour les factures impayées.

Voici le code :

If
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
Storage .info.paid:=ds.Invoices.query("status=:1" ; "Paid")
Storage .info.unpaid:=ds.Invoices.query("status=:1" ; "Unpaid") xml-ph-0034@de

Voici la méthode 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:= "mon mot de passe"

$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:="Paiement OK pour la facture #"+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:="Veuillez payer la facture # "+String($invoice.number)
$status :=$transporter.send($email)
End for each

Comme vous pouvez le voir, le travailleur peut traiter les sélections d’entités !

aller et venir entre les sélections d’entités partageables / non partageables

Dans certains cas, vous pouvez avoir une sélection d’entité non partageable. Si vous avez besoin de la partager avec un autre processus, il suffit d’utiliser la nouvelle fonction de classe .copy() disponible sur les objets de sélection d’entités.

Voici un exemple de cela :

La sélection Form.products est une nouvelle sélection d’entité vide obtenue avec la fonction de classe newSelection(). Ainsi, elle n’ est pas partageable et accepte l’ajout d’une entité.

Form.products:=ds.Products.newSelection()

//Form.product is entered by the user
Form .products.add(Form.product)

Si vous essayez de le mettre « tel quel » dans l’objet partagé $sharedObj, vous obtiendrez une erreur :

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

Puisque ORDA pense à tout, il y a une nouvelle fonction de classe disponible sur les objets de sélection d’entités. .copy() fonction de classe disponible sur les objets de sélection d’entités.

Elle renvoie une copie de la sélection d’entités donnée, nous pouvons donc demander à cette copie d’être partageable ou non.

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

Voilà, c’est fait !

Bien entendu, avec cette nouvelle fonction de classe, vous pouvez également transformer une sélection d’entités partageables en une sélection non partageable en omettant le paramètre facultatif.

Notez que la commande OB Copy a également été mise à jour :

  • elle accepte une sélection d’entité comme paramètre.
  • Les sélections d’entités imbriquées dans l’objet à copier sont également copiées en fonction de l’option passée.

Téléchargez l’IDH et consultez la documentation pour en savoir plus !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.