sys_choice が Domain Separation 環境のリストビューでどのように動作するかを理解するSummary<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } 多くの場合、セッションドメインと同じドメインに Choice が存在しないにもかかわらず、リストビューで特定の Choice Label が表示される理由について問題が報告されます。sys_choice テーブルは、Domain Separation において特別なテーブルです。セッションドメインに基づいて Label が評価される仕組みは、リストとフォームで異なります。この記事では、リストビューで sys_choice がどのように動作するかを理解するための説明を行います。 最初に覚えておくべきことは、リストビューでは、セッションドメインが正しい Choice Label を評価または検索する際の開始点として使用されるということです。この動作は想定どおりです。設計上、リストは常にユーザーセッションのドメインを使用します。各レコードごとに異なる Choice を追跡しようとすると混乱を招く可能性があります。たとえば Incident が異なるドメインに存在し、かつ Multi-row Cell Editing を使用している場合がそれに該当します。これは Additional information セクションに記載されている以下の KB に文書化されています。これを念頭に置いて、Choice Label がシステムによってどのように評価されるかを理解するために、ユースケースを見ていきます。 以下を想定します。 トリーが存在する。Label は "Incident State 5" とする。 このシナリオでは、セッションドメインが TOP/XYZ の状態で sc_task テーブルのリストビューを開くと、State 値が -5 のレコードは "Incident State 5" という Label を表示します。 ここから、なぜシステムがこの Label を表示するのかを詳しく説明します。 ステップ 1 : 特に sys_choice テーブルにおける Domain Separation のアーキテクチャに従い、まず sys_choice テーブル上で利用可能な Choice を次の条件に基づいて検索します。 (a) セッションドメインと同じドメインであること (b) リストビュー内の正確なテーブル名であること (c) 要素名が一致すること (d) Choice がアクティブであること(inactive = false) (e) ログインユーザーのセッション言語に一致すること ここで重要なのは、フィールド値はまだ考慮されないということです。まずはデータ取得元となる Choice の集合を見つけることが重要です。 ステップ 2 : 上記条件で、このシナリオにおいてシステムが Choice Label を取得しようとすると、TOP/XYZ ドメインに対して次の条件で検索します。しかし同じドメイン内には値 -5 のアクティブなレコードは存在しません。 SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'sc_task' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = '12345678901234567890123456789012' AND (sys_choice0.inactive = 0 OR sys_choice0.inactive IS NULL ) ORDER BY sys_choice0.sequence,sys_choice0.label,sys_choice0.`dependent_value ステップ 3 : システムがこの条件でレコードを見つけられない場合(このユースケースでも同様)、sc_task の親テーブルに Choice が存在するかを確認します(言語、TOP/XYZ ドメイン、フィールドなどの条件は同じです)。 SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'task' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = '12345678901234567890123456789012' ステップ 4 : この条件でも見つからない場合(このユースケースでも同様)、今度は親ドメイン(TOP)の task テーブルに対して同じ条件で検索します。 SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'task' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = '774190f01f1310005a3637b8ec8b70ef' ステップ 5 : この条件でも見つからない場合(このユースケースでも同様)、Global ドメインを確認します。 SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'task' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = 'global' ステップ 6 : この条件でも見つからない場合(このユースケースでも同様)、システムは TOP/XYZ ドメイン内で条件に一致する子テーブルの Choice を検索範囲に含めます。 SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.element = 'state' AND sys_choice0.name IN ('sn_ti_case' , 'u_sna_assumptions' , 'incident_task' , 'sa_error_handler_task' , 'sn_risk_response_task' , 'sn_risk_transfer_task' , 'sn_risk_avoidance_task' , 'sn_risk_acceptance_task' , 'sn_risk_mitigation_task' , 'std_change_proposal' , 'x_fstfs_service_ac_service_acceptance' .........<TASK の複数の子テーブル>..............'sn_test_management_test_plan' , 'pm_project' , 'sn_audit_engagement' , 'sn_compliance_policy_exception' , 'rm_feature' , 'rm_doc' , 'rm_defect' , 'rm_test' , 'rm_enhancement' , 'rm_story' , 'sn_safe_story' , 'rm_epic' , 'sn_safe_epic' , 'sn_safe_feature' , 'itfm_dispute' , 'sc_req_item' , 'itfm_sb_stmt' , 'sn_customerservice_escalation') AND (sys_choice0.sys_domain_path = '/' OR sys_choice0.sys_domain_path LIKE '!!$/!!+/%' OR sys_choice0.sys_domain_path LIKE '!!$/!!1/!!W/!!./%' OR sys_choice0.sys_domain_path LIKE '!!$/!!$/!!&/!!!/%') GROUP BY sys_choice0.name ORDER BY sys_choice0.name ステップ 7 : 各子テーブルについて、システムはステップ 2、4、および 5 を繰り返します(つまり XYZ ドメイン、TOP ドメイン、Global ドメインの順)。条件に一致するレコードが見つかるまで検索を続けます。 ここでも、まだフィールド値の比較は行われていないことに注意してください。存在する Choice レコードを探しているだけです。値の確認は後で行われます。 前述のとおり、incident テーブルの Global ドメインにはこのフィールドに対するエントリーが存在するため、次のクエリーが実行され、最後にデータが見つかります。 (TOP/XYZ ドメイン) SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'incident' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = '12345678901234567890123456789012' (TOP ドメイン) SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'incident' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = '774190f01f1310005a3637b8ec8b70ef' (Global ドメイン) SELECT ... FROM sys_choice sys_choice0 WHERE sys_choice0.name = 'incident' AND sys_choice0.element = 'state' AND sys_choice0.language = 'en' AND sys_choice0.sys_domain = 'global' この最後のクエリーにより、システムはステップ 1 の条件に一致する参照を見つけ、その後で値の確認を行います。値が一致した場合、Label が表示されます。前述のとおり、この条件に一致する Label "Incident State 5" のエントリーが存在するため、State 値が -5 のレコードではこの Label が表示されます。 ここでも見つからなかった場合、値は青色で括弧付き(例: (-5))で表示されます。 これが、リストビューにおいて任意のフィールドの sys_choice レコードの Label が評価される仕組みです。これを確認するには Debug SQL を有効化し、セッションログを分析してください。 Related Links<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } https://hi.service-now.com/kb_view.do?sysparm_article=KB0685040