オブジェクトタイプのフィールド

初めて投稿します。

tableにオブジェクトタイプのフィールド[field]を作成したとします。

fieldの中にはproperty1,property2があるとします。
このテーブルで、今修正を加えているエンティティをentityとします。

エンティティを使って
entity.field.property1:=value
entity.save()

とオブジェクトのプロパティ値を変更して保存した場合、
フィールドには修正した値が保存されていることが期待されます。

スタンドアローンの環境ではその通りになるのですが、
サーバークライアント環境では、valueを代入する前の値に戻っているようです。

回避するには、フィールド値をコピーしたものに値を代入して、
それをフィールドに保存するようにしないと無理のようです。

object:=ob copy(entity.field)
object.property1:=value
entity.field:=object
entity.save()

皆さんはどうなのでしょうか?
バージョンは4Dv17 R3です。

佐藤康弘

17R3にて,とのことですが,ビルド番号はいくつになるでしょうか。

https://4d-jp.github.io/2018/12/26/release-note-version-17r3/

ACI0098526 ORDAでNフィールドに相当するリレーション属性を更新しようとすると,指定した値ではなく,Nullが代入されました。値を確認して,もう一度,同じ値を代入すれば,今度は成功します。あるいは,値を代入する代わりに,1レコードに相当するエンティティを代入すれば,問題を回避することができます。

コードは,Nフィールドではなく,オブジェクト型フィールドの最上位プロパティですが,状況は似ているように思います。ORDAのクライアント/サーバーモードでは,ネットワーク最適化のため,オブジェクトのロードが遅延されているわけですが,ドット記法を会した間接的な代入(更新)をうまく判定できていない問題があったようです。

宮古さん お返事ありがとうございます。

ビルド番号は231689でした。
ドット記法を使用しなければ問題が解決する可能性があると言うことでしょうか?

話は変わってしまうかも知れませんが、
オブジェクトのプロパティ値はblobも使用できるのですか?

オブジェクトのプロパティ値にblobを代入して、
ドット記法で参照したら、nullが返ってきました。

リストボックスやフィールド・変数など,フォームオブジェクトとのバインドがORDAの「目玉」と位置付けられていることもあって,BLOBのサポートは,いまのところ,先送りされています。

もちろん,将来的にはサポートされる予定です。

参考:https://speakerdeck.com/miyako/obuziekutoxing-developer-conference-2018yori?slide=16

問題は17R4ベータ版,および17.xのビルド231563以降ではすでに修正されているのですが,17R3はリリース日が確定しているので,後述する回避策で対処する必要があります。

この動作,つまり,既存オブジェクト型のプロパティに新しい値を代入した場合,大元のオブジェクト型(変数またはフィールド)は「タッチ」されたことにならず,明示的に$obj:=$objを実行しないとフォームの再描画やデータベースの更新が発動しない,という問題は,当初,最適化(更新のタイミングはプログラマーが明示的に記述することで無駄な処理を省く)を追求した「仕様」とされていましたが,「直感的ではない」ということで全面的に直されることになりました。スタンドアロンの動作はすでに改定されていますが,ネットワーク版のほうが残されていた格好になります。

回避策は下記のようになります。

entity.field.property1:=value
entity.field:=entity.field
entity.save()

OB Copyとは違い,オブジェクト(entity.field)更新フラグをタッチするだけですので,コピーのオーバーロードは発生しません。また,修正後に敢えて取り除く必要もありません。

よろしくお願い申し上げます。

宮古さん ありがとうございます。

やっとわかりました。

スタンドアローンではうまくいかず、
たまたま、フィールドのオブジェクトをコピーして代入したらうまくいったので、
それを使っていました。OB copyをする必要はないのですね。

OB copyしていたところを修正しておきます。

ところで、blobのサポートは先送りと言うことでしたが、
blobフィールドをエンティティで操作するのは
しばらくは控えた方がいいと言うことですね。

ありがとうございました。

ところで、17R3はいつリリースなのでしょうか?
そういう情報をどこから拾ってくるのかよくわかっていません。><