Qlik Community

Japan

Announcements
Submit your remarkable customer story for the Global Transformation Awards at QlikWorld Denver 2022. SUBMIT A STORY
cancel
Showing results for 
Search instead for 
Did you mean: 
shinfujii
Contributor III
Contributor III

Noconcatenateがうまくいかない(合成キーが作成される)

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

販売データと製造データの結合で苦戦しております。

Noconcatenateの使い方について、思うように動作しません。

Webで色々と記載をチェックして

LOADの前に宣言するタイプと、FROMの後に項目名を指定するタイプがあり、テストしても強制的に結合されてうまく行きません。

サンプルデータを作成しましたので、合成キーが作成されないように、Noconcatenateを動作させる方法についてご教授お願いします。

添付のサンプルデータについて

販売データ、製造データ共に、3年分のデータ(2013年、2014年、2015年)を作成

顧客コード、販売日付が共通キーです。

よろしくお願いします。

fujii

Labels (2)
1 Solution

Accepted Solutions
kentaroWakamatsu
Creator II
Creator II

修正したファイルを添付しております。

スクリプト編集画面の「相対パス」にチェックが入っている状態で作成されていると思うので、'Directry'が都度自動記述されていますが、添付ファイルのスクリプトタブ「販売明細データロード」の20行目に記載しているように、前もってフォルダパスを記述すると、それ以降の'Directory'をまとめて指定する事となります。ですので、22行目移行の記述には、記載が無いですがこれで大丈夫です。

('Directory’のフォルダパスはhujiiさんのPCの'追加データ'フォルダ上部のパスに変更して下さい)

用途によっては相対パスの方が良い場合もあるのですが、通常「相対パス」にはチェックを入れず、絶対パスで指定している方がリスクが少ないように思います。

「相対パス」のチェックをいれたまま、'Directory'も残す場合はタブ「製造明細データロード」のスクリプトを参考にして下さい。

その他、NoConcatenate、Concatenate、JOINについて要点記載しておきます。

[NoConcatenate]

 'Resident'などを用いたり同一レイアウトファイルを取り込む場合に、自動的に同一テーブルにまとめたくない場合利用します。

 同一レイアウトのテーブル取り込みが無いのであれば記述不要です。

[Concatenate]

 既に存在するテーブルに新しく取り込むテーブルのデータを追加したい場合に記述します。

Concatenatを記述すると、レイアウトが違う場合でも上部に記載のテーブルにデータ追加されます。

間に別のテーブルを挟んでいる場合は、後ろに()を記述して、()の中にテーブル名を指定します。

同一レイアウトの場合で、既に読込み済みのテーブルに'NoConcatenate'の記述が無い場合は、記述無しでデータ追加されます。

[Join]

'Join'の記述だけの場合は、すぐ上のテーブルにJoinしますが、()でテーブル指定も可能です。

その他として、「数量」がJoinの際にキーに含まれてしまっていますが、これは違う意味合いだと思うので、「製造数量」、「販売数量」といった感じに読み替えないと、行ないたい形にはならないと思います。

View solution in original post

13 Replies
kentaroWakamatsu
Creator II
Creator II

修正したファイルを添付しております。

スクリプト編集画面の「相対パス」にチェックが入っている状態で作成されていると思うので、'Directry'が都度自動記述されていますが、添付ファイルのスクリプトタブ「販売明細データロード」の20行目に記載しているように、前もってフォルダパスを記述すると、それ以降の'Directory'をまとめて指定する事となります。ですので、22行目移行の記述には、記載が無いですがこれで大丈夫です。

('Directory’のフォルダパスはhujiiさんのPCの'追加データ'フォルダ上部のパスに変更して下さい)

用途によっては相対パスの方が良い場合もあるのですが、通常「相対パス」にはチェックを入れず、絶対パスで指定している方がリスクが少ないように思います。

「相対パス」のチェックをいれたまま、'Directory'も残す場合はタブ「製造明細データロード」のスクリプトを参考にして下さい。

その他、NoConcatenate、Concatenate、JOINについて要点記載しておきます。

[NoConcatenate]

 'Resident'などを用いたり同一レイアウトファイルを取り込む場合に、自動的に同一テーブルにまとめたくない場合利用します。

 同一レイアウトのテーブル取り込みが無いのであれば記述不要です。

[Concatenate]

 既に存在するテーブルに新しく取り込むテーブルのデータを追加したい場合に記述します。

Concatenatを記述すると、レイアウトが違う場合でも上部に記載のテーブルにデータ追加されます。

間に別のテーブルを挟んでいる場合は、後ろに()を記述して、()の中にテーブル名を指定します。

同一レイアウトの場合で、既に読込み済みのテーブルに'NoConcatenate'の記述が無い場合は、記述無しでデータ追加されます。

[Join]

'Join'の記述だけの場合は、すぐ上のテーブルにJoinしますが、()でテーブル指定も可能です。

その他として、「数量」がJoinの際にキーに含まれてしまっていますが、これは違う意味合いだと思うので、「製造数量」、「販売数量」といった感じに読み替えないと、行ないたい形にはならないと思います。

View solution in original post

kentaroWakamatsu
Creator II
Creator II

単発のデータ取得ではなくて、継続的にデータ取得する場合は、ロード時の日付に応じて取得するシートを変更するよう、以下のような記述をした方が良いとは思うので、参考に記載しておきます。

コピペ後、ファイルパスだけ変更すれば、動くと思います。

LET V_FROM = Year(AddYears(Today(1),-4));//変数へ取得するシート名の「年」部分の開始年を指定します。今回はシートの範囲は2013~2015でしたので、2013になるようにしました。

SET ErrorMode = 0;  //For文で取り込み中、必要なシート名が無い場合のエラーを無視するために、エラーモードを変更しています。エラーモードの詳細はヘルプを確認して下さい。

FOR i = $(V_FROM) to $(V_FROM)+1 //今回は、2013~2015の内、2年分の2013と2014を取得するようにしています。'1'の部分を増やせば、範囲変更可能です。
LET V_SName = '売上明細'&$(i);
HANBAI:
LOAD 伝票番号,
      販売日付,
      顧客コード,
      商品コード,
      数量 as 販売数量,
      販売価格,
      販売原価,
      販売利益
FROM
   //ご自身の環境での対象ファイルのフルパスに変更して下さい。
(ooxml, embedded labels, table is $(V_SName));

SEIZO:
LOAD 伝票番号,
      販売日付,
      顧客コード,
      商品コード,
      数量 as 製造数量,
      生産高,
      損益
FROM
   //ご自身の環境での対象ファイルのフルパスに変更して下さい。
(ooxml, embedded labels, table is $(V_SName));
NEXT

SET ErrorMode = 1;

JOIN (HANBAI)
LOAD 伝票番号,
     販売日付,
     顧客コード,
     商品コード,
     製造数量,
     生産高,
     損益
Resident SEIZO;
Drop table SEIZO;

shinfujii
Contributor III
Contributor III
Author

若松様

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

金曜日は1日外出しており、返信がおそくなりすいません。

詳細な返信ありがとうございます。

そもそも、Directoryの記述についてよくわかっておらず、おまじないのようにコピペしておりました。

回答頂きました内容でトライしてみます。

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

fujii

shinfujii
Contributor III
Contributor III
Author

若松様

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

こんな技もあるのですね。

予算取込、経費取込で応用できそうです。

アドバイス助かります。

fujii

shinfujii
Contributor III
Contributor III
Author

若松様

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

先週この問題に直面した際の問題点は

販売データと製造データの統合をするときに、複数の共通キーでOuter JOINさせておりました。

単年度のデータは問題なくJOINできましたが、複数年のデータを各々ロードして、Resident SEIZO;

Drop table SEIZO; と記述した際に、ある時はうまく行きある時は合成キーが作成されるというエラーに遭遇しました。

Qlikのバグかと思い最新版のDesktopのインストールも行いましたが、一度うまく行かなくなると、レジストリに何か残って

いるのか、合成キーが作成されるので、同じテーブルはConcatenateを使用し、、別のテーブルはNoConcatenateで意図的に別だと宣言。しかし、合成キーが作成されるので、コミュニティーに投稿しました。

そもそもの問題で、同一レイアウトでないテーブルを別テーブル名で宣言して、NoConcatenateを指定すると、合成キーを生成する動きは、なんともしっくりきませんね。

fujii

shinfujii
Contributor III
Contributor III
Author

若松様

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

アドバイス頂きました 継続的にデータ取得するスクリプトですが、コピペして動かしてみましたが

2013年だけロードしております。

FOR 設定がうまく動いていない状況のようです。

fujii

以下、動作させたスクリプト

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

LET V_FROM = Year(AddYears(Today(1),-5)); //-5が2013年ですね。
SET ErrorMode = 0;
FOR i = $(V_FROM) to $(V_FROM)+1
LET V_SName = '売上明細'&$(i);


//販売明細データのロード 2013年から2015年
Directory;
HANBAI:
LOAD 伝票番号,
     販売日付,
     顧客コード,
     商品コード,
     数量 as 販売数量,
     販売価格,
     販売原価,
     販売利益
FROM
//追加データ\売上明細_販売.xlsx
H:\Downloads\qlikサンプルQVW\追加データ\売上明細_販売.xlsx
(ooxml, embedded labels, table is  $(V_SName));

kentaroWakamatsu
Creator II
Creator II

最後に、'NEXT' を入れないとダメですよ。

kentaroWakamatsu
Creator II
Creator II

これは、「同一項目名」は自動的にキー情報になるというクリックビューの仕様なので、慣れるしかないと思います。

個人的には慣れてくると、非常に使いやすいと感じています。

ただ、同一項目名がキーとなるということは、これらのデータの意味が完全に同じである必要があります。

添付されていたエクセルデータで言うと、「売上明細_製造.xlsx」の「販売日付」や「顧客コード」は「売上明細_販売.xlsx」の同一項目と同じ意味合いであれば問題ないですが、違う意味であればどちらか片方の項目名を変更する必要があります。

(たとえば、販売日ではなく製造日の場合など)

また、リロード時に、合成キーの自動作成が発生すると、ロード時間が余分にかかります。

ですので、キー項目をつなげて、キー項目をひとつにしてあげる方が良いです。データ量が増えると、シンセティックキーの自動作成時間が非常に長くなります。

JOINもデータ量が多いと多少時間のかかる処理ですので、個人的にはレイアウトの違うテーブルは別で分けておいた方が良いとおもいます。

変わりにリンク用のキー情報が網羅されたテーブルを用意する構成が、おすすめです。

サンプル添付しておきます。

kentaroWakamatsu
Creator II
Creator II

Year(AddYears(Today(1),-4)) 

の部分間違ってましたね。'-5'でした。