abOut.nsf

新旧かまわず、またお役立ち度にあまりこだわらずに、 拡張子がnsfであるNoSQLなデータベースファイルと、それを扱うコラボレーション製品に絡んでのあれこれを。

2015/08

こちらの作文は、ひとつ前の作文への、おまけ的な補足です。

<1>Default Valueも要注意

前の作文では、”作成時の計算結果”フィールド をターゲットにしました。

基本的には、“編集可能”フィールドのDefault Valueでも、同じことがいえます。

既に利用中のNotes DBで、既存のフォームに、新しい”編集可能”フィールドを追加した場合も
Default Valueは、”そのフィールドが初めて作成され計算された”ときの値になります。
既存文書では文書が作成されたときの値ではなくなることに注意してください。

主な注意点に関しては前の作文と同様です。

付言すると、編集可能フィールドでは、ラジオボタンやコンボボックスなど、キーワード選択肢のフィールドが注意対象に含まれます。
キーワード選択肢は、主に編集可能フィールドで使われ、”作成時の計算結果”で使われることは滅多にないと思いますので。(使い道が少ないだけで設定はできますが)


<2>ビューと文書の逆転現象

”作成時の計算結果”にせよ、“編集可能”なDefault Valueにせよ、
後から追加した項目をビューにも表示する場合は、こんな落とし穴も。

仮に、”NewSign” というチェックボックスフィールドを追加して、デフォルトはチェックOnの状態だとします。

ビュー列上では、既存文書には、”NewSign”フィールドが元々無いから、値は表示されません。
しかし、文書を開くと、チェックOnになってしまいます。

前の作文で書いたように、開いたタイミングでフィールドが内部的に作成され値が計算されるためです。

ビューにはないのに、文書を開くとチェックがついている。ビューと文書でうっかりこのような表示の逆転をおこしてしまうと、
一般ユーザーになぜ?と聞かれた場合の説明、理解してもらうのは難しいと思います。

"作成時の計算結果"は「文書の作成時に1回だけ計算されるフィールド」ということになっています。
大抵その通りなのですが、そうでない場合があります。
イメージ 1


Notes/Dominoの開発者には、そこそこ知られていそうな割に、記載が見当たらない(もしくは少ない)ことのひとつなので書いておこうと思います。

そうでない場合とは、
既に利用中のNotes DBで、既存のフォームに、新しい"作成時の計算結果"を追加した場合。

問題は、既存文書を改修後のフォームで開いた際の動作です。
    既存文書には、その新しいフィールドは入っていません。

    ユーザーが文書を開いたとき、初めてフィールドが生成され、計算されます。
    ただしユーザーが編集保存せずに、そのまま閉じた場合は、実際には何も残らない。
    ユーザーが開く都度、内部でフィールドが生成され、計算されるけど…保存されない限りはそのまま。

    ユーザーが編集保存を行った場合に、初めて値が文書内に残ります。
以降は誰が開いても、値は変わりません。


仮に、新しい"作成時の計算結果"フィールドに、@UserNameを使って名前を表示する式がある場合。
    Yamadaさんが文書を開けば、Yamadaさんの名で生成され、Yamadaさんが編集保存しなければ残らず。
    Suzukiさんが文書を開けば、Suzukiさんの名で生成され、Suzukiさんも編集保存しなければ残らず。

    保存されない限りは、誰が開いても、開いた人がそれぞれ自分のユーザー名を目にすることになります。

    Takahashiさんが開いたときに、編集保存すれば、そこで初めて値が確定し、Takahashiさん名で残ります。

    以降は、誰が開いても表示されるのはTakahashiさんです。

保存しなければ値が確定しない点は、
新規文書を作成した画面のまま保存しなかった場合と、同じといえば同じ、ともいえそうですが
既存文書の場合は、読み込みで開いただけで編集しなくても一時的に作成され、値が表示される点が要注意です。

"作成時の計算結果"といえば、「文書作成者」や「作成日時」といった用途が思いうかびます。
しかし、既存のフォームに後からフィールドを追加した場合には、
単に「現在のユーザー」や「現在の日時」を式として入れるだけでは失敗することになります。

前述の例も、開発者は文書を作成した人を表示するつもりで追加しており
Takahashiさんで保存された文書も最初に作ったのはYamamotoさんだったかもしれません。

したがって、文書作成時の情報を意図した"作成時の計算結果"を、後から追加する場合には、
次のような工夫が必要です。

(1)可能なら、現在の情報をセットする式ではなく、本当に文書が作成された時点の情報をセットする
    ほかに作成者を表す既存フィールドがあればその情報を利用します。
    ご参考ですが、大抵の場合、$UpdatedByフィールドの先頭は作成者ということになります。エントリを制限してる場合など正しくない場合もありうるので、汎用的にお勧めはできないですが。
    作成日時は@Createdフィールドがあります。

(2)文書作成時点の情報がない場合は、既存文書に現在の値をセットしない工夫をする
    @IsNewDoc関数を使用して、新規文書の時以外は値をセットしないなど。

軽いまとめとして、首題について私の認識を書くと、
"作成時の計算結果"は、
"文書作成時の計算結果" というより
"フィールド作成時の計算結果" というとらえ方が正確だと思います。

そうとらえると、上記の振る舞いについても理解し易いのではないかと。

↑このページのトップヘ