Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
shinfujii
Contributor III
Contributor III

変数をINCLUDEで外部ロードすると、if文に限り一部の数式が欠落する

お世話になっております

Qvwの変数を外部に出すことで、Qvwの共通管理を行っております。

Qvwの変数として記述して正常に動作したものを INCLUDE で外部参照した際、if文の構文でロード時に数式の欠落が発生します。

<Qvwの変数として定義> → 正常動作

 変数名: v今期   変数: = if(max({<会計年度={$(=max(会計年度_作成))}>}会計半期)='1','上期','下期') 

<INCLUDEで外出しした変数の記述>

Set v今期 = = if(max({<会計年度={$(=max(会計年度_作成))}>}会計半期)='1','上期','下期') ;

<INCLUDEで上記の記述をロードした結果 → Qvwにロードされた変数> → 正しく動作しない

変数名: v今期   変数: = if(max({<会計年度={}>}会計半期)='1','上期','下期')

◆問題点◆

<会計年度={$(=max(会計年度_作成))}> この記述が欠落します。

-----------------

同様に、<会計年度={$(=max(会計年度_作成))}> この記述が欠落する例は、  

=if (max({<会計年度={$(=max(会計年度_作成))}>}会計半期)='1','10','4') ;

=if (max({<会計年度={}>}会計半期)='1','10','4')

------------------

INCLUDE と if文 の組み合わせの場合に発生しているようです。

これはQlikviewのバグなのでしょうか? または仕様でしょうか?

回避する方法等ありましたら、ご教授お願いします。

Labels (2)
15 Replies
kentaroWakamatsu
Creator II
Creator II

おそらく計算式の中にイコールつきの変数部分「 $(=max(会計年度_作成)) 」があることによって、リロード時にこの部分の計算が実行され、その結果がNULLとしてかえってきているとおもいます。

今日は時間が取れないかもしれませんが、興味深いので回避策考えて見ます。

kentaroWakamatsu
Creator II
Creator II

試してみましたが、計算式の中に、計算結果をあてはめる意味での変数は組み込めましたが、変数の中の計算式をそのまま式として組み込むことは出来ませんでした。

何か方法はあるかもしれませんが、今のところ思いつきません。

代替案として、計算式内に変数を入れないよう、式の内容を変更してみてはどうでしょうか?

(例)

=if(Max(Aggr(IF(Max(会計年度_作成)=会計年度,会計半期,NULL()),会計年度,会計半期))='1','上期','下期')

会計年度、会計半期があるテーブルは、他にも月などの情報があると思うので、Aggr関数の'会計年度、会計半期' 部分へは、データを1行ごとに判断するための集計軸を必要に応じて追加して下さい。

shinfujii
Contributor III
Contributor III
Author

若松様

いつも大変お世話になっております。

まず、結論ですが、ご教授頂きました式を使用すると、変数を外部ロードしても正常に動作するようになりました。

かなりの数のQvwとチャート今回問題となった変数 v今期 を参照しており、最悪 外部ロードしている数式をQvwに記述していくか? 気の遠くなる思いでした。

本当に助かります。

>会計年度、会計半期があるテーブルは、他にも月などの情報があると思うので、Aggr関数の'会計年度、会計半期' 部分へ>は、データを1行ごとに判断するための集計軸を必要に応じて追加して下さい。

Aggr関数はまだ初心者なので、今回の代替え案の数式について、簡単に解説頂けますとAggr関数を理解する上で助かります。

=if(Max(Aggr(IF(Max(会計年度_作成)=会計年度,会計半期,NULL()),会計年度,会計半期))='1','上期','下期')

ご参考まで、会計年度、会計半期、会計四半期、会計月などは以下サイトを参照して、元のデータから自動生成しております。

Qlik Senseのマスターカレンダー作成テンプレート

よろしくお願いします。

fujii

kentaroWakamatsu
Creator II
Creator II

私も同様に、各ファイル共通の変数をエクセルで管理していて、エクセルの変更だけで各ファイル内変数の中身をコントロールしているのですが、既にご存知かもしれませんが、変数がイコール無しの数式、イコール付の数式、文字列などによって、変数への変換方法が違いますのでご注意ください。

 ※サンプルファイルつけております。ロードスクリプトの7行目のパスだけ添付エクセルの保存場所へ変更して下さい。

また、変数やステートが多いと、リスト選択時やクリアー時の処理速度が重くなるケースがあります。

固定値ではなく計算式の変数が増える事によって、画面上で表示されている帳票以外の変数処理が増加し、このような状況になるようです。

私は一次帳票内の計算式も外出しで管理していた次期があり、1ファイルに300を超える変数を実装していましたが、あまりにも重くなってしまったために、おおかたの変数を削除して作り直しました。

この時いろいろテストを行いましたが、V11よりもV12の方が大きな影響がありました。

ファイルや計算式のチューニング効果を確認するQVのツールもありますので、良ければまた使ってみてください。

URL :http://qlikviewcookbook.com/tools/

 ・DaCompareTool

 ・DocumentAnalyzer

shinfujii
Contributor III
Contributor III
Author

若松様

お世話になっております。

お忙しい中、詳細な説明とサンプルまでご提供頂き感謝です。

本件はQlikviewを業務で実装する場合のキモなので、じっくり勉強させて頂きます。

まずは重ねてお礼申し上げます。

fujii

kentaroWakamatsu
Creator II
Creator II

Aggr関数は、前部分に計算式、後ろ部分に計算を実行する計算軸をカンマ区切りで記載します。

テンプレートを見ましたが、これであれば最小単位が「販売日付」なので、「会計年度,会計半期」と記載した部分を「販売日付」に書き換えるだけで大丈夫です。

具体的に利用するケースとして、日付、店舗、売上のテーブルがあり、ストレートテーブルで数式に「AVG(売上)」と記載して軸に「日付」だけを用意したとします。

この場合は、合計欄では「売上」の値の単純な平均値になります。

これを「AVG(Aggr(AVG(売上),日付))」と記載すると、一度日付単位で「AVG(売上)」した結果を平均値を合計行へかえします。「AVG(Aggr(AVG(売上),日付,店舗))」の場合は、日付と店舗単位で平均した値の平均になります。

shinfujii
Contributor III
Contributor III
Author

若松様

お世話になっております。

色々と説明をありがとうございます。

元の数式の中のNULL() はどういう動作をしておりますか? 

この数式の動作が今一つ、ぴんと来ておりません。

=if(Max(Aggr(IF(Max(会計年度_作成)=会計年度,会計半期,NULL()),会計年度,会計半期))='1','上期','下期')

よろしくお願いします。

kentaroWakamatsu
Creator II
Creator II

'Max(会計年度_作成)=会計年度'  のときは '会計半期' を返して、

それ以外の場合はNULLにするという意味で、NULLはデータが無い状態です。

こ処理を軸ごとに行い、一旦条件に一致した '会計半期' データだけを先に作成しているのが

 'Aggr(IF(Max(会計年度_作成)=会計年度,会計半期,NULL()),会計年度,会計半期)' の部分です。

この軸単位で複数出来上がったデータの最大値を取得しているのがその外側のMAX関数です。

 'Max(Aggr(IF(Max(会計年度_作成)=会計年度,会計半期,NULL()),会計年度,会計半期))'

この結果が '1' の場合は '上期' , そうでない場合は'下期' とIF関数で判断させています。

shinfujii
Contributor III
Contributor III
Author

若松様

おはようございます。

お世話になっております。

何度も解説ありがとうございます。

内容を理解すると、非常に合理的な記述であることが理解できます。

Qlikの場合、演算・変数ともに、選択肢が多くどのようなアプローチで実装するかで

工数・品質が大きく左右されます。 

よって

センスの良い人が作成すればシンプルでレスポンスも良く、品質もメンテナンス性も高いアプリができます。

逆にセンスの悪い人が作成すれば、複雑で反応が悪く、品質も悪いアプリが出来上がります。

新しい気づきをありがとうございました。

fujii