4D v16 R6では、プロセス間の通信に新しい概念、共有 オブジェクトと 共有 コレクション変数が導入されました!このおかげで、プロセス間で簡単に情報を共有することができるようになりました。
今までは、エンティティセレクションは、プロセス間で共有することができませんでした。しかし、4D v18 R5では、エンティティセレクションを共有できるようになりました。
もう、主キーのリストを作成して、選択したエンティティを別のプロセスに移動させる必要はありません。ORDAのエンティティセレクションを共有オブジェクトとして含めることで、あなたのマルチプロセスのコードを 強化します。
詳しくはこちらをご覧ください。
原理
4D v18 R5では、ほとんどのエンティティセレクションが共有可能 です。これは、次のことを意味します。
- 変更不可(新しいエンティティを追加できない)
- 複数のプロセスやワーカー間で共有できる。
エンティティセレクションの中には、共有できないものもあります(例えば、dataClass.newSelection()やCreate entity selection() で作成された場合)。これは、次のことを意味します。
- 変更可能 である (新しいエンティティを追加できる)
- 複数のプロセス間で共有することができない
共有可能なエンティティセレクション
4D v18 R5から、ほとんどのエンティティセレクション(query(),all(), …で取得可能)が共有可能になりました。
例を見て、理解を深めましょう。
例
以下の例では、2 つのエンティティセレクションを作成します。
- 1 つは支払い済み請求書、もう 1 つは未払い請求書です。
- 1 つは支払い済み請求書、もう 1 つは未払い請求書です。
これらをワーカーに渡して、送信を委ねることもできます。
- 支払い済み請求書の確認メール
- 未払いの請求書に対する督促メール。
以下はそのコードです。
If
End use
CALL WORKER Storageinfo( . = ) ( ) . := ( . ) . . := . . ("status=:1"; "Paid") . . := . ("status=:1"; "Unpaid") xml-ph-0034@deをStorageinfoNull
UseStorage
StorageinfoNew shared object()
End useEnd if
UseStorageinfo
//Put entity selections in a shared object StorageinfopaiddsInvoicesquery
StorageinfounpaiddsInvoicesquery実行する。
以下は、sendMails メソッドです。
var $info
; : ; : . : . ; ; ; : s := . :="exchange.company.com" $1 Object
var $paid $unpaid csInvoicesSelection
var $invoice csInvoicesEntityvar $server $transporter $email $status Object//Prepare emails
$serverNew object
$serverhost
$server .:="myName@company.com" . :="my password" := ( ) := . :="myName@company.com" user
$serverpassword
$transporterSMTP New transporter$server
$emailNew object
$emailfrom
//Get entity selections
$info:=$ 1
$paid:= .:= . ( ; ) := . . . :="Payment OK for invoice #"+ ( . ) :=$infopaid
$unpaid$infounpaid
//Loops on entity selections
For each$invoice $paid
$emailto$invoicecustomeraddress // email address of the customer $emailsubjectString$invoicenumber
$status$transporter.=”請求書の支払い完了” :=”請求書の支払い完了” :=”請求書の支払い完了” :=”請求書の支払い完了
send // email address of the customer $email($email) ( ; ) . := . . :="Please pay invoice #"+ ( . ) := . ( )
End for each
For each$invoice $unpaid
$emailto$invoicecustomeraddress
subjectString$invoicenumber
$status$transportersend$email
End for each
見ての通り、ワーカーはエンティティを選択することができます。
共有可能なエンティティ選択と共有不可能なエンティティ選択の間を行ったり来たりする
場合によっては、共有不可能なエンティティセレクションがあることがあります。もし、他のプロセスと共有する必要がある場合は、エンティティ選択オブジェクトで利用できる新しい .copy()クラス関数を使用してください。
これはまさにその例です。
Form.products はnewSelection()クラス関数で取得した新しい空のエンティティセレクションです。したがって、これは共有可能ではなく、エンティティを追加することができます。
Formproducts:= . . dsProductsnewSelection()
//Form.product is entered by the user .
Form
products.( . )addFormproduct
$sharedObj 共有オブジェクトの中に「そのまま」入れようとすると、エラーが発生します。
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
ORDAはあらゆることを考えるので、エンティティ選択オブジェクトで利用できる新しい .copy()クラス関数が用意されています。
与えられたエンティティセレクションのコピーを返すので、このコピーに共有可能かどうかを問い合わせることができます。
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 。
以上です。
もちろん、この新しいクラス関数では、オプションのパラメータを省略することで、共有可能なエンティティ選択 を共有不可能なエンティティに変更することもできます。
OB コピーコマンドも更新されました。
- これは、パラメータとしてエンティティセレクションを受け取ります。
- コピーするオブジェクトにネストされたエンティティセレクションも、渡されたオプションに従ってコピーされます。
HDIをダウンロードし、ドキュメントを参照してください。