ORDA – Condividere una selezione di entità tra i processi

Tradotto automaticamente da Deepl

4D v16 R6 ha introdotto un nuovo concetto di comunicazione tra processi: le variabili condivise di oggetti e collezioni! Grazie a questo concetto, è possibile condividere facilmente le informazioni tra i processi.

Finora le selezioni di entità non erano condivisibili tra i processi. Tuttavia, le cose sono cambiate… siamo lieti di annunciare che in 4D v18 R5 le selezioni di entità sono condivisibili!

Sono finiti i giorni in cui bisognava costruire un elenco di chiavi primarie per spostare una selezione di entità a un altro processo. Migliorate il vostro codice multiprocesso includendo le selezioni di entità ORDA come oggetti condivisi.

Continuate a leggere per saperne di più.

HDI: Condividere le selezioni di entità ORDA

principio

Con 4D v18 R5, la maggior parte delle selezioni di entità è condivisibile. Ciò significa che:

  • non sono modificabili (non consentono l’aggiunta di nuove entità).
  • possono essere condivise tra più processi o lavoratori.

Alcune selezioni di entità non sono condivisibili (ad esempio, se sono state create con dataClass.newSelection() o Create entity selection()). Ciò significa che:

  • sono modificabili (consentono l’aggiunta di nuove entità)
  • non possono essere condivise tra più processi

selezioni di entità condivisibili

A partire da 4D v18 R5, le selezioni di entità più utilizzate (recuperate con query(), all(), …) sono condivisibili.

Vediamo un esempio per capire meglio.

Esempio

Nell’esempio che segue, vengono create due selezioni di entità:

  • una per le fatture pagate
  • una per le fatture non pagate.

Potremmo volerle passare a un worker per delegare l’invio:

  • email di conferma per le fatture pagate.
  • email di sollecito per le fatture non pagate.

Ecco il codice:

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

Ecco il metodo sendMails :

var $info Object; $1: Object
var $paid ; $unpaid: cs.InvoicesSelection
var $invoice : cs.InvoicesEntity
var $server ; $transporter; $email; $status:

//Prepare emails s
$server :=New object
$server .host:="exchange.company.com"
$server .user:="myName@company.com"
$server .password:="la mia password"

$transporter :=SMTP New transporter($server)

$email :=New object
$email .from:="myName@company.com"

//Get entity selections
$info:=$1
$paid:=$info.paid
$unpaid $email:=$info.unpaid

//Loops on entity selections
For each ($invoice; $paid)
$email .to:=$invoice.customer.address // email address of the customer
.subject:="Pagamento OK per la fattura # "+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:="Si prega di pagare la fattura # "+String($invoice.number)
$status :=$transporter.send($email)
End for each

Come si può vedere, il worker può gestire le selezioni delle entità!

andare avanti e indietro tra le selezioni di entità condivisibili e non condivisibili

In alcuni casi, si potrebbe avere una selezione di entità non condivisibile. Se è necessario condividerla con un altro processo, è sufficiente utilizzare la nuova funzione di classe .copy() disponibile per gli oggetti di selezione delle entità.

Ecco un esempio di questo tipo:

Form.products è una nuova selezione di entità vuota ottenuta con la funzione della classe newSelection(). Pertanto, non è condivisibile e accetta l’aggiunta di un’entità.

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

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

Se si cerca di inserirlo “così com’è” nell’oggetto condiviso $sharedObj, si ottiene un errore:

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

Poiché ORDA pensa a tutto, c’è una nuova funzione di classe .copy() disponibile per gli oggetti di selezione di entità.

Restituisce una copia della selezione di entità data, quindi possiamo chiedere che questa copia sia condivisibile o meno.

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

Ecco fatto!

Naturalmente, con questa nuova funzione di classe, è possibile trasformare una selezione di entità condivisibile in una non condivisibile, omettendo il parametro opzionale.

Si noti che anche il comando OB Copy è stato aggiornato:

  • accetta come parametro una selezione di entità.
  • Le selezioni di entità annidate nell’oggetto da copiare vengono copiate anche in base all’opzione passata.

Scaricare l’HDI e consultare la documentazione per saperne di più!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert è entrata a far parte del team 4D Product come Product Owner nel 2017. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente.Marie-Sophie si è laureata presso la scuola di ingegneria ESIGELEC e ha iniziato la sua carriera come ingegnere presso IBM nel 1995. Ha partecipato a vari progetti (di manutenzione o di costruzione) e ha lavorato come sviluppatrice Cobol. In seguito ha lavorato come progettista UML e sviluppatore Java. Ultimamente i suoi ruoli principali erano l'analisi e la scrittura dei requisiti funzionali, il coordinamento dei team di business e di sviluppo.