On-demand テンプレート アプリのバインディング数式

テンプレート アプリにおけるデータ バインディングでは、On-demand アプリへのデータ ロード時に発行されるクエリの作成に使用される、テンプレートに対応した選択アプリのデータが指定されます。

バインディング数式 ($(od_FIELDNAME)) の基本形式は、修正して選択を絞り込めるので、テンプレート アプリがデータを正しくロードできます。

警告: 最初から On-demand App GenerationQlik Sense 拡張を使用して作成されたテンプレート アプリは、以下に説明する手法を使って項目から大量の選択をバインディングするよう変更する必要があります。

項目から大量の選択をバインディングする

Qlik associative engine によって、単一の LET ステートメントで連結できる値の数が制限されます。この制限を回避するために、INLINE LOAD ステートメントを使用して効率的にコンマ区切りの値のリストを作成できます。

まず、INLINE テーブルを処理するサブルーチン スクリプトを作成する必要があります。

SUB BuildValueList(VarName, TableName, ColName, QuoteChrNum) IF $(QuoteChrNum) = 0 THEN LET LOADEXPR = 'Concat($(ColName),' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ELSE LET CHREXPR = ' chr(' & '$(QuoteChrNum)' & ') '; LET LOADEXPR = 'Concat( $(CHREXPR) & $(ColName) & $(CHREXPR)' & ',' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ENDIF _TempTable: LOAD $(LOADEXPR) Resident $(TableName); Let vNoOfRows = NoOfRows('_TempTable'); IF $(vNoOfRows)> 0 THEN LET $(VarName) = Peek('CombinedData',0,'_TempTable'); ENDIF drop table _TempTable; drop table '$(TableName)'; END SUB;
注: BuildValueList サブルーチンの呼び出しでは、QuoteChrNum パラメーターの特定の値を使用する必要があります。このサブルーチンが処理する項目が数値の場合、パラメーターは 0 に設定する必要があります。文字データの場合、パラメーターの設定は 39 です。

バインディングは、INLINE テーブルを使って書き、値の数に関係なくロードする項目値の構造を作成する必要があります。

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

$(od_ORIGIN) {"quote": "", "delimiter": "") 数式は、選択アプリの ORIGIN 項目値 (改行区切り) のリストで置き換えられます。ORIGIN 項目に BOSJFKORD の 3 つの値が含まれている場合、展開された INLINE テーブルは次のように表示されます。

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL BOS JFK ORD ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

BuildValueList を呼び出した後の ORIGIN 変数の値は、次のとおりです

'BOS','JFK’,'JFK'

オプション値と除外値のバインディング

場合によっては、選択アプリでは直接選択できない項目を使用して、On-demand テンプレート アプリ のスクリプトのクエリでフィルター条件を作成する必要があります。たとえば、売上レコードでは REGION_CODE のような地域コードを使用するのに対し、選択アプリではより認識しやすい REGION_NAME 項目を使用して地域を選択するという場合があります。選択アプリでは、別個のテーブルを使用して REGION_CODEREGION_NAME と関連付けるモデルを含めることができるため、ユーザーは REGION_NAME から値を選択して選択ステートを制御することができます。

REGION_NAME の値を選択すると、その値は選択したステートに配置されますが、REGION_CODE の値はオプション ステート (つまり、緑ではなく白) にしかなりません。さらに、選択アプリのシートの設計においてフィルター パネルのセットから REGION_CODE が除外されている場合に、On-demand アプリのスクリプトのバインド数式 $(od_REGION_CODE) を、選択された地域のリストに展開する方法はありません。これは、REGION_CODE の値が実際に選択される (つまり、緑になる) ことは決してないからです。

この状況に対処するため、各データ バインディングで使用される選択ステートの値をより正確に制御するための追加の構文が用意されています。すべての On-demand バインド数式に含まれる項目名の部分の od_ プレフィックスには、バインディングで使用される値が選択ステートとオプション ステートから取得された値かどうかを示す文字の組み合わせを含めることができます。REGION_CODE を使用する有効な組み合わせの例を示します。

REGION_CODE を使用する有効な組み合わせ
パターン 展開
$(ods_REGION_CODE) REGION_CODE の選択 (緑) 値
$(odo_REGION_CODE) REGION_CODE のオプション (白) 値
$(odso_REGION_CODE) REGION_CODE の選択値またはオプション値
$(od_REGION_CODE) $(ods_REGION_CODE) と同じ、REGION_CODE の選択 (緑) 値のみ

売上データに関する On-demand アプリの例の場合は、次のデータ バインディング数式により、REGION_CODE の選択値またはオプション値のどちらかが必ず REGION_CODE に含まれるようにします。

$(odso_REGION_CODE)

数値のバインディング

On-demand アプリにバインドするデータが文字列ではなく数値で構成されている場合は、数値項目を引用符で囲む動作を無効にすると効果的です。たとえば、売上レコードに数値の DAY_OF_WEEK 列が含まれており、選択アプリのユーザーが DAY_OF_WEEK の任意の組み合わせを選択できるようにする場合は、選択アプリをロードするために使用される集計クエリを増やして、SELECT リストと GROUP BY リストの両方に DAY_OF_WEEK を含めます。データベースで文字列から数値への自動型変換機能がサポートされていない場合、DAY_OF_WEEK の値を選択するときに引用符で囲まれていると、実行時にクエリ エラーが発生する可能性があります。

この状況に対処するために構文サフィックスが用意されており、バインド数式の FIELDNAME 部分の最後に追加して、文字列値ではなく選択アプリの数値が項目バインディングで使用されるように強制することができます。そのサフィックスは、以下の WHERE 節に含まれる _n です。

WHERE DAY_OF_WEEK IN ( $(od_DAY_OF_WEEK_n) );

これは、次のように展開されます。

WHERE DAY_OF_WEEK IN ( 1,2 );

一定数の選択の要求

状況によっては、On-demand アプリのクエリに、特定の項目に関する、特定の数または範囲の値を含める必要があることがあります。たとえば、On-demand アプリのクエリに開始日から終了日までの全売上高を取得するための BETWEEN 節が含まれている場合、 YEARQUARTER 項目のバインド数式には、YEARQUARTER の値を正確に 2 つ選択するように要求するサフィックス構文 [2] を以下に示すように含めることができます。

$(od_YEARQUARTER)[2]

選択アプリの [On-Demand アプリのナビゲーション ポイント] は、選択された YEARQUARTER の値が正確に 2 つにならない限り無効のままになります。YEARQUARTER の値を正確に 2 つ選択する必要があることを示すメッセージが表示されます。

選択数量の制約により、[選択アプリ] と [On-Demand アプリ] の間に前提条件の連鎖が作成されます。これは、数量の制約を使用しないバインド式とは異なります。たとえば、[テンプレート アプリ] のスクリプトに、以下のように数量の制約なしのバインド数式が含まれているとします。

$(od_MYFIELD)

[選択アプリ] に MYFIELD という名前の項目を含めたり、その項目に選択値 (存在する場合) を含めたりするように求める要件はありません。[選択アプリ] に MYFIELD という名前の項目が含まれていない場合、またはユーザーがそのアプリから何らかの選択を行うことを単に無視した場合でも、他の選択によってレコード制限値の条件が満たされているときは、[On-Demand アプリのナビゲーション ポイント] が有効となる可能性があります。

一方、次のようなバインド数式があるとします。

$(od_MYFIELD)[1+]

この場合は、以下の 2 つの要件が [選択アプリ] に課されます。

  • [選択アプリ] には、MYFIELD という名前の項目を含める必要があります。
  • ユーザーは、MYFIELD の値を少なくとも 1 つ選択する必要があります。

この種類のバインド数式では、[テンプレート アプリ] と一緒に使用できる [選択アプリ] が制限されるため、注意して使用する必要があります。 [テンプレート アプリ] にリンクするすべての [選択アプリ] に対して選択数量の要件を確実に課したい場合を除き、この数量の制約を [テンプレート アプリ] に課さないでください。

データ バインド プロセスを実行するため、On-Demand アプリ サービスは、スクリプト内のコメントに影響されない、文字列代替手法を使用します。このため、アプリ生成後のバインド値のリストをコメントに含めたい場合を除き、コメント内ではバインド数式を使用しないでください。

数量に関するその他の制約を設定することも可能です。次の表に、選択数量の制約に関するさまざまな組み合わせの概要を示します。

選択数量の制約に関するさまざまな組み合わせ
制約のパターン 選択要件
$(od_YEARQUARTER)[2] YEARQUARTER の値を正確に 2 個選択する必要があります。
$(od_YEARQUARTER)[2-4] YEARQUARTER の値を 2 ~ 4 個選択する必要があります。
$(od_YEARQUARTER)[2+] YEARQUARTER の値を 2 個以上選択する必要があります。
$(od_YEARQUARTER)[2-] YEARQUARTER の値を最大 2 個選択する必要があります。
注: テンプレート アプリにおけるすべての数量制約が満たされているかどうかを確認するチェックは、アプリ生成プロセス中に実行されます。数量制約違反があった場合、アプリ生成リクエストは拒否され、エラー メッセージが表示されます。

値の引用符と区切り文字の変更

On-demand の選択アプリで選択された項目値のリストがテンプレート アプリのスクリプトに挿入される場合、その値は単一引用符で囲まれ、コンマで区切られます。これらは、引用符と区切り記号のデフォルトの文字です。これらの値は、各項目のバインディング ステートメントに付加される構文で変更できます。例:

$(odso_ORIGIN){"quote": "|", "delimiter": ";"}

新しい設定値は、選択アプリから取得したバインド値のリストを次に作成するときに使用されます。例えば、選択した値が年の最初の 3 か月の場合、リストは以下のように作成されます。

|January|;|February|;|March|

引用符と区切り文字の既定値は、ほとんどの標準的な SQL データベースに対応しています。ただし、一部の SQL データベースでは機能しない場合があり、また NoSQL や REST を始めとする多くの動的データ ソースには対応していません。そうしたソースの場合は、このバインディング数式を付加して、引用符と区切り文字を変更する必要があります。

Bind data containing commas and/or quotation marks

If the data in any of the fields used for bind variables contains commas, you need to change the default behavior of the INLINE load statement to not interpret commas as field separators. 書式設定を使用して、次の例の「|」文字によって示されるとおり、バインドされている項目の値としては決して使用されない文字に区切り文字を変更してください。

Also, if any of the bound fields contain single quotation marks, you need to add a Replace command to the LOAD statement that will add an extra single quotation mark after each single quotation mark in the value. This prevents the quote characters from being interpreted as the end of the string that is used in the WHERE clause.  Note that database products may use different techniques for escaping single quotation marks.

例:

OdagBinding: LOAD Replace(VAL,'''','''''') AS VAL INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ] (ansi, txt, delimiter is '|', embedded labels);