Interested in a ServiceNow event built for developers? Registration for now[dev]26 is officially open!

How can I configure multiple ORDERBY fields as the default sort when opening a list from a Module?

m-kishida
Tera Contributor

ServiceNowモジュールからリストを開く際に、デフォルトで複数列のソートを設定したいと考えています。
対象となるのはカスタムテーブルです。リストは、以下のソート順で開くようにしたいです。

1. aaaa DESC
 2. bbbb ASC
 3. cccc ASC
 4. dddd ASC

 

フィルタビルダーでは、以下のエンコードされたクエリは期待どおりに動作します。

ORDERBYDESCaaaa ^ ORDERBYbbbb ^ ORDERBYcccc ^ ORDERBYdddd

 

 

「並べ替えの追加」を使用して手動で並べ替えを設定し、「実行」をクリックすると、生成されたリスト URL には、たとえば次のすべての ORDERBY 句も含まれます。

< custom_table > _list . do ? sysparm_query = ORDERBYDESCaaaa ^ ORDERBYbbbb ^ ORDERBYcccc ^ ORDERBYdddd

 

エンコードされたクエリ自体は有効だと考えています。
しかし、モジュールからリストを開いた場合、同じ複数列ソートが機能しません。
以下の方法を試しました。

  1. モジュール引数で sysparm_query を使用する
sysparm_query = ORDERBYDESCaaaa ^ ORDERBYbbbb ^ ORDERBYcccc ^ ORDERBYdddd

モジュールを開いた後、最初の ORDERBY のみが適用されているようです。
結果として得られる URL は次のようになります。

sysparm_fixed_query = ORDERBYDESCaaaa

残りのORDERBY句はもはや存在しません。

  •  sysparm_fixed_query を使用する
sysparm_fixed_query = ORDERBYDESCaaaa ^ ORDERBYbbbb ^ ORDERBYcccc ^ ORDERBYdddd

結果は同じで、最初のソート条件だけが残るようだ。

  • URL (引数から) を使用して
    、以下の方法も試しました:
< custom_table > _list . do ? sysparm_query = ORDERBYDESCaaaa ^ ORDERBYbbbb ^ ORDERBYcccc ^ ORDERBYdddd

そしてURLエンコード版:

< custom_table > _list . do ? sysparm_query = ORDERBYDESCaaaa % 5EORDERBYbbbb % 5EORDERBYcccc % 5EORDERBYdddd

しかし、モジュールを起動した後、URLは依然として以下のようなものに変換されます。

sysparm_fixed_query = ORDERBYDESCaaaa

そして、追加のORDERBY句は失われます。

sys_user_preferenceも確認しました。

リストに複数のソートフィールドを設定した後でも、設定にはプライマリソートフィールドのみが保存されるようです。例:

<table> .db.order = aaaa
 <table> .db.order.direction = DESC​​​​​​​​​​​​

つまり、sys_user_preferenceには、すべてのユーザーに対してこの4段階のデフォルトソートを定義する方法は提供されていないようです。

 

私の具体的な要望は以下のとおりです。

ORDERBYDESCaaaa
 ^ ORDERBYbbbb
 ^ ORDERBYcccc
 ^ ORDERBYdddd

 ユーザーがモジュールからこのリストを開いたとき。

理想としては、このモジュールからリストを開いた場合にのみソートが適用されるようにしたいです。テーブル全体のデフォルトのクエリ動作を変更したり、API、スクリプト、またはテーブルがクエリされるその他の場所に影響を与えたりしたくありません。

モジュールのデフォルトのソート順として、複数のORDERBY句を設定するための推奨される方法はありますか?

モジュールがこれを直接サポートしていない場合、推奨されるアプローチは何でしょうか?

例えば:

  • 保存済みフィルター
  • 別のモジュール/リスト構成
  • クライアント側のアプローチ
  • クエリ実行前のビジネスルール
  • 別のサポートされているメカニズム

可能であれば、クエリ前ビジネスルールは避けたいと考えています。なぜなら、それはこの特定のモジュール以外のクエリにも影響を与える可能性があるからです。

何かアドバイスをいただければ幸いです。

1 REPLY 1

musislam
Kilo Sage

Hi,

Got this working in my PDI - multi-column ORDERBY does survive from a Module, but only if the Arguments field holds the bare encoded query.

Module: Link type = List of Records, Table = Incident, Filter empty, Arguments = ORDERBYDESCpriority^ORDERBYnumber

Result: Priority descending, then Number ascending. Both sorts applied.

The version that fails is Arguments = sysparm_query=ORDERBYDESCpriority^ORDERBYnumber. For "List of Records" the Arguments value is already appended into sysparm_query, so that prefix gets parsed as a filter condition - my breadcrumb read literally "sysparm_query=ORDERBYDESCpriority" and the list dropped back to its default sort. I suspect that is what you hit.

So just drop the sysparm_query= prefix and leave the ORDERBY chain on its own. No business rule and no user preference needed.

If that works for you, mind marking it as the recommended solution? Helps me support these better for the community.

 

以下、日本語での要約です。

モジュールの Arguments に sysparm_query= を付けると、その文字列全体がフィルタ条件として解釈され、ソートが既定に戻ります。Arguments には接頭辞なしでエンコードクエリのみを入れてください。

リンクタイプ: List of Records / テーブル: Incident / フィルタ: 空 / Arguments: ORDERBYDESCpriority^ORDERBYnumber

これで Priority 降順、続いて Number 昇順という複数ソートが効くことを自分の PDI で確認しました。ビジネスルールもユーザー設定も不要です。

解決しましたら、推奨ソリューションとしてマークしていただけると助かります。

Macki | Deloitte AU | Engineer Lead