ORDA – プロセス間でエンティティセレクションを共有する

Deeplからの自動翻訳

4D v16 R6では、プロセス間の通信に新しい概念共有 オブジェクトと 共有 コレクション変数が導入されました!このおかげで、プロセス間で簡単に情報を共有することができるようになりました。

今までは、エンティティセレクションは、プロセス間で共有することができませんでした。しかし、4D v18 R5では、エンティティセレクションを共有できるようになりました。

もう、主キーのリストを作成して、選択したエンティティを別のプロセスに移動させる必要はありません。ORDAのエンティティセレクションを共有オブジェクトとして含めることで、あなたのマルチプロセスのコードを 強化します。

詳しくはこちらをご覧ください。

HDI: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.productsnewSelection()クラス関数で取得した新しい空のエンティティセレクションです。したがって、これは共有可能ではなくエンティティを追加することができます。

Formproducts:= . . dsProductsnewSelection()

//Form.product is entered by the user .
Formproducts.( . )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をダウンロードし、ドキュメントを参照してください。

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。