313 Views
March 23, 23
スライド概要
Notes/Dominoの@関数を取り上げながら、調べたこと、経験したことを雑談してゆきます。
第33回も @Picklist について。
@ -notes knows community- 2021/12/09 @関数Talk 第33回 公開版 @ 阿部 覚 (tw:) @abesat
@ @PickListについては2回お話して 一通り引数の紹介を(いちおう)したのですが まだ確認したいことがあるなと思い、 @
@ @PickList でもうちょっと放談 @
@PickList でビューを表示 @ @PickListの一番メジャーな使い方、と私が思っている ビューから文書を選択する[Custom]パターンについて @
@PickList でビューを表示 @ 選択した文書の、指定した列の値をとってきてくれる 取ってくるのは 1列目 だよ @
@PickList で複数項目をゲットするには @ しかし、どうせ取ってきてくれるなら 複数の項目をいっぺんに取ってきてくれないものかな? @
@PickList で複数項目をゲットするには @ @PickList 単体では、そういう融通はきかないようです 例えばこんな指定をしてもだめ 式はエラーにはならないけど、 1つ目の列番号分しか取り出してくれませんでした @ 取ってくるのは 1列目と2列目だよ (希望)
@ 複数項目を取得するためのアプローチ したがって、@PickListを使って複数の項目を取り出すには 多少の工夫を加える必要が生じます 工夫のしかたには、 おもに2つのアプローチがあると思います いずれのアプローチも、 @PickListに使用するビューで 「非表示の列」を持つのが無難なやり方です @ ここでの「非表示の列」とは 「列」プロパティの「詳細」タブで 「列を非表示」にチェックしたものを意味します
@ 複数項目を取得するためのアプローチ その1 アプローチその1 1つの列に複数項目を寄せ集める 対象のビューに非表示の列を設定します その列に、取得したい複数の項目の値を連結で持たせます @
@ アプローチその1 1つの列に複数項目を寄せ集める どのように連結するかは例えば…👇 @
@ アプローチその1 1つの列に複数項目を寄せ集める @PickListでは、この非表示列を取得します @ ここでは取得した値を @Wordという関数で分割して セットしています (この関数のTalkはまたの機会に)
@ アプローチその1 1つの列に複数項目を寄せ集める この方法には次のような制約・欠点があると思います 1.対象項目の属性を 一時的に統一しなくてはならない 数値や日時のフィールド項目も、 一時的にテキストにそろえないと 式がエラーになってしまいます @
@ アプローチその1 1つの列に複数項目を寄せ集める この方法には次のような制約・欠点があると思います 2.複数値の項目が含まれるなら単一値になるように 連結するなどの工夫が必要 ここでは@Implodeという関数を使って 連結しています (この関数についてのTalkもまたの機会に😅) @
@ アプローチその1 1つの列に複数項目を寄せ集める この方法には次のような制約・欠点があると思います 3.項目を連結する際の連結文字に注意が必要 たとえば"-"でつなぐとすれば、 対象フィールド内に"-"が含まれていない必要があります でもユーザーが自由入力してよいフィールド項目なら、 どんな文字が入っている可能性も 排除できないとも思います(いちばんの悩みどころ) @
@ 複数項目を取得するためのアプローチ その2 アプローチその2 @PickListは、文書の特定だけに使う やはり対象のビューに非表示の列を設定します @
@ アプローチその2 @PickListは、文書の特定だけに使う @PickListでは、この非表示列を取得します すなわち、取得されるのは文書IDになるのですが 複数項目の取り出しは この文書IDを使って別の式で行います そこで一つ、確認ごとを挟みます @
@ @GetDocField で放談 @
@GetDocField @ こんな構文で 指定した文書からフィールド値を取り出す関数です @GetDocField( 文書ID ; フィールド名 ) @
@PickListと@GetDocField @ @PickList で、選択した文書の文書IDを取り出した後、 @GetDocField では、文書IDを使って 複数のフィールド項目値を取り出すことができるわけです @
@ アプローチその2 @PickListは、文書の特定だけに使う さて、"XSnippets" というサイトに @PickList を使った類似のサンプルがあります @ https://www.xpages.jp/XSnippetsJ.nsf/
@ アプローチその2 @PickListは、文書の特定だけに使う @
@ アプローチその2 @PickListは、文書の特定だけに使う このサンプルでは、@Picklistで取得した文書IDを元に、 文書ID順のビュー(view02)から@DbLookupで 値を取得しています @ @GetDocField を使えば、こんな感じの式だけで良く 文書ID順のビューなんて要らないよ…? value_a := @GetDocField( unid ; "Field_A" ); value_b := @GetDocField( unid ; "Field_B" ); value_c := @GetDocField( unid ; "Field_C" );
@GetDocField の現状… @ 実は、@GetDocField は、一度実行するだけで文書全体を読み込む 現時点ではあまりパフォーマンスがよろしくない関数 なのだそうです value_a := @GetDocField( unid ; "Field_A" ); value_b := @GetDocField( unid ; "Field_B" ); value_c := @GetDocField( unid ; "Field_C" ); <関連情報> この例では 文書全体を 3回読み込む 😮 1回で取れる フィールド項目値は ひとつ分だけ なのに… モッタイナイ @ Performance Design Tips : @GetDocField 関数 | Lotus Notes/Domino (R) をこよなく愛して。。。。 https://ameblo.jp/iwama/entry-10002063621.html こちらは実は、今回の「のの会」後の中野さん調査 GetDocField の処方箋 https://speakerdeck.com/harunakano/getdocfield-falsechu-fang-jian
@PickList を使用して複数項目を取得するには @ 今回触れた方法をまとめるとこんな感じになります 方法 留意点 1つの列に複数項目を寄せ集める 項目の属性を統一しなくてはならない 複数値の項目は連結するなどの工夫が必要 項目を連結する際の連結文字に注意 @PickListは、文書の 特定だけに使う 文書IDをもとに @GetDocFieldを 項目数分実施 現状では@GetDocFieldのパフォーマンスに課題、 都度文書全体を読み込んでしまう 文書IDをもとに @DbLookupを 項目数分実施 文書ID順の専用ビューも準備が必要 @
@ 補足 スライド中で触れたXSnippets(日本語版)は Notes/Domino 関係のサンプルコードを集めたサイトです (現時点で式言語のサンプルはわずかですが) https://www.xpages.jp/XSnippetsJ.nsf/ @ 公開にあたって当初発表時に無かったページ等を追加させていただきました
@ 今回もお付き合い ありがとうございました 😀 @