Skip to main content
Announcements
Accelerate Your Success: Fuel your data and AI journey with the right services, delivered by our experts. Learn More
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

【QlikView】 入力ボックス 制約について

QlikView 入力ボックスの制約について質問があり投稿させて頂きました。

初めての投稿で勝手が掴めていませんので、不備等ありましたら申し訳ございません。

現在、入力ボックスを使用して年月項目を範囲指定するように設定しております。

その入力内容に制約を掛け、エラーメッセージを表示されるようにしたいと考えております

どのように設定すればよいのかわからず困っております。

年月の範囲指定_制約について.png

予定している制約は下記3点です。

   ①対象項目(年月)の最小値未満、最大値より大きい値の入力の禁止(空白は許可)

   ②開始日>終了日の関係を禁止

   ③数字6桁以外の入力を禁止  

    ※年月項目のデータが「YYYYMM」の為  例:201506

①の最小値、最大値に関しては入力ボックスのプロパティから変数の入力制約に

「$ >= Min (年月項目)」、「$ <= Max (年月項目)」の二つを記述すれば良いかと思うのですが

この両方を有効にする方法と、空白を許可する方法が分からず先に進めないでいます。

①、②、③の制約を実現する方法について

恐れ入りますが、どなたかご助力頂けると助かります。

以上、よろしくお願い致します。

1 Solution

Accepted Solutions
Masaki_Hamano
Employee
Employee

こんにちは、

されようとされていることを細かく見れてはいないのですが、そもそも初期値をnullにする必要があるのでしょうか?もう少しシンプルに初期値を入力データの最小値、最大値に設定する形などが良いと思われますが?

例えば、以下の様なスクリプトをロードスクリプトに追加すれば、変数に入力データの最小値、最大値を設定することが出来ます。

temp_MinDate:

LOAD

     Min(年月項目) as MinDate

Resident Table;

Let vStartDate = Peek('MinDate');

temp_MaxDate:

LOAD

     Max(年月項目) as MaxDate

Resident Table;

Let vEndDate = Peek('MaxDate');

濵野

View solution in original post

9 Replies
Masaki_Hamano
Employee
Employee

こんにちは、

入力ボックスプロパティの「制約」タブの「カスタム」入力制約に、以下の様な設定を行って一度試して頂ければと思います。

vStartDate:

=$>=Min(年月項目) and $<=Max(年月項目) and len($)=6 and isNum($) and $ <= $(vEndDate)

eEndDate:

=$>=Min(年月項目) and $<=Max(年月項目) and len($)=6 and isNum($) and $ >= $(vStartDate)

濵野

Not applicable
Author

アドバイスありがとうございます!!

早速ご連絡頂いた方法を試してみました。

しかし、min(年月項目)max(年月項目)の部分が上手く動きません。

一度、入力ボックスを使用して範囲選択をした後に範囲を変更しようとすると、

その時点で選択されている年月項目の範囲内しか指定が出来ません。

どうやら選択している項目の中から最小値と最大値を判定しているようで

範囲外を指定しようとすると、設定している=$>=Min(年月項目) and $<=Max(年月項目)」の制約で弾かれてしまいます。

選択していない項目を含めての最小値と最大値を判定する方法は無いでしょうか?

何度も申し訳ございませんが、よろしくお願い致します。

Masaki_Hamano
Employee
Employee

そういうことですね。以下の様な形でMin, Maxに{1}を付け加えると選択状態が無視されますので、そちらでご確認ください。

Min({1}年月項目)

濵野

Not applicable
Author

ご連絡頂いた方法で上手く行きました。

ありがとうございました。

しかし、全く想定していなかったのですが、よくよく考えますとこの制約では

入力ボックスに何も入力されていない状態ではエラーになってしまいます。

これを改善する為に、nullの場合の処理を追加した記述に変えました。

開始日(変数:vStartDate)

=if($<>'',$>=Min({1}[収益分析(販推用)_01_年月]) and $<=Max({1}[収益分析(販推用)_01_年月]) and len($)=6 and isNum($) and $ <= $(vEndDate),'')

終了日(変数:vEndDate)

=if($<>'',$>=Min({1}[収益分析(販推用)_01_年月]) and $<=Max({1}[収益分析(販推用)_01_年月]) and len($)=6 and isNum($) and $ >= $(vStartDate),'')

上記のようにif文を使用して変数がnullでなければ制約を有効にして、nullの場合は制約無しという記述にしているつもりです。

しかし、両方の変数に値が入力されていない状態でどちらかの変数に値を入力しようとすると、制約が有効になってしまい

入力した値とnullで比較されてしまい必ずエラーになってしまいます。

なのでif文を入れ子にして、値を入力する変数がnullでは無く

比較対象の変数がnullであった場合は下記4つの制約が有効になるように記述を変更致しました。

 

有効

 ①年月の最小値以上

 ②年月の最大値以下

 ③文字数が6文字

 ④数値形式

無効

 ⑤vStartDateの場合:vEndDate以下

  vEndDateの場合:vStartDate以下

ですが、構文が間違っているのか入れ子自体が出来ないのか上手く動いてくれません。

変更後の記述は下記の通りです。

開始日(変数:vStartDate)

=if($<>'',=if($(vEndDate)<>'',$>=Min({1}[収益分析(販推用)_01_年月]) and $<=Max({1}[収益分析(販推用)_01_年月]) and len($)=6 and isNum($) and $ <= $(vEndDate),$>=Min({1}[収益分析(販推用)_01_年月]) and $<=Max({1}[収益分析(販推用)_01_年月]) and len($)=6 and isNum($)),'')

何度も何度も申し訳ございませんがアドバイスを頂けると幸いです。

よろしくお願い致します。

Masaki_Hamano
Employee
Employee

こんにちは、

されようとされていることを細かく見れてはいないのですが、そもそも初期値をnullにする必要があるのでしょうか?もう少しシンプルに初期値を入力データの最小値、最大値に設定する形などが良いと思われますが?

例えば、以下の様なスクリプトをロードスクリプトに追加すれば、変数に入力データの最小値、最大値を設定することが出来ます。

temp_MinDate:

LOAD

     Min(年月項目) as MinDate

Resident Table;

Let vStartDate = Peek('MinDate');

temp_MaxDate:

LOAD

     Max(年月項目) as MaxDate

Resident Table;

Let vEndDate = Peek('MaxDate');

濵野

Not applicable
Author

Masaki Hamano 様

アドバイスありがとうございます。

私も最初は最小値、最大値を初期値に設定しようかと思ったのですが

私が作成しているQVW上のチャートで、画面の見やすさ、負荷軽減の為に

項目が選択された時だけ演算するように演算実行条件を記述しております。

その為、最小値・最大値を初期値にしてしまうと、トリガーで項目を自動選択するようにしているので

何も選択していないという状態が作れなくなってしまうと思いその案は採用せずに少々ややこしい方法を取っています。

今の所、私に考え付く方法が先日投稿させて頂いた方法なのですが、やはりif文の入れ子は出来ないのでしょうか?

色々と継続して調べたり、試したりしてみたのですが今の所芳しい成果が出ておりません。

何度も申し訳ないのですが、アドバイスを頂けると幸いです。

Masaki_Hamano
Employee
Employee

こんにちは、

実現されたいことは、空白の入力を許可したいとのことでよろしいでしょうか?

以下の形でor条件を付加し、($='') で空白入力を許可する形にすれば可能ではないかと思います。一度ご確認ください。

= ($='') or ($>=Min({1}年月項目) and $<=Max({1}年月項目) and len($)=6 and isNum($) and $ <= $(vEndDate))

濵野

Not applicable
Author

Masaki Hamano 様


お返事が遅れ申し訳ございません。

大分やり取りが長くなっている中、ご丁寧にありがとうございます。

この方法ですが、私の方で既に一度実施しております。


この方法ですと、最初にnullを入力することは可能なのですが

一旦両方の変数をnullにした後に変数に値を入力すると、

nullと値を比較してしまい、エラーになってしまいます。

なので両方の変数がnullの状態で、

片方の変数に値を入力した場合は変数同士を比較しないような記述に出来ないかと思い、

6月18日に投稿させて頂いたif文の入れ子で対応しようとしておりました。

しかし、if分の入れ子は出来ないようですね。

他の方法を探してみます。

ご回答ありがとうございました。

Not applicable
Author

Masaki Hamano 様


その後の状況についてご報告させて頂きます。


この内容一つに時間をつぎ込むことも出来ませんでしたので

Hamano様にご提案頂いた最小値、最大値を初期値として設定しnull値の入力を制限する形に致しました。

最終的に、私が考えていた方法で実現する事が出来ませんでしたので継続して勉強していこうと思います。

ご回答ありがとうございました。