4D v16 R6 hat ein neues Konzept für die Kommunikation zwischen Prozessen eingeführt: Shared Object und Shared Collection Variablen! Damit können Sie auf einfache Weise Informationen zwischen Prozessen austauschen.
Bis jetzt war es nicht möglich, Objektauswahlen zwischen Prozessen zu teilen. Das hat sich jedoch geändert … wir freuen uns, Ihnen mitteilen zu können, dass in 4D v18 R5 die Auswahl von Objekten gemeinsam genutzt werden kann!
Vorbei sind die Zeiten, in denen Sie eine Liste von Primärschlüsseln erstellen mussten, um eine Auswahl von Entitäten in einen anderen Prozess zu verschieben. Verbessern Sie Ihren Multiprozess-Code , indem Sie ORDA-Entity-Selektionen als gemeinsam genutzte Objekte einbinden.
Lesen Sie weiter, um mehr zu erfahren.
HDI: Gemeinsame Nutzung von ORDA-Entitätsselektionen
Prinzip
Mit 4D v18 R5 sind die meisten Entitätsselektionen gemeinsam nutzbar. Das bedeutet:
- Sie sind nicht änderbar (erlaubt nicht das Hinzufügen neuer Entitäten).
- sie können von mehreren Prozessen oder Arbeitern gemeinsam genutzt werden.
Einige Objektauswahlen sind nicht gemeinsam nutzbar (zum Beispiel, wenn sie mit dataClass.newSelection() oder Create entity selection() erstellt wurden). Das bedeutet:
- sie sind veränderbar (erlaubt das Hinzufügen neuer Entitäten)
- sie können nicht von mehreren Prozessen gemeinsam genutzt werden
gemeinsam nutzbare Entity-Auswahlen
Ab 4D v18 R5 sind die meisten Entity-Auswahlen (abgerufen mit query(), all(), …) gemeinsam nutzbar.
Schauen wir uns zum besseren Verständnis ein Beispiel an.
Beispiel
In dem folgenden Beispiel erstellen wir zwei Entitätsselektionen:
- eine für bezahlte Rechnungen.
- eine für unbezahlte Rechnungen.
Wir möchten sie an einen Worker weitergeben, um das Senden zu delegieren:
- Bestätigungs-E-Mails für bezahlte Rechnungen.
- Erinnerungs-E-Mails für unbezahlte Rechnungen.
Hier ist der 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
Hier ist die sendMails-Methode :
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:="mein Passwort"
$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:="Zahlung OK für Rechnung #"+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:="Bitte bezahlen Sie Rechnung #"+String($invoice.number)
$status :=$transporter.send($email)
End for each
Wie Sie sehen können, kann der Worker mit der Auswahl der Entitäten umgehen!
Hin- und Hergehen zwischen gemeinsam nutzbaren und nicht gemeinsam nutzbaren Entitätsauswahlen
In einigen Fällen kann es vorkommen, dass Sie eine Entity-Auswahl haben , die nicht gemeinsam genutzt werden kann. Wenn Sie sie für einen anderen Prozess freigeben müssen, verwenden Sie einfach die Funktion new .copy() Klassenfunktion, die für Entitätsauswahlobjekte verfügbar ist.
Hier ist ein Beispiel für genau das:
Die Form.products ist eine neue leere Entity-Auswahl, die mit der Klassenfunktion newSelection() erzeugt wurde. Sie ist also nicht teilbar und erlaubt das Hinzufügen einer Entität.
Form.products:=ds.Products.newSelection()
//Form.product is entered by the user
Form .
products.add(Form.product)
Wenn Sie versuchen, es „so wie es ist“ in das gemeinsam genutzte Objekt $sharedObj einzufügen, erhalten Sie einen Fehler:
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
Da ORDA an alles denkt, gibt es eine neue .copy() Klassenfunktion für Entity-Auswahl-Objekte zur Verfügung.
Es gibt eine Kopie der angegebenen Entitätsauswahl zurück, so dass wir diese Kopie fragen können, ob sie geteilt werden kann oder nicht.
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
Das war’s!
Natürlich können Sie mit dieser neuen Klassenfunktion auch eine gemeinsam nutzbare Entitätsauswahl in eine nicht gemeinsam nutzbare umwandeln, indem Sie den optionalen Parameter weglassen.
Beachten Sie, dass der Befehl OB Copy ebenfalls aktualisiert wurde:
- Er akzeptiert eine Entity-Auswahl als Parameter.
- Entity-Auswahlen, die in dem zu kopierenden Objekt verschachtelt sind, werden ebenfalls entsprechend der übergebenen Option kopiert.
Laden Sie den HDI herunter und lesen Sie die Dokumentation, um mehr zu erfahren!