この のブログ記事で、共有可能なエンティティセレクションが提供できるパワーを発見しましたね。4Dはデータの共有に重点を置いています。なぜなら、長期的に見れば、それがパフォーマンスにつながるからです。
しかし、私たちは、この戦略があなたの現在の戦略ではないかもしれないと認識しています。私たちはフォーラムでの議論を追いかけ、皆さんのコメントや気持ちを理解してきました。
このステップを和らげ、より柔軟性とツールを提供するために、我々はエンティティセレクションの性質(共有可能か非共有可能か)に関するいくつかの機能拡張を行いました。
この作業を続ける前に、このブログ記事と この記事をお読みいただき、以下の機能強化の内容をご理解いただくことを強くお勧めします。
4D v18 R5では、非共有(変更可能)なエンティティセレクションを扱う可能性が増えました。慣れた方法で作業できるようになります。
一方、もしあなたが共有可能なエンティティセレクションで作業することを望んでいるなら、4D v18 R5でこの新時代に備えることができます。4D v18では、コードの準備に透過的に使用できる柔軟な方法を導入しています。
一言で言えば、4D v18で準備し、4D v18 R5で実行し、より高いパフォーマンスを得るための準備をすることです。
変更可能なエンティティセレクションについて
エンティティセレクションに項目を追加する
よくある使用例として、リストボックスにエンティティセレクション(製品、請求書など)を表示し、ユーザーが新しいエンティティを追加できるようにすることがあります。
Products データクラスで作業してみましょう。
フォームがロードされると、Form.products が作成され、これがリスト・ボックスのデータソースとなります。
Case of
: ( = ) . := . . () Form event codeOn Load
FormproductsdsProductsall
End case
ユーザーが新しい商品を追加するとき。
Form.products.add(Form.product)
このコードをそのまま4D v18 R5で実行すると、エラーが発生します。 add()ds.Products.all() は共有可能なエンティティセレクション(変更不可)を返すため、関数を実行するとエラーが発生します。
私たちは、この不都合を認識しています。そのため、4D v18 copy()関数は、あなたのコードを 4D v18 R5 に対応させるために準備するために利用できます。
もし copy()が4D v18で実行された場合:それは単にあなたのエンティティセレクションをコピーするだけです。
If copy()が4Dv18 R5で実行された場合、デフォルトでは、変更不可能なエンティティセレクションを変更可能なものとしてコピーするので、追加アクションで問題が発生することはありません!
というように、コードを用意すればOKです。
Case of
: ( = ) . := . . ().() Form event codeOn Load
FormproductsdsProductsallcopy
End case
エンティティセレクションの性質を保持する
元のエンティティセレクションから作成されたエンティティセレクションは、同じ性質を保持します。
例
リストボックスのソート
表示されている商品の例でもう一度作業してみましょう。この表示されたエンティティセレクションは、ユーザーが新しい製品を追加する必要があるため、変更可能として設定されています。
リストボックスの列に対して何らかの操作を行うと、エンティティ選択の変更可能性が維持されるため、製品を追加することができます。
クエリの実行
エンティティセレクションに対してクエリを実行すると、その結果に対してエンティティセレクションの性質が保持されます。
この例では、ユーザーが表示されている製品に対して検索を実行した場合、次のようになります。
Formproducts:= . . ("name = :1"; . )Formproductsquery Formsearch
Form.products は変更可能なので、このクエリーの結果は変更可能であり、新しい商品を追加することができます。
これらは2つの例に過ぎません。元の選択の性質が維持されるすべてのケースを確認するには、ドキュメントをチェックしてください。
汎用コード
適切な方法で使用するために、一般的なコードでエンティティセレクションの性質を確認することは有用です。あるメソッドが、共有可能かそうでないかのどちらかのエンティティセレクションを受け取ることを想像してみてください。
以下の例では、Products エンティティセレクションを受け取っています。これをWORKER に渡す前に、共有可能かどうかをチェックする必要があります。そうでない場合は、共有可能なエンティティセレクションに変更します。
このために、新しい OB Is shared() 関数を使用します。
var $productsEnd if
; : . := ( ( ( )) := . ( ) ("worker"; "buildCatalog"; ;$1 csProductsSelection
$products$1
IfNotOB Is shared$products
$products$productscopyck shared
//Generate the catalog of productsCALL WORKER $products Current form window))。
注:また、新しいisAlterable() 関数は、エンティティのセレクションが変更可能かどうかをチェックするために利用できます。
上記のHDIをダウンロードすると、より多くの例を見ることができます。
以前と同じように動作させる
もし、以前の4Dバージョンの動作(共有可能なエンティティセレクションの概念がない)を継続したい場合は、データストアで利用可能な makeSelectionsAlterable()クラス関数がデータストアオブジェクトで利用できます。
これで、4D v18 R5でもたらされた変更は、完全に見えなくなります。